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 не требует опциональных extra. Всё, что он импортирует, входит в базовую установку.
pip install libreyoloИсключение — дообучение адаптерами с lora=True: ему нужен extra lora.
pip install "libreyolo[lora]"Предсказание
Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.
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)libreyolo predict model=LibreDFINEn.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Суффикс -seg в имени файла выбирает голову масок, поэтому аргумент# task здесь не нужен.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 | Параметры (млн) |
|---|---|---|---|
| LibreDFINEl | 640 | 60.0 | 31.24 |
| LibreDFINEm | 640 | 57.8 | 19.59 |
| LibreDFINEn | 640 | 45.8 | 3.78 |
| LibreDFINEs | 640 | 53.4 | 10.32 |
| LibreDFINEx | 640 | 61.4 | 62.62 |
COCO val2017, 500 images. Измерено системой бенчмарков LibreYOLO и опубликовано на Vision Analysis, где сравниваются задержки на разном оборудовании и в разных средах выполнения и хранятся полные записи запусков.
Сегментация переиспользует бэкбон, энкодер и декодер детекции и добавляет голову
масок, поэтому -seg-чекпойнт принимает те же аргументы, что и его детекционный
аналог. Семейство RT-DETRv4 в LibreYOLO написано как подкласс обёртки D-FINE:
оно наследует эту линию декодера, а затем фиксирует список задач обратно на
детекцию, потому что головы масок у него нет.
Обучение
Обучение начинается с опубликованного чекпойнта — для обеих задач.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=640, batch=8, lr0=2e-4)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=640from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)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:
обратный проход по бинированному matmul в Integral упирается в ошибку
компиляции Metal. На инференс на MPS это не влияет.
Про датасеты, аугментацию, multi-GPU и логгеры см. обучение.
Валидация
val() возвращает словарь с ключами по именам метрик и печатает результаты по
классам, если verbose оставлен включённым.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreDFINEn.pt data=my-dataset.yamlfrom 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), так
что оба значения доступны за один проход.
Экспорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection 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 segmentation | Instance 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 работают с
фиксированным холстом, а не с динамическими формами. Экспорт
перечисляет аргументы, которые принимает каждый формат, и те дополнительные,
что добавляют некоторые из них.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDFINEn.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreDFINEn.pt format=onnx imgsz=640libreyolo export model=LibreDFINEn.pt format=tensorrt imgsz=640 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает загрузчик по расширению файла, поэтому# экспортированный артефакт загружается как любой чекпойнт и# возвращает тот же объект Results.model = LibreYOLO("LibreDFINEn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Чекпойнты
Все опубликованные файлы весов этого семейства.
| Файл | Вход (пикс.) | Лицензия весов |
|---|---|---|
| Detection | ||
| LibreDFINEn.pt | 640 | apache-2.0 |
| LibreDFINEs.pt | 640 | apache-2.0 |
| LibreDFINEm.pt | 640 | apache-2.0 |
| LibreDFINEl.pt | 640 | apache-2.0 |
| LibreDFINEx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreDFINEn-seg.pt | 640 | apache-2.0 |
| LibreDFINEs-seg.pt | 640 | apache-2.0 |
| LibreDFINEm-seg.pt | 640 | apache-2.0 |
| LibreDFINEl-seg.pt | 640 | apache-2.0 |
| LibreDFINEx-seg.pt | 640 | apache-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.