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

Вхідний вузол камери.

CameraInput — це вихідний вузол для MIPI-камер, доступ до яких здійснюється через libcamera та GStreamer libcamerasrc. Використовуйте його на початку графа, що належить джерелу, коли кадри повинні надходити зі стеку камер DevKit, а не з run.push(...).

Інструкції щодо виконання завдання див. у розділі Використовуйте камеру MIPI..

Необхідні умови.

Перш ніж використовувати CameraInput, активуйте камеру за межами Neat:

  • прикріпіть камеру, коли Modalix DevKit вимкнено.
  • оберіть відповідне накладення .dtbo, яке відповідає материнській платі, виробнику камери, сенсору та порту.
  • перевірте, чи відображається камера в списку libcamera;
  • підтвердьте, чи може libcamerasrc здійснювати потокову передачу у вказаному вами форматі format,width,height,framerate.

camera_name – це назва камери libcamera. Залиште це значення порожнім для використання камери за замовчуванням або скопіюйте назву з cam -l, якщо на платі встановлено більше однієї камери.

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

#include <neat.h>

namespace neat = simaai::neat;

neat::CameraInputOptions opt;
opt.width = 1920;
opt.height = 1080;
opt.framerate_num = 30;
opt.framerate_den = 1;
opt.format = "NV12";
opt.buffer_name = "camera0";
opt.allow_cpu_fallback = true;

neat::Graph graph;
graph.add(neat::nodes::CameraInput(opt));
graph.add(neat::nodes::Output("frames"));

neat::Run run = graph.build();
std::optional<neat::Sample> frame = run.pull(/*timeout_ms=*/5000);

Оскільки CameraInput є власником джерела, створіть граф, не додаючи загальнодоступний вузол Input, якщо ваш застосунок насправді не має іншого вхідного вузла, що надходить від іншого застосунку.

Інтерфейс API.

namespace simaai::neat {
struct CameraInputOptions;
class CameraInput;
}

namespace simaai::neat::nodes {
std::shared_ptr<simaai::neat::Node> CameraInput(
simaai::neat::CameraInputOptions opt = {});
std::shared_ptr<simaai::neat::Node> CameraInputWithCaptureBuffers(
simaai::neat::CameraInputOptions opt,
std::uint32_t capture_buffer_count);
}

Python:

opt = pyneat.CameraInputOptions()
node = pyneat.nodes.camera_input(opt, capture_buffer_count=32)

Параметри

ПолеЗначення за замовчуваннямОпис
camera_nameне встановленоНеобов’язкова назва камери libcamera, зазвичай копіюється з cam -l. Залиште порожнім, щоб дозволити libcamera вибрати камеру за замовчуванням.
width1920Зазначена ширина кадру в пікселях. Має підтримуватися камерою та накладкою.
height1080Запитана висота фрейму в пікселях.
framerate_num30Чисельник частоти кадрів.
framerate_den1Знаменник частоти кадрів. 0 нормалізується до 1.
format"NV12"Запитано video/x-raw формат. NV12 є рекомендованим шляхом попередньої обробки для моделі.
buffer_name"camera"Логічна назва буфера, що використовується в подальших метаданих і для іменування моделей.
insert_queuetrueПісля узгодження з алокатором і перевірки можливості використання механізму «нульового копіювання» вставте невелику чергу для потокового джерела даних.
leaky_queuetrueЗробіть чергу пропускною у нижній частині, щоб динамічні графіки надавали перевагу останнім кадрам, а не застарілим даним.
queue_depth2Максимальна кількість буферів у черзі, коли insert_queue має значення true.
allow_cpu_fallbackfalseЯкщо false, вимагайте підтримку функції «нульового копіювання» для камери/пристрою. Встановіть значення true лише для активації приватної адаптивної інтеграції Neat із пам’яттю SiMaAI.

capture_buffer_count є аргументом для CameraInputWithCaptureBuffers, а не полем CameraInputOptions. За замовчуванням його значення становить 0, що зберігає значення за замовчуванням для конвеєра камери. Конвеєр камери перевіряє це обмеження; постачальник Neat підтримує максимум 128.

Вхідні та вихідні параметри контракту.

