? [26.10.2023] DINOv2-Backbones mit Registern hinzugefügt, entsprechend Vision Transformers Need Registers.
Meta-KI-Forschung, 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
]
PyTorch-Implementierung und vorab trainierte Modelle für DINOv2. Einzelheiten finden Sie in den Artikeln: DINOv2: Learning Robust Visual Features without Supervision und Vision Transformers Need Registers .
DINOv2-Modelle erzeugen leistungsstarke visuelle Funktionen, die direkt mit einfachen Klassifikatoren wie linearen Schichten für eine Vielzahl von Computer-Vision-Aufgaben eingesetzt werden können; Diese visuellen Funktionen sind robust und funktionieren domänenübergreifend gut, ohne dass eine Feinabstimmung erforderlich ist. Die Modelle wurden anhand eines Datensatzes von 142 Millionen Bildern vorab trainiert, ohne dass Beschriftungen oder Anmerkungen verwendet wurden.
Modell | # von Parameter | mit registriert | ImageNet k-NN | ImageNet linear | herunterladen |
---|---|---|---|---|---|
ViT-S/14 destilliert | 21 M | 79,0 % | 81,1 % | Nur Rückgrat | |
ViT-S/14 destilliert | 21 M | ✅ | 79,1 % | 80,9 % | Nur Rückgrat |
ViT-B/14 destilliert | 86 Mio | 82,1 % | 84,5 % | Nur Rückgrat | |
ViT-B/14 destilliert | 86 Mio | ✅ | 82,0 % | 84,6 % | Nur Rückgrat |
ViT-L/14 destilliert | 300 Mio | 83,5 % | 86,3 % | Nur Rückgrat | |
ViT-L/14 destilliert | 300 Mio | ✅ | 83,8 % | 86,7 % | Nur Rückgrat |
ViT-g/14 | 1.100 Mio | 83,5 % | 86,5 % | Nur Rückgrat | |
ViT-g/14 | 1.100 Mio | ✅ | 83,7 % | 87,1 % | Nur Rückgrat |
Bitte folgen Sie den Anweisungen hier, um PyTorch zu installieren (die einzige erforderliche Abhängigkeit zum Laden des Modells). Die Installation von PyTorch mit CUDA-Unterstützung wird dringend empfohlen.
Eine entsprechende Modellkarte ist im Repository enthalten.
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' )
Rückgrat | mit registriert | herunterladen |
---|---|---|
ImageNet | ||
ViT-S/14 destilliert | Linearkopf (1 Lage, 4 Lagen) | |
ViT-S/14 destilliert | ✅ | Linearkopf (1 Lage, 4 Lagen) |
ViT-B/14 destilliert | Linearkopf (1 Lage, 4 Lagen) | |
ViT-B/14 destilliert | ✅ | Linearkopf (1 Lage, 4 Lagen) |
ViT-L/14 destilliert | Linearkopf (1 Lage, 4 Lagen) | |
ViT-L/14 destilliert | ✅ | Linearkopf (1 Lage, 4 Lagen) |
ViT-g/14 | Linearkopf (1 Lage, 4 Lagen) | |
ViT-g/14 | ✅ | Linearkopf (1 Lage, 4 Lagen) |
Die (vollständigen) Klassifikatormodelle können über PyTorch Hub geladen werden:
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' )
Rückgrat | Kopf herunterladen | |
---|---|---|
NYUd | KITTI | |
ViT-S/14 destilliert | linear (1 Schicht, 4 Schichten), DPT | linear (1 Schicht, 4 Schichten), DPT |
ViT-B/14 destilliert | linear (1 Schicht, 4 Schichten), DPT | linear (1 Schicht, 4 Schichten), DPT |
ViT-L/14 destilliert | linear (1 Schicht, 4 Schichten), DPT | linear (1 Schicht, 4 Schichten), DPT |
ViT-g/14 | linear (1 Schicht, 4 Schichten), DPT | linear (1 Schicht, 4 Schichten), DPT |
Rückgrat | Modell herunterladen | Kopf herunterladen | |
---|---|---|---|
ADE20K | ADE20K | VOC2012 | |
ViT-S/14 destilliert | linear, mehrskalig | linear, mehrskalig | |
ViT-B/14 destilliert | linear, mehrskalig | linear, mehrskalig | |
ViT-L/14 destilliert | linear, mehrskalig | linear, mehrskalig | |
ViT-g/14 | Mask2Former | linear, mehrskalig | linear, mehrskalig |
Der Trainings- und Evaluierungscode erfordert PyTorch 2.0 und xFormers 0.0.18 sowie eine Reihe anderer Pakete von Drittanbietern. Beachten Sie, dass der Code nur mit den angegebenen Versionen getestet wurde und auch eine Linux-Umgebung erwartet. Um alle erforderlichen Abhängigkeiten für Training und Evaluierung einzurichten, befolgen Sie bitte die folgenden Anweisungen:
conda (empfohlen) – Klonen Sie das Repository und erstellen und aktivieren Sie dann eine dinov2
Conda-Umgebung mithilfe der bereitgestellten Umgebungsdefinition:
conda env create -f conda.yaml
conda activate dinov2
pip – Klonen Sie das Repository und verwenden Sie dann die bereitgestellte requirements.txt
, um die Abhängigkeiten zu installieren:
pip install -r requirements.txt
Für dichte Aufgaben (Tiefenschätzung und semantische Segmentierung) gibt es zusätzliche Abhängigkeiten (spezifische Versionen von mmcv
und mmsegmentation
), die in den extras
Abhängigkeitsspezifikationen erfasst werden:
conda (empfohlen) :
conda env create -f conda-extras.yaml
conda activate dinov2-extras
Pip :
pip install -r requirements.txt -r requirements-extras.txt
Das Stammverzeichnis des Datensatzes sollte den folgenden Inhalt enthalten:
<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
Die bereitgestellte Datensatzimplementierung erwartet, dass einige zusätzliche Metadatendateien im zusätzlichen Verzeichnis vorhanden sind:
<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
Diese Metadatendateien können (einmalig) mit den folgenden Zeilen Python-Code generiert werden:
from dinov2 . data . datasets import ImageNet
for split in ImageNet . Split :
dataset = ImageNet ( split = split , root = "<ROOT>" , extra = "<EXTRA>" )
dataset . dump_extra ()
Beachten Sie, dass das Stammverzeichnis und das Zusatzverzeichnis keine unterschiedlichen Verzeichnisse sein müssen.
Bitte passen Sie die Datensatzklasse an Ihre lokale Einrichtung an.
dinov2
Paket im Suchpfad des Python-Moduls enthalten sein, dh dem auszuführenden Befehl einfach PYTHONPATH=.
.
Führen Sie das DINOv2-Training auf 4 A100-80GB-Knoten (32 GPUs) in einer SLURM-Clusterumgebung mit commitit aus:
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 >
Die Trainingszeit beträgt etwa 1 Tag und der resultierende Prüfpunkt sollte 81,6 % bei der k-NN-Bewertung und 82,9 % bei der linearen Bewertung erreichen.
Der Trainingscode speichert die Gewichtungen des Lehrers alle 12.500 Iterationen zur Auswertung im eval
-Ordner.
Führen Sie das DINOv2-Training auf 12 A100-80GB-Knoten (96 GPUs) in einer SLURM-Clusterumgebung mit „submitit“ durch:
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 >
Die Trainingszeit beträgt ungefähr 3,3 Tage und der resultierende Prüfpunkt sollte 82,0 % bei der k-NN-Bewertung und 84,5 % bei der linearen Bewertung erreichen.
Der Trainingscode speichert die Gewichtungen des Lehrers alle 12.500 Iterationen zur Auswertung im eval
-Ordner.
Der Trainingscode speichert regelmäßig die Lehrergewichte. Um das Modell auszuwerten, führen Sie die folgende Auswertung auf einem einzelnen Knoten durch:
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 >
Wir geben die Gewichte aus der Bewertung der verschiedenen Modelle frei:
Modell | mit registriert | ImageNet Top-1 | lineare Auswertung |
---|---|---|---|
ViT-S/14 destilliert | 81,1 % | lineare Kopfgewichte | |
ViT-S/14 destilliert | ✅ | 80,8 % | lineare Kopfgewichte |
ViT-B/14 destilliert | 84,5 % | lineare Kopfgewichte | |
ViT-B/14 destilliert | ✅ | 84,4 % | lineare Kopfgewichte |
ViT-L/14 destilliert | 86,3 % | lineare Kopfgewichte | |
ViT-L/14 destilliert | ✅ | 86,5 % | lineare Kopfgewichte |
ViT-g/14 | 86,5 % | lineare Kopfgewichte | |
ViT-g/14 | ✅ | 87,0 % | lineare Kopfgewichte |
Die Leistung der bereitgestellten vorab trainierten Modellgewichte kann auf ImageNet-1k wie folgt bewertet werden:
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 >
Um der Community bei der Nutzung der Modelle und des Codes zu helfen, werden einige Notebooks bereitgestellt:
DINOv2-Code und Modellgewichte werden unter der Apache-Lizenz 2.0 veröffentlicht. Weitere Einzelheiten finden Sie unter LIZENZ.
Siehe Beiträge und Verhaltenskodex.
Wenn Sie dieses Repository nützlich finden, denken Sie bitte darüber nach, einen Stern zu vergeben und zu zitieren?:
@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}
}