RF-DETR

Трансформер виявлення, який передбачає фіксований набір об'єктів замість щільної сітки, тому не потребує NMS під час інференсу. LibreYOLO підтримує його для чотирьох завдань.

Задачі
detection, instance segmentation, pose, oriented boxes
Розміри
n, s, m, l for detection and oriented boxes; n through xx for segmentation; x for pose
Встановлення
pip install "libreyolo[rfdetr]"
Рівень підтримки
Флагманський, починаючи з v1.0.0. Тут функції проєктують і першими повністю валідують на GPU.
Першоджерело
RF-DETR, автори: Roboflow, ліцензія Apache-2.0. Стаття, джерело
Ліцензії
Код: MIT, ваги: Apache-2.0. Комерційне використання
LibreRFDETRs, виявлення на відео з 512 px.

Встановлення

RF-DETR потребує власного додаткового пакета, який встановлює transformers для бекбона.

bash
pip install "libreyolo[rfdetr]"

Без нього завантаження контрольної точки або назви моделі RF-DETR, з Python чи з CLI, завершується помилкою, яка називає цей рядок встановлення.

Передбачення

Під час першого використання ваги завантажуються з Hugging Face та кешуються локально.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreRFDETRs.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreRFDETRs.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
Відео
from libreyolo import LibreYOLO model = LibreYOLO("LibreRFDETRs.pt") # Будь-яке джерело, яке приймає бібліотека: файл, каталог, URL-адреса,# індекс вебкамери, потік RTSP або список .streamsfor result in model.predict("clip.mp4", stream=True, save=True):    print(len(result.boxes))

Повертається той самий об'єкт Results, що й для кожного сімейства, тому для заміни детектора достатньо змінити один рядок. Параметри conf і max_det фільтрують вибір запитів; етапу NMS для налаштування немає. Джерела, потокове оброблення та роботу з результатами описано на сторінці передбачення.

Виявлення, сегментація та орієнтовані рамки використовують білінійне масштабування OpenCV з рухомою комою без згладжування; для пози збережено масштабування зі згладжуванням. Прямокутний imgsz=(height, width) має відповідати сітці патчів і вікон завдання. Перелік контрольних точок містить детектор інтерфейсу. Гістограми подій використовують записаний профіль вхідних даних.

Варіанти

Доступні чотири розміри для виявлення, від n до l, і чотири завдання зі спільною архітектурою: сегментація, оцінювання пози та орієнтовані рамки повторно використовують декодер виявлення з іншою головою, тому приймають ті самі аргументи. Сегментація додає x і xx, а оцінювання пози доступне лише в розмірі x. Розміри мають подібну кількість параметрів і відрізняються переважно роздільною здатністю вхідних даних.

Контрольна точкаВхід (пікс.)mAP 50-95Параметри (млн)
LibreRFDETRn38451.430.47
LibreRFDETRs51255.232.11
LibreRFDETRm57657.433.69
LibreRFDETRl70458.633.93

COCO val2017, 500 images. Виміряно засобами бенчмарку LibreYOLO й опубліковано на сторінці Vision Analysis, де порівнюють затримку на різному обладнанні та в різних середовищах виконання, а також зберігають повні записи запусків.

Навчання

Для всіх чотирьох завдань навчання починається з опублікованої контрольної точки. pretrained=False натомість повторно ініціалізує всю мережу, включно з бекбоном, і навчає її з нуля.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRFDETRs.pt")model.train(data="my-dataset.yaml", epochs=50, imgsz=512, batch=8, lr0=1e-4)
CLI
libreyolo train model=LibreRFDETRs.pt data=my-dataset.yaml \  epochs=50 imgsz=512 batch=8 lr0=1e-4
LoRA
from libreyolo import LibreYOLO model = LibreYOLO("LibreRFDETRs.pt")model.train(data="my-dataset.yaml", epochs=50, lora=True)
Кілька GPU
libreyolo train model=LibreRFDETRs.pt data=my-dataset.yaml \  epochs=50 device=0,1 batch=-1

Два аргументи мають тут більше значення, ніж для детектора CNN. Зберігайте lr0 на рівні 1e-4 або нижче, оскільки трансформери виявлення розходяться за швидкостей навчання, які витримує модель YOLO. Залишайте imgsz із нативною роздільною здатністю контрольної точки, якщо немає причини її змінювати. Розмір вхідних даних має ділитися без остачі на добуток розміру патча бекбона й кількості вікон; LibreYOLO перевіряє це до початку запуску й називає найближчі дійсні розміри.

