DINOv2
DINOv2 è un vision transformer autosupervisionato addestrato da Meta AI per produrre feature di immagine generiche senza etichette. LibreYOLO incapsula il suo backbone DINOv2-with-Registers per tre task: segmentazione semantica, classificazione ed embedding dell'immagine intera.
- Task
- semantic, classify, embed
- Dimensioni
- n, s, m, l at 518 px
- Installa
pip install libreyolo- Livello di supporto
- Supportato, dalla v. Modelli addestrabili di supporto: mantenuti funzionanti nella CI, ricevono nuove funzionalità quando possibile.
- Licenze
- Codice MIT, pesi Apache-2.0. Uso commerciale
Installazione
LibreDINOv2 si registra solo quando transformers è installato, la stessa
dipendenza opzionale che serve a RF-DETR per il suo backbone DINOv2, quindi
richiede lo stesso extra.
pip install "libreyolo[rfdetr]"Predizione
LibreYOLO non pubblica nessun checkpoint LibreDINOv2. Costruisci il wrapper
direttamente invece di caricare un file: model_path=None (il valore
predefinito) scarica al primo utilizzo il backbone Apache-2.0
facebook/dinov2-with-registers-small di Meta da Hugging Face. task=
seleziona che cosa gira sopra di esso.
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Per questa famiglia non esiste nessun checkpoint ospitato da# LibreYOLO: questo scarica il backbone Apache-2.0# DINOv2-with-Registers-small dall'org Hugging Face di Meta. La testa# densa parte da un'inizializzazione casuale finché non la addestri# (vedi Addestramento più sotto).model = LibreDINOv2(size="s", task="semantic", nb_classes=19)result = model(SAMPLE_IMAGE) mask = result.semantic_maskprint(mask.data.shape, mask.classes)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # nb_classes= è il numero di classi del tuo dataset; la testa lineare# parte da un'inizializzazione casuale finché non la addestri.model = LibreDINOv2(size="s", task="classify", nb_classes=10)result = model(SAMPLE_IMAGE) print(result.probs.top1, result.probs.top1conf)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Salta tutte le teste di task: basta il backbone da solo, quindi non# serve nessun fine-tuning perché sia utile.model = LibreDINOv2(size="s", task="embed")result = model(SAMPLE_IMAGE) print(result.embeddings.data.shape) # (1, D), normalizzato L2from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed") # Wrapper di comodo: esegue predict() e impila ogni riga in un unico# tensore (N, D).features = model.embed(["a.jpg", "b.jpg", "c.jpg"])print(features.shape)task="semantic" e task="classify" aggiungono una testa densa o lineare
sopra il backbone; quella testa è inizializzata in modo casuale ed è utile solo
dopo che l'hai addestrata (vedi Addestramento). task="embed" salta
tutte le teste e restituisce il token CLS finale normalizzato del backbone come
un'unica riga per l'immagine intera in result.embeddings, quindi non ha
bisogno di nessun addestramento. result.boxes è sempre None: nessuno dei
tre task produce rilevamenti per istanza. Vedi predizione per
sorgenti, streaming e gestione dei risultati.
Varianti
size seleziona la larghezza del proiettore in stile RF-DETR sovrapposto al
backbone, non il backbone stesso: tutte le dimensioni condividono lo stesso
encoder DINOv2-S (small). La segmentazione semantica gira alla griglia di patch
quadrata nativa di DINOv2; la classificazione e l'embedding girano alla
risoluzione di classificazione, più piccola, usata per addestrare il linear
probe.
Addestramento
task="semantic" e task="classify" si addestrano entrambi; task="embed"
non ha nessuna testa dipendente dalle classi da adattare e solleva
NotImplementedError se ci chiami train() sopra.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train( data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4, device="0,1",)Gli argomenti a parola chiave principali qui sono batch_size e lr, non
batch e lr0 usati dalla maggior parte delle altre famiglie; batch e lr0
sono ancora accettati e mappati su di essi, ma passarli entrambi solleva un
errore di conflitto. output_dir= (predefinito "runs/train") sostituisce
project=/name= come modo principale per collocare un'esecuzione, anche se
passare project=/name= direttamente continua a funzionare. Vedi
addestramento per dataset, data augmentation, multi-GPU e
logger.
Validazione
val() restituisce un dizionario di chiavi metrics/: mIoU e accuratezza per
pixel per task="semantic", accuratezza top-1 e top-5 per task="classify".
task="embed" non ha nessun ground truth con cui misurarsi e solleva
NotImplementedError se ci chiami val() sopra.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mIoU"])print(metrics["metrics/pixel_accuracy"])from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])Esportazione
| Task | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: supportato | semantic to TorchScript: supportato | semantic to ExecuTorch: supportato | semantic to TensorRT: supportato | semantic to OpenVINO: supportato | semantic to Paddle: non supportato | semantic to MNN: non supportato | semantic to RKNN: non supportato | semantic to ncnn: non supportato | semantic to TFLite: non supportato | semantic to CoreML: non supportato | semantic to Core AI: non supportato |
| classify | classify to ONNX: supportato | classify to TorchScript: supportato | classify to ExecuTorch: supportato | classify to TensorRT: supportato | classify to OpenVINO: supportato | classify to Paddle: non supportato | classify to MNN: non supportato | classify to RKNN: non supportato | classify to ncnn: non supportato | classify to TFLite: non supportato | classify to CoreML: non supportato | classify to Core AI: supportato |
| embed | embed to ONNX: supportato | embed to TorchScript: supportato | embed to ExecuTorch: supportato | embed to TensorRT: supportato | embed to OpenVINO: supportato | embed to Paddle: non supportato | embed to MNN: non supportato | embed to RKNN: non supportato | embed to ncnn: non supportato | embed to TFLite: supportato | embed to CoreML: non supportato | embed to Core AI: non supportato |
Ogni task supporta un sottoinsieme diverso di formati, mostrato qui sopra. Un
artefatto esportato si ricarica tramite LibreYOLO() in base al suffisso del
file, quindi un file .onnx o .engine si comporta come un checkpoint e
restituisce gli stessi Results. Esportazione elenca gli
argomenti che ogni formato accetta.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed")model.export(format="tflite")from libreyolo import LibreYOLO, SAMPLE_IMAGE # La factory smista in base al suffisso del file, quindi un artefatto# esportato si carica come qualsiasi checkpoint e restituisce lo stesso# oggetto Results. L'esportazione dà il nome al file a partire dal# task, qui LibreDINOv2s-sem.onnx.model = LibreYOLO("LibreDINOv2s-sem.onnx")result = model(SAMPLE_IMAGE)Licenze
Controlla la licenza nel repository Hugging Face degli specifici pesi che scarichi. Ogni checkpoint nell<link>organizzazione LibreYOLO</link> ne include una e non è sempre la stessa per tutta la famiglia. Quel repository è la fonte autorevole; il riepilogo seguente descrive le condizioni applicabili al momento dellultima verifica di questa pagina.
Questa è una descrizione delle licenze coinvolte, non una consulenza legale. Se la risposta è importante a fini commerciali, leggi personalmente le licenze e chiedi una consulenza indipendente.
- Lavoro originale
- DINOv2, Meta AI (FAIR)
- Licenza upstream
- Apache-2.0
- Sorgente upstream
- github.com/facebookresearch/dinov2
- Codice LibreYOLO
- MIT
- Pesi
- Apache-2.0, distribuiti dai rispettivi autori. LibreYOLO non li ospita né ne mantiene una copia.
- Interpretazione
- Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. LibreYOLO does not host or republish a DINOv2 checkpoint of its own: LibreDINOv2 downloads the pretrained backbone directly from Meta's facebook/dinov2-with-registers-small repository on Hugging Face the first time it runs, unmodified. The semantic and classification heads start at random initialization until you train them, since LibreYOLO does not publish a trained head for this family.
La riga "Pesi" qui sopra indica la licenza che si applica, Apache-2.0, ma per
questa famiglia non viene ripubblicato niente sotto l'org Hugging Face di
LibreYOLO: LibreYOLO non ospita nessun checkpoint LibreDINOv2 proprio. Quello
che LibreDINOv2(model_path=None) scarica è il repository
facebook/dinov2-with-registers-small di Meta, intatto.
Citazione
@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}
}Copiato dal blocco di citazione degli autori disponibile su github.com/facebookresearch/dinov2#citing-dinov2.