Перейти до основного вмісту

BoxDecode: типи декодування.

nodes::SimaBoxDecode перетворює необроблені тензори голів детектора на результати виявлення. Після інференсу моделі він застосовує обчислення декодування для вибраної родини моделей і фільтрує результати. NMS і кодування виходу залежать від вибраної родини. Моделі виявлення можуть розбирати дані як рамки; моделі поз і сегментації також можуть розбирати ключові точки або маски після рамок.

Для звичайного використання пакетів моделей, віддавайте перевагу конструктору, який враховує Model. Архів моделі надає порядок, розміщення, квантування тензорів, кількість класів, метадані зміни розміру та підказки щодо діапазону оцінок, необхідні декодеру. Ваш застосунок зазвичай лише вибирає родину декодування та порогові значення фільтрації.

Бекенд середовища виконання​

BoxDecode і SuperPoint використовують neatkernelrunner із перевіреними виконуваними ядрами Kernels. Наявні формати виходу детекцій і ознак не змінилися. Для орієнтованих рамок YOLO26 використовується окремий формат із версією. Для прямого тензорного входу використовуйте тензори зі спільною CMA-пам’яттю (TensorMemory::EV74), навіть коли декодування виконується на A65: цей вибір пам’яті забезпечує транспорт DMA-BUF, а не визначає ціль виконання.

Перший етап RCNN використовує контракт top-K для кожного рівня, яким володіє ядро: глобальне NMS, потім до top_k уцілілих пропозицій на кожний рівень площі моделі. Його вихід — це дротовий формат пропозицій, а не звичайний формат BBOX: чотири групи, кожна з лічильником INT32 та top_k записами із шести FP16 (score, 0, x1, y1, x2, y2). Перетворення координат зберігає дробову геометрію до остаточної серіалізації. Використовуйте його як вхід пропозицій для другого етапу, а не з decode_bbox_tensor(). Застарілий плагін не завантажується.

Голови SuperPoint з доповненням і чергуванням даних INT8, BF16 та FP32 використовують нативний щільний читач з явними кроками пікселів. Доповнення виключається зі згорток детектора та вибірки дескрипторів без етапу Cast або матеріалізації. Порти INT8 зберігають власні задані параметри квантування. Нативні голови з плитковою розкладкою MLA зберігають оголошену фізичну розкладку; щільні скаляри ніколи не позначаються як байтові площини MLA.

Швидкий старт.​

using namespace simaai::neat;

Model model("/path/to/yolov8_model.tar.gz");

auto boxdecode = nodes::SimaBoxDecode(
model,
BoxDecodeType::YoloV8,
/* detection_threshold */ 0.25,
/* nms_iou_threshold */ 0.45,
/* top_k */ 100);

Для використання в окремому середовищі розробки:

simaai::neat::stages::BoxDecodeOptions opt(simaai::neat::BoxDecodeType::YoloV8);
opt.detection_threshold = 0.25;
opt.nms_iou_threshold = 0.45;
opt.top_k = 100;

Аргументи​

АргументЗначення
decode_typeТип моделі/формат заголовка, наприклад, BoxDecodeType::YoloV8 або BoxDecodeType::YoloX. Обов’язково.
detection_thresholdМінімальний бал, необхідний для збереження результату виявлення. Використовуйте значення, що відповідає конкретній моделі, наприклад, 0.25.
nms_iou_thresholdПоріг IoU, який використовується алгоритмом придушення не-максимумів. 0 зберігає значення, упаковане в модель; якщо його немає, YOLO26 пропускає NMS, а інші декодери пригнічують кожну рамку, що перекривається. Задайте значення, що відповідає моделі, наприклад 0.45.
top_kМаксимальна кількість виходів. Декодування необроблених обмежувальних рамок потребує явної додатної межі. У вузлі, прив’язаному до моделі, 0 успадковує визначену межу Model. SuperPoint використовує типове значення свого профілю для 0.
original_width, original_heightРозмір вихідного зображення, що використовується для відображення координат під час застосування конструктора raw-geometry.
model_width, model_heightЗамінює розмір вхідних даних моделі. За допомогою Model цей конструктор змінює параметри просторового декодування, але не змінює структуру тензора, що використовується.
resize_mode_overrideВикористовуйте лише тоді, коли на попередньому етапі обробки Preproc не записуються метадані щодо зміни розміру, і вам потрібно явно вказати поведінку для масштабування, заповнення або обрізання.
decode_type_optionРозширений селектор підпорядкованих макетів. Залиште значення Auto, якщо використовуєте пакет моделей, якщо тільки ви не знаєте, який макет заголовка експортується.

Вхідні та вихідні дані.​

Вхідні дані: необроблені тензори виявлення, отримані від моделі. Очікувані розміри тензорів залежать від типу моделі. У випадку з MPK/архівом моделі, Neat зчитує ці деталі з упакованого контракту.

