Попередня обробка списків ROI.
Використовуйте список попередньо оброблених областей інтересу (ROI), якщо ваш застосунок вже має одне або кілька вікон зображень і ви хочете, щоб кожне вікно було попередньо оброблено точно так, як це потрібно для вхідних даних моделі: зміна розміру або застосування методу letterbox, перетворення кольору, нормалізація, квантування та, за бажанням, розбиття на частини.
Це ідеальний інструмент для класифікаторів другого рівня, каскадів детекторів, трекерів або будь-якого процесу, де пакет вихідних зображень генерує динамічний список фрагментів.
Мінімальний приклад.
C++:
#include <neat.h>
#include <opencv2/imgcodecs.hpp>
using namespace simaai::neat;
Model model("/path/to/model.tar.gz");
std::vector<cv::Mat> images = {
cv::imread("/data/camera0.jpg", cv::IMREAD_COLOR),
cv::imread("/data/camera1.jpg", cv::IMREAD_COLOR),
};
std::vector<PreprocessRoi> rois = {
{0, 0, 0, 320, 240},
{0, 120, 80, 160, 160},
{1, -20, 30, 224, 224},
};
TensorList out = stages::Preproc(images, model, rois);
for (std::size_t i = 0; i < out.size(); ++i) {
const auto& meta = out[i].semantic.preprocess;
// out[i] is the preprocessed tensor for rois[i].
// meta carries the ROI and inverse-coordinate breadcrumbs.
}
Python:
import cv2
import pyneat
model = pyneat.Model("/path/to/model.tar.gz")
images = [
cv2.imread("/data/camera0.jpg", cv2.IMREAD_COLOR),
cv2.imread("/data/camera1.jpg", cv2.IMREAD_COLOR),
]
rois = [
pyneat.PreprocessRoi(0, 0, 0, 320, 240),
pyneat.PreprocessRoi(0, 120, 80, 160, 160),
pyneat.PreprocessRoi(1, -20, 30, 224, 224),
]
out = pyneat.stages.preproc(
images,
model,
rois=rois,
image_format=pyneat.PixelFormat.BGR,
)
for i, tensor in enumerate(out):
meta = tensor.semantic.preprocess
# tensor is the preprocessed output for rois[i].
# meta carries the ROI and inverse-coordinate breadcrumbs.
Налаштуйте зміну розміру, додавання чорних смуг і нормалізацію.
ROI-list Preproc використовує ті самі параметри попередньої обробки моделі, що й повноекранний Preproc.
C++:
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.normalize.enable = AutoFlag::On;
opt.preprocess.normalize.mean = {0.0f, 0.0f, 0.0f};
opt.preprocess.normalize.stddev = {1.0f, 1.0f, 1.0f};
opt.preprocess.tessellate.enable = AutoFlag::Auto;
Model model("/path/to/model.tar.gz", opt);
TensorList out = stages::Preproc(images, model, rois);
Python:
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.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]
opt.preprocess.tessellate.enable = pyneat.AutoFlag.Auto
model = pyneat.Model("/path/to/model.tar.gz", opt)
out = pyneat.stages.preproc(
images,
model,
rois=rois,
image_format=pyneat.PixelFormat.BGR,
)
Підтримувані значення для scaling_type включають BILINEAR, NEAREST_NEIGHBOUR, BICUBIC, INTERAREA та NO_SCALING. NEAREST_NEIGHBOR і INTER_AREA є допустимими альтернативними назвами.
Пакетна семантика.
| Вхідні дані | Значення |
|---|---|
images | Пакет вихідних зображень. Вектор/список не повинен бути порожнім, якщо надаються області інтересу (ROIs). Python приймає вхідні дані у вигляді зображень у форматі uint8 HW/HWC NumPy/Torch/pyneat.Tensor. |
rois | Список областей інтересу (ROI) для середовища виконання. Порядок елементів у вихідному тензорі відповідає порядку елементів у цьому векторі. |
PreprocessRoi::batch_index | визначає, з якого вихідного зображення в images зчитуються дані для області інтересу (ROI). |
PreprocessRoi::x, y | Підписані координати верхнього лівого кута вихідного кадру. Допускаються від’ємні значення. |
PreprocessRoi::width, height | Розміри області інтересу (ROI). Обидва значення мають бути додатними. |
Усі вихідні зображення у списку ROI повинні мати однакову ширину, висоту, тип OpenCV і кількість каналів. API етапу підтримує упаковані 8-бітові RGB/BGR (CV_8UC3) і GRAY/GRAY8 (CV_8UC1) вихідні зображення для списків ROI.
Для Python передавайт е image_format=pyneat.PixelFormat.BGR для зображень, отриманих за допомогою cv2.imread, RGB для RGB-масивів або GRAY8 для HW-масивів у градаціях сірого. pyneat.stages.preproc відхиляє тензори CHW; перед викликом етапу перетворіть їх на HWC.
Семантика виводу
stages::Preproc(images, model, rois) повертає:
out.size() == rois.size()для коректного запиту, який не є порожнім;- вихідний тензор
out[i], отриманий з області інтересуrois[i]; - тип даних і структура, обрані моделлю, зокрема BF16 або INT8, а також щільний або розділений на блоки вихідний формат;
- на вихід
tensor.semantic.preprocessметадані.
Кожен результат попередньої обробки містить інформацію про вибрану область інтересу (ROI), геометрію кадрування, прапори нормалізації/квантування/триангуляції та афінне перетворення, яке відображає координати моделі/обробленого зображення назад у вихідну систему координат.