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

Угода щодо типу даних.

У моделі маршруту Neat є два контракти:

  • публічний контракт, який ваш застосунок бачить через Tensor, Sample, InputOptions, специфікації моделі та кінцеві точки графа;
  • контракт маршруту моделі Neat визначається на основі скомпільованого архіву моделі та обраного шляху попередньої/пост-обробки.

Не варто вважати, що кожна публічна межа використовує формат FP32. Деякі межі містять зображення, кодовані медіадані, упаковані дані для виявлення об’єктів, тензори INT8, тензори BF16 або семантику тензорів, визначену застосунком. Спочатку перевірте специфікації; специфікації є основою угоди.

У межах маршруту Neat додає етапи квантування, теселяції, приведення типів, детеселяції, деквантування та постобробки, коли це передбачено контрактом скомпільованої моделі.

Чотири приклади вхідних даних MLA.

Архів моделі містить інформацію про те, що Neat дві важливі речі щодо першого етапу MLA:

  • тип даних для вхідних даних MLA, зазвичай BF16 або INT8;
  • чи вже реалізовано теселяцію на стороні MLA в скомпільованому ядрі.

Таким чином, ми отримуємо чотири родини графів для попередньої обробки:

Тип даних MLA.MLA tessПопередня обробка сімейства графів.Що Neat вставляє перед MLA?
BF16такPreprocЗмінюйте розмір, конвертуйте кольори, нормалізуйте. На етапі MLA відбувається внутрішня теселяція.
BF16ніTessЗмінюйте розмір, конвертуйте кольори, нормалізуйте, розбивайте на мозаїку.
INT8такQuantЗмінюйте розмір, конвертуйте кольори, нормалізуйте, квантуйте. На етапі MLA відбувається внутрішня теселяція.
INT8ніQuantTessЗмінюйте розмір, конвертуйте кольори, нормалізуйте, квантуйте, розбивайте на мозаїку.

Перегляньте ResolvedPreprocessPlan, щоб дізнатися, який план обрав планувальник.

Що означає термін «теселяція»?

Теселяція організовує байти тензора у вигляді геометричної структури, якої очікує вхідний буфер MLA. Це перетворення розміщення: один і той самий логічний тензор, але інший порядок розташування в пам’яті.

Відповідне детеселювання відбувається після виведення даних MLA, коли маршруту потрібно повернути природне розташування тензора на наступний етап або в застосунок.

Оновлення меж

Neat може додавати більш складні етапи маршрутизації поверх чотирьох базових варіантів визначення типу даних:

  • Універсальний попередній процесор: використовує PreprocessOptions, щоб застосувати зміну розміру, корекцію кольору, форматування, нормалізацію, квантування, розбиття на мозаїку або явне перетворення перед виконанням обчислень.
  • BoxDecode: декодує вихідні дані для моделей, яким потрібен етап постобробки виявлення. Застосунок вибирає потрібну структуру за допомогою BoxDecodeType, наприклад, YoloV8, і застосовує фільтри, такі як score_threshold, nms_iou_threshold та top_k.

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

Що це означає для коду застосунку.

  • Перевірте model.input_specs() та model.output_specs() перед розподілом вхідних даних або декодуванням вихідних даних.
  • Використовуйте ModelOptions.preprocess, щоб вказати, який тип вхідних даних ви надаєте: вхідні дані у вигляді зображення, вхідні дані у вигляді тензора, зміна розміру, колір, макет, нормалізація, квантування або намір щодо теселяції.
  • Використовуйте model.resolved_preprocess_plan() / model.preprocess_plan(), щоб переглянути, що Neat запланував на основі ваших налаштувань, а також архів моделі.
  • Не варто робити припущень щодо типу даних, розміру або структури вихідних даних. Перегляньте специфікацію вихідних даних і, за потреби, метадані повернутого тензора.
  • Виконуйте декодування, визначення пози, або сегментацію лише тоді, коли вихідний формат відповідає заданому упакованому формату.
  • Розглядайте деталі, пов’язані з INT8/BF16/теселяцією, як особливості маршрутизації, якщо лише публічна специфікація або тензор явно не визначають їх.

Жодних емоцій. Спочатку прочитайте договір, а потім передавайте дані.

Уважно проаналізуйте отримані дані.

Використовуйте допоміжну функцію декодування, яка відповідає специфікації вихідних даних.

Вихідний контрактC++Python
Необроблений тензор.Використовуйте отриманий Tensor / TensorList безпосередньо.Використовуйте отриманий тензор безпосередньо або перетворіть його за допомогою to_numpy(...) / to_torch(...).
Упаковані коробки.simaai::neat::decode_bbox(...)pyneat.decode_bbox(...)
Згрупована поза.simaai::neat::decode_pose(...)pyneat.decode_pose(...)
Ущільнена сегментаціяsimaai::neat::decode_segmentation(...)pyneat.decode_segmentation(...)

Декодовані обмежувальні рамки використовують тензор типу float32 [N, 6] з колонками x1, y1, x2, y2, score та class_id. Декодери, що визначають позу та сегментують об’єкти, повертають обмежувальні рамки разом із тензорами, специфічними для конкретного завдання, для ключових точок або масок.

Збережіть координатні метадані.

Координати виявлення часто потребують попередньої обробки метаданих, щоб відобразити їх із простору моделі назад у простір вихідного кадру. Зберігайте метадані в процесі обробки графа, коли використовуєте letterbox, зміну розміру, списки ROI, рендеринг або декодування виявлення.

Відповідні метадані можуть включати цільовий розмір, масштабований розмір, відступи, перетворення кольору, перестановку осей, нормалізацію, квантування, теселяцію, вікна ROI та афінні перетворення для кожної області ROI.

Якщо декодовані рамки опинилися не в тому місці, перевірте передачу метаданих, перш ніж звинувачувати NMS. Див. Формати даних та Попереднє оброблення списків областей інтересу..

Пов’язані типи

  • PreprocessOptions — призначення попередньої обробки застосунку.
  • ResolvedPreprocessPlan — це те, що було зібрано планувальником.
  • PreprocessGraphFamily — яка сім’я алгоритмів попередньої обробки була обрана.
  • Tensor — загальнодоступні дані та метадані тензора.
  • Sample — корисне навантаження плюс метадані середовища виконання.

Для подальшого ознайомлення