Вихідні дані: один тензор BoxDecode, що містить декодовані виявлення. Моделі виявлення використовують стандартний формат BBOX. Моделі для визначення поз і сегментації зберігають початкові обмежувальні рамки та додають власні, специфічні для завдання, дані:

Завдання моделіДопоміжний код C++Допоміжний код PythonДекодовані тензори
Виявленняdecode_bbox(...)pyneat.decode_bbox(...)[N, 6] float32 boxes: x1, y1, x2, y2, score, class_id
Орієнтоване виявленняdecode_obb(...)pyneat.decode_obb(...)Геометрія з власним сховищем [N, 5] float32 (cx, cy, width, height, angle_radians), оцінки [N] float32, ID класів [N] int32
Позаdecode_pose(...)pyneat.decode_pose(...)обмежувальні рамки [N, 6] та ключові точки [N, 17, 3] float32: x, y, visibility
Сегментаціяdecode_segmentation(...)pyneat.decode_segmentation(...)прямокутники [N, 6] float32 і маски [N, 160, 160] uint8.
Сегментація + позаdecode_segmentation_pose(...)pyneat.decode_segmentation_pose(...)рамки [N, 6] float32, маски [N, 160, 160] uint8, ключові точки [N, 17, 3] float32
SuperPointdecode_superpoint(...)pyneat.decode_superpoint(...)ключові точки [N,2], оцінки [N], дескриптори [N,D].

Графи відображення рамок, паралельних осям, можуть передавати результат у SimaRender. Використовуйте decode_bbox(...) лише для наявних форматів із рамками на початку; ані він, ані SimaRender не приймають орієнтованих рамок.

Класичний DETR​

Виберіть Detr для двох голів на одній сітці запитів: чотириканальних логітів рамок і логітів класів з останнім каналом фону. Залиште decode_type_option у стані Auto: рецепт вибирає Softmax незалежно від назв тензорів. Фон бере участь у знаменнику, але не входить до кількості передніх класів або вибору результатів. До координат рамок застосовується sigmoid. Це не декодер уже нормалізованих рамок моделей із focal loss.

Використовуйте Stretch і додатне top_k. Декодер не застосовує NMS та відновлює координати початкового кадру за метаданими попередньої обробки. Явні макети з імовірностями або несумісні активації оцінок відхиляються.

options = pyneat.ModelOptions()
options.decode_type = pyneat.BoxDecodeType.Detr
options.preprocess.resize.mode = pyneat.ResizeMode.Stretch
options.top_k = 100
options.score_threshold = 0.7

Детектори запитів із focal loss​

Для двох упорядкованих тензорів використовуйте BoxDecodeType::DetrFocal (Python: pyneat.BoxDecodeType.DetrFocal, токен detr-focal): нормалізовані координати cx,cy,width,height із глибиною4, потім незалежні логіти класів із глибиноюN. Осі запитів і типи даних мають збігатися; N дорівнює1–1024. Підтримуються FP32, BF16 та INT8 із заданими параметрами квантування.

Профіль застосовує sigmoid лише до логітів класів і вибирає глобальні top-K пар «запит/клас». Один запит може дати кілька класів. Немає фонового класу, sigmoid для рамок, argmax для кожного запиту, NMS чи фільтра малих площ. Задайте додатне top_k, detection_threshold=0 для top-K без фільтрації та обов’язкове nms_iou_threshold=0. Використовуйте Stretch і фактичні розміри зображення та моделі.

Наявний вихід BBOX обрізає рамки до меж зображення й округлює координати XYWH до цілих чисел. decode_bbox подає їх як числа з рухомою комою, але не відновлює субпіксельну точність. Окремо вимірюйте вплив цього представлення на точність порівняно з необрізаним еталоном із рухомою комою. Класичний BoxDecodeType::Detr не змінено: він очікує логіти рамок і softmax-оцінки з фоновим класом, а не ці тензори.

У Python використовуйте decode_bbox(..., strict=True), щоб зберегти рядки з нульовою площею після округлення замість стандартного фільтра вироджених рамок.

Перевантаження Python raw-geometry відповідає фабриці C++ для явного передавання тензорів голови. Для щільних FP32-голів зберігайте всі вихідні адаптери моделі та явно задавайте фактичне сховище. Не зупиняйтеся на сирому виході MLA й не позначайте байти з доповненням як щільні тензори.

node = pyneat.nodes.sima_box_decode(
pyneat.BoxDecodeType.DetrFocal,
original_width=1280, original_height=720,
model_width=640, model_height=640,
detection_threshold=0.0, nms_iou_threshold=0.0, top_k=300,
decode_type_option=pyneat.BoxDecodeTypeOption.InterleavedByHeadLogit,
source_storage=pyneat.BoxDecodeSourceStorage.DenseHwc,
detess=False, dequant=False,
resize_mode=pyneat.ResizeMode.Stretch,
)

