D-FINE

Трансформер виявлення, який переформульовує регресію рамок як розподіл імовірностей для кожного краю рамки з уточненням між шарами декодера. LibreYOLO підтримує його для виявлення та сегментації екземплярів.

Задачі
detection, instance segmentation
Розміри
n, s, m, l, x at 640 px
Встановлення
pip install libreyolo
Рівень підтримки
Основний, починаючи з v1.1.0. Основні придатні до навчання детектори: функції з'являються після флагманських моделей у тій самій хвилі випуску.
Першоджерело
D-FINE, автори: University of Science and Technology of China, ліцензія Apache-2.0. Стаття, джерело
Ліцензії
Код: Apache-2.0, ваги: Apache-2.0. Комерційне використання

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

D-FINE не потребує додаткових пакетів. Усі його імпорти входять до базового встановлення.

bash
pip install libreyolo

Винятком є донавчання адаптерів із lora=True, для якого потрібен додатковий пакет lora.

bash
pip install "libreyolo[lora]"

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

Під час першого використання ваги завантажуються з Hugging Face та кешуються локально.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDFINEn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Сегментація екземплярів
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Суфікс -seg у назві файлу вибирає голову масок, тому аргумент# завдання тут не потрібен.model = LibreYOLO("LibreDFINEn-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)

Повертається той самий об'єкт Results, що й для кожного сімейства, тому для заміни детектора достатньо змінити один рядок. Назва файлу із -seg самостійно вибирає завдання сегментації, після чого result.masks містить маски екземплярів разом із рамками. Параметри conf і max_det фільтрують вибір запитів; iou приймається для сумісності API, але не впливає на результат, оскільки декодер є множинним предиктором без етапу NMS. Джерела, потокове оброблення та роботу з результатами описано на сторінці передбачення.

Варіанти

Доступні п'ять розмірів. Усі вони працюють з однаковою роздільною здатністю вхідних даних, тому таблиця розрізняє їх за кількістю параметрів і правильністю.

Контрольна точкаВхід (пікс.)mAP 50-95Параметри (млн)
LibreDFINEl64060.031.24
LibreDFINEm64057.819.59
LibreDFINEn64045.83.78
LibreDFINEs64053.410.32
LibreDFINEx64061.462.62

COCO val2017, 500 images. Виміряно засобами бенчмарку LibreYOLO й опубліковано на сторінці Vision Analysis, де порівнюють затримку на різному обладнанні та в різних середовищах виконання, а також зберігають повні записи запусків.

Сегментація повторно використовує бекбон, кодер і декодер виявлення та додає голову масок, тому контрольна точка -seg приймає ті самі аргументи, що й відповідна контрольна точка виявлення. Сімейство RT-DETRv4 у LibreYOLO реалізовано як підклас обгортки D-FINE: воно успадковує цю лінію декодера, а потім знову обмежує перелік завдань виявленням, оскільки не містить голови масок.

Навчання

Для обох завдань навчання починається з опублікованої контрольної точки.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)
CLI
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 imgsz=640 batch=8 lr0=2e-4
Сегментація екземплярів
# Продовжує навчання з опублікованих ваг сегментації, зокрема голови масок.libreyolo train model=LibreDFINEn-seg.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
Сегментація з ваг виявлення
# Ваги виявлення не містять голови масок, тому це явне перенесення:# голова починає без навчання й стає корисною лише після нього. Саме запит# task=segment тут дозволяє перенесення.libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  task=segment epochs=50 imgsz=640
LoRA
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)
Кілька GPU
libreyolo train model=LibreDFINEn.pt data=my-dataset.yaml \  epochs=50 device=0,1 batch=16

Без додаткових параметрів тренер виконує 132 епохи з lr0=2e-4, amp=False, батчем 16 і ранньою зупинкою після 50 епох без покращення. Ваги виявлення можна використати як початкову точку для навчання сегментації, але лише як явне перенесення, оскільки голова масок починає без навчання й інакше повертала б беззмістовні маски. Саме передавання task=segment до CLI дозволяє це. Шлях Python має суворіші обмеження: потрібно безпосередньо створити LibreDFINE з allow_detect_to_segment_transfer=True, оскільки фабрика LibreYOLO() не приймає такого аргументу, а пряме створення не завантажує файли, тому файл ваг уже має бути на диску.

Параметр lora=True застосовується до виявлення. Навчання сегментації відхиляє його та натомість указує на freeze='backbone', оскільки голову масок не перевірено з адаптерами. На Apple silicon тренер переносить весь запуск на CPU: зворотний прохід бінованого матричного множення Integral спричиняє помилку компіляції Metal. Інференс на MPS не зазнає впливу.

