В узол попередньої обробки.
Preproc — це об’єднаний вузол попередньої обробки зображень CVU, який використовується перед виконанням MLA. Він може змінювати розмір зображення, зберігати пропорції за допомогою заповнення рамками, конвертувати кольори, нормалізувати, квантувати та розбивати зображення на частини, щоб створити тензор, який відповідає очікуваному контракту моделі.
Для більшості застосунків налаштовуйте попередню обробку за допомогою Model::Options::preprocess і дозвольте планувальнику моделі створити відповідний вузол Preproc. Створюйте nodes::Preproc(...) безпосередньо лише тоді, коли ви створюєте спеціальний фрагмент графа, який вже знає повний вхідний і вихідний контракт.
Швидкий старт.
C++:
#include <neat.h>
#include <opencv2/imgcodecs.hpp>
using namespace simaai::neat;
Model::Options opt;
opt.preprocess.resize.enable = AutoFlag::On;
opt.preprocess.resize.width = 640;
opt.preprocess.resize.height = 640;
opt.preprocess.resize.mode = ResizeMode::Letterbox;
opt.preprocess.resize.pad_value = 114;
opt.preprocess.resize.scaling_type = "BILINEAR";
opt.preprocess.color_convert.input_format = PreprocessColorFormat::BGR;
opt.preprocess.color_convert.output_format = PreprocessColorFormat::RGB;
opt.preprocess.normalize.enable = AutoFlag::On;
opt.preprocess.normalize.mean = {0.0f, 0.0f, 0.0f};
opt.preprocess.normalize.stddev = {1.0f, 1.0f, 1.0f};
Model model("/path/to/model.tar.gz", opt);
cv::Mat image = cv::imread("/path/to/frame.jpg", cv::IMREAD_COLOR);
TensorList tensors = stages::Preproc({image}, model);
Python:
import cv2
import pyneat
opt = pyneat.ModelOptions()
opt.preprocess.resize.enable = pyneat.AutoFlag.On
opt.preprocess.resize.width = 640
opt.preprocess.resize.height = 640
opt.preprocess.resize.mode = pyneat.ResizeMode.Letterbox
opt.preprocess.resize.pad_value = 114
opt.preprocess.resize.scaling_type = "BILINEAR"
opt.preprocess.color_convert.input_format = pyneat.PreprocessColorFormat.BGR
opt.preprocess.color_convert.output_format = pyneat.PreprocessColorFormat.RGB
opt.preprocess.normalize.enable = pyneat.AutoFlag.On
opt.preprocess.normalize.mean = [0.0, 0.0, 0.0]
opt.preprocess.normalize.stddev = [1.0, 1.0, 1.0]
model = pyneat.Model("/path/to/model.tar.gz", opt)
image = cv2.imread("/path/to/frame.jpg", cv2.IMREAD_COLOR)
tensors = pyneat.stages.preproc(
[image],
model,
image_format=pyneat.PixelFormat.BGR,
)
Способи використання.
| Приклад використання | API | Інструкція |
|---|---|---|
| Повний шлях до моделі: | Model model(path, opt); graph.add(model); | Рекомендовано для використання в виробничих конвеєрах. Архів моделі та планувальник маршруту визначають точну сімейство графів попередньої обробки та спосіб передачі тензорів. |
| Автономний етап | stages::Preproc(images, model) | Корисний для проведення швидких перевірок, налагодження попередньої обробки або ручного введення даних для MLA. |
| Етап ROI-списку | stages::Preproc(images, model, rois) | Використовуйте, коли кожен результат має бути отриманий з вікна середовища виконання, що охоплює одне або кілька вихідних зображень. |
| Ручне створення вузла | nodes::Preproc(PreprocOptions{...}) | Лише для досвідчених користувачів, які створюють граф. Якщо є архів моделі, краще використовувати автоматизоване створення. |
Інтерфейс API.
C++:
namespace simaai::neat::nodes {
std::shared_ptr<Node> Preproc(PreprocOptions opt = {});
}
namespace simaai::neat::stages {
TensorList Preproc(const std::vector<cv::Mat>& inputs, const Model& model);
TensorList Preproc(const std::vector<cv::Mat>& inputs, const Model& model,
const std::vector<PreprocessRoi>& rois);
}
Python:
pyneat.nodes.preproc(options: pyneat.PreprocOptions | None = None)
pyneat.stages.preproc(
images: list,
model: pyneat.Model,
*,
rois: list[pyneat.PreprocessRoi] | None = None,
image_format: pyneat.PixelFormat | None = None,
copy: bool = False,
) -> list[pyneat.Tensor]
stages::Preproc використовує визначений моделью план попередньої обробки. Це забезпечує узгодженість окремого виклику з тим самим вузлом Preproc, який використовується у повному графі.
Вхідні та вихідні параметри контракту.
| Пункт контракту | Поведінка |
|---|---|
| Тип вхідних даних | C++ приймає cv::Mat зображення, зазвичай CV_8UC3 для RGB/BGR або CV_8UC1 для зображень у сірих тонах. Python підтримує uint8 у бібліотеках NumPy/Torch.pyneat.Tensor зображення у форматі HW або HWC. |
| Пакет джерел | Функція обробки, яка не використовує ROI, обробляє кожне зображення окремо. Функція обробки, яка використовує список ROI, приймає пакет зображень однакового розміру та однакового типу. |
| Порядок виведення | Версія, яка не використовує ROI, повертає результати у порядку зображень. Версія, яка використовує список ROI, повертає результати у порядку ROI. |
| Тип даних/формат вихідних даних | визначається обраним шляхом моделі: щільний формат BF16/INT8/INT16 або формат з використанням багатошарових матричних операцій (MLA), залежно від визначеної родини попередньої обробки графа. |
| Метадані. | Тензори, що передаються на вихід, містять tensor.semantic.preprocess метадані, які описують зміну розміру, застосування методу letterbox, нормалізацію, квантування, теселяцію та геометрію області інтересу (ROI). |
Параметри попередньої обробки моделі.
Це параметри, які мають бути доступні користувачам у коді застосунку.