Скінченні інвертовані розміри наявне обрізання кінцевих точок перетворює на BBOX із нульовою площею, зберігаючи вибрану пару й оцінку. Нескінченні значення або NaN у координатах чи логітах спричиняють помилку до публікації.

Орієнтовані рамки YOLOv8 та YOLO11​

Виберіть BoxDecodeType::YoloV8Obb (Python: pyneat.BoxDecodeType.YoloV8Obb; токени yolov8-obb або yolo11-obb). Передайте дев’ять згрупованих за роллю голів INT8, BF16 або FP32: по три 64-канальні голови DFL для рамок, голови логітів класів та голови логітів кутів, у порядку кроків 8, 16 і 32. Повна кількість класів визначається з голів класів.

BoxDecode застосовує DFL, sigmoid класів, (sigmoid(angle)-0.25)*pi та покласове повернуте Fast-NMS з nms_iou_threshold. Вхідні дані мають бути необробленими логітами. Геометрія й вихід BBOX_OBB_V1 відповідають наведеному нижче контракту YOLO26; використовуйте той самий допоміжний метод decode_obb.

Орієнтовані рамки YOLO26​

Явно виберіть BoxDecodeType::YoloV26Obb (Python: pyneat.BoxDecodeType.YoloV26Obb, токен yolo26-obb). Цей профіль приймає дев’ять голів FP32, BF16 або INT8, згрупованих за роллю: три чотириканальні голови відстаней, три голови логітів класів і три одноканальні голови необроблених кутів, із кроками 8, 16 і 32. Усі голови мають узгоджуватися щодо повної кількості класів (1–256). Auto, GroupedByRole і GroupedByRoleLogit вибирають це групування; голови класів зі значеннями ймовірності та перемежовані розміщення відхиляються.

Для голів INT8 потрібні додатні скінченні потензорні метадані квантування та нульова точка INT8. Голови BF16 і FP32 не використовують метадані цілочисельного квантування.

Використовуйте додатне top_k і nms_iou_threshold = 0. Профіль застосовує sigmoid до логітів класів, вибирає анкери за їхньою найвищою активованою оцінкою, а потім вибирає пари анкер/клас. За однакових оцінок зберігаються порядок першого етапу та порядок класів. Поріг оцінки є строгим (score > detection_threshold). Необроблений кут уже задано в радіанах; декодер не застосовує до нього sigmoid і не нормалізує діапазон.

Метадані попередньої обробки мають містити явне скінченне перетворення з координат моделі у вихідні координати з додатними однаковими масштабами X/Y і без зсувної деформації. Явне тотожне перетворення потрібне навіть для плиток розміру моделі. Профіль відхиляє відсутні або анізотропні перетворення, а не наближує повернутий прямокутник. Він зберігає скінченні ширину й висоту зі знаком і не обрізає їх за межами зображення. Для плиткового оцінювання DOTA використовуйте тотожне перетворення для кожної плитки, а відновлення її зміщення та міжплиткове придушення полігонів виконуйте в застосунку.

У графах, керованих джерелом, Core визначає початкову геометрію підготовки з перевіреного контракту попереднього Preproc. Це лише початкове значення для підготовки: кожен кадр і далі має містити скінченне додатне рівномірне афінне перетворення та розміри полотна, що відповідають моделі. Відсутність перетворення кадру є помилкою, а не приводом для підстановки тотожного перетворення.

Вихід має тег BBOX_OBB_V1: після 32-байтового заголовка з версією йдуть top_k записів по 32 байти. Невикористані записи нульові. decode_obb_tensor(tensor) перевіряє один носій; decode_obb(tensors) повертає один типізований результат для кожного носія. Обидва копіюють дані в тензори CPU з власним сховищем; ID класів залишаються INT32. Наприклад:

result = pyneat.decode_obb(outputs)[0]
geometry = result.geometry.to_numpy() # cx, cy, width, height, angle_radians
scores = result.scores.to_numpy()
class_ids = result.class_ids.to_numpy()

Цей формат навмисно не є розширенням із BBOX на початку. Використовуйте типізовані допоміжні функції, а не decode_bbox, парсери сегментації/поз чи засіб відображення рамок, паралельних осям.

Суперточка​

SuperPoint залишається частиною продукту BoxDecode, але генерує ключові точки, а не намагається видавати їх за прямокутники. Мінімальна конфігурація за замовчуванням A65:

BoxDecodeOptions options{BoxDecodeType::SuperPoint};
options.superpoint.descriptor_output_dtype = TensorDType::Float32;

auto decoder = nodes::SimaBoxDecode(model, options);

У Python використовуються ті самі значення за замовчуванням:

options = pyneat.BoxDecodeOptions(pyneat.BoxDecodeType.SuperPoint)
options.superpoint.descriptor_output_dtype = pyneat.TensorDType.Float32

decoder = pyneat.nodes.sima_box_decode(model, options=options)

