? [2023-10-26] Vision Transformers Need Registers에 따라 레지스터가 있는 DINOv2 백본을 추가했습니다.
메타 AI 연구, FAIR
막심 오쿠압, 티모시 다르셋, 테오 무타카니, 위이 V. 보, 마크 샤프라니에츠, 바실 칼리도프, 패트릭 라바투트, 아르망 주랭, 표트르 보야노프스키
[ Paper #1
] Paper #2
] [ Blog
] [ Demo
] [ BibTeX
]
DINOv2용 PyTorch 구현 및 사전 훈련된 모델. 자세한 내용은 DINOv2: Learning Robust Visual Features Without Supervision and Vision Transformers Need Registers 문서를 참조하세요.
DINOv2 모델은 다양한 컴퓨터 비전 작업에서 선형 레이어만큼 간단한 분류기와 함께 직접 사용할 수 있는 고성능 시각적 기능을 생성합니다. 이러한 시각적 기능은 강력하며 미세 조정 요구 사항 없이 여러 도메인에서 잘 작동합니다. 모델은 라벨이나 주석을 사용하지 않고 142M 이미지 데이터 세트에서 사전 학습되었습니다.
모델 | # 의 매개변수 | ~와 함께 레지스터 | 이미지넷 k-NN | 이미지넷 선의 | 다운로드 |
---|---|---|---|---|---|
ViT-S/14 증류 | 21M | 79.0% | 81.1% | 백본만 | |
ViT-S/14 증류 | 21M | ✅ | 79.1% | 80.9% | 백본만 |
ViT-B/14 증류 | 86M | 82.1% | 84.5% | 백본만 | |
ViT-B/14 증류 | 86M | ✅ | 82.0% | 84.6% | 백본만 |
ViT-L/14 증류수 | 300M | 83.5% | 86.3% | 백본만 | |
ViT-L/14 증류수 | 300M | ✅ | 83.8% | 86.7% | 백본만 |
ViT-g/14 | 1,100M | 83.5% | 86.5% | 백본만 | |
ViT-g/14 | 1,100M | ✅ | 83.7% | 87.1% | 백본만 |
PyTorch(모델을 로드하는 데 필요한 유일한 종속성)를 설치하려면 여기 지침을 따르십시오. CUDA를 지원하는 PyTorch를 설치하는 것이 좋습니다.
해당 모델 카드가 저장소에 포함되어 있습니다.
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' )
등뼈 | ~와 함께 레지스터 | 다운로드 |
---|---|---|
이미지넷 | ||
ViT-S/14 증류 | 리니어 헤드(1레이어, 4레이어) | |
ViT-S/14 증류 | ✅ | 리니어 헤드(1레이어, 4레이어) |
ViT-B/14 증류 | 리니어 헤드(1레이어, 4레이어) | |
ViT-B/14 증류 | ✅ | 리니어 헤드(1레이어, 4레이어) |
ViT-L/14 증류수 | 리니어 헤드(1레이어, 4레이어) | |
ViT-L/14 증류수 | ✅ | 리니어 헤드(1레이어, 4레이어) |
ViT-g/14 | 리니어 헤드(1레이어, 4레이어) | |
ViT-g/14 | ✅ | 리니어 헤드(1레이어, 4레이어) |
(전체) 분류자 모델은 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' )
등뼈 | 다운로드 헤드 | |
---|---|---|
뉴욕대학교 | 키티 | |
ViT-S/14 증류 | 선형(1레이어, 4레이어), DPT | 선형(1레이어, 4레이어), DPT |
ViT-B/14 증류 | 선형(1레이어, 4레이어), DPT | 선형(1레이어, 4레이어), DPT |
ViT-L/14 증류수 | 선형(1레이어, 4레이어), DPT | 선형(1레이어, 4레이어), DPT |
ViT-g/14 | 선형(1레이어, 4레이어), DPT | 선형(1레이어, 4레이어), DPT |
등뼈 | 모델 다운로드 | 다운로드 헤드 | |
---|---|---|---|
ADE20K | ADE20K | VOC2012 | |
ViT-S/14 증류 | 선형, 다중 규모 | 선형, 다중 규모 | |
ViT-B/14 증류 | 선형, 다중 규모 | 선형, 다중 규모 | |
ViT-L/14 증류수 | 선형, 다중 규모 | 선형, 다중 규모 | |
ViT-g/14 | 마스크2이전 | 선형, 다중 규모 | 선형, 다중 규모 |
교육 및 평가 코드에는 PyTorch 2.0, xFormers 0.0.18 및 기타 여러 타사 패키지가 필요합니다. 코드는 지정된 버전에서만 테스트되었으며 Linux 환경도 예상됩니다. 훈련 및 평가에 필요한 모든 종속성을 설정하려면 아래 지침을 따르십시오.
conda (권장) - 리포지토리를 복제한 다음 제공된 환경 정의를 사용하여 dinov2
conda 환경을 만들고 활성화합니다.
conda env create -f conda.yaml
conda activate dinov2
pip - 저장소를 복제한 다음 제공된 requirements.txt
사용하여 종속성을 설치합니다.
pip install -r requirements.txt
밀도가 높은 작업(깊이 추정 및 의미론적 분할)의 경우 extras
종속성 사양에 캡처되는 추가 종속성( mmcv
및 mmsegmentation
의 특정 버전)이 있습니다.
콘다 (권장) :
conda env create -f conda-extras.yaml
conda activate dinov2-extras
핍 :
pip install -r requirements.txt -r requirements-extras.txt
데이터세트의 루트 디렉터리에는 다음 콘텐츠가 포함되어야 합니다.
<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
제공된 데이터 세트 구현에서는 추가 디렉터리 아래에 몇 가지 추가 메타데이터 파일이 있을 것으로 예상합니다.
<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
이러한 메타데이터 파일은 다음 Python 코드 줄을 사용하여 한 번 생성할 수 있습니다.
from dinov2 . data . datasets import ImageNet
for split in ImageNet . Split :
dataset = ImageNet ( split = split , root = "<ROOT>" , extra = "<EXTRA>" )
dataset . dump_extra ()
루트 및 추가 디렉터리가 서로 다른 디렉터리일 필요는 없습니다.
로컬 설정에 맞게 데이터세트 클래스를 조정하세요.
dinov2
패키지가 Python 모듈 검색 경로에 포함되어야 합니다. 즉, 실행할 명령 앞에 PYTHONPATH=.
.
submitit을 사용하여 SLURM 클러스터 환경에서 A100-80GB 노드 4개(GPU 32개)에 대해 DINOv2 교육을 실행합니다.
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 >
학습 시간은 약 1일이며 결과 체크포인트는 k-NN 평가에서 81.6%, 선형 평가에서 82.9%에 도달해야 합니다.
훈련 코드는 평가를 위해 12500회 반복마다 교사의 가중치를 eval
폴더에 저장합니다.
submitit을 사용하여 SLURM 클러스터 환경에서 A100-80GB 노드 12개(GPU 96개)에 대해 DINOv2 교육을 실행합니다.
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 >
훈련 시간은 약 3.3일이며 결과 체크포인트는 k-NN 평가에서 82.0%, 선형 평가에서 84.5%에 도달해야 합니다.
훈련 코드는 평가를 위해 12500회 반복마다 교사의 가중치를 eval
폴더에 저장합니다.
훈련 코드는 정기적으로 교사 가중치를 저장합니다. 모델을 평가하려면 단일 노드에서 다음 평가를 실행하세요.
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 >
다양한 모델 평가에서 가중치를 해제합니다.
모델 | ~와 함께 레지스터 | 이미지넷 탑-1 | 선형 평가 |
---|---|---|---|
ViT-S/14 증류 | 81.1% | 선형 헤드 웨이트 | |
ViT-S/14 증류 | ✅ | 80.8% | 선형 헤드 웨이트 |
ViT-B/14 증류 | 84.5% | 선형 헤드 웨이트 | |
ViT-B/14 증류 | ✅ | 84.4% | 선형 헤드 웨이트 |
ViT-L/14 증류수 | 86.3% | 선형 헤드 웨이트 | |
ViT-L/14 증류수 | ✅ | 86.5% | 선형 헤드 웨이트 |
ViT-g/14 | 86.5% | 선형 헤드 웨이트 | |
ViT-g/14 | ✅ | 87.0% | 선형 헤드 웨이트 |
제공된 사전 훈련된 모델 가중치의 성능은 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 >
커뮤니티가 모델과 코드를 활용할 수 있도록 몇 가지 노트북이 제공됩니다.
DINOv2 코드 및 모델 가중치는 Apache License 2.0에 따라 릴리스됩니다. 자세한 내용은 라이선스를 참조하세요.
기여 및 행동 강령을 참조하세요.
이 저장소가 유용하다고 생각되면 별표와 인용을 고려해 보십시오.
@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}
}