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 segmentation, classification, embeddings
Dimensioni
n, s, m, l at 518 px
Installa
pip install "libreyolo[rfdetr]"
Livello di supporto
Supportato, dalla v1.3.0. Modelli addestrabili di supporto: mantenuti funzionanti nella CI, ricevono nuove funzionalità quando possibile.
Origine
DINOv2 di Meta AI (FAIR), Apache-2.0. Articolo, sorgente
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.

bash
pip install "libreyolo[rfdetr]"

Senza di esso, caricare un checkpoint o un nome di modello DINOv2 si ferma con un errore che indica questa riga di installazione.

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.

Semantica
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)
Classificazione
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)
Embedding
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 L2
Embedding di un batch
from 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.

Semantica
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)
Classificazione
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)
Multi-GPU
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 principali qui sono batch_size e lr, invece di batch e lr0 usati dalla maggior parte delle altre famiglie; batch e lr0 sono comunque accettati e convertiti, ma passarli entrambi genera un errore di conflitto. output_dir= (default None) sostituisce project=/name= come metodo principale per scegliere la directory di un'esecuzione, anche se passare direttamente project=/name= funziona ancora. Vedi addestramento per dataset, augmentation, multi-GPU e logger.

Le nuove esecuzioni usano una directory incrementale runs/train/dinov2_exp con exist_ok=False. resume=True ripristina lo stato del trainer e conserva la directory selezionata. La classificazione supporta cls_pw e class_weights come descritto negli iperparametri.

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.

Semantica
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"])
Classificazione
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"])

La calibrazione per classificazione ed embedding riutilizza la pipeline di classificazione del modello. La valutazione usa la trasformazione della famiglia.

Esportazione

TaskONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
Semantic segmentationSemantic segmentation to ONNX: supportatoSemantic segmentation to TorchScript: supportatoSemantic segmentation to ExecuTorch: supportatoSemantic segmentation to TensorRT: supportatoSemantic segmentation to OpenVINO: supportatoSemantic segmentation to Paddle: non supportatoSemantic segmentation to MNN: non supportatoSemantic segmentation to RKNN: non supportatoSemantic segmentation to ncnn: non supportatoSemantic segmentation to TFLite: non supportatoSemantic segmentation to CoreML: non supportatoSemantic segmentation to Core AI: non supportato
ClassificationClassification to ONNX: supportatoClassification to TorchScript: supportatoClassification to ExecuTorch: supportatoClassification to TensorRT: supportatoClassification to OpenVINO: supportatoClassification to Paddle: non supportatoClassification to MNN: non supportatoClassification to RKNN: non supportatoClassification to ncnn: non supportatoClassification to TFLite: non supportatoClassification to CoreML: non supportatoClassification to Core AI: supportato
EmbeddingsEmbeddings to ONNX: supportatoEmbeddings to TorchScript: supportatoEmbeddings to ExecuTorch: supportatoEmbeddings to TensorRT: supportatoEmbeddings to OpenVINO: supportatoEmbeddings to Paddle: non supportatoEmbeddings to MNN: non supportatoEmbeddings to RKNN: non supportatoEmbeddings to ncnn: non supportatoEmbeddings to TFLite: supportatoEmbeddings to CoreML: non supportatoEmbeddings 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.

Semantica
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.export(format="onnx")
Classificazione
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.export(format="onnx")
Embedding
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed")model.export(format="tflite")
Usare il file esportato
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
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.

Verificato con LibreYOLO v1.6.0. Le tabelle di supporto, i checkpoint e i dati dei benchmark in questa pagina vengono generati dalla libreria rilasciata e dai pesi pubblicati, non scritti a mano.

Architettura di DINOv2

Scegli una variante o la vista della famiglia, poi un blocco per i dettagli. Apri il diagramma completo per ingrandire o scaricare SVG e PNG. I diagrammi sono in inglese.