Донавчання сегментації починається з контрольної точки сегментації, бо RF-DETR не має перенесення з виявлення на сегментацію. libreyolo train model=LibreRFDETRn-seg.pt task=segment завантажує цю контрольну точку, а контрольна точка виявлення з task=segment зупиняється з помилкою.

Датасети, аугментацію, кілька GPU та системи журналювання описано на сторінці навчання.

Нові запуски типово використовують output_dir=None, що визначає каталог runs/train/rfdetr_exp зі збільшуваним номером і exist_ok=False. Відновлений запуск продовжує записувати в каталог запуску своєї контрольної точки. Датасети багатокласової пози використовують kpt_names із ключами за індексом або назвою класу; порожній список позначає клас лише з рамками. Передбачення доповнюють ключові точки до kpt_shape; оцінка якості за mAP ключових точок не враховує класи лише з рамками.

Валідація

Метод val() повертає словник ключів metrics/ із mAP 50, mAP 50-95, mAP 75 і середньою повнотою COCO, виміряними для будь-якого датасету у форматі, на якому виконувалося навчання.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRFDETRs.pt") # val() повертає звичайний словник, а не об'єктmetrics = model.val(data="my-dataset.yaml", imgsz=512) print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])print(metrics["metrics/mAP75"], metrics["metrics/AR100"])
CLI
libreyolo val model=LibreRFDETRs.pt data=my-dataset.yaml imgsz=512
На COCO
# Вбудований YAML-файл COCO містить скрипт завантаження, тому потребує# явного дозволу, якщо датасету ще немає локально.libreyolo val model=LibreRFDETRn.pt data=coco.yaml imgsz=384 \  allow_download_scripts=True

Експорт

ЗадачаONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX: підтримуєтьсяDetection to TorchScript: підтримуєтьсяDetection to ExecuTorch: підтримуєтьсяDetection to TensorRT: підтримується. Runtime parity coverage lives in tests/e2e/test_tensorrt.py.Detection to OpenVINO: підтримується. Runtime parity coverage lives in tests/e2e/test_openvino.py.Detection to Paddle: не підтримуєтьсяDetection to MNN: підтримуєтьсяDetection to RKNN: не підтримуєтьсяDetection to ncnn: не підтримуєтьсяDetection to TFLite: не підтримуєтьсяDetection to CoreML: підтримується. Conversion is available, but runtime parity requires a macOS runner.Detection to Core AI: підтримується
Instance segmentationInstance segmentation to ONNX: підтримуєтьсяInstance segmentation to TorchScript: підтримуєтьсяInstance segmentation to ExecuTorch: підтримуєтьсяInstance segmentation to TensorRT: підтримується. A published Apache-2.0 trained segmentation checkpoint exports and reloads, but public top-k class membership changes.Instance segmentation to OpenVINO: підтримується. After Hungarian query alignment, the converted-runtime element match rate is 69.0%, below the validation bar.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: не підтримується
PosePose to ONNX: підтримуєтьсяPose to TorchScript: підтримуєтьсяPose to ExecuTorch: підтримуєтьсяPose to TensorRT: підтримується. A published Apache-2.0 trained pose checkpoint exports and reloads, but matched public boxes fall to 0.704 IoU with 41.4-pixel coordinate drift.Pose to OpenVINO: підтримується. After Hungarian query alignment, the converted-runtime element match rate is 72.75%, below the validation bar.Pose to Paddle: не підтримуєтьсяPose to MNN: не підтримуєтьсяPose to RKNN: не підтримуєтьсяPose to ncnn: не підтримуєтьсяPose to TFLite: не підтримуєтьсяPose to CoreML: не підтримуєтьсяPose to Core AI: не підтримується
Oriented boxesOriented boxes to ONNX: підтримуєтьсяOriented boxes to TorchScript: підтримуєтьсяOriented boxes to ExecuTorch: підтримуєтьсяOriented boxes to TensorRT: підтримується. A deterministic synthetic OBB fixture exports and reloads, but public top-k class membership changes.Oriented boxes to OpenVINO: підтримується. After Hungarian query alignment, the converted-runtime element match rate is 91.25%, below the validation bar.Oriented boxes to Paddle: не підтримуєтьсяOriented boxes to MNN: не підтримуєтьсяOriented boxes to RKNN: не підтримуєтьсяOriented boxes to ncnn: не підтримуєтьсяOriented boxes to TFLite: не підтримуєтьсяOriented boxes to CoreML: не підтримуєтьсяOriented boxes to Core AI: не підтримується