Пункт контрактуПоведінка
Вхідна роль:Вхідний вузол. Граф отримує кадри з камери; додаток не передає дані до цього вузла.
Тип вихідного медіафайлу:video/x-raw.
Формат виводу:Зазвичай, запитуваний формат format – це NV12.
Контракт пам’ятіВіддає перевагу механізму обміну даними без копіювання між пристроєм і SiMaAI. У разі активації механізму резервного копіювання, буфери ОС/libcamera адаптуються для використання в пам’яті SiMaAI для подальших етапів обробки CVU/MLA.
Обмеження можливостей, що гарантуютьсяСтатична підказка, що базується на запрошених параметрах. Узгодження обмежень можливостей під час роботи все ще залежить від програмного забезпечення камери.

Нульове копіювання та резервне копіювання.

allow_cpu_fallback = false є значенням за замовчуванням і вимагає суворого використання камери/пристрою без копіювання даних. Збірка завершиться помилкою, якщо встановлений libcamerasrc не надає загальну властивість external-buffer-mode, і бібліотека пам’яті не може експортувати виділену пам’ять камери як DMA-буфери.

Neat завжди розміщує свій приватний міст камери безпосередньо після фільтра caps і перед живою чергою. Міст пропонує стандартний пул через GStreamer's downstream GST_QUERY_ALLOCATION. Пул отримує розміри площин і крок з валідованих caps, виділяє їх з одного упакованого виділення SiMaAI та експортує один DMA-буфер на площину. libcamerasrc імпортує ці DMA-буфери в чергу захоплення ISP. Міст перевіряє результат і розпаковує те саме упаковане виділення без копіювання в суворому режимі.

Передайте capture_buffer_count до фабрики камери на основі власника в потоці даних. Тимчасовий кодувальник або глибокий асинхронний ML-граф може потребувати 32 буфери; граф CV з низькою затримкою може використовувати менше і відкидати застарілі кадри. Це налаштування контролює лише цикл ISP-вихід/застосунок. Воно не збільшує приватне кільце передачі RAW CSI-to-ISP в ядрі, і воно не залежить від політики відкидання GStreamer queue_depth.

Явно встановіть allow_cpu_fallback = true, щоб дозволити вже наявному мосту виконувати копіювання, коли стек камери не може виконати запропонований розподільник. Міст передає буфери SiMaAI/EV74, коли вони надаються вищезазначеним потоком. В іншому випадку він копіює кадр камери в пул SiMaAI і приєднує метадані, які очікують наступні етапи. Цей приватний пул копій збільшується за потреби, а не обмежується queue_depth, що дозволяє потоку даних, який може втрачати дані, відкидати застарілі кадри, не змушуючи міст спочатку зупинятися.

Назва fallback означає, що міст може приймати буфери OS/libcamera. Це не означає, що слід перемістити зміну розміру, перетворення кольору або нормалізацію на ЦП. Залиште ці операції в попередній обробці CVU, керованій моделлю, коли це підтримується.

Не додавайте самостійно вузол OsToSima для CameraInput. Адаптація належить до шляху джерела камери.

Найпоширеніші типи графів.

Витягуйте кадри безпосередньо з камери:

CameraInput -> Output

Проведіть камерою по моделі:

CameraInput -> model.graph({include_input=false, include_output=true})

Для конвеєрів моделей налаштуйте попередню обробку за допомогою Model::Options::preprocess або pyneat.ModelOptions.preprocess, щоб такі операції, як зміна розміру, перетворення кольорів, нормалізація, квантування та теселяція, виконувалися в межах керованого моделлю шляху обробки комп’ютерного зору (CVU).

Можливі сценарії відмови.

ПомилкаЙмовірна причина
build.plugin_missinglibcamerasrc або neatcamerabridge відсутні в наборі плагінів середовища виконання.
misconfig.media_caps / not-negotiatedКамера не підтримує запрошений формат, роздільну здатність або частоту кадрів.
Сувора нульова копія помилокallow_cpu_fallback має значення «false», і джерело камери не надає властивості SiMaAI для нульової копії.
Час очікування вичерпано.Камера не передала кадри, на графі виникла затримка, або потік даних від камери зупинився.
Зелені, фіолетові або надмірно кольорові рамки.Формат або модель рамки неправильно обробляє перетворення кольорів, або колірне відтінення вже присутнє у вихідних даних камери ISP/libcamera. Спочатку перевірте NV12 знімок поза Neat.