A65V1 є профілем за замовчуванням. Обирайте інший профіль, якщо моделі потрібна інша числова поведінка; Neat не визначає поведінку на основі форми або значень тензора:

ПрофільКоли його слід обратиСтатус виробництва
LightGlueV1Детектор, NMS, координати та поведінка дескриптора, сумісні з LightGlueПідтримується
MagicLeapDemoV1Поведінка закріпленої демонстраційної програми Magic LeapПідтримується
A65V1Сумісність зі старим декодером A65 SuperPointПідтримується; встановлено за замовчуванням
PaperBicubicV1Зарезервовано числовий ідентифікатор для майбутньої повністю визначеної бікубічної політики.Відхилено до моменту визначення у виробничому середовищі.

Числовий формат і кодування вихідних даних є незалежними. Наприклад, можна вибрати числовий формат A65 із використанням стандартного вихідного формату V1:

BoxDecodeOptions options{BoxDecodeType::SuperPoint};
options.superpoint.profile = SuperPointProfile::A65V1;
options.superpoint.output_format = SuperPointOutputFormat::FeaturePointsV1;

Використання застарілої схеми розміщення байтів є опціональним і має додаткові обмеження:

options.superpoint.profile = SuperPointProfile::A65V1;
options.superpoint.output_format = SuperPointOutputFormat::LegacyA65InterleavedV0;
options.superpoint.descriptor_output_dtype = TensorDType::Int8;

SuperPointProfile::Auto спочатку використовує авторитетні метадані MPK superpoint.profile. Якщо ні API, Model::Options.superpoint.profile, ні MPK не надають профіль, то використовується A65V1. Neat ніколи не визначає профіль на основі розмірів тензорів, значень, імен файлів або наступних вузлів.

Коли їхні загальнодоступні значення-за замовчуванням залишаються незмінними, detection_threshold=0.0, top_k=0, nms_radius=-1 і border_margin=-1 визначаються з обраного профілю. A65V1 визначає порогове значення 0.1, Top-K 600, радіус NMS 4 і межу 0. LightGlueV1 і MagicLeapDemoV1 використовують порогові значення 0.0005 і 0.015 відповідно; обидва використовують Top-K 600, радіус NMS 4 і межу 4.

nms_iou_threshold не застосовується до SuperPoint; використовуйте радіус у пікселях superpoint.nms_radius. За замовчуванням виводиться структурований масив FEATURE_POINTS_V1 версії. LegacyA65InterleavedV0 є явним форматом міграції та вимагає 256-вимірних дескрипторів INT8. Використовуйте decode_superpoint замість decode_bbox або BoxDecodeResults.

Версіоновані записи схеми MPK superpoint v1 мають режим відмови за замовчуванням. Вони повинні містити назву профілю, окремі ідентифікатори тензорів детектора та дескриптора, sha256: відбиток, що містить 64 шістнадцяткових цифри, і підтримувані вхідні представлення raw-logits-65 і coarse-pre-l2. Схема 0 залишається прийнятною лише як запис для міграції/ручного використання; відсутні поля представлення схеми 0 канонізуються до цих двох представлень необроблених даних і записуються як значення за замовчуванням у діагностиці. Невідомі версії схеми або маркери представлення призводять до помилки під час компіляції. Якщо перевантаження профілю API суперечить відбитку, який було встановлено для іншого профілю MPK, повторно встановіть відбиток MPK для вибраного профілю; Neat не відкидає та не переінтерпретує ці дані про походження.

Корисне навантаження BBOX у форматі wire.​

Модуль декодування вихідних даних детектора генерує один тензор, позначений як BBOX, для кожного вхідного кадру. Цей тензор є буфером байтів першого рангу, що має тип UInt8.

ПолеЗначення
semantic.detection.format"BBOX"
dtypeUInt8
shape[N_bytes], де N_bytes – це обсяг запакованого буфера з архіву моделі.

Розмір тензора визначається в байтах, а не кількістю виявлених об’єктів. Структура даних використовує порядок байтів little-endian:

offset size content
------ ---- -------
0 4 uint32 N = valid detections in this frame
4 24 RawBox[0]
28 24 RawBox[1]
. . ...
. . RawBox[N-1]
trailing bytes are padding and must be ignored

Кожен запис RawBox має розмір 24 байти:

ЗміщенняРозмірТипПолеЗначення
04int32xКоордината X у верхньому лівому куті у вихідних пікселях.
44int32yВерхня ліва координата y у вихідних пікселях.
84int32wШирина в пікселях вихідного зображення.
124int32hВисота в пікселях вихідного зображення.
164float32scoreВпевненість після застосування NMS для [0.0, 1.0].
204int32class_idІдентифікатор класу, визначений моделлю.

Відповідний формат Python struct для одного запису — "<iiiifi".

Координати вказуються в пікселях вихідного зображення, якщо наявні метадані попередньої обробки. Вони не нормалізовані до [0, 1] і не представлені у внутрішньому просторі вхідних даних моделі, який має форму прямокутника.