Експортований артефакт повторно завантажується через LibreYOLO() за суфіксом файлу, тому файл .onnx або .engine поводиться як контрольна точка й повертає той самий Results. Запуск графа безпосередньо в середовищі виконання без установленої LibreYOLO також підтримується, але тоді попередню та подальшу обробку потрібно написати самостійно.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreRFDETRs.pt")model.export(format="onnx", imgsz=512)model.export(format="tensorrt", imgsz=512, half=True) # Аргументи, які приймає кожен формат:##   format    "onnx" | "torchscript" | "executorch" | "tensorrt"#             | "openvino" | "paddle" | "mnn" | "rknn" | "ncnn"#             | "tflite" | "coreml" | "coreai".#             "engine" є псевдонімом tensorrt, "litert" є псевдонімом tflite.#   imgsz     ціле число або (висота, ширина). Типовим є нативний#             розмір контрольної точки.#   batch     ціле число, типово 1.#   half      логічне значення, експорт у FP16. Типово False.#   int8      логічне значення, експорт у INT8. Типово False. Потрібен `data`.#   data      шлях до YAML-файлу датасету для калібрування int8.#   fraction  число з рухомою комою, частка калібрувальної вибірки. Типово 1.0.#   dynamic   логічне значення, динамічні осі. Типово True.#   simplify  логічне значення, спрощення графа ONNX. Типово True.#   opset     ціле число, opset ONNX. Якщо не задано, вибирається за сімейством.#   device    рядок, пристрій трасування. Типовим є пристрій моделі.#   output_path  рядок, типовою є назва, утворена з контрольної точки.#   verbose   логічне значення, типово False.#   allow_download_scripts  логічне значення, типово False. Дозволяє вбудований#             Python у YAML-файлі датасету, який потрібно завантажити.## Кілька форматів приймають власні додаткові аргументи, наприклад цільову# платформу RKNN. Їх описано на сторінці кожного формату.
CLI
libreyolo export model=LibreRFDETRs.pt format=onnx imgsz=512libreyolo export model=LibreRFDETRs.pt format=tensorrt imgsz=512 half=True
Використати експортований файл
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика виконує маршрутизацію за суфіксом файлу, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий об'єкт Results.model = LibreYOLO("LibreRFDETRs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)
Без LibreYOLO
import numpy as npimport onnxruntime as ort # Безпосередній запуск графа означає самостійну попередню та подальшу# обробку. Перевірте сигнатуру до підключення компонентів.session = ort.InferenceSession("weights/LibreRFDETRs.onnx")name = session.get_inputs()[0].nameoutputs = session.run(None, {name: np.zeros((1, 3, 512, 512), dtype=np.float32)}) for meta, array in zip(session.get_outputs(), outputs):    print(meta.name, array.shape)

Входи та виходи ONNX

Тензорinput float32 [batch, 3, height, width]
КолірRGB
Масштабуванняпіксель / 255
Нормалізаціясереднє [0.485,0.456,0.406], стандартне відхилення [0.229,0.224,0.225]
Зміна розміруcustom, bilinear

The input tensor is named input, not images.

Square input only. Export rejects a non-square imgsz. The default size comes from the checkpoint and is stored in the imgsz metadata key: 384 for LibreRFDETRn, 312 for LibreRFDETRn-seg, 576 for LibreRFDETRx-pose.

A custom imgsz must be a multiple of patch size x windows: 32 for detection and OBB, 12 for segmentation n, 24 for the other segmentation sizes and for pose.

Stretch the whole image to width x height. There is no letterbox and no padding, so the aspect ratio is not kept.

Detection, segmentation and OBB: convert the 8-bit RGB image to float32 and divide by 255 first, then resize the float image with cv2.resize INTER_LINEAR (half-pixel centers, no antialiasing). Resizing the 8-bit image before dividing is close but moves scores by up to about 0.01.

Pose resizes differently: divide by 255 the same way, then resize the float image with antialiased bilinear, as torch.nn.functional.interpolate does with mode bilinear, align_corners False and antialias True. This is the filter of Pillow's BILINEAR, which widens by the shrink factor, but in float with no rounding to 8 bits. Per axis, let s = in_size / out_size and f = max(s, 1). Output pixel i has center c = (i + 0.5) * s. It reads source pixels j from int(c - f + 0.5) to int(c + f + 0.5) - 1, clipped to the image, each with weight max(0, 1 - |j + 0.5 - c| / f). Divide the weights by their sum.

