DINOv2

DINOv2 є самокерованим візуальним трансформером, який Meta AI навчила створювати універсальні ознаки зображення без міток. LibreYOLO обгортає його бекбон DINOv2-with-Registers для трьох завдань: семантичної сегментації, класифікації та ембедингу всього зображення.

Задачі
semantic, classify, embed
Розміри
n, s, m, l at 518 px
Встановлення
pip install libreyolo
Рівень підтримки
Підтримуваний, починаючи з v. Додаткові придатні до навчання моделі: тести CI підтримують справними, а функції додають за нагоди.
Першоджерело
DINOv2, автори: Meta AI (FAIR), ліцензія Apache-2.0. Стаття, джерело
Ліцензії
Код: MIT, ваги: Apache-2.0. Комерційне використання

Встановлення

LibreDINOv2 реєструється, лише якщо встановлено transformers, ту саму необов'язкову залежність, яка потрібна RF-DETR для бекбона DINOv2, тому потрібен той самий додатковий пакет.

bash
pip install "libreyolo[rfdetr]"

Передбачення

LibreYOLO не публікує контрольну точку LibreDINOv2. Створіть обгортку безпосередньо замість завантаження файлу: model_path=None (типове значення) під час першого використання завантажує з Hugging Face бекбон Meta facebook/dinov2-with-registers-small за ліцензією Apache-2.0. Параметр task= вибирає те, що запускається поверх нього.

Семантична сегментація
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Для цього сімейства немає контрольної точки на хостингу LibreYOLO: цей код# завантажує бекбон DINOv2-with-Registers-small за ліцензією Apache-2.0 з# організації Meta на Hugging Face. Щільна голова має випадкову# ініціалізацію, доки ви не навчите її (див. розділ «Навчання» нижче).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= визначає кількість класів вашого датасету; лінійна голова має# випадкову ініціалізацію, доки ви не навчите її.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 # Обходить усі голови завдань: достатньо самого бекбона, тому# корисний результат не потребує донавчання.model = LibreDINOv2(size="s", task="embed")result = model(SAMPLE_IMAGE) print(result.embeddings.data.shape)   # (1, D), нормалізовано за L2
Ембединг батча
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed") # Зручна обгортка: запускає predict() і складає кожен рядок в один# тензор (N, D).features = model.embed(["a.jpg", "b.jpg", "c.jpg"])print(features.shape)

Завдання task="semantic" і task="classify" додають поверх бекбона щільну або лінійну голову; ця голова має випадкову ініціалізацію й стає корисною лише після навчання (див. Навчання). Завдання task="embed" пропускає всі голови та повертає кінцевий нормалізований токен CLS бекбона як один рядок для всього зображення у result.embeddings, тому взагалі не потребує навчання. result.boxes завжди дорівнює None: жодне з трьох завдань не створює виявлень окремих екземплярів. Джерела, потокове оброблення та роботу з результатами описано на сторінці передбачення.

Варіанти

size вибирає ширину проєктора в стилі RF-DETR, розташованого поверх бекбона, а не сам бекбон: усі розміри використовують спільний кодер DINOv2-S (small). Семантична сегментація працює на нативній квадратній сітці патчів DINOv2; класифікація та ембединг працюють із меншою роздільною здатністю класифікації, використаною для навчання лінійного пробника.

Навчання

Обидва завдання task="semantic" і task="classify" навчаються; task="embed" не має залежної від класів голови для підлаштування та спричиняє NotImplementedError, якщо викликати для нього train().

Семантична сегментація
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)
Кілька 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",)

Основними іменованими аргументами тут є batch_size і lr, а не batch і lr0, які використовує більшість інших сімейств; batch і lr0 усе одно приймаються та зіставляються з ними, але передавання обох спричиняє помилку конфлікту. output_dir= (типове значення "runs/train") замінює project=/name= як основний спосіб розміщення запуску, хоча пряме передавання project=/name= усе одно працює. Датасети, аугментацію, кілька GPU та системи журналювання описано на сторінці навчання.

Валідація

Метод val() повертає словник ключів metrics/: mIoU і правильність за пікселями для task="semantic", правильність top-1 і top-5 для task="classify". Завдання task="embed" не має еталонних даних для оцінювання та спричиняє NotImplementedError, якщо викликати для нього val().

