Угода щодо типу даних.
У моделі маршруту 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— корисне навантаження плюс метадані середовища виконання.