? [2023-10-26] Ajout de backbones DINOv2 avec registres, suite aux registres de besoin de Vision Transformers.
Recherche sur la méta-IA, FAIR
Maxime Oquab, Timothée Darcet, Théo Moutakanni, Huy V. Vo, Marc Szafraniec, Vasil Khalidov, Patrick Labatut, Armand Joulin, Piotr Bojanowski
[ Paper #1
] Paper #2
] [ Blog
] [ Demo
] [ BibTeX
]
Implémentation de PyTorch et modèles pré-entraînés pour DINOv2. Pour plus de détails, consultez les articles : DINOv2 : apprentissage de fonctionnalités visuelles robustes sans supervision et registres nécessaires aux transformateurs de vision .
Les modèles DINOv2 produisent des fonctionnalités visuelles hautes performances qui peuvent être directement utilisées avec des classificateurs aussi simples que des couches linéaires sur une variété de tâches de vision par ordinateur ; ces fonctionnalités visuelles sont robustes et fonctionnent bien dans tous les domaines sans aucune nécessité de réglage fin. Les modèles ont été pré-entraînés sur un ensemble de données de 142 millions d'images sans utiliser d'étiquettes ni d'annotations.
modèle | # de paramètres | avec registres | ImageNet k-NN | ImageNet linéaire | télécharger |
---|---|---|---|---|---|
ViT-S/14 distillé | 21 M | 79,0% | 81,1% | colonne vertébrale seulement | |
ViT-S/14 distillé | 21 M | ✅ | 79,1% | 80,9% | colonne vertébrale seulement |
ViT-B/14 distillé | 86 millions | 82,1% | 84,5% | colonne vertébrale seulement | |
ViT-B/14 distillé | 86 millions | ✅ | 82,0% | 84,6% | colonne vertébrale seulement |
ViT-L/14 distillé | 300 M | 83,5% | 86,3% | colonne vertébrale seulement | |
ViT-L/14 distillé | 300 M | ✅ | 83,8% | 86,7% | colonne vertébrale seulement |
ViT-g/14 | 1 100 millions | 83,5% | 86,5% | colonne vertébrale seulement | |
ViT-g/14 | 1 100 millions | ✅ | 83,7% | 87,1% | colonne vertébrale seulement |
Veuillez suivre les instructions ici pour installer PyTorch (la seule dépendance requise pour charger le modèle). L'installation de PyTorch avec le support CUDA est fortement recommandée.
Une carte modèle correspondante est incluse dans le référentiel.
import torch
# DINOv2
dinov2_vits14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14' )
dinov2_vitb14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14' )
dinov2_vitl14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14' )
dinov2_vitg14 = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14' )
# DINOv2 with registers
dinov2_vits14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14_reg' )
dinov2_vitb14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14_reg' )
dinov2_vitl14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14_reg' )
dinov2_vitg14_reg = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14_reg' )
colonne vertébrale | avec registres | télécharger |
---|---|---|
ImageNet | ||
ViT-S/14 distillé | tête linéaire (1 couche, 4 couches) | |
ViT-S/14 distillé | ✅ | tête linéaire (1 couche, 4 couches) |
ViT-B/14 distillé | tête linéaire (1 couche, 4 couches) | |
ViT-B/14 distillé | ✅ | tête linéaire (1 couche, 4 couches) |
ViT-L/14 distillé | tête linéaire (1 couche, 4 couches) | |
ViT-L/14 distillé | ✅ | tête linéaire (1 couche, 4 couches) |
ViT-g/14 | tête linéaire (1 couche, 4 couches) | |
ViT-g/14 | ✅ | tête linéaire (1 couche, 4 couches) |
Les modèles (complets) de classificateur peuvent être chargés via PyTorch Hub :
import torch
# DINOv2
dinov2_vits14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14_lc' )
dinov2_vitb14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14_lc' )
dinov2_vitl14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14_lc' )
dinov2_vitg14_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14_lc' )
# DINOv2 with registers
dinov2_vits14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vits14_reg_lc' )
dinov2_vitb14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitb14_reg_lc' )
dinov2_vitl14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitl14_reg_lc' )
dinov2_vitg14_reg_lc = torch . hub . load ( 'facebookresearch/dinov2' , 'dinov2_vitg14_reg_lc' )
colonne vertébrale | tête de téléchargement | |
---|---|---|
NYUD | KITTI | |
ViT-S/14 distillé | linéaire (1 couche, 4 couches), DPT | linéaire (1 couche, 4 couches), DPT |
ViT-B/14 distillé | linéaire (1 couche, 4 couches), DPT | linéaire (1 couche, 4 couches), DPT |
ViT-L/14 distillé | linéaire (1 couche, 4 couches), DPT | linéaire (1 couche, 4 couches), DPT |
ViT-g/14 | linéaire (1 couche, 4 couches), DPT | linéaire (1 couche, 4 couches), DPT |
colonne vertébrale | télécharger le modèle | tête de téléchargement | |
---|---|---|---|
ADE20K | ADE20K | COV2012 | |
ViT-S/14 distillé | linéaire, multi-échelle | linéaire, multi-échelle | |
ViT-B/14 distillé | linéaire, multi-échelle | linéaire, multi-échelle | |
ViT-L/14 distillé | linéaire, multi-échelle | linéaire, multi-échelle | |
ViT-g/14 | Mask2Ancien | linéaire, multi-échelle | linéaire, multi-échelle |
Le code de formation et d'évaluation nécessite PyTorch 2.0 et xFormers 0.0.18 ainsi qu'un certain nombre d'autres packages tiers. Notez que le code n'a été testé qu'avec les versions spécifiées et attend également un environnement Linux. Pour configurer toutes les dépendances requises pour la formation et l'évaluation, veuillez suivre les instructions ci-dessous :
conda (Recommandé) - Clonez le référentiel, puis créez et activez un environnement conda dinov2
à l'aide de la définition d'environnement fournie :
conda env create -f conda.yaml
conda activate dinov2
pip - Clonez le référentiel, puis utilisez le fichier requirements.txt
fourni pour installer les dépendances :
pip install -r requirements.txt
Pour les tâches denses (estimation de la profondeur et segmentation sémantique), il existe des dépendances supplémentaires (versions spécifiques de mmcv
et mmsegmentation
) qui sont capturées dans les spécifications de dépendances extras
:
conda (Recommandé) :
conda env create -f conda-extras.yaml
conda activate dinov2-extras
pépin :
pip install -r requirements.txt -r requirements-extras.txt
Le répertoire racine de l'ensemble de données doit contenir le contenu suivant :
<ROOT>/test/ILSVRC2012_test_00000001.JPEG
<ROOT>/test/[..]
<ROOT>/test/ILSVRC2012_test_00100000.JPEG
<ROOT>/train/n01440764/n01440764_10026.JPEG
<ROOT>/train/[...]
<ROOT>/train/n15075141/n15075141_9993.JPEG
<ROOT>/val/n01440764/ILSVRC2012_val_00000293.JPEG
<ROOT>/val/[...]
<ROOT>/val/n15075141/ILSVRC2012_val_00049174.JPEG
<ROOT>/labels.txt
L'implémentation de l'ensemble de données fournie s'attend à ce que quelques fichiers de métadonnées supplémentaires soient présents dans le répertoire supplémentaire :
<EXTRA>/class-ids-TRAIN.npy
<EXTRA>/class-ids-VAL.npy
<EXTRA>/class-names-TRAIN.npy
<EXTRA>/class-names-VAL.npy
<EXTRA>/entries-TEST.npy
<EXTRA>/entries-TRAIN.npy
<EXTRA>/entries-VAL.npy
Ces fichiers de métadonnées peuvent être générés (une fois) avec les lignes de code Python suivantes :
from dinov2 . data . datasets import ImageNet
for split in ImageNet . Split :
dataset = ImageNet ( split = split , root = "<ROOT>" , extra = "<EXTRA>" )
dataset . dump_extra ()
Notez que les répertoires racine et supplémentaire ne doivent pas nécessairement être des répertoires distincts.
Veuillez adapter la classe de l'ensemble de données pour qu'elle corresponde à votre configuration locale.
dinov2
doit être inclus dans le chemin de recherche du module Python, c'est-à-dire simplement préfixer la commande à exécuter avec PYTHONPATH=.
.
Exécutez la formation DINOv2 sur 4 nœuds A100-80GB (32 GPU) dans un environnement de cluster SLURM avec submitit :
python dinov2/run/train/train.py
--nodes 4
--config-file dinov2/configs/train/vitl16_short.yaml
--output-dir < PATH/TO/OUTPUT/DIR >
train.dataset_path=ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
La durée de la formation est d'environ 1 jour et le point de contrôle résultant devrait atteindre 81,6 % sur l'évaluation k-NN et 82,9 % sur l'évaluation linéaire.
Le code de formation enregistre les poids de l'enseignant dans le dossier eval
toutes les 12 500 itérations pour évaluation.
Exécutez la formation DINOv2 sur 12 nœuds A100-80GB (96 GPU) dans un environnement de cluster SLURM avec submitit :
python dinov2/run/train/train.py
--nodes 12
--config-file dinov2/configs/train/vitl14.yaml
--output-dir < PATH/TO/OUTPUT/DIR >
train.dataset_path=ImageNet22k:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
Le temps de formation est d'environ 3,3 jours et le point de contrôle résultant devrait atteindre 82,0 % sur l'évaluation k-NN et 84,5 % sur l'évaluation linéaire.
Le code de formation enregistre les poids de l'enseignant dans le dossier eval
toutes les 12 500 itérations pour évaluation.
Le code de formation enregistre régulièrement les poids des enseignants. Afin d'évaluer le modèle, exécutez l'évaluation suivante sur un seul nœud :
python dinov2/run/eval/knn.py
--config-file < PATH/TO/OUTPUT/DIR > /config.yaml
--pretrained-weights < PATH/TO/OUTPUT/DIR > /eval/training_24999/teacher_checkpoint.pth
--output-dir < PATH/TO/OUTPUT/DIR > /eval/training_24999/knn
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
python dinov2/run/eval/log_regression.py
--config-file < PATH/TO/OUTPUT/DIR > /config.yaml
--pretrained-weights < PATH/TO/OUTPUT/DIR > /eval/training_24999/teacher_checkpoint.pth
--output-dir < PATH/TO/OUTPUT/DIR > /eval/training_24999/logreg
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
python dinov2/run/eval/linear.py
--config-file < PATH/TO/OUTPUT/DIR > /config.yaml
--pretrained-weights < PATH/TO/OUTPUT/DIR > /eval/training_24999/teacher_checkpoint.pth
--output-dir < PATH/TO/OUTPUT/DIR > /eval/training_24999/linear
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
Nous libérons les poids issus de l’évaluation des différents modèles :
modèle | avec registres | ImageNet top-1 | évaluation linéaire |
---|---|---|---|
ViT-S/14 distillé | 81,1% | poids de tête linéaires | |
ViT-S/14 distillé | ✅ | 80,8% | poids de tête linéaires |
ViT-B/14 distillé | 84,5% | poids de tête linéaires | |
ViT-B/14 distillé | ✅ | 84,4% | poids de tête linéaires |
ViT-L/14 distillé | 86,3% | poids de tête linéaires | |
ViT-L/14 distillé | ✅ | 86,5% | poids de tête linéaires |
ViT-g/14 | 86,5% | poids de tête linéaires | |
ViT-g/14 | ✅ | 87,0% | poids de tête linéaires |
Les performances des poids de modèle pré-entraînés fournis peuvent être évaluées comme suit sur ImageNet-1k :
python dinov2/run/eval/linear.py
--config-file dinov2/configs/eval/vitg14_pretrain.yaml
--pretrained-weights https://dl.fbaipublicfiles.com/dinov2/dinov2_vitg14/dinov2_vitg14_pretrain.pth
--train-dataset ImageNet:split=TRAIN:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
--val-dataset ImageNet:split=VAL:root= < PATH/TO/DATASET > :extra= < PATH/TO/DATASET >
Quelques cahiers sont fournis pour aider la communauté à exploiter les modèles et le code :
Le code DINov2 et les poids des modèles sont publiés sous la licence Apache 2.0. Voir LICENCE pour plus de détails.
Voir contribution et code de conduite.
Si vous trouvez ce référentiel utile, pensez à donner une étoile et une citation ? :
@misc{oquab2023dinov2,
title={DINOv2: Learning Robust Visual Features without Supervision},
author={Oquab, Maxime and Darcet, Timothée and Moutakanni, Theo and Vo, Huy V. and Szafraniec, Marc and Khalidov, Vasil and Fernandez, Pierre and Haziza, Daniel and Massa, Francisco and El-Nouby, Alaaeldin and Howes, Russell and Huang, Po-Yao and Xu, Hu and Sharma, Vasu and Li, Shang-Wen and Galuba, Wojciech and Rabbat, Mike and Assran, Mido and Ballas, Nicolas and Synnaeve, Gabriel and Misra, Ishan and Jegou, Herve and Mairal, Julien and Labatut, Patrick and Joulin, Armand and Bojanowski, Piotr},
journal={arXiv:2304.07193},
year={2023}
}
@misc{darcet2023vitneedreg,
title={Vision Transformers Need Registers},
author={Darcet, Timothée and Oquab, Maxime and Mairal, Julien and Bojanowski, Piotr},
journal={arXiv:2309.16588},
year={2023}
}