RTMDet
RTMDet є одностадійним детектором, що робить передбачення на основі одного точкового пріора для кожної позиції сітки без якорів через голову зі спільними згортками для всіх рівнів ознак. LibreYOLO підтримує його для виявлення об'єктів і сегментації екземплярів RTMDet-Ins.
- Задачі
- detection, instance segmentation
- Розміри
- t, s, m, l, x at 640 px
- Встановлення
pip install libreyolo- Рівень підтримки
- Підтримуваний, починаючи з v. Додаткові придатні до навчання моделі: тести CI підтримують справними, а функції додають за нагоди.
- Ліцензії
- Код: Apache-2.0, ваги: Apache-2.0. Комерційне використання
Установлення
RTMDet не потребує нічого додаткового до базового пакета.
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(), не перевірено: збіжність
донавчання на малих датасетах, відповідність статті під час навчання з нуля,
поведінку на кількох GPU, пропускну здатність кешованих Mosaic і MixUp, суворе
перемикання двостадійного пайплайна оригінальної реалізації та параметричні
перевизначення спаду ваг, які обнуляють спад для параметрів нормалізації та зміщення.
Для RTMDet-Ins немає шляху навчання. Виклик train() для контрольної точки
із суфіксом -seg або з task="segment" спричиняє NotImplementedError;
сегментація екземплярів підтримує лише інференс і валідацію.
train() також приймає аргумент pretrained, але його значення всередині методу
ніколи не зчитується: навчання завжди продовжується з ваг, з якими створено модель,
тому pretrained=False не ініціалізує мережу повторно.
Якщо інші параметри не змінювати, навчання триває 300 епох з AdamW за
lr0=0.004 і weight_decay=0.05, містить прогрівання протягом 1 епохи за
косинусним розкладом, а Mosaic і MixUp вимикаються на останні 20 епох.
Докладніше про датасети, аугментацію, кілька 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.