Поєднане корисне навантаження сегментації та пози​

yolox-seg-pose видає один буфер із трьома регіонами. Розміщення кожного регіону визначається однаковою кількістю слотів top_k:

РегіонЗсувКрокВміст
заголовок04кількість виявлень int32
рамки424записи BoundingBoxOut, описані вище
маски4 + 24*top_kmask_w * mask_huint8, одна площина на слот
пози4 + (24 + mask_w*mask_h)*top_k20417 x {uint32 x, uint32 y, float32 visibility}

Використовуйте decode_segmentation_pose(...), щоб отримати рамки, маски й ключові точки. Рядок i кожного тензора описує те саме виявлення. Якщо потрібні лише рамки, використовуйте decode_bbox(...) або BoxDecodeResults(...).

Комбінований декодер також приймає застарілий тег BBOX. Одночасне відображення масок і поз не підтримується. Не передавайте комбінований буфер до poseyolo: цей рендерер очікує ключові точки безпосередньо після рамок, тоді як комбіноване навантаження зберігає там маски.

Кожне виявлення має 17 слотів ключових точок. Бекенд обнуляє невикористані слоти та ключові точки класів, виключених через pose_classes. Допоміжна функція копіює ці значення без змін.

Core визначає num_classes як глибину голови класів мінус один, оскільки канал 0 містить оцінку наявності об’єкта. Наприклад, 30 каналів означають 29 класів. Явно задане num_classes має збігатися з цим значенням.

Класи ключових точок​

Задайте ID класів, які мають ключові точки:

options = pyneat.BoxDecodeOptions(pyneat.BoxDecodeType.YoloXSegPose)
options.yolox_seg_pose.pose_classes = [0, 5]

ModelOptions.yolox_seg_pose приймає таке саме налаштування.

  • Класи поза списком отримують нульові координати ключових точок і видимість.
  • Порожній список BoxDecodeOptions успадковує налаштування моделі. Якщо список не задано, ключові точки отримують усі класи.
  • ID мають бути унікальними та належати діапазону [0, num_classes). Цей параметр підтримується лише для YoloXSegPose.

Коли model.run повертає необроблені результати.​

Деякі маршрути моделі повертають необроблені вихідні дані у вигляді карт ознак замість декодованого тензора BBOX з model.run(...). Це не означає, що виконання моделі завершилося з помилкою. Це означає, що модель була виконана, але вказаний маршрут не містив етап декодування обмежувальних рамок (BoxDecode) в точці, де ви зчитуєте вихідні дані.

Використовуйте це правило:

  • detections=... або тензор BBOX: розпакуйте дані BBOX або використовуйте їх. допоміжні функції для декодування.
  • raw_output_heads=...: додайте етап BoxDecode, перевірте маршрут моделі або обробляйте необроблені тензори за допомогою спеціалізованої постобробки для конкретної моделі.

Не розглядайте необроблені дані як обмежувальні рамки. Структура необроблених тензорів залежить від експортованої родини моделей та специфікацій архіву моделі.

Замінити контракт.​

MPK надає тензорні контракти та відомості про сімейство декодування. Задавайте параметри фільтрації в ModelOptions. Для вузла SimaBoxDecode(Model, ...) додатні аргументи фільтрації перевизначають визначені параметри Model; нульові аргументи успадковують їх. ModelOptions.score_threshold = 0.0 — це справжній нульовий поріг оцінки, а не запит на відновлення порога з пакета.

Аргумент середовища виконанняЗначення, що передаєтьсяПоведінка
decode_typeпорожньо / UnspecifiedЗберігайте архів моделі або використовуйте функцію планування маршруту, якщо це підтримується.
decode_typeконкретний типЗамініть сімейство декодувань для цього запуску.
original_width / original_height0Збережіть геометрію, що входить до пакета, або метадані попередньої обробки.
original_width / original_heightдодатне ціле числоЗамініть вихідні розміри для відображення координат.
Вузол, прив’язаний до моделі: detection_threshold0.0Успадкувати визначений поріг оцінки Model.
Вузол, прив’язаний до моделі: detection_threshold> 0.0Перевизначити поріг оцінки.
Вузол, прив’язаний до моделі: nms_iou_threshold0.0Успадкувати визначений IoU для NMS із Model.
Вузол, прив’язаний до моделі: nms_iou_threshold> 0.0Перевизначити IoU для NMS.
Вузол, прив’язаний до моделі: top_k0Успадкувати визначену межу виходу Model.
Вузол, прив’язаний до моделі: top_k> 0Перевизначити максимальну кількість збережених детекцій.

