? [2023-10-26] Se agregaron redes troncales DINOv2 con registros, siguiendo los registros de necesidad de Vision Transformers.
Investigación de Meta AI, FAIR
Maxime Oquab, Timothée Darcet, Théo Moutakani, Huy V. Vo, Marc Szafraniec, Vasil Khalidov, Patrick Labatut, Armand Joulin, Piotr Bojanowski
[ Paper #1
] Paper #2
] [ Blog
] [ Demo
] [ BibTeX
]
Implementación de PyTorch y modelos previamente entrenados para DINOv2. Para obtener más información, consulte los artículos: DINOv2: Aprendizaje de funciones visuales robustas sin supervisión y transformadores de visión que necesitan registros .
Los modelos DINOV2 producen características visuales de alto rendimiento que pueden emplearse directamente con clasificadores tan simples como capas lineales en una variedad de tareas de visión por computadora; Estas características visuales son sólidas y funcionan bien en todos los dominios sin necesidad de realizar ajustes. Los modelos se entrenaron previamente en un conjunto de datos de 142 millones de imágenes sin utilizar etiquetas ni anotaciones.
modelo | # de parámetros | con registros | ImagenNet k-NN | ImagenNet lineal | descargar |
---|---|---|---|---|---|
ViT-S/14 destilado | 21M | 79,0% | 81,1% | solo columna vertebral | |
ViT-S/14 destilado | 21M | ✅ | 79,1% | 80,9% | solo columna vertebral |
ViT-B/14 destilado | 86 millones | 82,1% | 84,5% | solo columna vertebral | |
ViT-B/14 destilado | 86 millones | ✅ | 82,0% | 84,6% | solo columna vertebral |
ViT-L/14 destilado | 300M | 83,5% | 86,3% | solo columna vertebral | |
ViT-L/14 destilado | 300M | ✅ | 83,8% | 86,7% | solo columna vertebral |
ViT-g/14 | 1.100 millones | 83,5% | 86,5% | solo columna vertebral | |
ViT-g/14 | 1.100 millones | ✅ | 83,7% | 87,1% | solo columna vertebral |
Siga las instrucciones aquí para instalar PyTorch (la única dependencia requerida para cargar el modelo). Se recomienda encarecidamente instalar PyTorch con soporte CUDA.
En el repositorio se incluye una tarjeta modelo correspondiente.
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' )
columna vertebral | con registros | descargar |
---|---|---|
ImagenNet | ||
ViT-S/14 destilado | cabeza lineal (1 capa, 4 capas) | |
ViT-S/14 destilado | ✅ | cabeza lineal (1 capa, 4 capas) |
ViT-B/14 destilado | cabeza lineal (1 capa, 4 capas) | |
ViT-B/14 destilado | ✅ | cabeza lineal (1 capa, 4 capas) |
ViT-L/14 destilado | cabeza lineal (1 capa, 4 capas) | |
ViT-L/14 destilado | ✅ | cabeza lineal (1 capa, 4 capas) |
ViT-g/14 | cabeza lineal (1 capa, 4 capas) | |
ViT-g/14 | ✅ | cabeza lineal (1 capa, 4 capas) |
Los modelos de clasificador (completos) se pueden cargar a través de 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' )
columna vertebral | descargar cabeza | |
---|---|---|
Universidad de Nueva York | KITTI | |
ViT-S/14 destilado | lineal (1 capa, 4 capas), DPT | lineal (1 capa, 4 capas), DPT |
ViT-B/14 destilado | lineal (1 capa, 4 capas), DPT | lineal (1 capa, 4 capas), DPT |
ViT-L/14 destilado | lineal (1 capa, 4 capas), DPT | lineal (1 capa, 4 capas), DPT |
ViT-g/14 | lineal (1 capa, 4 capas), DPT | lineal (1 capa, 4 capas), DPT |
columna vertebral | descargar modelo | descargar cabeza | |
---|---|---|---|
ADE20K | ADE20K | COV2012 | |
ViT-S/14 destilado | lineal, multiescala | lineal, multiescala | |
ViT-B/14 destilado | lineal, multiescala | lineal, multiescala | |
ViT-L/14 destilado | lineal, multiescala | lineal, multiescala | |
ViT-g/14 | Mask2Ex | lineal, multiescala | lineal, multiescala |
El código de capacitación y evaluación requiere PyTorch 2.0 y xFormers 0.0.18, así como otros paquetes de terceros. Tenga en cuenta que el código sólo se ha probado con las versiones especificadas y también espera un entorno Linux. Para configurar todas las dependencias necesarias para la capacitación y la evaluación, siga las instrucciones a continuación:
conda (recomendado) : clona el repositorio y luego crea y activa un entorno conda dinov2
utilizando la definición de entorno proporcionada:
conda env create -f conda.yaml
conda activate dinov2
pip : clona el repositorio y luego usa el requirements.txt
proporcionado para instalar las dependencias:
pip install -r requirements.txt
Para tareas densas (estimación de profundidad y segmentación semántica), existen dependencias adicionales (versiones específicas de mmcv
y mmsegmentation
) que se capturan en las especificaciones de dependencia extras
:
conda (recomendado) :
conda env create -f conda-extras.yaml
conda activate dinov2-extras
pipa :
pip install -r requirements.txt -r requirements-extras.txt
El directorio raíz del conjunto de datos debe contener el siguiente contenido:
<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
La implementación del conjunto de datos proporcionada espera que algunos archivos de metadatos adicionales estén presentes en el directorio adicional:
<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
Estos archivos de metadatos se pueden generar (una vez) con las siguientes líneas de código Python:
from dinov2 . data . datasets import ImageNet
for split in ImageNet . Split :
dataset = ImageNet ( split = split , root = "<ROOT>" , extra = "<EXTRA>" )
dataset . dump_extra ()
Tenga en cuenta que los directorios raíz y adicional no tienen por qué ser directorios distintos.
Adapte la clase del conjunto de datos para que coincida con su configuración local.
dinov2
debe incluirse en la ruta de búsqueda del módulo Python, es decir, simplemente anteponga el comando a ejecutar con PYTHONPATH=.
.
Ejecute el entrenamiento DINOv2 en 4 nodos A100-80 GB (32 GPU) en un entorno de clúster SLURM con 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 >
El tiempo de entrenamiento es de aproximadamente 1 día y el punto de control resultante debería alcanzar el 81,6 % en la evaluación k-NN y el 82,9 % en la evaluación lineal.
El código de entrenamiento guarda los pesos del profesor en la carpeta eval
cada 12500 iteraciones para su evaluación.
Ejecute el entrenamiento DINOv2 en 12 nodos A100-80 GB (96 GPU) en un entorno de clúster SLURM con 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 >
El tiempo de entrenamiento es de aproximadamente 3,3 días y el punto de control resultante debería alcanzar el 82,0 % en la evaluación k-NN y el 84,5 % en la evaluación lineal.
El código de entrenamiento guarda los pesos del profesor en la carpeta eval
cada 12500 iteraciones para su evaluación.
El código de formación ahorra periódicamente el peso de los profesores. Para evaluar el modelo, ejecute la siguiente evaluación en un solo nodo:
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 >
Liberamos los pesos de evaluar los diferentes modelos:
modelo | con registros | ImagenNet top-1 | evaluación lineal |
---|---|---|---|
ViT-S/14 destilado | 81,1% | pesos de cabeza lineales | |
ViT-S/14 destilado | ✅ | 80,8% | pesos de cabeza lineales |
ViT-B/14 destilado | 84,5% | pesos de cabeza lineales | |
ViT-B/14 destilado | ✅ | 84,4% | pesos de cabeza lineales |
ViT-L/14 destilado | 86,3% | pesos de cabeza lineales | |
ViT-L/14 destilado | ✅ | 86,5% | pesos de cabeza lineales |
ViT-g/14 | 86,5% | pesos de cabeza lineales | |
ViT-g/14 | ✅ | 87,0% | pesos de cabeza lineales |
El rendimiento de los pesos del modelo previamente entrenado proporcionado se puede evaluar de la siguiente manera en 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 >
Se proporcionan algunos cuadernos para ayudar a la comunidad a aprovechar los modelos y el código:
El código DINOV2 y los pesos de los modelos se publican bajo la licencia Apache 2.0. Consulte LICENCIA para obtener detalles adicionales.
Ver contribución y código de conducta.
Si encuentra útil este repositorio, considere dar una estrella y una cita:
@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}
}