Dome-DETR
Специалист по мелким объектам на базе D-FINE: голова плотности решает, где находятся объекты, внимание энкодера ограничивается окнами, в которых они есть, а число запросов подбирается по этой же плотности вместо фиксированного. LibreYOLO поддерживает его для детекции.
- Задачи
- detection
- Размеры
- s, m, l at 800 px
- Установка
pip install libreyolo- Уровень поддержки
- Поддерживаемый, начиная с v1.5.0. Дополнительные обучаемые модели: тесты CI поддерживаются в рабочем состоянии, а функции добавляются по возможности.
- Исходный проект
- Dome-DETR от The Dome-DETR Authors, unclear, not redistributed. Статья, исходный код
- Лицензии
- Код: Apache-2.0, веса: unclear, not redistributed. Коммерческое использование
Установка
Dome-DETR не нужен дополнительный extra. Всё, что он импортирует, входит в базовую установку.
pip install libreyoloПредсказание
Автоматически скачивать нечего. LibreYOLO не размещает эти веса, поэтому порядок такой: получить оригинальный чекпойнт, один раз его сконвертировать, а затем загрузить сконвертированный файл по пути. Почему так — лицензирование.
# LibreYOLO не размещает веса Dome-DETR, поэтому чекпойнт скачивается# из оригинального репозитория и конвертируется один раз.hf download RicePasteM/Dome-DETR --include 'best_ckpts_dome_2026/*' \ --local-dir dome-ckpts python weights/convert_domedetr_weights.py \ dome-ckpts/best_ckpts_dome_2026/dome-s-visdrone_converted.pth \ LibreDOMEDETRs-visdrone.pt --size s --variant visdronefrom libreyolo import LibreYOLO # Локальный путь, а не имя: для этого семейства ничего не скачивается.model = LibreYOLO("LibreDOMEDETRs-visdrone.pt")result = model("drone-frame.jpg", save=True) for box in result.boxes: print(result.names[int(box.cls)], box.conf, box.xyxy)libreyolo predict model=LibreDOMEDETRs-visdrone.pt source=drone-frame.jpg save=Truefrom libreyolo import LibreYOLO # Чекпойнта на COCO нет, поэтому классы берутся из датасета, на котором# обучались веса, и читаются из метаданных чекпойнта.aitod = LibreYOLO("LibreDOMEDETRs-aitod.pt")print(aitod.model.names) # 9 классов AI-TOD-V2 visdrone = LibreYOLO("LibreDOMEDETRs-visdrone.pt")print(visdrone.model.names) # 12 классов VisDroneВозвращаемый объект Results — тот же, что возвращает любое семейство, поэтому
замена одного детектора на другой сводится к одной строке. conf и max_det
фильтруют отбор запросов; iou принимается ради совместимости API, но ни на
что не влияет, потому что декодер предсказывает набор целиком и шага NMS в нём
нет. Про источники, стриминг и обработку результатов см.
предсказание.
Две возможности для этого семейства выключены. Захват CUDA-графов отключён, потому что число запросов в PAQI зависит от данных и прямой проход поэтому меняет форму от изображения к изображению — а это ровно то, что захват графа переварить не может. Аугментация во время инференса (TTA) работает на одном фиксированном квадратном размере, поэтому запрос многомасштабного TTA ничего не делает.
Варианты
Три размера — s, m и l, — все на 800 на 800. Размер выбирает бэкбон, а датасет, из которого пришли веса, выбирает глубину декодера и бюджет запросов, поэтому один только код размера граф не определяет. Веса на AI-TOD-V2 выбирают от 300 до 1500 запросов на изображение, веса на VisDrone — от 250 до 500, а большая модель работает с четырьмя слоями декодера на AI-TOD-V2 против шести на VisDrone.
Dome-DETR — это D-FINE с тремя добавлениями. DeFE предсказывает карту плотности. MWAS по этой карте ограничивает внимание энкодера окнами, в которых объекты действительно есть, вместо внимания по всему изображению. PAQI по той же плотности подбирает размер набора запросов вместо декодирования фиксированных 300. Выигрыш сосредоточен там, где объекты самые мелкие, и сходит на нет по мере их роста: в собственном ablation-исследовании авторов AP на очень мелких объектах поднимается с 14.0 до 17.8, тогда как AP на средних объектах — лишь с 45.4 до 46.4. Стоит воспринимать его как дополнение к D-FINE для аэроснимков, съёмки с дронов и дистанционного зондирования, а не как замену.
LibreYOLO не публикует для этого семейства строк бенчмарков, потому что не публикует и чекпойнтов, которые можно было бы измерить.
Обучение
Dome-DETR обучается. Обучение идёт по полной целевой функции оригинала: функции потерь D-FINE плюс супервизия плотности и количества из DeFE, с маскированием дополняющих запросов в классификационных слагаемых и с масками внимания для denoising, отдельными на каждое изображение, чтобы дополнение одного изображения не протекало в другое.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDOMEDETRs-visdrone.pt")model.train(data="my-dataset.yaml", epochs=160, imgsz=800, batch=4, lr0=2e-4)libreyolo train model=LibreDOMEDETRs-visdrone.pt data=my-dataset.yaml \ epochs=160 imgsz=800 batch=4 lr0=2e-4libreyolo train model=LibreDOMEDETRs-visdrone.pt data=my-dataset.yaml \ epochs=160 device=0,1 batch=4Конфигурация наследует рецепт D-FINE и меняет то, что требует MWAS. imgsz
равен 800, lr0 — 2e-4, группа параметров бэкбона масштабируется
коэффициентом backbone_lr_mult=0.1, а multi_scale принудительно выключен,
потому что окнам MWAS нужно, чтобы вход оставался кратным шагу 8. batch по
умолчанию равен 4, а не 16, как в D-FINE: PAQI дополняет каждый батч до самого
широкого его элемента, поэтому память определяется самым нагруженным
изображением в батче, а не средним.
Одна честная оговорка про точность. Оригинальная реализация обучается 160 эпох
на MultiStepLR(milestones=[80, 120], gamma=0.8), тогда как эти значения по
умолчанию гоняют расписание flat-cosine из D-FINE те же 160 эпох. Это
расписание здесь не воспроизводили, и числа AP из статьи тоже не
воспроизводили, так что читайте их как результаты авторов оригинальной работы,
а не как обещание, что этот рецепт до них дотянет. Если цель — совпасть со
статьёй, задайте оригинальное расписание.
Про датасеты, аугментацию, multi-GPU и логгеры см. обучение.
Валидация
val() возвращает словарь с ключами по именам метрик и печатает результаты по
классам, если verbose оставлен включённым.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDOMEDETRs-visdrone.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreDOMEDETRs-visdrone.pt data=my-dataset.yamlВалидация идёт на вашем собственном датасете в том формате, в котором вы обучали. Гейт валидации на COCO из библиотеки здесь не применяется, потому что чекпойнта на COCO, с которым можно было бы сравнить, для этого семейства не существует.
Экспорт
Экспорт не поддерживается ни для одного формата: запрос на него не создаёт файл, а выбрасывает ошибку.
Причина — PAQI. Он определяет число запросов на каждое изображение, по отфильтрованным по плотности предложениям и жадному циклу подавления, адаптивного к плотности, поэтому длина выхода декодера — свойство входа, а не графа. Трассировка намертво фиксирует то число, которое случайно дало изображение при трассировке, и на выходе получается артефакт, который молча возвращает неверные результаты для всех остальных изображений. Статическая формулировка должна была бы развернуть этот цикл подавления по всем 250–1500 кандидатам, а схлопывание до фиксированного top-k убрало бы ровно ту полноту на мелких объектах, ради которой семейство и существует. Если нужен экспортируемый трансформер для детекции, берите D-FINE.
Чекпойнты
Перечислять нечего. LibreYOLO не публикует веса Dome-DETR, и ни одно имя вида
LibreDOMEDETR<size>-<dataset>.pt не ведёт к загрузке.
Авторы публикуют шесть чекпойнтов — s, m и l для каждого из двух датасетов:
AI-TOD-V2 с 9 классами и VisDrone с 12. Чекпойнта на COCO нет, поэтому
каноническое имя файла всегда несёт суффикс датасета, а имена классов едут в
метаданных чекпойнта, а не берутся из константы семейства. Запрос голого
LibreDOMEDETRs.pt сразу выбрасывает ошибку с сообщением, где названы два
настоящих имени файлов и команда конвертации, вместо попытки скачивания,
которая вернула бы 404.
Конвертацию делает weights/convert_domedetr_weights.py. Он заново собирает
граф LibreYOLO, загружает в него оригинальные тензоры и отказывается что-либо
записывать, если хоть один ключ отсутствует, лишний или не той формы, так что
сконвертированный файл либо в точности совпадает, либо его нет вовсе. Укажите
ему оригинальный .pth и передайте размер и вариант:
python weights/convert_domedetr_weights.py \
dome-ckpts/best_ckpts_dome_2026/aitod-s-best.pth \
LibreDOMEDETRs-aitod.pt --size s --variant aitodПро численную точность: weights/parity_domedetr.py сравнивает этот порт с
оригинальной реализацией на всех шести чекпойнтах и показывает
max_abs_diff == 0.0 и по pred_logits, и по pred_boxes, предварительно
сверив бит в бит маску окон MWAS, и отдельно сравнивает каждое слагаемое
функции потерь с оригинальным критерием. Стоит прямо сказать, что это такое:
ручной скрипт, которому нужны оригинальный checkout и опубликованные чекпойнты
на диске, и запускают его руками. В непрерывную интеграцию он не входит, и ни
одна CI-задача его не воспроизводит.
Лицензирование
Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.
Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.
- Оригинальная работа
- Dome-DETR, The Dome-DETR Authors
- Лицензия исходного проекта
- unclear, not redistributed
- Исходный код проекта
- github.com/RicePasteM/Dome-DETR
- Код LibreYOLO
- MIT
- Веса
- unclear, not redistributed, распространяются авторами. LibreYOLO не размещает и не зеркалирует их.
- Толкование
- The code and the weights part company here. The upstream repository is Apache-2.0, permissive and safe for commercial and closed-source use, and LibreYOLO's own port is MIT, so nothing restricts the architecture or the training code. The weights are the unresolved part: the upstream model card carries no license field in its metadata, and its prose states that the project is Apache-2.0 while also restricting the material to academic research purposes only. Those two readings do not agree, and the stricter one is not a grant to redistribute, so LibreYOLO mirrors nothing for this family and hosts no checkpoint. Download the six upstream checkpoints yourself and convert them with weights/convert_domedetr_weights.py, and read the upstream terms before using them for anything commercial. Weights you train yourself on your own data derive from no upstream checkpoint and are yours.
Причина, по которой это семейство не зеркалируется, — веса. В метаданных оригинальной карточки модели нет поля лицензии, а в её тексте сказано, что проект под Apache-2.0, и одновременно материал ограничен только академическими исследованиями. Эти два прочтения не сходятся, а более строгое из них разрешения на распространение не даёт, поэтому LibreYOLO ссылается на оригинальный репозиторий, а не копирует файлы, до прояснения. Ровно те же соображения действуют здесь и для YOLO-NAS.
Код — вопрос отдельный и более ясный. Оригинальный репозиторий под Apache-2.0, порт в LibreYOLO — под MIT, а веса, которые вы обучили сами на своих данных, принадлежат вам.
Цитирование
Dome-DETR опубликован на ACM Multimedia 2025 под названием «Dome-DETR: DETR with Density-Oriented Feature-Query Manipulation for Efficient Tiny Object Detection». Препринт — arxiv.org/abs/2505.05741. Авторы не публикуют в своём репозитории блок BibTeX, поэтому он здесь не воспроизводится, а не собирается вручную.