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. Всё, что он импортирует, входит в базовую установку.

bash
pip install libreyolo

Исключение — дообучение адаптерами с lora=True: ему нужен extra 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 в имени файла выбирает голову масок, поэтому аргумент# 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Параметры (млн)
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)
Multi-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: обратный проход по бинированному matmul в Integral упирается в ошибку компиляции Metal. На инференс на MPS это не влияет.

Про датасеты, аугментацию, multi-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. Таблицы поддержки, чекпойнты и результаты бенчмарков на этой странице сгенерированы из выпущенной библиотеки и опубликованных весов, а не написаны вручную.