コンテンツにスキップ

NVIDIA DeepStream からの移行

DeepStream もこのフレームワークも、メタデータモデルを備えた GStreamer パイプラインです。主な違いは次のとおりです。推論は TensorRT ではなく MIGraphX を通して AMD GPU 上で実行します。フレームは NVMM ではなく VA サーフェス(memory:VAMemory)に置きます。モデルごとの設定は config_infer_*.txt ではなく小さな JSON ファイル(model-info)に記述します。

要素の対応表

DeepStream このフレームワーク 備考
nvv4l2decoder vah264dec / vah265dec / vaav1dec 出力は video/x-raw(memory:VAMemory),format=NV12
nvstreammux gvastreammux output-mode=container、または model-instance-id を共有する独立した分岐 コンテナーモードでは各ソースの解像度を保持します。共通のバッチサイズに合わせる width/height の拡大縮小はありません。
nvinfer(プライマリ) amddetect / amdinference
nvinfer(セカンダリ、process-mode=2) amdclassify inference-region=roi-list で、上流の検出器が出力したボックス(最大 300 個)を分類します
nvtracker gvatrack tracking-type=short-term-imageless NvDCF、IOU、DeepSORT の低レベルライブラリは利用できません。画像を使わない IOU/Kalman トラッカーのみです。
nvdsosd amdwatermark ボックス、ラベル、トラック ID、マスク、COCO-17 の骨格を GPU で描画します
nvvideoconvert 不要。形式や拡大縮小を明示する場合は vapostproc amd* 要素は NV12 の VAMemory を直接受け取ります
nvmsgconv + nvmsgbroker amdmetapublish(MQTT、Kafka、ファイル) JSON スキーマが異なります。メタデータを参照してください。AMQP、Azure IoT、Redis は提供していません。
nvdsanalytics(ROI、ライン通過、方向) 提供していません amdpython またはプローブで、メタデータを使って実装してください。
nvdspreprocess 推論要素に内蔵 VA video processor での切り出し/拡大縮小と HIP での正規化
nvv4l2h264enc / nvv4l2h265enc amdencode エンコードと配信を参照してください
nvstreamdemux gvastreamdemux
nvdsmetamux、nvof、nvdspostprocess 提供していません

nvinfer の設定

config_infer_*.txt / プロパティ このフレームワーク
onnx-file、model-engine-file model = amdva-compile-model model.onnx model.mxr で生成した .mxr。TensorRT エンジンはインポートできません。
net-scale-factor、offsets model-info の input.scale、input.mean(offset * scale)
model-color-format input.channel_order
maintain-aspect-ratio、symmetric-padding input.letterbox(letterbox は対称パディングを行います)
infer-dims input.shape
num-detected-classes、labelfile-path output.num_classes、labels
network-type(0 検出器、1 分類器、2 セグメンテーション) task_type と要素の選択
batch-size 要素の batch-size = コンパイル時のバッチ(--batch)
interval(スキップするフレーム数) inference-interval(N フレームごとに推論): interval=2 は inference-interval=3 になります
gie-unique-id、operate-on-gie-id パイプライン上の順序。model-instance-id は実行器を共有するだけです
operate-on-class-ids、filter-out-class-ids 利用できません。コールバックで絞り込んでください
pre-cluster-threshold、nms-iou-threshold、cluster-mode confidence-threshold、nms-threshold(NMS のみ)
parse-bbox-func-name、custom-lib-path 利用できません。アダプターは yolov8、yolov8-seg、yolov8-pose、分類、セマンティックセグメンテーション、生のテンソルです
network-mode(FP32/FP16/INT8) amdva-compile-model --precision=fp16|fp32。INT8 には対応していません
output-tensor-meta task_type=raw で、出力テンソルを AmdAnalysisMeta に入れたまま GPU 上に保持します
tensor-meta-pool-size、workspace-size なし

DeepStream の例:

gst-launch-1.0 uridecodebin uri=file:///in.mp4 ! m.sink_0 \
  nvstreammux name=m batch-size=1 width=1920 height=1080 ! \
  nvinfer config-file-path=config_infer_primary.txt ! \
  nvtracker ll-lib-file=libnvds_nvmultiobjecttracker.so ll-config-file=tracker.yml ! \
  nvvideoconvert ! nvdsosd ! nvvideoconvert ! nvv4l2h264enc ! h264parse ! mp4mux ! filesink location=out.mp4

このフレームワーク:

gst-launch-1.0 -e filesrc location=in.h264 ! h264parse ! vah264dec ! \
  'video/x-raw(memory:VAMemory),format=NV12' ! \
  amddetect model=model.mxr model-info=model-info.json batch-size=1 ! \
  gvatrack tracking-type=short-term-imageless ! \
  amdwatermark ! amdencode bitrate=6000 ! h264parse ! mp4mux ! filesink location=out.mp4

途中でデータが GPU の外に出ることがないため、nvvideoconvert はありません。

バッチ処理と複数ストリーム

DeepStream では、すべてのソースを nvstreammux に入れてバッチ化します。このフレームワークでは、各分岐に、同じ model-instance-id、同じモデル、同じ batch-size を設定した推論要素を置きます。共有の実行器は、batch-timeout(既定値 20 ms)ごとに全分岐から 1 つのバッチを組み立てます。1 つのバッチにはソースごとに 1 リクエストを入れ、不完全なバッチは GPU 上でパディングします。解像度の異なるソースには gvastreammux output-mode=container ! amddetect ! gvastreamdemux を使い、demux の各分岐にそれぞれ queue を置いてください。examples/pipelines/multistream-encode.sh を参照してください。

batched-push-timeout と live-source に直接対応するプロパティはありません。ライブの RTSP ソースでは、mux に max-fps を設定しないでください。

メタデータ

DeepStream このフレームワーク
NvDsBatchMeta、NvDsFrameMeta 1 フレームにつき 1 バッファー。フレーム識別情報(ソース、世代、シーケンス、PTS)は AmdAnalysisMeta に含まれます
NvDsObjectMeta(rect_params、confidence、class_id、object_id) GstAnalyticsTrackingMtd と関連付けた GstAnalyticsODMtd(ボックス、スコア、ラベルの quark)
分類器のメタ 親オブジェクトと関連付けた GstAnalyticsClsMtd
マスク / セグメンテーションのメタ AmdAnalysisMeta 内の GPU テンソル
NvDsUserMeta のテンソル出力 task_type=raw。テンソルは GPU 上に保持します
pyds のプローブ amdpython(frame_dict、読み取り専用のメタデータ)または C++ のパッドプローブ
pyds.get_nvds_buf_surface(画素へのアクセス) 設計上利用できません。C++ の GPU API を使ってください

メモリ

DeepStream このフレームワーク
video/x-raw(memory:NVMM) video/x-raw(memory:VAMemory)(デコーダー、推論、エンコーダー)
nvbuf-memory-type なし
CUDA ユニファイドメモリ モデル実行器が所有する HIP デバイスバッファー。VA サーフェスは DMA-BUF 経由で HIP にインポートします

AMD の推論要素は NV12 の VAMemory(またはそれを格納した gvastreammux のコンテナー)だけを受け付け、既定値は require-zero-copy=true です。そのため、システムメモリ上のフレームを黙ってコピーする代わりに、caps ネゴシエーションが失敗します。

提供していない機能

INT8 キャリブレーション、TensorRT エンジンのインポート、nvinferserver/Triton、NvDCF と DeepSORT のトラッカー、ReID によるトラッカー機能、nvdsanalytics、独自のバウンディングボックスパーサー、音声、Smart Record。人物の ReID と意味検索は NVR サンプルにあり、フレームワークの要素としては提供していません。