The pose model is sensitive to this. On the test image, cv2.resize INTER_LINEAR or INTER_AREA adds 3 to 9 detections, and Pillow on the 8-bit image adds one and moves keypoints by more than 4 px.

Then subtract the mean and divide by the std per channel.

nms=True is not available for this family: export raises NotImplementedError.

Detection, експорт за замовчуванням
ВихідФормаЗначення
dets[batch, queries, 4]Boxes as cx, cy, w, h, normalized 0 to 1 of the input. 300 queries.
labels[batch, queries, columns]Raw class logits per query, sigmoid not applied. The COCO checkpoints have 91 columns, where column k is COCO category id k. For other checkpoints column j is class j.

Постобробка

  1. Apply sigmoid to labels.
  2. Flatten the scores of one image to queries x columns and take the top k over all of them, with k equal to queries (300). For flat index i, the query is i // columns and the column is i % columns. One query can yield several classes.
  3. Keep the entries whose score is strictly above the confidence threshold (0.25 by default). There is no NMS.
  4. When labels has 91 columns and nc is 80 (the COCO checkpoints), the column is a COCO category id. Class i is the i-th id, counting from 0, in this list: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 67, 70, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90. Drop entries whose id is not in the list. With any other column count the column is the class.
  5. Convert the query's box to x1 = cx - w / 2, y1 = cy - h / 2, x2 = cx + w / 2, y2 = cy + h / 2.
  6. Map boxes back to the original image: multiply x by the original width and y by the original height. The input was stretched, so no pad offset applies. LibreYOLO does not clip these boxes.
Instance segmentation, експорт за замовчуванням
ВихідФормаЗначення
dets[batch, queries, 4]Boxes as cx, cy, w, h, normalized 0 to 1 of the input. 100 queries for sizes n and s, 200 for m and l, 300 for x and xx.
labels[batch, queries, columns]Raw class logits per query, sigmoid not applied. 91 columns for the COCO checkpoints, where column k is COCO category id k.
masks[batch, queries, mask_h, mask_w]Raw mask logits per query over the whole input, at a quarter of the input size: 78 x 78 at 312 x 312.

Постобробка

  1. Select, threshold, map classes and decode boxes exactly as for detection, with k equal to queries.
  2. Take the mask of each kept query and resize the logits straight to the original image size with bilinear, half-pixel centers and no antialiasing (cv2.resize INTER_LINEAR on the float logits gives the same).
  3. A pixel is foreground when its resized logit is above 0.
Pose, експорт за замовчуванням
ВихідФормаЗначення
dets[batch, queries, 4]Boxes as cx, cy, w, h, normalized 0 to 1 of the input. 100 queries.
labels[batch, queries, columns]Raw class logits per query, sigmoid not applied, with the keypoint class term already added inside the graph. Column 0 is an empty slot and column j + 1 is class j, so the person checkpoint has 2 columns.
keypoints[batch, queries, columns * num_keypoints, 8]One block of num_keypoints rows per label column, 2 x 17 = 34 rows here. Each row is x, y normalized 0 to 1 of the input, findable logit, visible logit, log_l11, l21, log_l22 and a class logit term. The num_keypoints_per_class metadata key ([0, 17]) says how many rows of each block are real keypoints.

Постобробка

  1. Apply sigmoid to labels. Flatten to queries x columns and take the top k over all of them, with k equal to queries (100). For flat index i, the query is i // columns and the column is i % columns.
  2. For each entry take its column's keypoint block: rows column * num_keypoints onward, of which the first num_keypoints_per_class[column] are used.
  3. Rescore each entry whose column has keypoints. Per used keypoint, with a = log_l11, b = l21, d = log_l22 and p = sigmoid(findable logit): sigma = exp(-2a) + exp(-2d) + b^2 * exp(-2a - 2d). Then trace = log(sum of p * sigma / sum of p) over the used keypoints, and score = score * exp(-0.2 * trace). Scores can go above 1.
  4. Drop entries whose column is 0. The class is column - 1.
  5. Keep the entries whose new score is strictly above the confidence threshold (0.25 by default). There is no NMS.
  6. Decode and map the box as for detection. LibreYOLO does not clip these boxes.
  7. Keypoint x is x * original width and keypoint y is y * original height. Keypoint confidence is sigmoid(findable logit). LibreYOLO does not use the visible logit.
