RTMDet

RTMDet — одностадийный детектор, который предсказывает из одного точечного приора на каждую позицию сетки, без якорей, через голову, свёртки которой общие для всех уровней признаков. LibreYOLO поддерживает его для детекции и сегментации экземпляров RTMDet-Ins.

Задачи
detection, instance segmentation
Размеры
t, s, m, l, x at 640 px
Установка
pip install libreyolo
Уровень поддержки
Поддерживаемый, начиная с v. Дополнительные обучаемые модели: тесты CI поддерживаются в рабочем состоянии, а функции добавляются по возможности.
Исходный проект
RTMDet от OpenMMLab, Apache-2.0. Статья, исходный код
Лицензии
Код: Apache-2.0, веса: Apache-2.0. Коммерческое использование

Установка

RTMDet не требует никаких extra сверх базового пакета.

bash
pip install libreyolo

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

Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreRTMDets.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreRTMDets.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Сегментация экземпляров
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Суффикс -seg в имени файла выбирает голову масок RTMDet-Ins,# поэтому аргумент task здесь не нужен.model = LibreYOLO("LibreRTMDets-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)

Возвращаемый объект Results — тот же, что возвращает любое семейство, поэтому замена на другой детектор занимает одну строку. Имя файла с -seg само по себе разрешается в задачу RTMDet-Ins, и тогда result.masks несёт маски экземпляров рядом с рамками. conf задаёт порог уверенности, а iou — порог NMS. Про источники, стриминг и обработку результатов см. предсказание.

Варианты

Пять размеров, от t до x, используют одну архитектуру на общем входном разрешении. Таблицы бенчмарков у этого семейства здесь нет: размеры сравнивайте по размеру файла чекпойнта в таблице ниже.

Обучение

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.train(    data="my-dataset.yaml",    epochs=300, imgsz=640, batch=16, lr0=0.004,)
CLI
libreyolo train model=LibreRTMDets.pt data=my-dataset.yaml imgsz=640 epochs=300 batch=16 lr0=0.004

Детекция обучается через train(). Компоненты QualityFocalLoss, GIoU и DynamicSoftLabelAssigner портированы из апстрима mmdetection, прямой проход и экспорт в ONNX побитово совпадают с ним, а постобработка сходится с выводом mmdet в пределах 0.001 mAP на подмножествах val2017.

Что не проверялось, согласно докстрингу самого train(): сходимость дообучения на маленьких датасетах, соответствие статье при обучении с нуля, поведение на multi-GPU, пропускная способность кэшированных Mosaic и MixUp, строгое апстримовое переключение двухстадийного пайплайна и попараметрические переопределения weight decay, которые обнуляют его для параметров нормализации и смещений.

У RTMDet-Ins нет пути обучения. Вызов train() на -seg-чекпойнте или с task="segment" выбрасывает NotImplementedError; сегментация экземпляров поддерживает только инференс и валидацию.

train() также принимает аргумент pretrained, но внутри метода его значение никогда не читается: обучение всегда продолжается с тех весов, с которыми была создана модель, поэтому pretrained=False не переинициализирует сеть.

Если ничего не менять, обучение идёт 300 эпох с AdamW при lr0=0.004 и weight_decay=0.05, с прогревом длиной в одну эпоху по косинусному расписанию и с отключёнными Mosaic и MixUp на последних 20 эпохах.

Про датасеты, аугментацию, multi-GPU и логгеры см. обучение.

Валидация

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

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreRTMDets.pt data=my-dataset.yaml
Сегментация экземпляров
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets-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. Запуск графа в голой среде выполнения, без установленной LibreYOLO, тоже поддерживается, но тогда предобработку и постобработку вам придётся писать самостоятельно.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)
CLI
libreyolo export model=LibreRTMDets.pt format=onnx imgsz=640libreyolo export model=LibreRTMDets.pt format=tensorrt imgsz=640 half=True
Использование экспортированного файла
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает загрузчик по расширению файла, поэтому# экспортированный артефакт загружается как любой чекпойнт и# возвращает тот же объект Results.model = LibreYOLO("LibreRTMDets.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

Чекпойнты

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

ФайлВход (пикс.)Лицензия весов
Detection
LibreRTMDett.pt640apache-2.0
LibreRTMDets.pt640apache-2.0
LibreRTMDetm.pt640apache-2.0
LibreRTMDetl.pt640apache-2.0
LibreRTMDetx.pt640apache-2.0
Instance segmentation
LibreRTMDett-seg.pt640apache-2.0
LibreRTMDets-seg.pt640apache-2.0
LibreRTMDetm-seg.pt640apache-2.0
LibreRTMDetl-seg.pt640apache-2.0
LibreRTMDetx-seg.pt640apache-2.0

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

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

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

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

Оригинальная работа
RTMDet, OpenMMLab
Лицензия исходного проекта
Apache-2.0
Исходный код проекта
github.com/open-mmlab/mmdetection
Код 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 published RTMDet and RTMDet-Ins checkpoints are converted from mmdetection's own COCO weights, trained by OpenMMLab under the same license.

Цитирование

@misc{lyu2022rtmdet,
      title={RTMDet: An Empirical Study of Designing Real-Time Object Detectors},
      author={Chengqi Lyu and Wenwei Zhang and Haian Huang and Yue Zhou and Yudong Wang and Yanyi Liu and Shilong Zhang and Kai Chen},
      year={2022},
      eprint={2212.07784},
      archivePrefix={arXiv},
      primaryClass={cs.CV}
}

Скопировано из блока цитирования авторов на странице github.com/open-mmlab/mmdetection/tree/main/configs/rtmdet#citation.

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