Датасети, аугментацію, кілька GPU та системи журналювання описано на сторінці навчання.

Валідація

Метод val() повертає словник із ключами за назвами метрик і виводить результати для кожного класу, якщо verbose залишається ввімкненим.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreDFINEn.pt data=my-dataset.yaml
Сегментація екземплярів
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"])   # маскиprint(metrics["metrics/mAP50-95(B)"])   # рамки

Для контрольної точки -seg звичайний ключ metrics/mAP50-95 містить оцінку масок, а той самий запуск також повідомляє рамки під (B) і маски під (M), тому обидва результати доступні за один прохід.

Експорт

ЗадачаONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: підтримуєтьсяDetection to TorchScript: підтримуєтьсяDetection to ExecuTorch: не підтримуєтьсяDetection to TensorRT: підтримуєтьсяDetection to OpenVINO: підтримуєтьсяDetection to Paddle: підтримуєтьсяDetection to MNN: підтримуєтьсяDetection to RKNN: не підтримуєтьсяDetection to ncnn: не підтримуєтьсяDetection to TFLite: не підтримуєтьсяDetection to CoreML: не підтримуєтьсяDetection to Core AI: підтримується
Instance segmentationInstance segmentation to ONNX: підтримуєтьсяInstance segmentation to TorchScript: підтримуєтьсяInstance segmentation to ExecuTorch: не підтримуєтьсяInstance segmentation to TensorRT: підтримуєтьсяInstance segmentation to OpenVINO: підтримуєтьсяInstance segmentation to Paddle: не підтримуєтьсяInstance segmentation to MNN: не підтримуєтьсяInstance segmentation to RKNN: не підтримуєтьсяInstance segmentation to ncnn: не підтримуєтьсяInstance segmentation to TFLite: не підтримуєтьсяInstance segmentation to CoreML: не підтримуєтьсяInstance segmentation to Core AI: не підтримується

Експортований артефакт повторно завантажується через LibreYOLO() за суфіксом файлу, тому файл .onnx або .engine поводиться як контрольна точка й повертає той самий Results. Шляхи OpenVINO, Paddle, MNN і Core AI експортують із фіксованим полотном, а не динамічними формами. На сторінці Експорт наведено аргументи, які приймає кожен формат, і додаткові пакети, потрібні деяким із них.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=True
Використати експортований файл
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика виконує маршрутизацію за суфіксом файлу, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий об'єкт Results.model = LibreYOLO("LibreDFINEn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Контрольні точки

Усі опубліковані файли ваг для цього сімейства.

ФайлВхід (пікс.)Ліцензія ваг
Detection
LibreDFINEn.pt640apache-2.0
LibreDFINEs.pt640apache-2.0
LibreDFINEm.pt640apache-2.0
LibreDFINEl.pt640apache-2.0
LibreDFINEx.pt640apache-2.0
Instance segmentation
LibreDFINEn-seg.pt640apache-2.0
LibreDFINEs-seg.pt640apache-2.0
LibreDFINEm-seg.pt640apache-2.0
LibreDFINEl-seg.pt640apache-2.0
LibreDFINEx-seg.pt640apache-2.0

Кожен наведений вище файл уже доступний у організації LibreYOLO і завантажується під час першого використання.

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

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

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

Оригінальна робота
D-FINE, University of Science and Technology of China
Ліцензія першоджерела
Apache-2.0
Джерело першоджерела
github.com/Peterande/D-FINE
Код LibreYOLO
MIT
Ваги
Apache-2.0, повторно опубліковано на huggingface.co/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. It places no obligation on your own application code, and weights you train yourself on your own data are yours. The segmentation weights carry a second Apache-2.0 upstream, ArgoHA/D-FINE-seg, under the same terms.

Ваги сегментації мають друге джерело: декодер масок, зіставлення масок і функцію втрат масок взято з ArgoHA/D-FINE-seg, також за ліцензією Apache-2.0, а його супровідник схвалив повторне використання із зазначенням авторства.

Цитування

@misc{peng2024dfine,
      title={D-FINE: Redefine Regression Task in DETRs as Fine-grained Distribution Refinement},
      author={Yansong Peng and Hebei Li and Peixi Wu and Yueyi Zhang and Xiaoyan Sun and Feng Wu},
      year={2024},
      eprint={2410.13842},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Скопійовано з блоку цитування авторів на сторінці github.com/Peterande/D-FINE#citation.

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