크기 조정, 색상 변환 및 정규화
모델의 융합된 Preproc 대신 전처리 연산 하나만 필요한 경우 타입이 지정된
이미지 프런트엔드를 사용하세요. 이 연산은 EV74에서 실행되며, CPU 폴백,
재패킹 또는 페이로드 복사를 삽입하지 않습니다.
#include <neat.h>
simaai::neat::ResizeOptions size;
size.width = 640;
size.height = 480;
size.max_input_width = 1920;
size.max_input_height = 1080;
auto resize = simaai::neat::nodes::Resize(size);
simaai::neat::ColorConvertOptions color;
color.output_format = simaai::neat::ImageFormat::NV12;
color.surface = simaai::neat::ImageSurfaceLayout::EncoderNv12;
auto convert = simaai::neat::nodes::ColorConvert(color);
Python에서도 동일한 옵션 타입과 pyneat.nodes.resize,
pyneat.nodes.color_convert, pyneat.nodes.normalization 팩터리를 제공합니다.
입력 및 출력 계약
- Resize는 원시 이미지 형식을 유지하면서 크기를 변경합니다. 출력 크기는
고정됩니다. 입력 크기는 준비된 용량 범위 내에서 변경할 수 있으며, 최대값을
생략하면 초기 입력 크기를 사용합니다. 레터박스에는
ResizeFit::Contain을, 각 축의 독립적인 배율 조정에는Stretch를 사용하세요. 입력 형식은 고정됩니다. - ColorConvert는 크기를 유지하며 RGB, BGR, GRAY8, NV12, I420 또는 NV16을 생성합니다. 입력 크기와 형식은 노드를 처음 구체화할 때 고정됩니다. 이를 변경하려면 새 노드와 그래프를 생성하세요. 동일한 그래프를 다시 빌드해도 노드는 초기화되지 않습니다.
- Normalization은 UInt8 RGB, BGR 또는 GRAY8을 받아 원시 비디오가 아닌
조밀한 BF16 텐서를 생성합니다. 크기와 채널 순서는 유지됩니다. ColorConvert와
마찬가지로, 구체화된 입력 크기나 형식을 변경하려면 새 노드와 그래프를
사용하세요. 계수는 BGR 저장 형식에서도 의미상의 RGB 순서를 사용합니다.
연산은
(x - float(mean * 255)) * float(1 / (stddev * 255))이며, 이후 기존 Preproc BF16 절삭을 적용합니다. 표준편차는 양수이면서 유한해야 합니다.
현재 GRAY8 출력에는 GRAY8 입력이 필요하며, RGB/YUV에서 휘도로의 변환은 제공하지 않습니다. 정규화 전에 YUV를 RGB 또는 BGR로 변환하세요. NV12와 I420은 너비와 높이가 모두 짝수여야 합니다. NV16은 너비가 짝수여야 하며 색차 평면의 높이는 전체 이미지 높이와 같습니다. YUV 레터박스 배치도 동일한 색차 격자에 맞아야 합니다. 명시적인 소스 색도 정보와 색차 샘플 위치는 작성된 정책과 일치해야 합니다. 인터레이스 및 DV/교대 라인 색차는 거부됩니다. 이 프런트엔드는 ROI 목록이나 프레임 배치가 아니라 호출마다 한 프레임을 처리합니다. 완전한 아핀 출처 정보를 가진 업스트림의 단일 ROI 결과는 새 자르기 요청이 아닙니다. 이러한 출처 정보가 없는 단일 ROI 요청은 거부됩니다. 연산을 연결하면 출력에서 원본으로의 좌표 변환이 합성됩니다.
EV74는 소스와 출력의 각 차원을 4096픽셀로 제한합니다. BoxAverage는
색차 위상과 샘플 위치를 포함하여 축마다 최대 8개의 구성 요소 셀에 걸치는 경우를
허용합니다. 따라서 정렬되지 않은 8:1 축소는 거부될 수 있습니다. 지원되지 않는
크기는 보간 방식을 변경하거나 A65를 사용하는 대신 준비 단계에서 실패합니다.
프레임 레이트
이 연산은 프레임 레이트를 변경하지 않습니다. 준비된 원시 이미지 출력 caps는 분수 형태를 포함하여 알려진 업스트림 레이트를 유지합니다. 다운스트림 소비자에게 레이트가 필요하면 Input 또는 업스트림 caps 경계에 이를 지 정하세요. 인코더의 레이트를 설정해도 입력 레이트가 정해지지는 않습니다. 알 수 없는 레이트는 임의의 기본값으로 대체되지 않고 지정되지 않은 상태로 유지됩니다.
이미지 게시는 준비 단계에서 엄격한 경계 투영을 사용합니다.
OutputSpecProvider가 없는 노드는 실제로 프레임을 그대로 전달하더라도
상속된 레이트를 알 수 없게 만듭니다. 명시적인 다운스트림 caps 경계에서
레이트를 다시 정할 수 있습니다. 이는 일반적인 최선 노력 방식의 OutputSpec 투영보다
엄격합니다. 준비된 입력 레이트를 변경하려면 새 실행이 필요합니다. 정해진 범위 내의
동적 Resize 입력 크기를 허용한다고 해서 프레임 레이트 변경까지 허용되는 것은 아닙니다.
색상 및 저장 형식
ImageColorOptions는 BT.601 또는 BT.709 행렬 계열을 선택합니다. 직접적인
YUV-to-YUV 연산은 전체 또는 제한 범위와 각 축의 중앙 또는 동일 위치 색차를
지원합니다. 이 연산은 코딩 범위와 행렬을 변환하지 않고 유지합니다.
RGB/GRAY-to-YUV는 중앙 색차를 사용하는 전체 범위만 지원하며, 다른 프로파일은
준비 단계에서 거부됩니다. 이 옵션은 전달 함수 변환을 수행하지 않습니다.
패킹된 RGB/GRAY 출력은 기존의 전체 범위, 중앙 색차 YUV 해석을 유지합니다.
다른 범위/샘플 위치 설정을 요청하면 조용히 근사 처리하지 않고 실패합니다.
다중 평면 결과는 하나의 저장소 소유자를 가진 하나의 이미지입니다. 평면 오프셋과
양수 피치는 GstVideoMeta에서 가져옵니다. 소비자는 평면이 빈틈없이 패킹되어
있다고 가정해서는 안 됩니다. 공개 NV16 샘플은 Y 및 UV 평면을 가지며,
UV는 [height, width] 형태의 인터리브된 바이트입니다.
ImageSurfaceLayout::Native는 RGB/GRAY 행을 빈틈없이 패킹하고 YUV 피치를
16바이트로 정렬합니다. YUV 행 패딩과 평면 사이의 빈 공간은 유지됩니다.
EncoderNv12는 인코더가 정의하는 레이아웃을 사용합니다. 피치는 64바이트로
정렬되고, 휘도 저장 높이는 8행 단위로 올림됩니다. EV74는 매 호출마다
선언된 모든 행 끝 패딩과 저장 전용 행을 기록합니다. 프레임마다 CPU로 0을 채우는
작업은 삽입되지 않습니다. 이 서피스 옵션은 NV12에만 유효하며,
NV16을 거부하는 코덱에 NV16 지원을 추가하지 않습니다.
YUV 레터박스에서 ResizeOptions::yuv_padding은 원시 [Y, U, V] 값입니다.
생략하면 출력 범위에 따라 검은색이 정해집니다. 전체 범위는 [0,128,128],
제한 범위는 [16,128,128]입니다. pad_value는 패킹된 RGB/GRAY의
채우기 값으로 유지되며, YUV 출력에서는 반드시 0이어야 합니다.
기존 융합 Preproc API와 모델에서 파생되는 동작은 변경되지 않습니다.
새 팩터리도 그래프 도구에서 사용하는 표준 Preproc 노드 종류를 유지합니다.