DINOv2
DINOv2 є самокерованим візуальним трансформером, який Meta AI навчила створювати універсальні ознаки зображення без міток. LibreYOLO обгортає його бекбон DINOv2-with-Registers для трьох завдань: семантичної сегментації, класифікації та ембедингу всього зображення.
- Задачі
- semantic, classify, embed
- Розміри
- n, s, m, l at 518 px
- Встановлення
pip install libreyolo- Рівень підтримки
- Підтримуваний, починаючи з v. Додаткові придатні до навчання моделі: тести CI підтримують справними, а функції додають за нагоди.
- Ліцензії
- Код: MIT, ваги: Apache-2.0. Комерційне використання
Встановлення
LibreDINOv2 реєструється, лише якщо встановлено transformers, ту саму
необов'язкову залежність, яка потрібна RF-DETR для бекбона DINOv2, тому потрібен
той самий додатковий пакет.
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), нормалізовано за L2from 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)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"])Експорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic 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: не підтримується |
| classify | classify 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: підтримується |
| embed | embed 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.