メインコンテンツまでスキップ

リサイズ、色変換、正規化

モデルの融合された 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 は画像の形状を変更し、raw 画像形式を維持します。出力寸法は固定です。入力寸法は準備済みの容量内で変更できます。最大値を省略すると、初期入力寸法が使われます。レターボックスには ResizeFit::Contain、各軸を独立に拡大縮小する場合は Stretch を使用します。入力形式は固定です。
  • ColorConvert は寸法を維持し、RGB、BGR、GRAY8、NV12、I420、NV16 を出力します。入力の形状と形式は、ノードを最初に具体化した時点で固定されます。変更する場合は新しいノードとグラフを作成してください。同じグラフを再ビルドしてもノードはリセットされません。
  • Normalization は UInt8 の RGB、BGR、GRAY8 を入力とし、raw ビデオではなく密な 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/交互ラインのクロマは拒否されます。これらのフロントエンドは呼び出しごとに 1 フレームを処理し、ROI リストやフレームバッチは処理しません。完全なアフィン変換の由来情報を持つ上流の単一 ROI 結果は、新たなクロップ要求ではありません。その由来情報を持たない単一 ROI 要求は拒否されます。連結時には、出力から元画像への座標変換が合成されます。

EV74 では入力と出力の各寸法が 4096 ピクセル以下に制限されます。BoxAverage が許可する参照先成分セルは、クロマの位相と位置を含めて各軸最大 8 個です。そのため、位置が揃わない 8 対 1 の縮小は拒否される場合があります。未対応の形状は準備時に失敗し、補間方法を変更したり A65 を使用したりしません。

フレームレート​

これらの操作はフレームレートを変更しません。準備済みの raw 画像出力 caps は、分数レートを含む既知の上流レートを維持します。下流コンシューマーがレートを必要とする場合は、Input または上流の caps 境界で指定してください。エンコーダーのレート設定だけでは入力レートは確定しません。不明なレートは未指定のままで、架空の既定値には置き換えられません。

画像の公開には準備時の厳密な境界投影を使用します。OutputSpecProvider を持たないノードがあると、実際にはフレームを通過させるだけでも、継承されるレートは不明になります。下流に明示的な caps 境界を設ければ、レートを再度確定できます。これは一般的なベストエフォートの OutputSpec 投影より厳格です。準備済みの入力レートを変更するには新しい実行が必要です。容量内での動的な Resize 入力形状変更は、フレームレートの変更を許可するものではありません。

色とストレージ​

ImageColorOptions は BT.601 または BT.709 の行列系を選択します。直接の YUV 間変換は、フルレンジまたはリミテッドレンジと、各軸の中央配置または同位置のクロマに対応します。符号化レンジと行列は変換せず維持します。RGB/GRAY から YUV への変換は、フルレンジと中央配置のクロマにのみ対応します。他のプロファイルは準備時に拒否されます。これらのオプションは伝達関数の変換を行いません。パックされた RGB/GRAY 出力は、従来のフルレンジ・中央配置の YUV 解釈を維持します。他のレンジや位置設定を要求すると、暗黙の近似ではなく失敗になります。

複数プレーンの結果は、1 つのストレージ所有者を持つ 1 枚の画像です。プレーンのオフセットと正のピッチは GstVideoMeta に従います。コンシューマーは隙間なくパックされたプレーンを仮定してはいけません。公開 NV16 サンプルは Y と UV のプレーンを持ち、UV は形状 [height, width] のインターリーブされたバイト列です。

ImageSurfaceLayout::Native は RGB/GRAY の行を隙間なくパックし、YUV のピッチを 16 バイト境界に揃えます。YUV の行パディングとプレーン間の空き領域は維持されます。EncoderNv12 はエンコーダーが定めるレイアウトを使用します。ピッチは 64 バイト境界に揃え、輝度ストレージの高さは 8 行単位に切り上げます。EV74 は呼び出しごとに、宣言されたすべての行末領域とストレージ専用行を書き込みます。フレームごとの CPU ゼロ埋めは挿入しません。このサーフェス設定は NV12 のみに有効で、NV16 を拒否するコーデックに NV16 対応を追加するものではありません。

YUV レターボックスの ResizeOptions::yuv_padding は raw の [Y, U, V] 値です。省略すると、出力レンジに応じた黒を使用します。フルレンジでは [0,128,128]、リミテッドレンジでは [16,128,128] です。pad_value は引き続きパックされた RGB/GRAY の塗りつぶし値であり、YUV 出力ではゼロのままにする必要があります。

既存の融合された Preproc API とモデル由来の動作は変わりません。新しいファクトリーも、グラフツール向けの標準 Preproc ノード種別を維持します。