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 не потребує нічого додаткового до базового пакета.

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(), не перевірено: збіжність донавчання на малих датасетах, відповідність статті під час навчання з нуля, поведінку на кількох 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, виміряні на будь-якому датасеті у форматі, на якому проводилося навчання.

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. Таблиці підтримки, контрольні точки й результати бенчмарків на цій сторінці згенеровано з випущеної бібліотеки та опублікованих ваг, а не написано вручну.