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 сверх базового пакета.
pip install libreyoloПредсказание
Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.
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)libreyolo predict model=LibreRTMDets.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom 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, используют одну архитектуру на общем входном
разрешении. Таблицы бенчмарков у этого семейства здесь нет: размеры сравнивайте
по размеру файла чекпойнта в таблице ниже.
Обучение
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.train( data="my-dataset.yaml", epochs=300, imgsz=640, batch=16, lr0=0.004,)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, измеренные на любом датасете в том формате, на
котором вы обучались.
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreRTMDets.pt data=my-dataset.yamlfrom 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), так
что оба значения доступны за один проход.
Экспорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection 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 segmentation | Instance 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, тоже поддерживается, но тогда предобработку и
постобработку вам придётся писать самостоятельно.
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreRTMDets.pt format=onnx imgsz=640libreyolo export model=LibreRTMDets.pt format=tensorrt imgsz=640 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает загрузчик по расширению файла, поэтому# экспортированный артефакт загружается как любой чекпойнт и# возвращает тот же объект Results.model = LibreYOLO("LibreRTMDets.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Чекпойнты
Все опубликованные файлы весов этого семейства.
| Файл | Вход (пикс.) | Лицензия весов |
|---|---|---|
| Detection | ||
| LibreRTMDett.pt | 640 | apache-2.0 |
| LibreRTMDets.pt | 640 | apache-2.0 |
| LibreRTMDetm.pt | 640 | apache-2.0 |
| LibreRTMDetl.pt | 640 | apache-2.0 |
| LibreRTMDetx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreRTMDett-seg.pt | 640 | apache-2.0 |
| LibreRTMDets-seg.pt | 640 | apache-2.0 |
| LibreRTMDetm-seg.pt | 640 | apache-2.0 |
| LibreRTMDetl-seg.pt | 640 | apache-2.0 |
| LibreRTMDetx-seg.pt | 640 | apache-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.