要素リファレンス¶
同梱のDL Streamer要素と独立したamdnpuを除き、すべての要素は amdanalytics プラグイン(libgstamdanalytics.so)に含まれます。ランクは NONE のため、自動で接続されることはありません。READY と記したプロパティは NULL/READY 状態でのみ変更できます。正確な一覧は、お使いのビルドで
gst-inspect-1.0 <element> を実行して確認してください。
GST_PLUGIN_PATH にプラグインのディレクトリ(build/plugins または
<prefix>/lib/gstreamer-1.0)を設定してください。
amdnpuは独立した任意プラグインです。以下に専用の説明があります。
推論: amddetect、amdclassify、amdinference¶
実装は 1 つで、既定値だけが異なる 3 つの要素です。インプレースで動作し、メタデータを追加するだけで画素は変更しません。
amddetect |
amdclassify |
amdinference |
|
|---|---|---|---|
inference-region の既定値 |
full-frame |
roi-list |
full-frame |
| タスク | 検出、インスタンスセグメンテーション、姿勢推定 | 分類 | 任意の task_type(セマンティックセグメンテーション、生のテンソルなど) |
パッド(sink と src): video/x-raw(memory:VAMemory),format=NV12,width=[2,32766],height=[2,32766]
または multistream/x-analytics-batch(meta:GstAnalyticsBatchMeta)(gvastreammux が生成するコンテナー)。フレームは BT.709 limited range で、幅と高さが偶数である必要があります。
| プロパティ | 型 / 範囲 | 既定値 | 意味 |
|---|---|---|---|
model |
string | .manifest.json を伴うコンパイル済み .mxr モデル(READY) |
|
model-info |
string | model-info JSON(READY) | |
model-instance-id |
string | ID、モデル、設定が同じ要素は 1 つの実行器を共有し、まとめてバッチ処理します | |
inference-region |
full-frame | roi-list |
上記参照 | roi-list では上流の GstAnalytics ボックスを最大 300 個まで VPE で切り出します |
device |
0-16 | 0 | HIP デバイス番号 |
batch-size |
1-16 | 1 | コンパイル時のバッチと一致させる必要があります |
batch-timeout |
0-10000 ms | 20 | 不完全なバッチを待つ時間 |
inference-interval |
1-100000 | 1 | N フレームごとに推論します |
confidence-threshold |
0-1 | 0.25 | 物体スコアの最小値 |
nms-threshold |
0-1 | 0.45 | NMS の IoU |
require-zero-copy |
bool | true | 画像やテンソルを CPU でコピーする経路をすべて拒否します |
付加するメタデータは、GstAnalytics の物体検出、分類、キーポイントグループの mtd と、GPU のマスク/テンソル、逆変換のジオメトリ、フレーム識別情報を保持する AmdAnalysisMeta です。キューのあふれはエラーとして扱い、際限なくバッファーリングすることはしません。
amdwatermark¶
ボックス、ラベル、トラッキング ID、インスタンス/セマンティックのマスク、COCO-17 の骨格を GPU で描画します。
| Sink | video/x-raw(memory:VAMemory),format=NV12,width=[2,4096],height=[2,4096] |
| Src | video/x-raw(memory:DMABuf),format=BGRA,width=[2,4096],height=[2,4096](リニア、エクスポートした VA サーフェス) |
device |
HIP デバイス番号(既定値 0、READY) |
require-zero-copy |
既定値 true(READY) |
BGRA サーフェスは EGL(amdva::EglDmaBufImporter)で表示するか、amdencode でエンコードできます。通常の vapostproc ではこのサーフェスをネゴシエーションできません。
amdencode¶
VA のハードウェアエンコーダーを内包する bin です。エンコードと配信を参照してください。
| Sink | video/x-raw(memory:VAMemory),format={NV12,BGRA,BGRx,RGBA} または video/x-raw(memory:DMABuf),format={NV12,BGRA,BGRx,RGBA} |
| Src | video/x-h264 または video/x-h265 の byte-stream(AU 単位)、video/x-av1 の OBU/TU |
codec |
h264(既定値)、h265、av1 |
bitrate |
1-2048000 kbit/s(既定値 4000) |
key-int-max |
1-10000(既定値 30) |
b-frames |
0-4(既定値 0。AV1 では使用不可) |
signal-bt709 |
既定値 true。H.264 の SPS VUI を書き換えます |
すべてのプロパティは READY です。内部構成は、DMA-BUF のインポートと変換の段、vapostproc、caps フィルター、vah264enc/vah265enc/vaav1enc、パーサーです。
amdpython¶
メタデータのみを扱うコールバックです。メタデータと Python を参照してください。
| プロパティ | 既定値 | |
|---|---|---|
module |
Python のソースファイル(READY) | |
function |
process |
callback(frame_dict)(READY) |
caps: 任意(パススルー)。
amdmetapublish¶
上限付きの非同期送信要素です。caps は任意で、パススルーです。
| プロパティ | 既定値 | |
|---|---|---|
method |
none |
none、file、mqtt、kafka |
file-path |
JSON Lines の出力先 | |
address |
ブローカーのアドレス | |
topic |
amdva/analytics |
|
queue-limit |
256 | 1-65536 レコード |
delivered、dropped、errors |
読み取り専用 | uint64 のカウンター |
GPU前処理: amdpreproc¶
元のNV12 VAMemoryバッファーを保持し、GPUテンソルを添付します。次のREADYプロパティで、検出器以外の画像エンコーダーにも使えます。
| プロパティ | 既定値 | 内容 |
|---|---|---|
tensor-width、tensor-height |
640、640 | 出力画像の寸法 |
letterbox |
true | 縦横比を維持。falseは出力寸法に合わせて伸縮 |
tensor-scale |
1/255 | RGB画素へmean/std正規化の前に掛ける値 |
tensor-mean、tensor-std |
0,0,0、1,1,1 |
有限なRGBの3値。stdは正の値が必要 |
roi-meta |
false | 範囲内で面積のあるGstVideoRegionOfInterestMetaが1つ必要。その矩形を前処理 |
output-memory |
device |
GPUテンソル、またはNPU用のhost-mapped共有入力 |
model-infoを指定すると、寸法、余白の処理、正規化はその設定を優先します。正規化は(pixel * scale - mean[channel]) / std[channel]です。ROIはNV12のクロマ境界に合わせて外側の2×2単位へ広げ、実際の矩形をTensor::geometryに記録します。ROIがない、複数ある、範囲外の場合はバスエラーになります。caps、映像のGstMemory、PTS、元のROIメタデータは保持し、テンソルの領域は後続の前処理と独立して所有します。
NVRのReIDは常設のappsrc → amdpreproc → appsinkを使い、roi-meta=true、letterbox=false、ImageNetのRGB mean/stdを指定します。元のVAフレームと人物のボックスを渡します。バッチ1はGPUテンソルを直接推論へ渡し、大きなバッチはGPU間コピーで組み立てます。端数は最後の有効行で埋め、余分な出力を破棄します。CPUへ戻すのは512次元の特徴量です。サムネイル用のCPU画像は別に保持し、ReIDの入力には使いません。
preproc-roi-contractでは、ROIの整列、テンソルの所有権、GPU上のImageNet正規化、VAメモリ・caps・PTSの維持、不正ROIの拒否、コピー監査を確認します。NVR用の実機検証では、実映像のROIを交互に切り替え、部分バッチと複数バッチ、入力アップロードがないことを確認します。
source scripts/env.sh
LD_PRELOAD="$PWD/build/src/gst/libamdva_copy_audit.so" \
build/examples/nvr/amdva-reid-validate /path/to/osnet.mxr /path/to/hevc.mp4
ReIDの検証記録を参照してください。縮小済みRGB画像のCPUリサイズからVPEでのリサイズへ変更したため、検索にはosnet-person-amdpreproc-roi-v2の名前空間を使います。既存のDB行や録画は残し、古い特徴量は書き換えません。
NPU推論: amdnpu¶
amdnpuは独立した任意プラグインlibgstamdnpu.soです。AMDVA_BUILD_NPU=ONでビルドし、AMDVA_ORT_ROOTにRyzen AIのC++ SDKを指定します。起動前にscripts/env.shとexamples/nvr/scripts/mobileclip-env.sh RYZEN_AI_VENVを読み込みます。NPUを無効にしたビルドでも、GPU用エレメントはNPUのSDKなしで使えます。
両パッドのcapsはapplication/x-amd-shared-tensorまたはvideo/x-raw(memory:VAMemory),format=NV12,width=[2,32766],height=[2,32766]です。各バッファーにはAmdSharedTensorMetaが必要です。映像だけではエラーになります。入力のcaps、GstMemory、タイムスタンプ、メタデータを保持し、バッファーごとに同期推論を1回実行してAmdNpuResultMetaを追加します。
| プロパティ(すべてREADY) | 内容 |
|---|---|
model |
静的なfloat32 [1,3,H,W]入力を1つ持つ画像ONNXモデル |
provider-config |
Vitis AIの設定JSON |
cache-dir、cache-key |
事前準備したキャッシュのルートとキー。context.jsonが必要 |
gpu-device |
HIP前処理のデバイス番号。既定値0 |
名前がbatchの可変次元は1に固定し、ほかの可変次元は拒否します。CPU EPへのフォールバックは無効です。出力は名前と静的な形状を持つ数値テンソルで、float32、float16、int32、int64、uint8に対応します。モデル固有の後処理は行いません。初期化や推論の失敗はバスエラーになり、PAUSED/PLAYING中のプロパティ変更は受け付けません。
amdva::SharedTensorはHIPのmapped host allocation、GPU側の別名ポインター、前処理の完了イベントを所有します。device_data()へ書き込み、record_ready(stream)を呼び、add_shared_tensor_meta(buffer, tensor)で添付します。推論側はイベントを待ってから、同じhost_data()の領域でORT入力を作ります。NpuResult::input_addressでこのポインターを確認できます。推論と入力を参照するすべての処理が終わるまで、領域を保持し、再書き込みを避けてください。
NpuResult::tensorsは型・名前・形状、読み取り専用のデータポインター、ORT出力領域の共有所有者を保持します。後続推論やパイプライン停止後も、出力全体をコピーせずに参照できます。GstBuffer全体のコピーでは入力・出力の所有権を共有し、部分コピーでは両メタデータを引き継ぎません。EP内部の転送やキャッシュ同期はこの契約の対象外です。
amdpreproc output-memory=host-mappedはHIP前処理の結果を新しい共有領域に直接書き込み、AmdSharedTensorMetaを添付します。既定値のoutput-memory=deviceは従来のGPUテンソル出力です。どちらもmodel-infoで入力名、寸法、正規化を指定します。
filesrc location=in.mp4 ! qtdemux ! h265parse ! vah265dec !
amdpreproc output-memory=host-mapped model-info=image.json !
amdnpu model=image.onnx provider-config=provider.json cache-dir=cache cache-key=model !
appsink
ネイティブのテンソル生成側では、AMDVA::amdva_npu_pipelineとamdva::NpuPipelineで常設のappsrc → amdnpu → appsinkを使えます。呼び出しを直列化し、両キューの上限を1バッファーにしています。エラーやタイムアウト後はパイプラインを作り直してください。MobileCLIPとNVRのNPU画像推論もこの経路を使います。Pillow互換のHIP前処理はネイティブライブラリに残し、CPUテキスト推論、GPU画像推論、検索のフィンガープリントは維持します。
実機検証の再実行¶
source scripts/env.sh
source examples/nvr/scripts/mobileclip-env.sh /path/to/ryzen-ai-venv
cmake -S . -B build -DAMDVA_BUILD_NPU=ON -DAMDVA_HARDWARE_TESTS=ON \
-DAMDVA_ORT_ROOT="$AMDVA_ORT_ROOT"
cmake --build build -j8
python scripts/prepare_npu_fixture.py artifacts/npu-fixture /path/to/provider.json
build/src/gst/amdva-validate-npu artifacts/npu-fixture /path/to/hevc.mp4
専用の検証モデルはConv/Relu/GlobalAveragePoolと2つの出力を持ち、MobileCLIPには依存しません。GPUで書いた入力を交互に切り替えて100回実行し、出力の期待値、入力ポインターの一致、停止後の出力保持、メタデータのコピー、不正入力、READYプロパティ、caps、flush/EOS、任意のVAデコード・前処理を確認します。AMDVA_NPU_TEST_FIXTUREとAMDVA_RYZEN_AI_TEST_VENVを設定すると、CTestにnpu-element-contractを登録します。実機不要のnpu-meta-contractはNPU無効時にも型と出力所有権を確認します。検証結果とMobileCLIPサンプルも参照してください。
互換用の組: amdpreproc、amdmigraphx¶
当初の 2 要素構成の YOLOv8 インターフェースで、互換性のために残しています(amdpreproc: device、tensor-width、tensor-height、model-info、require-zero-copy、output-memory。amdmigraphx: model、model-info、device、confidence-threshold、nms-threshold、require-zero-copy)。新しいGPUタスクのパイプラインでは
amddetect を使ってください。タスク要素の前に amdpreproc を置かないでください。
同梱の DL Streamer 要素¶
third_party/dlstreamer からビルドします(AMDVA_BUILD_GVA_COMPAT)。プロパティは DL Streamer v2026.2.0 のものです。
| 要素 | このフレームワークでの用途 |
|---|---|
gvatrack |
tracking-type=short-term-imageless または zero-term-imageless。CPU のみで動作し、画像をマップしません |
gvametaconvert |
GstAnalytics を DL Streamer の JSON に変換します(format=json、json-indent、source、tags) |
gvametapublish |
method=file|mqtt|kafka、file-path、address、topic |
gvastreammux |
output-mode=container で解像度の異なる複数ストリームをバッチ化します。max-queue-size、max-wait-time、sync-mode |
gvastreamdemux |
コンテナーをソースごとの分岐に戻します |
gvametaaggregate |
並列の分岐をまとめ、AMD の GPU ペイロードも統合します |
典型的なパイプライン¶
filesrc ! h264parse ! vah264dec ! video/x-raw(memory:VAMemory),format=NV12 !
amddetect model=m.mxr model-info=m.json !
gvatrack tracking-type=short-term-imageless !
amdpython module=cb.py ! amdmetapublish method=mqtt address=tcp://broker:1883 !
amdwatermark ! amdencode ! h264parse ! mp4mux ! filesink location=out.mp4