Усі статті

RT-DETR без Ultralytics: v1, v2 і v4 з Apache-2.0

Xuban

RT-DETR є трансформером для виявлення об'єктів у реальному часі від Baidu. Він декодує фіксований набір запитів замість щільної сітки, тож не потрібно налаштовувати етап NMS. Якщо пошукати RT-DETR, однією з перших знайдених реалізацій буде та, що входить до пакета Python ultralytics. Тут виникає питання ліцензії, якого сама модель ніколи не породжувала.

Ліцензія RT-DETR залежить від репозиторію

Ліцензія стосується репозиторію, а не моделі. Репозиторіїв RT-DETR кілька, і їхні ліцензії різняться:

РепозиторійЩо охоплюєЛіцензія
lyuwenyu/RT-DETRRT-DETR і RT-DETRv2, PyTorch і PaddleApache-2.0
RT-DETRs/RT-DETRv4RT-DETRv4Apache-2.0
ultralytics/ultralyticsRT-DETR у пакеті ultralyticsAGPL-3.0 або Enterprise License
LibreYOLORT-DETR, RT-DETRv2 і RT-DETRv4код MIT, ваги Apache-2.0

Реалізація Ultralytics якісна. На сторінці RT-DETR наведено попередньо навчені rtdetr-l.pt і rtdetr-x.pt, а також підтримку навчання, валідації, інференсу й експорту. Вона входить до пакета з ліцензією AGPL-3.0, а Ultralytics продає Enterprise License командам, які не хочуть відкривати вихідний код усього проєкту. Якщо жоден варіант не підходить, архітектура доступна за Apache-2.0 від її авторів. У статті пояснення ліцензій YOLO розглянуто той самий сценарій для сімейства YOLO, а посібник із комерційної ліцензії пояснює, що AGPL-3.0 означає для продукту із закритим кодом.

Запуск RT-DETR з LibreYOLO

pip install libreyolo
from libreyolo import LibreYOLO, SAMPLE_IMAGE

model = LibreYOLO("LibreRTDETRr18.pt")  # downloads from Hugging Face on first use
result = model(SAMPLE_IMAGE, save=True)

for box in result.boxes:
    print(box.cls, box.conf, box.xyxy)

Той самий виклик працює з командного рядка:

libreyolo predict model=LibreRTDETRr18.pt source=image.jpg save=True

conf і max_det фільтрують декодування top-k за запитами й класами. Параметр iou приймається, але не використовується, оскільки NMS немає. Повертається об'єкт Results, який використовують усі моделі LibreYOLO, тому для заміни детектора достатньо змінити один рядок.

RT-DETR, RT-DETRv2 і RT-DETRv4 в одному завантажувачі

Версію вказано в імені файлу, а LibreYOLO() вибирає її за контрольної точкою, тож усі три версії завантажуються однаково:

  • RT-DETR: LibreRTDETR у варіантах r18, r34, r50, r50m, r101 (бекбони ResNet) та l, x (HGNetv2).
  • RT-DETRv2: LibreRTDETRv2 у варіантах r18, r34, r50, r50m і r101. Архітектура версії 1 збережена, змінено спосіб вибірки деформівною увагою.
  • RT-DETRv4: LibreRTDETRv4 у варіантах s, m, l і x. Тут повторно використано архітектуру D-FINE, а ваги отримано дистиляцією моделі-учителя DINOv3 у модель-учня HGNetv2.

Усі ваги для виявлення об'єктів навчено на COCO, інференс виконується на 640 px. Для довідки: у файлах README вихідних репозиторіїв вказано 46.5 AP для RT-DETR-R18 і 53.0 AP для RT-DETR-L на COCO, а для RT-DETRv4-S показник сягає 49.8 AP, для RT-DETRv4-X 57.0 AP. На сторінці документації RT-DETR наведено власну таблицю бенчмарків LibreYOLO для кожної контрольної точки.

RT-DETRv2 також підтримує орієнтовані рамки. Контрольні точки від LibreRTDETRv2n-obb.pt до LibreRTDETRv2x-obb.pt включно є офіційними контрольними точками DOTA v1.0: 15 класів аерознімків на 1024 px, конвертовані у формат LibreYOLO:

from libreyolo import LibreYOLO

model = LibreYOLO("LibreRTDETRv2n-obb.pt")
result = model("aerial.png", save=True)
print(result.obb.xywhr)  # (N, 5): cx, cy, w, h, radians

У розділі виявлення з орієнтованими рамками описано формат міток і метрики.

Донавчання RT-DETR на власних даних

Навчання починається з опублікованої контрольної точки:

from libreyolo import LibreYOLO

model = LibreYOLO("LibreRTDETRr18.pt")
model.train(data="coco128.yaml", epochs=50, batch=4, lr0=1e-4)

Для повноцінного запуску вкажіть у data YAML-файл власного датасету. Для кожної версії задано власне типове значення швидкості навчання, а у версіях 1 і 2 швидкість навчання бекбона дорівнює одній двадцятій від lr0, відповідно до оригінального рецепта. Для кількох GPU вкажіть у CLI device=0,1, а для донавчання адаптерами LoRA встановіть lora=True і додатковий компонент lora. Моделі орієнтованих рамок для RT-DETRv2 підтримують лише інференс. Інформацію про датасети, аугментацію та логери наведено в розділі навчання.

Валідація й експорт

metrics = model.val(data="coco128.yaml")
print(metrics["metrics/mAP50-95"])

path = model.export(format="onnx")  # needs: pip install "libreyolo[onnx]"

val() повертає звичайний словник. Серед доступних форматів експорту є ONNX, TorchScript, ExecuTorch, TensorRT і OpenVINO; у матриці експорту на сторінці моделі вказано, які з них перевірено для кожної задачі. Експортовані файли .onnx або .engine завантажуються через LibreYOLO() і повертають той самий об'єкт Results. Посібники для кожного формату дивіться в розділі експорт.

Коли варто використовувати оригінальні репозиторії

Якщо потрібно відтворити результат зі статті з точними конфігураціями авторів, потрібна версія для Paddle або ви хочете самостійно виконати дистиляцію моделі-учителя DINOv3 для RT-DETRv4, скористайтеся вихідними репозиторіями. LibreYOLO донавчає випущену модель-учня v4, але не запускає модель-учителя. Якщо ж ваш проєкт уже має ліцензію AGPL-3.0 або на нього поширюється Enterprise License Ultralytics, ліцензійних причин для переходу немає.

Примітка щодо ліцензії

Код LibreYOLO поширюється за MIT. Кожен файл ваг RT-DETR має ліцензію Apache-2.0, а в кожному репозиторії ваг на Hugging Face є файл LICENSE і NOTICE. Під час повторного поширення ваг Apache-2.0 вимагає зберігати ці файли. Ваги, навчені на власних даних, належать вам. RT-DETRv4 використовує DINOv3 лише як модель-учителя під час навчання, а випущені моделі-учні не містять параметрів DINOv3. Це загальна інформація, а не юридична консультація. Перед випуском перевірте актуальні файли LICENSE.

Спробуйте

pip install libreyolo
from libreyolo import LibreYOLO

model = LibreYOLO("LibreRTDETRv4s.pt")
result = model("image.jpg", save=True)
print(result.boxes.xyxy)

LibreYOLO поширюється за ліцензією MIT, працює на Linux, Mac і Windows, а також на GPU, Apple Silicon і звичайному CPU без змін у коді.

GitHub | Документація RT-DETR