DINOv2

DINOv2 jest samonadzorowanym transformatorem wizji trenowanym przez Meta AI w celu generowania ogólnych cech obrazu bez etykiet. LibreYOLO otacza swoje DINOv2-with-Registers backbone do trzech zadań: segmentacji semantycznej, klasyfikacji i osadzania całego obrazu.

Zadania
semantic, classify, embed
Rozmiary
n, s, m, l at 518 px
Instalacja
pip install libreyolo
Poziom obsługi
Obsługiwany, od wersji v. Dodatkowe trenowalne modele: testy CI pozostają zielone, a funkcje są dodawane w miarę możliwości.
Projekt źródłowy
DINOv2, autorzy: Meta AI (FAIR), licencja: Apache-2.0. Publikacja, kod źródłowy
Licencje
Kod: MIT, wagi: Apache-2.0. Użycie komercyjne

Instalacja

LibreDINOv2 jest rejestrowany tylko wtedy, gdy zainstalowano pakiet transformers. Jest to ta sama opcjonalna zależność, której RF-DETR wymaga dla backbone DINOv2, dlatego potrzebny jest ten sam dodatek.

bash
pip install "libreyolo[rfdetr]"

Predykcja

LibreYOLO nie publikuje checkpointu LibreDINOv2. Zamiast wczytywać plik, należy utworzyć otokę bezpośrednio. Domyślne model_path=None pobiera przy pierwszym użyciu z Hugging Face backbone Meta facebook/dinov2-with-registers-small na licencji Apache-2.0. Argument task= wybiera wykonywane na nim zadanie.

Semantyczny
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Nie istnieje checkpoint LibreYOLO-hosted dla tej rodziny: this# pobiera Apache-2.0 DINOv2-with-Registers-small backbone z# Organizacja Hugging Face Meta. Gęsta głowa zaczyna się losowo# inicjalizacja aż do momentu, gdy ją wytrenujesz (zobacz Trenuj poniżej).model = LibreDINOv2(size="s", task="semantic", nb_classes=19)result = model(SAMPLE_IMAGE) mask = result.semantic_maskprint(mask.data.shape, mask.classes)
Klasyfikować
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # nb_classes= to liczba klas w twoim zbiorze danych; głowa liniowa zaczyna# losowo inicjalizowane aż do momentu, gdy je wytrenujesz.model = LibreDINOv2(size="s", task="classify", nb_classes=10)result = model(SAMPLE_IMAGE) print(result.probs.top1, result.probs.top1conf)
Osadzić
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Omija każdą głowę zadania: sam backbone wystarczy, więc to# nie wymaga dopracowywania, aby być użytecznym.model = LibreDINOv2(size="s", task="embed")result = model(SAMPLE_IMAGE) print(result.embeddings.data.shape)   # (1, D), L2-normalized
Osadź partia
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed") # Wygodna nakładka: uruchamia predict() i układa każdy wiersz w jeden# (N, D) tensor.features = model.embed(["a.jpg", "b.jpg", "c.jpg"])print(features.shape)

task="semantic" i task="classify" dodają do backbone odpowiednio gęstą lub liniową głowicę. Głowica jest inicjalizowana losowo i staje się użyteczna dopiero po wytrenowaniu (zobacz sekcję Trenowanie). task="embed" pomija wszystkie głowice i zwraca końcowy, znormalizowany token CLS backbone jako jeden wiersz reprezentujący cały obraz w result.embeddings, dlatego nie wymaga trenowania. result.boxes zawsze ma wartość None, ponieważ żadne z trzech zadań nie tworzy detekcji instancji. Zobacz stronę predykcji, aby poznać źródła, streaming i obsługę wyników.

Warianty

size wybiera szerokość projektora RF-DETR-style nałożoną na backbone, a nie sam backbone: każdy rozmiar korzysta z tego samego kodera DINOv2-S (małego). Segmentacja semantyczna działa na natywnej siatce kwadratowych patchy DINOv2; klasyfikacja i osadzanie działają w mniejszej rozdzielczości klasyfikacyjnej używanej do trenowania liniowej sondy.

Trenowanie

Zadania task="semantic" i task="classify" obsługują trenowanie. Zadanie task="embed" nie ma zależnej od klas głowicy do dopasowania, dlatego wywołanie dla niego train() zgłasza NotImplementedError.

Semantyczny
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)
Klasyfikować
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",)

Główne argumenty kluczowe tutaj to batch_size i lr, a nie batch i lr0 używane przez większość innych rodzin; batch i lr0 są nadal akceptowane i mapowane na nie, ale podanie obu powoduje błąd konfliktu. output_dir= (domyślnie "runs/train") zastępuje project=/name= jako główny sposób umieszczania biegu, chociaż bezpośrednie podanie project=/name= nadal działa. Zobacz trenowanie dotyczące zbiorów danych, augmentacji, wielu GPU i loggerów.

