MIPI 카메라를 사용하세요.
Modalix DevKit의 MIPI 카메라에서 직접 프레임을 읽어와야 하는 경우 CameraInput을 사용합니다. CameraInput은 검증된 libcamera 스트림과 가속기 우선 모델 그래프 사이의 Neat 경계입니다.
CameraInput -> model-managed CVU preproc -> MLA -> Output
CameraInput -> model-managed CVU preproc -> MLA -> EV74 BoxDecode -> Output
appsrc는 없습니다. 사용자 코드에 ostosima는 없습니다. 사용자가 직접 추가하지 않는 한 프로덕션 경로에 CPU 기반의 videoconvert 또는 videoscale는 없습니다.
두 개의 게이트: 먼저 부팅을 하고, 그다음에 Neat를 실행합니다.
MIPI CSI-2는 카메라 인터페이스입니다. 모든 센서를 즉시 사용할 수 있도록 하지는 않습니다. 작동하는 카메라 경로를 위해서는 적절한 보드 오버레이, 센서 드라이버, libcamera 파이프라인, ISP 동작 및 기능이 필요합니다.
MIPI 카메라 작업을 두 단계로 나누어 생각하십시오.
- 보드 초기화: Modalix DevKit을 사용하면 센서와 libcamera가 요청된 모드를 스트리밍할 수 있는지 확인할 수 있습니다.
- Neat 그래프 초기화:
CameraInput은 해당 프레임을 모델에서 관리하는 CVU/MLA 단계로 전달합니다.
Neat는 게이트 2에서 시작합니다. .dtbo 오버레이를 선택하거나, 센서 드라이버를 로드하거나, ISP를 조정하지 않습니다. 오버레이 설정, 지원되는 오버레이 이름 및 cam 검증에 대해서는 Modalix DevKit MIPI 카메라 인터페이스 가이드를 참조하십시오.
Neat에서 지원하는 기능은 무엇인가요?
CameraInput은 플랫폼 카메라 스택에서 이미 활성화된 카메라를 지원합니다.
- 카메라는 전원이 꺼진 상태에서 Modalix DevKit MIPI 포트에 연결됩니다.
- 올바른 보드 오버레이가 활성화되어 있습니다.
- 커널 드라이버와 libcamera 파이프라인은 카메라를 노출합니다.
libcamerasrc는 요청된video/x-raw형식의 기능을 협상할 수 있으며, 일반적으로NV12형식을 사용합니다.- 캡션은 Neat에서 구성한 모델 전처리 방식과 일치합니다.
만약 그러한 조건이 아직 충족되지 않았다면, 먼저 카메라 스택을 수정하세요. Neat 그래프는 정확할 수 있지만, 연결되지 않은 센서를 스트림으로 변환할 수는 없습니다.
카메라 스트림을 확인합니다.
그래프를 빌드하기 전에 libcamera/GStreamer 레이어에서 카메라를 확인합니다. 이 레이어가 제대로 작동하지 않으면 Neat 그래프로 문제를 해결할 수 없습니다.
DevKit에서 libcamerasrc가 존재하는지 확인합니다.
devkit$gst-inspect-1.0 libcamerasrccam이 사용 가능한 경우, 카메라 목록과 검사 모드를 나열합니다.
devkit$cam -lcam -c 1 -I그런 다음 Neat에 요청할 정확한 대문자를 사용해 보세요.
devkit$gst-launch-1.0 -e libcamerasrc ! \ 'video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1' ! \ identity eos-after=30 ! fakesink시각적인 간단한 테스트를 위해 몇 개의 프레임을 JPEG 형식으로 인코딩합니다.
devkit$gst-launch-1.0 -e libcamerasrc ! \ 'video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1' ! \ identity eos-after=30 ! videoconvert ! jpegenc ! \ multifilesink location=/tmp/mipi-frame-%03d.jpgvideoconvert와 jpegenc은 일회성 디버그 검사에 적합합니다. 처리량이 중요한 경우 모델 파이프라인에서 제외하십시오.
원시 MLA 연기 그래프를 생성합니다.
먼저 원본 MLA 경로를 사용하세요. 이를 통해 카메라 프레임이 모델별 후처리를 추가하기 전에 CVU 전처리 및 MLA 추론 단계에 도달하는지 확인할 수 있습니다.
#include <neat.h>
namespace neat = simaai::neat;
neat::CameraInputOptions camera;
camera.width = 1920;
camera.height = 1080;
camera.framerate_num = 30;
camera.framerate_den = 1;
camera.format = "NV12";
camera.buffer_name = "camera0";
camera.allow_cpu_fallback = true;
neat::Model::Options model_options;
model_options.preprocess.kind = neat::InputKind::Image;
model_options.preprocess.input_max_width = static_cast<int>(camera.width);
model_options.preprocess.input_max_height = static_cast<int>(camera.height);
model_options.preprocess.input_max_depth = 3;
model_options.preprocess.color_convert.input_format = neat::PreprocessColorFormat::NV12;
model_options.preprocess.color_convert.output_format = neat::PreprocessColorFormat::RGB;
model_options.preprocess.resize.enable = neat::AutoFlag::On;
model_options.preprocess.resize.width = 640;
model_options.preprocess.resize.height = 640;
model_options.preprocess.resize.mode = neat::ResizeMode::Letterbox;
model_options.preprocess.resize.pad_value = 114;
model_options.preprocess.preset = neat::NormalizePreset::COCO_YOLO;
model_options.advanced_execution.preprocess_target = "EV74";
model_options.inference_terminal.mla_only = true;
neat::Model model("/models/yolo.tar.gz", model_options);
neat::Model::RouteOptions route;
route.include_input = false;
route.include_output = true;
route.upstream_name = camera.buffer_name;
route.buffer_name = camera.buffer_name;
route.name_suffix = "_camera0";
route.advanced_execution.preprocess_target = "EV74";
neat::Graph graph("camera_mla_smoke");
graph.add(neat::nodes::CameraInput(camera));
graph.add(model.graph(route));
neat::Run run = graph.build();
std::optional<neat::Sample> output = run.pull(/*timeout_ms=*/5000);
inference_terminal.mla_only = true는 의도적인 설정입니다. 연기 경로를 CameraInput -> CVU preproc -> MLA -> Output에 유지하므로, 객체 감지 디코딩을 디버깅하기 전에 카메라 및 추론 움직임을 디버깅할 수 있습니다.
모델에 필요한 경우 EV74 BoxDecode를 추가합니다.
YOLO 스타일의 객체 감지 모델의 경우, BoxDecode를 명시적으로 활성화하고 후처리 작업을 EV74에서 수행하도록 설정합니다. 디코딩 토큰은 MPK의 출력 계약과 일치해야 합니다.
model_options.inference_terminal.mla_only = false;
model_options.decode_type = neat::BoxDecodeType::YoloV9Seg;
model_options.advanced_execution.postprocess_target = "EV74";
model_options.score_threshold = 0.25f;
model_options.nms_iou_threshold = 0.45f;
model_options.top_k = 100;
route.advanced_execution.postprocess_target = "EV74";
decode_type은 설정하지 않은 상태로 두고, 원시 MLA 텐서를 사용하려는 경우 mla_only = true를 유지합니다. decode_type은 모델 경로에서 디코딩된 감지 결과 또는 분할 데이터를 출력해야 할 때만 설정합니다.