Декодування обмежувальних рамок потребує додатного визначеного top_k; нуль не означає необмежене сховище виходу. Для необроблених голів без прив’язаної Model задайте top_k до побудови графа. Вузол, прив’язаний до моделі, може успадкувати додатну межу Model, залишивши власне top_k нульовим. Ці параметри не змінюють окремі допоміжні читачі результатів: у них top_k=0 означає відсутність додаткової межі для вже обмеженого виходу. Нульовий поріг оцінки дозволяє нульові оцінки, але не обходить перевірку геометрії, виключення фону, NMS або межу виходу. За нульового IoU для NMS YOLO26 пропускає NMS. Інші профілі YOLO та SSD із ввімкненим NMS усе ще застосовують придушення за квантованим IoU. Додатні пороги YOLO26 вмикають NMS.

num_classes порівнює значення, налаштоване викликачем, із кількістю класів, отриманою з тензорного контракту MPK:

Сімейство моделейНалаштоване num_classesnum_classes з MPKПоведінка
Будь-яка підтримувана модель0додатне значення, яке можна вивестиВикористовується кількість класів з MPK.
Будь-яка підтримувана модельдодатне ціле числоте саме значенняВикористовується налаштована кількість класів.
Модель із неоднозначним поділом класівдодатне ціле числонедоступноВикористовується налаштована кількість класів. Це потрібно, коли поділ голови з одним класом не можна надійно вивести.
YOLOv5 або YOLO26додатне ціле числоінше значенняПомилка до побудови конвеєра з повідомленням обох значень. Ці необроблені розкладки голів виводять кількість класів із глибини тензора.
SSD або інше сімейство YOLO до YOLO26 без оцінки позидодатне ціле числоінше значенняЗастосовується наявна поведінка явного перевизначення для цього сімейства. Декодери пози та SuperPoint зберігають свої правила.

detection_threshold – це назва, яка використовується конструкторами вузлів/етапів BoxDecode. ModelOptions.score_threshold – це опція моделі, яка передає дані до того ж модуля керування.

Розшифруйте відображення типів даних.​

Перелік APIБекенд-токенТипова модельна лінійка
BoxDecodeType::YoloyoloДекодовані cx,cy,w,h у пікселях моделі
BoxDecodeType::YoloV5yolov5виявлення об’єктів за допомогою YOLOv5
BoxDecodeType::YoloV5Segyolov5-segСегментація YOLOv5
BoxDecodeType::YoloV7yolov7виявлення об’єктів за допомогою YOLOv7
BoxDecodeType::YoloV7Segyolov7-segСегментація YOLOv7
BoxDecodeType::YoloV8yolov8виявлення об’єктів за допомогою YOLOv8
BoxDecodeType::YoloV8Segyolov8-segСегментація YOLOv8
BoxDecodeType::YoloV8Poseyolov8-poseYOLOv8 pose
BoxDecodeType::YoloV9yolov9виявлення об’єктів за допомогою YOLOv9
BoxDecodeType::YoloV9Segyolov9-segСегментація YOLOv9
BoxDecodeType::YoloV10yolov10виявлення об’єктів за допомогою YOLOv10
BoxDecodeType::YoloV10Segyolov10-segСегментація YOLOv10
BoxDecodeType::YoloV26yolo26Виявлення об’єктів за допомогою YOLO26
BoxDecodeType::YoloV26Poseyolo26-poseYOLO26 pose
BoxDecodeType::YoloV26Segyolo26-segСегментація YOLO26
BoxDecodeType::YoloV26Obbyolo26-obbОрієнтоване виявлення YOLO26 (BBOX_OBB_V1)
BoxDecodeType::YoloV6yolov6виявлення об’єктів за допомогою YOLOv6
BoxDecodeType::YoloXyoloxвиявлення об’єктів за допомогою YOLOX
BoxDecodeType::YoloXSegPoseyolox-seg-poseУпакований експорт YOLOX, що разом містить голови рамок, масок і ключових точок
BoxDecodeType::SsdssdТочний підготовлений контракт SSD300, SSD-Mobile-300, SSD-Mobile-320 або SSDlite-Mobile-320, обраний із впорядкованої головної геометрії.
BoxDecodeType::SuperPointsuperpointПостпроцесинг детектора та дескриптора SuperPoint
BoxDecodeType::DetrdetrВиявлення об’єктів за допомогою трансформера в стилі DETR
BoxDecodeType::EffDeteffdetЕфективне виявлення об’єктів за допомогою EfficientDet
BoxDecodeType::RcnnStage1rcnn-stage1П’ять упорядкованих голів RPN; глобальне NMS, потім top-K для кожного рівня площі
BoxDecodeType::CenternetcenternetДетекція CenterNet

BoxDecodeType::Unspecified є невизначеним маркером і викликає помилку до початку роботи середовища виконання. Ідентифікатор рецепту SSD є внутрішнім контрактом Core (ssd300-v1, ssd-mobile-300-v1, ssd-mobile-320-v1 або ssdlite-mobile-320-v1), а не іншим загальнодоступним типом декодування або токеном бекенду. Core визначає його перед початком процесу оптимізації, тоді як встановлений об’єктний декодер продовжує отримувати підтримуваний токен ssd і вибирає відповідну фіксовану реалізацію з уже перевіреної геометрії заголовка.

