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.
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.
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)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)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-normalizedfrom 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.
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",)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.
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"])Eksport
| Zadanie | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: obsługiwane | semantic to TorchScript: obsługiwane | semantic to ExecuTorch: obsługiwane | semantic to TensorRT: obsługiwane | semantic to OpenVINO: obsługiwane | semantic to Paddle: brak obsługi | semantic to MNN: brak obsługi | semantic to RKNN: brak obsługi | semantic to ncnn: brak obsługi | semantic to TFLite: brak obsługi | semantic to CoreML: brak obsługi | semantic to Core AI: brak obsługi |
| classify | classify to ONNX: obsługiwane | classify to TorchScript: obsługiwane | classify to ExecuTorch: obsługiwane | classify to TensorRT: obsługiwane | classify to OpenVINO: obsługiwane | classify to Paddle: brak obsługi | classify to MNN: brak obsługi | classify to RKNN: brak obsługi | classify to ncnn: brak obsługi | classify to TFLite: brak obsługi | classify to CoreML: brak obsługi | classify to Core AI: obsługiwane |
| embed | embed to ONNX: obsługiwane | embed to TorchScript: obsługiwane | embed to ExecuTorch: obsługiwane | embed to TensorRT: obsługiwane | embed to OpenVINO: obsługiwane | embed to Paddle: brak obsługi | embed to MNN: brak obsługi | embed to RKNN: brak obsługi | embed to ncnn: brak obsługi | embed to TFLite: obsługiwane | embed to CoreML: brak obsługi | embed 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.
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 # 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.