DEIM

Детекционный трансформер, обученный плотным взаимно однозначным сопоставлением: он сходится за куда меньшее число эпох, чем рецепты DETR, на которых он построен. LibreYOLO несёт две его версии, а различают их по загружаемому чекпойнту.

Задачи
detection
Размеры
deim: n, s, m, l, x at 640 px
Установка
pip install libreyolo
Уровень поддержки
Основной, начиная с v1.2.0. Основные обучаемые детекторы: функции появляются вслед за флагманами в той же волне релиза.
Исходный проект
DEIM and DEIMv2 от Intellindust AI Lab, Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Статья, исходный код
Лицензии
Код: Apache-2.0, веса: Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License. Коммерческое использование

Установка

Ни одной из версий не нужен дополнительный 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("LibreDEIMn.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreDEIMn.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Видео
from libreyolo import LibreYOLO # Версия входит в имя файла, а фабрика выбирает по чекпойнту, поэтому# обе загружаются одинаково.model = LibreYOLO("LibreDEIMv2pico.pt") # Любой источник, который принимает библиотека: файл, папка, URL, индекс# веб-камеры, RTSP-поток или список .streamsfor result in model.predict("clip.mp4", stream=True, save=True):    print(len(result.boxes))

Возвращаемый объект Results — тот же, что возвращает любое семейство, поэтому подменить детектор на другой можно одной строкой. conf и max_det фильтруют top-k-декодирование по запросам и классам; шага NMS, который нужно было бы настраивать, здесь нет, а iou принимается, но не используется. Про источники, стриминг и обработку результатов — предсказание.

Варианты

Версия 1 поставляется в пяти размерах, все с одинаковым входным разрешением. Версия 2 сохраняет эти пять названий и добавляет три меньших — atto, femto и pico, — первые два из которых нативно работают на меньшем входном разрешении, чем остальные. Поэтому пять кодов размеров существуют в обеих версиях и обозначают разные модели; версия записана в имя файла чекпойнта.

ЧекпойнтВход (пикс.)mAP 50-95Параметры (млн)
LibreDEIMl64057.831.24
LibreDEIMm64055.419.59
LibreDEIMn64046.83.78
LibreDEIMs64052.110.32
LibreDEIMx64059.662.62
LibreDEIMv2atto32027.50.51
LibreDEIMv2femto41634.50.98
LibreDEIMv2l64058.632.55
LibreDEIMv2m64056.018.36
LibreDEIMv2n64046.73.6
LibreDEIMv2pico64042.21.54
LibreDEIMv2s64053.09.78
LibreDEIMv2x64061.351.21

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

Версия 1 сохраняет архитектуру D-FINE и заменяет её целевую функцию классификации на функцию потерь с учётом сопоставимости из рецепта плотного взаимно однозначного сопоставления, поэтому у двух семейств совпадают почти все ключи state dict, и различают их по метаданным в чекпойнте. Версия 2 сохраняет этот контракт обучения и смешивает бэкбоны: HGNetv2 ниже s и vision transformer DINOv3 с адаптером пространственной подстройки на s и выше. Именно из-за этого бэкбона на этих четырёх чекпойнтах появляется вторая лицензия, так что прежде чем выкатывать такой чекпойнт, прочитайте лицензирование.

Обучение

Обучение начинается с опубликованного чекпойнта. pretrained до обучения не доходит: версия 1 предупреждает, что ключ неизвестен, и игнорирует его, версия 2 его удаляет. Ни та, ни другая не дадут модель со случайной инициализацией.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # coco128.yaml при первом запуске скачивает выборку из 128 изображений.# Для реального запуска укажите в `data` YAML своего датасета.model.train(data="coco128.yaml", epochs=50, batch=8, lr0=1e-4)
CLI
libreyolo train model=LibreDEIMn.pt data=coco128.yaml \  epochs=50 batch=8 lr0=1e-4
DEIMv2
from libreyolo import LibreYOLO # Если epochs, batch, imgsz и lr0 не заданы, они берутся из# опубликованного рецепта для загруженного размера.model = LibreYOLO("LibreDEIMv2pico.pt")model.train(data="coco128.yaml", epochs=50)
LoRA
# Требуется extra lora: pip install "libreyolo[lora]"from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt")model.train(data="coco128.yaml", epochs=50, lora=True)
Multi-GPU
libreyolo train model=LibreDEIMn.pt data=coco128.yaml \  epochs=50 device=0,1

На версии 1 задавайте lr0 сами. В сигнатуре Python-метода train() по умолчанию стоит 4e-4 — скорость обучения из опубликованного рецепта для COCO, — тогда как в конфиге обучения этого семейства значением по умолчанию для дообучения записано 1e-4, и именно это меньшее значение подставляет CLI, если аргумент не передан. В конфиге записано и измерение, которое за этим стоит: при размерах батча, которые реально используются при дообучении, на небольших датасетах скорость обучения из рецепта COCO заметно ухудшала перенос.

Версия 2 разрешает эти значения по умолчанию сама. Если epochs, batch, imgsz и lr0 не заданы, каждое из них читается из опубликованного рецепта для загруженного размера, поэтому маленькие размеры обучаются на своём входном разрешении без дополнительных указаний, а переданное вами значение перекрывает рецепт. Ограничение накладывается на imgsz: он должен быть положительным числом, кратным 32, иначе версия 2 выбросит ошибку ещё до старта запуска.

Про датасеты, аугментацию, обучение на нескольких GPU и логгеры — обучение.

Валидация

val() возвращает словарь с ключами metrics/, которые покрывают точность, полноту, mAP 50 и mAP 50-95, посчитанные на любом датасете в том формате, на котором вы обучались.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt") # val() возвращает обычный dict, а не объектmetrics = model.val(data="coco128.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])print(metrics["metrics/precision"], metrics["metrics/recall"])
CLI
libreyolo val model=LibreDEIMn.pt data=coco128.yaml
Валидация на COCO
# coco-val-only.yaml скачивает 5000 изображений val2017 и пропускает# обучающий набор. Внутри него есть встроенный скрипт загрузки, поэтому# нужно явное разрешение, если датасета ещё нет локально.libreyolo val model=LibreDEIMn.pt data=coco-val-only.yaml \  allow_download_scripts=True