Вибір правильного типу.​

  • Вибирайте за контрактом експортованих голів: YoloV6 очікує сирі відстані l/t/r/b та логіти класів. Для пакетів YOLOv6 із декодуванням рамок усередині графа використовуйте Yolo; для виходів, згрупованих як [bbox_0..2, class_prob_0..2], задайте decode_type_option=GroupedByRoleProbability та num_classes, що відповідає кількості навчених класів.
  • Якщо рамки відображаються неправильно або їх розміри змінено некоректно, перевірте політику зміни розміру зображення. Використовуйте resize_mode_override лише тоді, коли ваш граф не має попереднього етапу Preproc, який записує метадані про зміну розміру.
  • Якщо ви створюєте власний набір моделей, переконайтеся, що в описі архіву точно вказано характеристики детекторів: порядок тензорів, логічна форма, фізичне зберігання, тип даних/квантування, діапазон значень, кількість класів і будь-які зрізані вихідні дані. Код застосунку не повинен містити жодних налаштувань для врахування цих деталей.

Рекомендації щодо форми та компонування.​

Різні моделі детектування використовують різні схеми організації вихідних даних. Деякі використовують один тензор для кожного рівня ознак; інші розділяють обмежувальні рамки, інформацію про об’єкти, класи, ключові точки або маски на окремі тензори. Вихідні дані деяких моделей представлені у вигляді щільних тензорів HWC; інші тензори пакуються або розбиваються компілятором/середовищем виконання.

Для моделей, що використовують пакетну обробку, це регулюється відповідним контрактом. Для тензорів, з’єднаних вручну, головне правило полягає в тому, щоб точно відповідати експортованому формату вихідних даних. Не слід вибирати тип декодування лише на основі рангу або кількості каналів.

Розширені правила для тензорних контрактів:

  • Типи декодування сімейства YOLO, окрім детекції YoloV5 (Yolo, YoloV7, YoloV8, YoloV9, YoloV10 та варіанти сегментації чи оцінки пози), очікують або роз'єднані голови, або об'єднані голови, що відповідають сімейству моделі.
  • Згорнуті шари YOLO повинні зберігати однакову кількість класів і глибину шарів. рівні функціональності.
  • Детекція YoloV5 приймає рівно три недекодовані об'єднані голови в порядку P3/P4/P5. Їхні сітки повинні мати геометрію stride 8/16/32, а кожна логічна глибина — дорівнювати 3 * (num_classes + 5). BoxDecode застосовує сигмоїду, перетворення сітки та кроку, а також стандартні якорі YOLOv5 ({10,13},{16,30},{33,23}; {30,61},{62,45},{59,119}; {116,90},{156,198},{373,326}). Власні таблиці AutoAnchor і декодовані експорти з шести тензорів боксів/класів мають використовувати інший контракт.
  • YoloV26 використовує згруповані необроблені координати обмежувальних рамок (l/t/r/b) разом із заголовками, що визначають клас і оцінку.
  • Ssd – це не універсальний декодер для SSD-накопичувачів. Він обробляє лише чотири попередньо налаштовані профілі. з повного впорядкованого набору локальних/конфігураційних змінних H/W/C, визначеного під час компіляції. Будь-який інший набір або порядок змінних відхиляється, і виводиться повідомлення про помилку, яке містить інформацію про виявлений і підтримуваний набори:
    • SSD300dboxes300_coco): вхідне зображення 300×300, карти ознак. {38,19,10,5,3,1}, апріорні значення для кожної комірки, {4,6,6,6,4,4}, порядок каналів впевненості. class*A + anchor, оцінки класів, отримані за допомогою функції softmax для кожного класу (включно з фоном під індексом 0).
    • SSD-Mobile-300-v1 (ssd_anchor_generator): вхідний розмір 300×300, функція: карти {19,10,5,3,2,1}, апріорні значення для кожної комірки {3,6,6,6,6,6}, канал зворотного зв’язку замовити anchor*C + class, оцінки для кожного класу за допомогою сигмоїдної функції для кожного класу (фон ігнорується).
    • SSD-Mobile-320-v1 (ssd_anchor_generator): вхідне зображення 320×320, вилучення ознак. карти {20,10,5,3,2,1}, апріорні значення для кожної комірки {3,6,6,6,6,6}, канал зворотного зв’язку замовити anchor*C + class, оцінки для кожного класу за допомогою сигмоїдної функції для кожного класу (фон ігнорується).
    • SSDlite-Mobile-320-v1 (TorchVision DefaultBoxGenerator): 320×320 вхідні дані, карти ознак {20,10,5,3,2,1}, шість апріорних значень на комірку на кожному рівні, порядок локалізації anchor*4 + {dx,dy,dw,dh}, порядок впевненості anchor*C + class та оцінки класів за допомогою softmax для всіх 91 класу, включаючи фон.