Walidacja

val() zwraca słownik kluczy metrics/: mIoU i dokładność pikseli dla task="semantic", dokładność top-1 i top-5 dla task="classify". task="embed" nie ma prawdziwej wartości do oceny i zgłasza NotImplementedError, jeśli wywołasz val() na nim.

Semantyczny
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"])
Klasyfikować
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"])

Eksport

ZadanieONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
semanticsemantic to ONNX: obsługiwanesemantic to TorchScript: obsługiwanesemantic to ExecuTorch: obsługiwanesemantic to TensorRT: obsługiwanesemantic to OpenVINO: obsługiwanesemantic to Paddle: brak obsługisemantic to MNN: brak obsługisemantic to RKNN: brak obsługisemantic to ncnn: brak obsługisemantic to TFLite: brak obsługisemantic to CoreML: brak obsługisemantic to Core AI: brak obsługi
classifyclassify to ONNX: obsługiwaneclassify to TorchScript: obsługiwaneclassify to ExecuTorch: obsługiwaneclassify to TensorRT: obsługiwaneclassify to OpenVINO: obsługiwaneclassify to Paddle: brak obsługiclassify to MNN: brak obsługiclassify to RKNN: brak obsługiclassify to ncnn: brak obsługiclassify to TFLite: brak obsługiclassify to CoreML: brak obsługiclassify to Core AI: obsługiwane
embedembed to ONNX: obsługiwaneembed to TorchScript: obsługiwaneembed to ExecuTorch: obsługiwaneembed to TensorRT: obsługiwaneembed to OpenVINO: obsługiwaneembed to Paddle: brak obsługiembed to MNN: brak obsługiembed to RKNN: brak obsługiembed to ncnn: brak obsługiembed to TFLite: obsługiwaneembed to CoreML: brak obsługiembed to Core AI: brak obsługi

Każde zadanie obsługuje inny podzbiór formatów, pokazany powyżej. Wyeksportowany artefakt można ponownie załadować przez LibreYOLO() na jego rozszerzeniu pliku, więc plik .onnx lub .engine działa jak checkpoint i zwraca ten sam Results. Eksport pokazuje argumenty, które akceptuje każdy format.

Semantyczny
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.export(format="onnx")
Klasyfikować
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.export(format="onnx")
Osadzić
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed")model.export(format="tflite")
Użyj wyeksportowanego pliku
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Fabryka kieruje na podstawie rozszerzenia pliku, więc eksportowany artefakt się ładuje# jak każdy checkpoint i zwraca ten sam obiekt Results. Eksport# nazywa plik z zadania, tutaj LibreDINOv2s-sem.onnx.model = LibreYOLO("LibreDINOv2s-sem.onnx")result = model(SAMPLE_IMAGE)

Licencjonowanie

Sprawdź licencję w repozytorium konkretnych pobieranych wag na Hugging Face. Każdy checkpoint w organizacji LibreYOLO ma licencję, która nie zawsze jest taka sama w całej rodzinie. To repozytorium jest źródłem rozstrzygającym, a poniższe podsumowanie opisuje stan z chwili ostatniej weryfikacji tej strony.

To opis obowiązujących licencji, a nie porada prawna. Jeśli odpowiedź ma znaczenie komercyjne, przeczytaj licencje i zasięgnij własnej porady prawnej.

Oryginalna praca
DINOv2, Meta AI (FAIR)
Licencja projektu źródłowego
Apache-2.0
Kod źródłowy projektu
github.com/facebookresearch/dinov2
Kod LibreYOLO
MIT
Wagi
Apache-2.0, rozpowszechniane przez autorów. LibreYOLO ich nie hostuje ani nie udostępnia kopii.
Interpretacja
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.

Wiersz „Wagi” powyżej podaje obowiązującą licencję Apache-2.0, ale LibreYOLO nie publikuje ponownie żadnych artefaktów tej rodziny na Hugging Face i nie ma własnego checkpointu LibreDINOv2. Wywołanie LibreDINOv2(model_path=None) pobiera niezmienione repozytorium Meta facebook/dinov2-with-registers-small.

Cytowanie

@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}
}

Skopiowano z bloku cytowania autorów w github.com/facebookresearch/dinov2#citing-dinov2.

Zweryfikowano z LibreYOLO v1.5.0. Tabele obsługi, checkpointy i wyniki benchmarków na tej stronie są generowane na podstawie wydanej biblioteki i opublikowanych wag, a nie wpisywane ręcznie.