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, Apache-2.0 code; academic-research-only weights. Статья, исходный код
Лицензии
Код: Apache-2.0, веса: Apache-2.0 code; academic-research-only weights. Коммерческое использование

Установка

Dome-DETR не нужен дополнительный extra. Всё, что он импортирует, входит в базовую установку.

bash
pip install libreyolo

Предсказание

Шесть конвертированных чекпойнтов скачиваются автоматически с зеркал LibreYOLO. Условия исходного проекта разрешают использование только в академических исследованиях.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Предобученные веса разрешены только для академических исследований.model = LibreYOLO("LibreDOMEDETRs-visdrone.pt", device="cpu")print(model(SAMPLE_IMAGE).boxes)

Возвращаемый объект 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 для аэроснимков, съёмки с дронов и дистанционного зондирования, а не как замену.

Для этого семейства нет записей бенчмарков Vision Analysis.

Обучение

Dome-DETR обучается. Обучение идёт по полной целевой функции оригинала: функции потерь D-FINE плюс супервизия плотности и количества из DeFE, с маскированием дополняющих запросов в классификационных слагаемых и с масками внимания для denoising, отдельными на каждое изображение, чтобы дополнение одного изображения не протекало в другое.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreDOMEDETRs-visdrone.pt")model.train(data="my-dataset.yaml", epochs=160, imgsz=800, batch=4, lr0=2e-4)
CLI
libreyolo train model=LibreDOMEDETRs-visdrone.pt data=my-dataset.yaml \  epochs=160 imgsz=800 batch=4 lr0=2e-4
Multi-GPU
libreyolo 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 оставлен включённым.

Python
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"])
CLI
libreyolo val model=LibreDOMEDETRs-visdrone.pt data=my-dataset.yaml

Валидация идёт на вашем собственном датасете в том формате, в котором вы обучали. Гейт валидации на COCO из библиотеки здесь не применяется, потому что чекпойнта на COCO, с которым можно было бы сравнить, для этого семейства не существует.

Экспорт

Экспорт не поддерживается ни для одного формата: запрос на него не создаёт файл, а выбрасывает ошибку.

Причина — PAQI. Он определяет число запросов на каждое изображение, по отфильтрованным по плотности предложениям и жадному циклу подавления, адаптивного к плотности, поэтому длина выхода декодера — свойство входа, а не графа. Трассировка намертво фиксирует то число, которое случайно дало изображение при трассировке, и на выходе получается артефакт, который молча возвращает неверные результаты для всех остальных изображений. Статическая формулировка должна была бы развернуть этот цикл подавления по всем 250–1500 кандидатам, а схлопывание до фиксированного top-k убрало бы ровно ту полноту на мелких объектах, ради которой семейство и существует. Если нужен экспортируемый трансформер для детекции, берите D-FINE.

Чекпойнты

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

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

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

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

Оригинальная работа
Dome-DETR, The Dome-DETR Authors
Лицензия исходного проекта
Apache-2.0 code; academic-research-only weights
Исходный код проекта
github.com/RicePasteM/Dome-DETR
Код LibreYOLO
MIT
Веса
Apache-2.0 code; academic-research-only weights, повторно опубликованы на huggingface.co/LibreYOLO
Толкование
The upstream source is Apache-2.0. Six mirrored checkpoints retain the publisher academic-research-only restriction.

Шесть зеркал сохраняют ограничение исходного проекта на использование только в академических исследованиях. Код лицензируется отдельно. Исходный репозиторий использует Apache-2.0, порт LibreYOLO использует MIT, а веса, которые вы обучаете на собственных данных, принадлежат вам.

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