Este repositório contém a implementação oficial do artigo ICLR 2024 "O ImageNet vale 1 vídeo? Aprendendo codificadores de imagem fortes a partir de 1 vídeo longo e não rotulado"
[ arXiv
], [ paper
], [ dataset
], [ Project Page
]
Nosso objetivo é construir representações robustas aproveitando a riqueza de informações dos quadros de vídeo. Estruturas SSL padrão, como SimCLR, DINo etc., geralmente assumem correspondências entre diferentes visualizações. Isto é verdade quer se utilize representações densas ou globais através de pooling, por exemplo, iBOT. Embora seja relativamente simples estabelecer correspondências em imagens, torna-se mais desafiador quando se lida com deformações temporais, exigindo alguma forma de rastreamento de objetos. Em vídeos com grande campo de visão ou movimento do ego, obter correspondências torna-se ainda mais difícil.
Apresentamos o DoRA, baseado em descoberta e rastreamento de vários objetos. Ele aproveita a atenção do token [CLS] de cabeças distintas em um transformador de visão para identificar e rastrear consistentemente vários objetos dentro de um determinado quadro em sequências temporais. Nestes, é então aplicada uma perda de destilação professor-aluno. É importante ressaltar que não usamos nenhum rastreador de objetos pronto para uso ou rede de fluxo óptico. Isso mantém nosso pipeline simples e não requer nenhum dado ou treinamento adicional. Também garante que a representação aprendida seja robusta.
A lista completa de vídeos do WTour está disponível no HuggingFace Dataset, incluindo os links do YouTube e instruções detalhadas sobre como baixá-lo usando os scripts necessários.
Caso os links estejam quebrados, você pode baixar os vídeos diretamente do Walking Tour Dataset
Para cumprir o GDPR, também tentamos desfocar todos os rostos e placas que aparecem no vídeo usando o Deface
Para fazer isso para todos os vídeos no conjunto de dados WTur:
python3 -m pip install deface
Em seguida, execute o Deface em todos os vídeos usando o script bash:
chmod a+x gdpr_blur_faces.sh ./gdpr_blur_faces.sh
Os requisitos são facilmente instalados via Anaconda. Aqui criamos um ambiente conda chamado dora e instalamos todas as bibliotecas necessárias
conda create -n dora python=3.8.2 conda activate dora conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia conda install pillow==9.4.0 scipy tensorboardX faiss-gpu==1.6.1 tqdm lmdb scikit-learn pyarrow==2.0.0 DALL-E munkres six einops
Se você estiver usando GPUs V100 com 32 GB de RAM, recomendamos usar o seguinte script para pré-treinar o DoRA:
python -m torch.distributed.launch --nproc_per_node=8 main.py --arch vit_small --data_path /path-to-video/venice.mp4 --output_dir /path-to-checkpoint/weights_WTours/DoRA/venice_8frames/ --optimizer adamw --use_bn_in_head False --out_dim 65536 --batch_size_per_gpu 6 --local_crops_number 6 --epochs 100 --num_workers 10 --lr 0.0005 --min_lr 0.00001 --norm_last_layer False --warmup_teacher_temp_epochs 30 --weight_decay 0.04 --weight_decay_end 0.4 --frame_per_clip 8 --step_between_clips 60
Para GPUs A100 com 80 GB de RAM, recomendamos usar o seguinte script de pré-treinamento (a única diferença está em batch_size_per_gpu):
python -m torch.distributed.launch --nproc_per_node=8 main.py --arch vit_small --data_path /path-to-video/venice.mp4 --output_dir /path-to-checkpoint/weights_WTours/DoRA/venice_8frames/ --optimizer adamw --use_bn_in_head False --out_dim 65536 --batch_size_per_gpu 16 --local_crops_number 6 --epochs 100 --num_workers 10 --lr 0.0005 --min_lr 0.00001 --norm_last_layer False --warmup_teacher_temp_epochs 30 --weight_decay 0.04 --weight_decay_end 0.4 --frame_per_clip 8 --step_between_clips 60
Você pode baixar os pesos do backbone pré-treinado usado para tarefas posteriores. Todos os backbones são modelos ViT-S/16
.
Épocas | Modelo | Conjunto de dados pré-treinado | Download | ||||
---|---|---|---|---|---|---|---|
100 | DINOSSAURO | WT-Veneza | espinha dorsal | ||||
100 | DoRA | WT-Veneza | espinha dorsal | ||||
300 | DoRA | WT-Veneza | espinha dorsal | ||||
100 | DoRA | WT-tudo | espinha dorsal |
Para sondagem linear no ImageNet-1K
python -m torch.distributed.launch --nproc_per_node=4 eval_linear.py --batch_size_per_gpu 512 --n_last_blocks 4 --avgpool_patchtokens 0 --arch vit_small --lr 0.01 --pretrained_weights /path-to-checkpoint/venice/checkpoint.pth --data_path /dataset/imagenet/ --output_dir /path-to-output-dir/venice/LP/
Para avaliação KNN no ImageNet-1K
python3 -m torch.distributed.launch --nproc_per_node=4 eval_knn.py --arch vit_small --checkpoint_key teacher --data_path /dataset/imagenet/ --pretrained_weights /path-to-checkpoint/venice/checkpoint.pth
Por favor, siga os scripts de avaliação do iBOT
(pendência)
Se você achar este repositório útil, considere dar uma estrela e uma citação:
@inproceedings{venkataramanan2024imagenet, title={Is ImageNet worth 1 video? Learning strong image encoders from 1 long unlabelled video}, author={Venkataramanan, Shashanka and Rizve, Mamshad Nayeem and Carreira, Jo{~a}o and Asano, Yuki M and Avrithis, Yannis}, booktitle={International Conference on Learning Representations}, year={2024} }