Усі рецепти використовують згруповані локалізаційні голови для кожного рівня (глибина = 4 * priors-per-cell) у поєднанні з головами для оцінки класу (глибина = num_classes * priors-per-cell), масштабування дисперсії FasterRcnnBoxCoder (scale_xy 0.1, scale_wh 0.2) та попередню обробку з розтягуванням (анізотропне) зміна розміру. Активація оцінки фіксується рецептом (відповідає декодеру на пристрої), а згрупована структура, що базується на ролі, вибирається автоматично — залиште decode_type_option як Auto. Незгрупована структура відхиляється.

Розмір моделі є частиною профілю, а не лише геометрії голови. SSD300-v1 та SSD-Mobile-300-v1 вимагають 300×300; обидва профілі 320-v1 вимагають 320×320. Будь-яка цільова зміна розміру попередньої обробки або перевизначення розміру моделі відхиляється під час створення, оскільки таблиці апріорних значень і зворотна проєкція з розтягуванням дійсні лише для цього розміру кадру.

Конструкція SimaBoxDecode у сирому/автономному вигляді ніколи не визначає режим зміни розміру. Збережіть вимогу метаданих попередньої обробки Preproc або використовуйте явне перевантаження, щоб підтвердити зовнішньо виконану ResizeMode::Stretch; Letterbox і Crop відхиляються.

Контракт num_classes. Кількість закодованих класів завжди визначається з глибини голови впевненості (conf_depth / priors-per-cell, фон під індексом 0 включно). SSD300-v1 дозволяє вибір суміжного префіксу, наприклад, підготовлений маршрут 81-to-8; інші три профілі вимагають точної кількості закодованих класів. Недійсний вибір відхиляється під час створення. Залиште його без змін, щоб використовувати значення за замовчуванням профілю.

  • Detr визначає класи каналів на основі максимальної глибини головного об’єкта та вимагає наявності дійсного клас розмірності.
  • EffDet і Centernet використовують контракти своїх сімейств моделей; не спрямовуйте їх через тип декодування YOLO.
  • *-seg типи декодування генерують вихідні дані, що містять інформацію про межі області, а також маскові дані, специфічні для конкретного завдання.

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

Нотатка про Python.​

Під час налаштування параметрів моделі з використанням Python, якщо це можливо, використовуйте перелічуваний тип (enum) замість рядка:

opt = pyneat.ModelOptions()
opt.decode_type = pyneat.BoxDecodeType.YoloV8

Аналізуйте результати за допомогою допоміжного інструменту, який відповідає поставленій задачі моделі:

outputs = model.run([image])

boxes = pyneat.decode_bbox(outputs)[0].to_numpy()

pose = pyneat.decode_pose(outputs)[0]
pose_boxes = pose.boxes.to_numpy()
keypoints = pose.keypoints.to_numpy()

seg = pyneat.decode_segmentation(outputs)[0]
seg_boxes = seg.boxes.to_numpy()
masks = seg.masks.to_numpy()

Оновлення​

Попередні параметри BoxDecode запровадили ABI 6. Поточні параметри арифметики джерела потребують ABI 7 (libsima_neat.so.7). Перезберіть застосунки C++, плагіни й прив’язки Python з відповідними заголовками та бібліотеками. Не завантажуйте бінарні файли ABI 5/6 через посилання для сумісності.

Допуск комбінованого входу YOLOX​

YoloXSegPose приймає голови BF16 та INT8 або нативні голови FP32 у неперервному сховищі чи сховищі з додатними кроками без перекриття (включно з планарними поданнями CHW). Адреси та кроки FP32 мають бути вирівняні на чотири байти; FP32 із блокуванням каналів та UINT8 відхиляються. Неявне перетворення FP32 із втратами не додається. Прототип має власний тип даних і потензорне квантування INT8; ролі кожної голови детекції все одно мають узгоджуватися за типом даних. Core зберігає ці відомості для кожного порту для допуску Kernels, а не застосовує тип даних або квантування першої голови до всіх портів. Три рівні детекції мають кроки 8, 16 та 32 по обох осях. Ширина й висота моделі мають бути кратними 32, але не обов’язково рівними. Прототип залишається 160×160×32 і не змінює розмір мовчки разом із розмірами моделі.

Для нецентрованого доповнення або координат обрізання використовуйте метадані попередньої обробки. Афінне перетворення відображає координати з моделі до оригіналу; зсув осей, обертання та списки ROI цим комбінованим профілем не підтримуються. Обрізання потребує авторитетних афінних метаданих під час підготовки. Це контракт декодера для зовнішньо попередньо оброблених тензорів, а не нова підтримка створення обрізаного входу в попередній обробці Model. Модель із менш ніж 17 ключовими точками все одно публікує фіксований публічний дротовий формат із 17 слотами, заповнюючи невикористані слоти нулями.