? [2023-10-26] Добавлены магистральные сети DINOv2 с регистрами вслед за регистрами, необходимыми для Vision Transformers.
Мета-исследование искусственного интеллекта, FAIR
Максим Окуаб, Тимоти Дарсе, Тео Мутаканни, Уи В. Во, Марк Шафранец, Василь Халидов, Патрик Лабатю, Арман Жулен, Петр Бояновский
[ Paper #1
] Paper #2
] [ Blog
] [ Demo
] [ BibTeX
]
Реализация PyTorch и предварительно обученные модели для DINOv2. Подробности см. в статьях: DINOv2: Обучение надежным визуальным функциям без надзора и Регистры необходимости преобразователей зрения .
Модели DINOv2 обеспечивают высокопроизводительные визуальные функции, которые можно напрямую использовать с такими простыми классификаторами, как линейные слои, в различных задачах компьютерного зрения; эти визуальные функции надежны и хорошо работают в разных областях без необходимости тонкой настройки. Модели были предварительно обучены на наборе данных из 142 миллионов изображений без использования каких-либо меток или аннотаций.
модель | # из параметры | с регистрирует | ImageNet к-НН | ImageNet линейный | скачать |
---|---|---|---|---|---|
ВиТ-С/14 дистиллированный | 21 М | 79,0% | 81,1% | только магистраль | |
ВиТ-С/14 дистиллированный | 21 М | ✅ | 79,1% | 80,9% | только магистраль |
ВиТ-Б/14 дистиллированный | 86 М | 82,1% | 84,5% | только магистраль | |
ВиТ-Б/14 дистиллированный | 86 М | ✅ | 82,0% | 84,6% | только магистраль |
ВиТ-Л/14 дистиллированный | 300 М | 83,5% | 86,3% | только магистраль | |
ВиТ-Л/14 дистиллированный | 300 М | ✅ | 83,8% | 86,7% | только магистраль |
ВИТ-г/14 | 1100 М | 83,5% | 86,5% | только магистраль | |
ВИТ-г/14 | 1100 М | ✅ | 83,7% | 87,1% | только магистраль |
Следуйте инструкциям здесь, чтобы установить PyTorch (единственная необходимая зависимость для загрузки модели). Настоятельно рекомендуется установить PyTorch с поддержкой CUDA.
Соответствующая карточка модели включена в репозиторий.
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' )
позвоночник | с регистрирует | скачать |
---|---|---|
ImageNet | ||
ВиТ-С/14 дистиллированный | линейная головка (1 слой, 4 слоя) | |
ВиТ-С/14 дистиллированный | ✅ | линейная головка (1 слой, 4 слоя) |
ВиТ-Б/14 дистиллированный | линейная головка (1 слой, 4 слоя) | |
ВиТ-Б/14 дистиллированный | ✅ | линейная головка (1 слой, 4 слоя) |
ВиТ-Л/14 дистиллированный | линейная головка (1 слой, 4 слоя) | |
ВиТ-Л/14 дистиллированный | ✅ | линейная головка (1 слой, 4 слоя) |
ВИТ-г/14 | линейная головка (1 слой, 4 слоя) | |
ВИТ-г/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' )
позвоночник | скачать голову | |
---|---|---|
Нью-Йоркский университет | КИТТИ | |
ВиТ-С/14 дистиллированный | линейный (1 слой, 4 слоя), DPT | линейный (1 слой, 4 слоя), DPT |
ВиТ-Б/14 дистиллированный | линейный (1 слой, 4 слоя), DPT | линейный (1 слой, 4 слоя), DPT |
ВиТ-Л/14 дистиллированный | линейный (1 слой, 4 слоя), DPT | линейный (1 слой, 4 слоя), DPT |
ВИТ-г/14 | линейный (1 слой, 4 слоя), DPT | линейный (1 слой, 4 слоя), DPT |
позвоночник | скачать модель | скачать голову | |
---|---|---|---|
АДЭ20К | АДЭ20К | ЛОС2012 | |
ВиТ-С/14 дистиллированный | линейный, многомасштабный | линейный, многомасштабный | |
ВиТ-Б/14 дистиллированный | линейный, многомасштабный | линейный, многомасштабный | |
ВиТ-Л/14 дистиллированный | линейный, многомасштабный | линейный, многомасштабный | |
ВИТ-г/14 | Маска2Бывший | линейный, многомасштабный | линейный, многомасштабный |
Для кода обучения и оценки требуются PyTorch 2.0 и xFormers 0.0.18, а также ряд других сторонних пакетов. Обратите внимание, что код был протестирован только с указанными версиями, а также для среды Linux. Чтобы настроить все необходимые зависимости для обучения и оценки, следуйте инструкциям ниже:
conda (рекомендуется) — клонируйте репозиторий, а затем создайте и активируйте среду conda dinov2
, используя предоставленное определение среды:
conda env create -f conda.yaml
conda activate dinov2
pip — клонируйте репозиторий, а затем используйте предоставленный файл requirements.txt
для установки зависимостей:
pip install -r requirements.txt
Для плотных задач (оценка глубины и семантическая сегментация) существуют дополнительные зависимости (конкретные версии mmcv
и mmsegmentation
), которые фиксируются в спецификациях extras
зависимостей:
Конда (рекомендуется) :
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=.
.
Запустите обучение DINOv2 на 4 узлах A100-80 ГБ (32 графических процессора) в кластерной среде SLURM с помощью 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 >
Время обучения составляет примерно 1 день, и итоговая контрольная точка должна достичь 81,6% при оценке k-NN и 82,9% при линейной оценке.
Код обучения сохраняет веса учителя в папке eval
каждые 12500 итераций для оценки.
Запустите обучение DINOv2 на 12 узлах A100-80GB (96 графических процессоров) в кластерной среде SLURM с помощью 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 >
Время обучения составляет примерно 3,3 дня, и итоговая контрольная точка должна достичь 82,0% при оценке k-NN и 84,5% при линейной оценке.
Код обучения сохраняет веса учителя в папке eval
каждые 12500 итераций для оценки.
В обучающем коде регулярно сохраняются веса учителя. Чтобы оценить модель, запустите следующую оценку на одном узле:
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 >
Мы освобождаем вес от оценки различных моделей:
модель | с регистрирует | ImageNet топ-1 | линейная оценка |
---|---|---|---|
ВиТ-С/14 дистиллированный | 81,1% | линейные головные грузы | |
ВиТ-С/14 дистиллированный | ✅ | 80,8% | линейные головные грузы |
ВиТ-Б/14 дистиллированный | 84,5% | линейные головные грузы | |
ВиТ-Б/14 дистиллированный | ✅ | 84,4% | линейные головные грузы |
ВиТ-Л/14 дистиллированный | 86,3% | линейные головные грузы | |
ВиТ-Л/14 дистиллированный | ✅ | 86,5% | линейные головные грузы |
ВИТ-г/14 | 86,5% | линейные головные грузы | |
ВИТ-г/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 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}
}