仕組み¶
このフレームワークは、デコードした映像を最後まで GPU のメモリに置いたまま処理します。フレームワークの要素では、CPU が扱うのは圧縮された映像データと、検出結果などの小さなメタデータだけで、画素のコピーや変換は CPU では行いません。アプリケーションが独自の処理のためにコピーを加えることはあり、例えば NVR デモ の人物検索は、切り出した人物の画像を CPU に読み戻します。このページでは、対象のハードウェア、データの流れ、要素の役割、モデル、メタデータ、ライブラリの構成を説明します。
Ryzen AI APU のハードウェア¶
このフレームワークは AMD Ryzen AI APU を対象にしています。APU は、性質の異なる複数の演算部を 1 つのチップにまとめたプロセッサーです。検証に使っている Ryzen AI 9 HX 370 には、次の 5 種類の演算部があります。
| 演算部 | 検証機での構成 | 得意な処理 | このフレームワークでの用途 |
|---|---|---|---|
| CPU | Zen 5 と Zen 5c、12 コア 24 スレッド | 汎用の処理 | ネットワークからの受信、録画ファイルの書き込み、メタデータの処理、アプリケーションの制御 |
| GPU | Radeon 890M(gfx1150) | 大量の並列計算と描画 | HIP による前処理と後処理、MIGraphX による推論、OpenGL ES による画面表示 |
| NPU | XDNA 2 | ニューラルネットワークの推論を少ない電力で行う | NVR デモの人物検索の埋め込み(Embedding)の計算。ONNX Runtime の Vitis AI 実行プロバイダーを通して使います |
| VCN | VCN 4.0.5 | 動画の符号化と復号(エンコードとデコード) | H.264/H.265/AV1 のデコードとエンコード。VA-API を通して使います |
| VPE | VPE 6.1.0 | 映像の縮小と拡大、色空間の変換、切り出し | 推論の入力サイズへの変換、表示用の縮小と色の変換。VA-API の映像処理を通して使います |
VCN(Video Core Next)と VPE(Video Processing Engine)は、映像のための専用回路です。VPE は、デコーダーが出力する NV12 形式の映像を推論や表示に使う BGRA 形式に変換し、同時に必要な大きさに縮小します。同じ処理は GPU のシェーダーでもできますが、VPE に任せると、GPU を推論や描画のために空けておけます。フレームワークは起動時に VPE が実際に動いたことを確かめ(インストール の動作確認を参照)、VPE で処理できない場合に GPU のシェーダーや CPU で代わりに処理することはしません。
メモリの共有とゼロコピー¶
APU では、すべての演算部が同じメインメモリ(DRAM)を共有します。デコードした映像のバッファーは、DMA-BUF という仕組みを使って、VCN、VPE、GPU(HIP、OpenGL ES)の間で同じメモリのまま受け渡せます。このように、データを複製せずに受け渡すことを「ゼロコピー」と呼びます。
一方、演算部の間でデータを複製(コピー)すると、同じ DRAM の中での複製であっても、メモリの帯域と時間を使います。2560×1440 の映像は 1 フレームで約 5.5 MB(NV12)あり、30 fps のカメラ 16 台分をコピーすると毎秒 2.6 GB になります。多数のカメラを扱うときは、このコピーを避けることが性能を保つ鍵になります。
データの流れ¶
flowchart TB
IN[圧縮映像<br>RTSP・ファイル] --> DEC
subgraph GPU[GPU]
DEC[VA デコード<br>NV12] --> PRE[VPE<br>切り出し・縮小] --> NORM[HIP<br>正規化してテンソルへ] --> INF[MIGraphX<br>推論] --> POST[後処理<br>NMS など]
DEC --> DRAW[描画] --> ENC[VA エンコード]
end
POST --> META[メタデータ<br>枠・クラス・ID]
META -.描画の指示.-> DRAW
META --> JSON[JSON・MQTT・Kafka]
ENC --> OUT[圧縮映像<br>MP4・RTSP]
| 段階 | 実行するハードウェア | 内容 |
|---|---|---|
| デコード、エンコード | VCN(VA-API) | H.264/H.265 のデコードと、H.264/H.265/AV1 のエンコード |
| 切り出し、縮小 | VPE(VA の映像処理) | 推論の入力サイズへの変換と、分類用の領域(ROI)の切り出し |
| 正規化 | GPU(HIP) | 画素をモデル入力のテンソル(float32)に変換 |
| 推論、後処理 | GPU(MIGraphX、HIP) | 推論、検出枠の絞り込み(NMS)、マスクやキーポイントの復元 |
| 描画 | GPU(VPE、HIP) | 検出枠、ラベル、ID、マスク、骨格の描画 |
セグメンテーションのマスクや推論の生の出力は、GPU 上のテンソルのまま保持されます。CPU に読み戻すのは、枠の座標やクラスなど上限のある結果だけです。
要素の役割¶
パイプラインは GStreamer の要素をつないで作ります。このフレームワークが提供する要素は次のとおりです。
| 要素 | 役割 |
|---|---|
amddetect |
物体検出、インスタンスセグメンテーション、姿勢推定(YOLOv8 系) |
amdclassify |
検出した物体ごと、またはフレーム全体の分類 |
amdinference |
セマンティックセグメンテーションなど、任意のモデルの推論 |
amdwatermark |
検出結果の描画 |
amdencode |
ハードウェアエンコード |
amdpython |
検出結果を受け取る Python 関数の呼び出し(画素は渡しません) |
amdmetapublish |
検出結果を JSON Lines のファイル、MQTT、Kafka へ送信 |
gvatrack ほか gva* |
Intel DL Streamer から同梱したトラッキング、複数ストリームの束ね、メタデータ変換 |
推論の要素は、入力として GPU 上の NV12(video/x-raw(memory:VAMemory),format=NV12)だけを受け付けます。CPU 上のフレームを黙ってコピーすることはなく、つなぎ方が誤っていれば起動時にエラーになります。
モデル¶
ONNX のモデルを amdva-compile-model でこの GPU 向けにコンパイルし、.mxr ファイルとして使います。前処理と出力の形式は、モデルと並べて置く model-info.json に書きます。
- バッチサイズは 1、2、4、8、16 のいずれかで、コンパイル時に固定します。
- コンパイルするとハッシュと GPU を記録したマニフェストも作られ、別の GPU 向けのモデルは読み込み時に拒否されます。
- 対応する出力形式は、YOLOv8 系の検出・セグメンテーション・姿勢推定、分類、セマンティックセグメンテーション、生のテンソルです。
model-info.json の項目は model-info リファレンス を参照してください。
メタデータ¶
検出結果は GStreamer 標準の GstAnalytics メタデータとしてフレームに付きます。下流の要素や自作のプローブは、DL Streamer と同じ方法で読み取れます。GPU 上のマスクやテンソル、フレームの識別情報は、このフレームワーク独自のメタデータに入ります。
amdmetapublish と amdpython は、同じ形式の JSON(スキーマ 1)を扱います。1 フレームが 1 レコードで、物体ごとにクラス、信頼度、枠、トラッキング ID、分類、キーポイントを持ちます。形式の詳細は メタデータと Python を参照してください。
ライブラリの構成¶
アプリケーションから使う場合は、CMake パッケージ AMDVideoAnalytics のライブラリをリンクします。矢印は、どのライブラリを使っているかを表します。
flowchart BT
runtime[amdva_runtime<br>VA と HIP の連携、前処理]
inference[amdva_inference<br>モデル、バッチ実行]
gst[amdva_gst_support<br>メタデータ、トラッキング、描画、送信]
streaming[amdva_streaming<br>RTSP 受信、録画、カタログ、再生]
media[amdva_media<br>エンコードの補助、RTSP 配信、EGL]
monitor[amdva_monitor<br>CPU・GPU・電力の計測]
inference --> runtime
gst --> inference
streaming --> gst
amdva_media と amdva_monitor は、ほかのライブラリに依存せずに使えます。使い方は SDK でアプリケーションに組み込む で説明します。