Семантична сегментація
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"])

Експорт

ЗадачаONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
semanticsemantic to ONNX: підтримуєтьсяsemantic to TorchScript: підтримуєтьсяsemantic to ExecuTorch: підтримуєтьсяsemantic to TensorRT: підтримуєтьсяsemantic to OpenVINO: підтримуєтьсяsemantic to Paddle: не підтримуєтьсяsemantic to MNN: не підтримуєтьсяsemantic to RKNN: не підтримуєтьсяsemantic to ncnn: не підтримуєтьсяsemantic to TFLite: не підтримуєтьсяsemantic to CoreML: не підтримуєтьсяsemantic to Core AI: не підтримується
classifyclassify to ONNX: підтримуєтьсяclassify to TorchScript: підтримуєтьсяclassify to ExecuTorch: підтримуєтьсяclassify to TensorRT: підтримуєтьсяclassify to OpenVINO: підтримуєтьсяclassify to Paddle: не підтримуєтьсяclassify to MNN: не підтримуєтьсяclassify to RKNN: не підтримуєтьсяclassify to ncnn: не підтримуєтьсяclassify to TFLite: не підтримуєтьсяclassify to CoreML: не підтримуєтьсяclassify to Core AI: підтримується
embedembed to ONNX: підтримуєтьсяembed to TorchScript: підтримуєтьсяembed to ExecuTorch: підтримуєтьсяembed to TensorRT: підтримуєтьсяembed to OpenVINO: підтримуєтьсяembed to Paddle: не підтримуєтьсяembed to MNN: не підтримуєтьсяembed to RKNN: не підтримуєтьсяembed to ncnn: не підтримуєтьсяembed to TFLite: підтримуєтьсяembed to CoreML: не підтримуєтьсяembed to Core AI: не підтримується

Кожне завдання підтримує власну підмножину форматів, наведену вище. Експортований артефакт повторно завантажується через LibreYOLO() за суфіксом файлу, тому файл .onnx або .engine поводиться як контрольна точка й повертає той самий Results. На сторінці Експорт наведено аргументи, які приймає кожен формат.

Семантична сегментація
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 # Фабрика виконує маршрутизацію за суфіксом файлу, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий об'єкт Results. Експорт# називає файл за завданням, тут LibreDINOv2s-sem.onnx.model = LibreYOLO("LibreDINOv2s-sem.onnx")result = model(SAMPLE_IMAGE)

Ліцензування

Перевіряйте ліцензію в репозиторії Hugging Face конкретних ваг, які завантажуєте. Кожна контрольна точка в організації LibreYOLO має ліцензію, і вона не завжди однакова для всього сімейства. Цей репозиторій є авторитетним джерелом, а наведене нижче резюме описує умови на момент останньої перевірки сторінки.

Це опис відповідних ліцензій, а не юридична консультація. Якщо відповідь має комерційне значення, самостійно прочитайте ліцензії та зверніться по юридичну консультацію.

Оригінальна робота
DINOv2, Meta AI (FAIR)
Ліцензія першоджерела
Apache-2.0
Джерело першоджерела
github.com/facebookresearch/dinov2
Код LibreYOLO
MIT
Ваги
Apache-2.0, поширюється авторами. LibreYOLO не розміщує й не дублює ці ваги.
Тлумачення
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.

У наведеному вище рядку «Weights» зазначено застосовну ліцензію Apache-2.0, але для цього сімейства організація LibreYOLO у Hugging Face насправді нічого не публікує: LibreYOLO не розміщує власної контрольної точки LibreDINOv2. Виклик LibreDINOv2(model_path=None) завантажує без змін власний репозиторій Meta facebook/dinov2-with-registers-small.

Цитування

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

Скопійовано з блоку цитування авторів на сторінці github.com/facebookresearch/dinov2#citing-dinov2.

Перевірено з LibreYOLO v1.5.0. Таблиці підтримки, контрольні точки й результати бенчмарків на цій сторінці згенеровано з випущеної бібліотеки та опублікованих ваг, а не написано вручну.