Oriented boxes, експорт за замовчуванням
ВихідФормаЗначення
dets[batch, queries, 4]Rotated boxes as cx, cy, w, h, normalized 0 to 1 of the input. 300 queries.
labels[batch, queries, columns]Raw class logits per query, sigmoid not applied. Column j is class j. The 6-class checkpoint has 7 columns: the last one is not a class and LibreYOLO does not drop it.
angles[batch, queries, 1]Rotation in radians from -pi / 2 to pi / 2, tanh already applied, measured on the square input. The width side points along (cos(angle), sin(angle)) with y pointing down.

Постобробка

  1. Select and threshold as for detection, with k equal to queries (300). The column is the class.
  2. The stretch scales x and y by different amounts, so map each box back through its corners. In normalized input units, with c = cos(angle) and s = sin(angle), the corners are (cx, cy) - u - v, + u - v, + u + v and - u + v, with u = (c * w / 2, s * w / 2) and v = (-s * h / 2, c * h / 2).
  3. Multiply corner x by the original width and corner y by the original height.
  4. Fit cv2.minAreaRect to the 4 corners and convert its angle to radians. Raise w and h to at least 1e-4. If h > w, swap them and add pi / 2 to the angle. Then wrap the angle to [-pi / 2, pi / 2) with angle = (angle + pi / 2) mod pi - pi / 2.
  5. The result is cx, cy, w, h, angle in original-image pixels, with w the long side.

Щоб перевірити власну реалізацію, пропустіть той самий файл через LibreYOLO: LibreYOLO("model.onnx").predict("image.jpg") повертає еталонні результати. Перевірено на LibreYOLO 1.7.0.

Контрольні точки

Усі опубліковані файли ваг для цього сімейства.

ФайлВхід (пікс.)Ліцензія ваг
Detection
LibreRFDETRl.pt704apache-2.0
LibreRFDETRm.pt576apache-2.0
LibreRFDETRn.pt384apache-2.0
LibreRFDETRs.pt512apache-2.0
LibreRFDETRm-ui.ptmit
Instance segmentation
LibreRFDETRn-seg.pt312apache-2.0
LibreRFDETRs-seg.pt384apache-2.0
LibreRFDETRm-seg.pt432apache-2.0
LibreRFDETRl-seg.pt504apache-2.0
LibreRFDETRx-seg.pt624apache-2.0
LibreRFDETRxx-seg.pt768apache-2.0
Pose
LibreRFDETRx-pose.pt576apache-2.0
Oriented boxes
LibreRFDETRn-obb.pt384cc-by-4.0
LibreRFDETRs-obb.pt512cc-by-4.0
LibreRFDETRm-obb.pt576cc-by-4.0
LibreRFDETRl-obb.pt704cc-by-4.0

Кожен наведений вище файл уже доступний у організації LibreYOLO і завантажується під час першого використання.

Ліцензування

Перевіряйте ліцензію в репозиторії Hugging Face конкретних ваг, які завантажуєте. Кожна контрольна точка в організації LibreYOLO має ліцензію, і вона не завжди однакова для всього сімейства. Цей репозиторій є авторитетним джерелом, а наведене нижче резюме описує умови на момент останньої перевірки сторінки.

Це опис відповідних ліцензій, а не юридична консультація. Якщо відповідь має комерційне значення, самостійно прочитайте ліцензії та зверніться по юридичну консультацію.

Оригінальна робота
RF-DETR, Roboflow
Ліцензія першоджерела
Apache-2.0
Джерело першоджерела
github.com/roboflow/rf-detr
Код 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.

Цитування

@inproceedings{robinson2026rfdetr,
  title     = {RF-DETR: Real-Time Detection Transformer},
  author    = {Robinson, Isaac and Robicheaux, Peter and Popov, Matvei and Ramanan, Deva and Peri, Neehar},
  booktitle = {International Conference on Learning Representations (ICLR)},
  year      = {2026},
  url       = {https://arxiv.org/abs/2511.09554}
}

Скопійовано з блоку цитування авторів на сторінці github.com/roboflow/rf-detr#citation.

Перевірено з LibreYOLO v1.6.0. Таблиці підтримки, контрольні точки й результати бенчмарків на цій сторінці згенеровано з випущеної бібліотеки та опублікованих ваг, а не написано вручну.