Строки в таблице бенчмарков выше получены на бенчмарк-стенде LibreYOLO; в примечании под этой таблицей указано, на каком датасете они получены, и даны ссылки на записи о запусках.

Экспорт

Задача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: поддерживается

Матрица описывает обе версии на одной странице: там, где они расходятся по формату, в ячейке показан более слабый из двух вариантов, так что здесь ничего не приукрашено — какую бы версию вы ни загрузили.

Экспортированный артефакт загружается обратно через LibreYOLO() по суффиксу файла, поэтому файл .onnx или .engine ведёт себя как чекпойнт и возвращает тот же Results.

Python
# Требуется extra onnx: pip install "libreyolo[onnx]"from libreyolo import LibreYOLO model = LibreYOLO("LibreDEIMn.pt")path = model.export(format="onnx")print(path)
CLI
libreyolo export model=LibreDEIMn.pt format=onnx
Использование экспортированного файла
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает по суффиксу файла, поэтому экспортированный артефакт# загружается как обычный чекпойнт и возвращает тот же объект Results.model = LibreYOLO("LibreDEIMn.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Чекпойнты

Все опубликованные файлы весов этого семейства.

ФайлВход (пикс.)Лицензия весов
Detection
LibreDEIMn.pt640apache-2.0
LibreDEIMs.pt640apache-2.0
LibreDEIMm.pt640apache-2.0
LibreDEIMl.pt640apache-2.0
LibreDEIMx.pt640apache-2.0
LibreDEIMv2n.pt640apache-2.0
LibreDEIMv2s.pt640other
LibreDEIMv2m.pt640other
LibreDEIMv2l.pt640other
LibreDEIMv2x.pt640other
LibreDEIMv2atto.ptapache-2.0
LibreDEIMv2femto.ptapache-2.0
LibreDEIMv2pico.ptapache-2.0

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

Лицензирование

Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.

Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.

Оригинальная работа
DEIM and DEIMv2, Intellindust AI Lab
Лицензия исходного проекта
Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License
Исходный код проекта
github.com/Intellindust-AI-Lab/DEIM
Код LibreYOLO
MIT
Веса
Apache-2.0; the DEIMv2 DINOv3 backbone adds Meta's DINOv3 License, повторно опубликованы на 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. DEIM is Apache-2.0 throughout, and so are the DEIMv2 sizes below S, which use an HGNetv2 backbone. The DEIMv2 S, M, L and X sizes take their backbone from DINOv3, so both their weights and the backbone source vendored in LibreYOLO are additionally governed by Meta's DINOv3 License Agreement, which is not an OSI license: redistribution has to carry the agreement with it, and it forbids use for military or warfare purposes, weapons development, espionage, nuclear industries and anything subject to ITAR. Their Hugging Face repositories declare both licenses, and DEIMv2 is also cited separately (arXiv 2509.20787).
Четыре размера DEIMv2 начиная с S берут бэкбон из DINOv3, поэтому в их репозиториях с весами действуют одновременно Apache-2.0 и DINOv3 License от Meta, а исходники бэкбона DINOv3 LibreYOLO поставляет по тому же соглашению. Остальная часть семейства, включая все размеры DEIMv2 ниже S, — только Apache-2.0.

Цитирование

@misc{huang2024deim,
      title={DEIM: DETR with Improved Matching for Fast Convergence},
      author={Shihua, Huang and Zhichao, Lu and Xiaodong, Cun and Yongjun, Yu and Xiao, Zhou and Xi, Shen},
      booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
      year={2025},
}

Скопировано из блока цитирования авторов на странице github.com/Intellindust-AI-Lab/DEIM#5-citation.

DEIMv2 — отдельная статья, и у неё свой блок цитирования на github.com/Intellindust-AI-Lab/DEIMv2; ссылайтесь на него, если использовали чекпойнт версии 2.

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