? [26-10-2023] Menambahkan tulang punggung DINOv2 dengan register, mengikuti Register Kebutuhan Vision Transformers.
Penelitian Meta AI, ADIL
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
]
Implementasi PyTorch dan model terlatih untuk DINOv2. Untuk detailnya, lihat makalah: DINOv2: Mempelajari Fitur Visual yang Kuat tanpa Pengawasan dan Transformator Visi Perlu Registrasi .
Model DINOv2 menghasilkan fitur visual berkinerja tinggi yang dapat langsung digunakan dengan pengklasifikasi sederhana seperti lapisan linier pada berbagai tugas visi komputer; fitur visual ini kuat dan berkinerja baik di seluruh domain tanpa memerlukan penyesuaian apa pun. Model tersebut dilatih sebelumnya pada kumpulan data 142 juta gambar tanpa menggunakan label atau anotasi apa pun.
model | # dari param | dengan register | GambarNet k-NN | GambarNet linier | unduh |
---|---|---|---|---|---|
ViT-S/14 disuling | 21 M | 79,0% | 81,1% | tulang punggung saja | |
ViT-S/14 disuling | 21 M | ✅ | 79,1% | 80,9% | tulang punggung saja |
ViT-B/14 disuling | 86M | 82,1% | 84,5% | tulang punggung saja | |
ViT-B/14 disuling | 86M | ✅ | 82,0% | 84,6% | tulang punggung saja |
ViT-L/14 disuling | 300M | 83,5% | 86,3% | tulang punggung saja | |
ViT-L/14 disuling | 300M | ✅ | 83,8% | 86,7% | tulang punggung saja |
ViT-g/14 | 1.100M | 83,5% | 86,5% | tulang punggung saja | |
ViT-g/14 | 1.100M | ✅ | 83,7% | 87,1% | tulang punggung saja |
Silakan ikuti petunjuk di sini untuk menginstal PyTorch (satu-satunya ketergantungan yang diperlukan untuk memuat model). Menginstal PyTorch dengan dukungan CUDA sangat disarankan.
Kartu model yang sesuai disertakan dalam repositori.
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' )
tulang punggung | dengan register | unduh |
---|---|---|
GambarNet | ||
ViT-S/14 disuling | kepala linier (1 lapisan, 4 lapisan) | |
ViT-S/14 disuling | ✅ | kepala linier (1 lapisan, 4 lapisan) |
ViT-B/14 disuling | kepala linier (1 lapisan, 4 lapisan) | |
ViT-B/14 disuling | ✅ | kepala linier (1 lapisan, 4 lapisan) |
ViT-L/14 disuling | kepala linier (1 lapisan, 4 lapisan) | |
ViT-L/14 disuling | ✅ | kepala linier (1 lapisan, 4 lapisan) |
ViT-g/14 | kepala linier (1 lapisan, 4 lapisan) | |
ViT-g/14 | ✅ | kepala linier (1 lapisan, 4 lapisan) |
Model pengklasifikasi (lengkap) dapat dimuat melalui 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' )
tulang punggung | unduh kepala | |
---|---|---|
NYUD | KITTI | |
ViT-S/14 disuling | linier (1 lapis, 4 lapis), DPT | linier (1 lapis, 4 lapis), DPT |
ViT-B/14 disuling | linier (1 lapis, 4 lapis), DPT | linier (1 lapis, 4 lapis), DPT |
ViT-L/14 disuling | linier (1 lapis, 4 lapis), DPT | linier (1 lapis, 4 lapis), DPT |
ViT-g/14 | linier (1 lapis, 4 lapis), DPT | linier (1 lapis, 4 lapis), DPT |
tulang punggung | model unduhan | unduh kepala | |
---|---|---|---|
ADE20K | ADE20K | VOC2012 | |
ViT-S/14 disuling | linier, multi-skala | linier, multi-skala | |
ViT-B/14 disuling | linier, multi-skala | linier, multi-skala | |
ViT-L/14 disuling | linier, multi-skala | linier, multi-skala | |
ViT-g/14 | Masker2Mantan | linier, multi-skala | linier, multi-skala |
Kode pelatihan dan evaluasi memerlukan PyTorch 2.0 dan xFormers 0.0.18 serta sejumlah paket pihak ketiga lainnya. Perhatikan bahwa kode tersebut hanya diuji dengan versi yang ditentukan dan juga mengharapkan lingkungan Linux. Untuk menyiapkan semua dependensi yang diperlukan untuk pelatihan dan evaluasi, ikuti petunjuk di bawah ini:
conda (Disarankan) - Mengkloning repositori lalu membuat dan mengaktifkan lingkungan conda dinov2
menggunakan definisi lingkungan yang disediakan:
conda env create -f conda.yaml
conda activate dinov2
pip - Kloning repositori dan kemudian gunakan requirements.txt
yang disediakan untuk menginstal dependensi:
pip install -r requirements.txt
Untuk tugas padat (estimasi kedalaman dan segmentasi semantik), terdapat dependensi tambahan (versi spesifik mmcv
dan mmsegmentation
) yang tercakup dalam spesifikasi dependensi extras
:
conda (Disarankan) :
conda env create -f conda-extras.yaml
conda activate dinov2-extras
pip :
pip install -r requirements.txt -r requirements-extras.txt
Direktori akar kumpulan data harus berisi konten berikut:
<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
Implementasi kumpulan data yang disediakan mengharapkan beberapa file metadata tambahan ada di bawah direktori tambahan:
<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
File metadata ini dapat dibuat (sekali) dengan baris kode Python berikut:
from dinov2 . data . datasets import ImageNet
for split in ImageNet . Split :
dataset = ImageNet ( split = split , root = "<ROOT>" , extra = "<EXTRA>" )
dataset . dump_extra ()
Perhatikan bahwa direktori root dan direktori tambahan tidak harus berupa direktori yang berbeda.
Harap sesuaikan kelas kumpulan data agar sesuai dengan pengaturan lokal Anda.
dinov2
harus disertakan dalam jalur pencarian modul Python, yaitu cukup awali perintah untuk dijalankan dengan PYTHONPATH=.
.
Jalankan pelatihan DINOv2 pada 4 node A100-80GB (32 GPU) di lingkungan cluster SLURM dengan 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 >
Waktu pelatihan kurang lebih 1 hari dan checkpoint yang dihasilkan harus mencapai 81,6% pada eval k-NN dan 82,9% pada eval linier.
Kode pelatihan menyimpan bobot guru di folder eval
setiap 12500 iterasi untuk evaluasi.
Jalankan pelatihan DINOv2 pada 12 node A100-80GB (96 GPU) di lingkungan cluster SLURM dengan 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 >
Waktu pelatihan kira-kira 3,3 hari dan checkpoint yang dihasilkan harus mencapai 82,0% pada eval k-NN dan 84,5% pada eval linier.
Kode pelatihan menyimpan bobot guru di folder eval
setiap 12500 iterasi untuk evaluasi.
Kode pelatihan secara teratur menyimpan bobot guru. Untuk mengevaluasi model, jalankan evaluasi berikut pada satu node:
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 >
Kami melepaskan bobot dari evaluasi model yang berbeda:
model | dengan register | GambarNet teratas-1 | evaluasi linier |
---|---|---|---|
ViT-S/14 disuling | 81,1% | bobot kepala linier | |
ViT-S/14 disuling | ✅ | 80,8% | bobot kepala linier |
ViT-B/14 disuling | 84,5% | bobot kepala linier | |
ViT-B/14 disuling | ✅ | 84,4% | bobot kepala linier |
ViT-L/14 disuling | 86,3% | bobot kepala linier | |
ViT-L/14 disuling | ✅ | 86,5% | bobot kepala linier |
ViT-g/14 | 86,5% | bobot kepala linier | |
ViT-g/14 | ✅ | 87,0% | bobot kepala linier |
Performa bobot model terlatih yang disediakan dapat dievaluasi sebagai berikut di 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 >
Beberapa buku catatan disediakan untuk membantu komunitas memanfaatkan model dan kode:
Kode DINOv2 dan bobot model dirilis di bawah Lisensi Apache 2.0. Lihat LISENSI untuk rincian tambahan.
Lihat berkontribusi dan kode etik.
Jika Anda merasa repositori ini bermanfaat, mohon pertimbangkan untuk memberikan bintang dan kutipan?:
@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}
}