付録:reComputer 上の AI NVR

なぜこの付録があるのか

全 10 セクションからなる本コースは、1 つの学習の背骨に沿って進みます。基礎、手法、タスク、訓練、デプロイ、Jetson システムの概念、そしてフロンティアの展望です。この付録は、そのすべてを終えた後に位置するキャップストーン(総仕上げ)プロジェクトであり、エンドツーエンドで構築できる完全なエッジビジョンアプリケーションです。

プロジェクトは AI NVR(AI Network Video Recorder)です。従来の NVR は映像を録画するだけですが、AI NVR はそこにリアルタイム解析を付け加えます。ライブストリーム内の物体を検出・追跡し、イベントをトリガーし、オペレーターが検索・確認できる録画を残します。

AI NVR の概要

このウォークスルーは、Seeed の wiki チュートリアル AI NVR with reServer Jetson に基づいています。wiki は JetPack 6.0 と reServer Industrial J4012 で作成・検証されました。本コースで使う新しい JetPack 6.2.x ベースラインを使用する場合も、ワークフローは同じですが、サービスのバージョンやコンテナイメージは異なる可能性があります。

構築するもの

この付録を終えるころには、次の条件を満たすローカルで動作する AI NVR が手に入ります。

  • Web UI から 1 台以上の IP カメラをオンボーディングできる
  • すべてのストリームに対して DeepStream による検出とトラッキングを実行する
  • ライブ映像に検出結果をオーバーレイ表示する
  • 設定可能なストレージで映像を録画する
  • ブラウザのビデオウォールにすべてを表示する

検出結果を表示したビデオウォール

前提条件

  • Jetson Orin デバイス。wiki では reServer Industrial J4012(Orin NX 16GB)を使用していますが、任意の Jetson Orin モジュールで構いません。
  • デバイスに JetPack 6.x が書き込まれていること。reServer の場合は reServer Industrial Getting Started に従ってください。

reServer への JetPack の書き込み

  • 同じネットワーク上に 1 台以上の IP カメラがあること(RTSP でアクセス可能)。まだカメラを持っていない場合は、まず 4.9 セクションの sim_rtsp_stream.py でストリームを模擬できます。
  • PC から Jetson デバイスへのネットワークアクセスと、ブラウザ。

アーキテクチャの概要

このプロジェクトはゼロから書き起こすのではなく、Jetson Platform Services(JPS)のマイクロサービスを組み合わせて構成されています。

  • VST(Video Storage Toolkit)— カメラのオンボーディング、録画、ストレージ管理、Web UI
  • DeepStream 認識 — 物体検出(PeopleNet)と複数物体トラッキング
  • Redis — イベント用メタデータの保存
  • Ingress(nginx)— ブラウザからのトラフィックを適切なサービスへ振り分け

各パーツは、本コースの以前のセクションに対応しています。

コンポーネント関連するコースセクション
映像入力としてのカメラストリーム4.2 コンピュータが画像を表現する方法
ビジョンタスクとしての検出とトラッキング4.5 ディープラーニングのコンピュータビジョンタスク
事前訓練済み検出モデル4.6 独自のビジョンモデルを訓練・デプロイする
ターゲットモジュール向け TensorRT エンジン4.7 モデルエクスポートとエッジデプロイ
GStreamer/DeepStream パイプライングラフ4.8 リアルタイムビジョンパイプラインフレームワーク
DeepStream と Jetson サービス4.9 DeepStream と Jetson

ステップ 1. Jetson Platform Services のインストール

Jetson デバイスをネットワーク、マウス、キーボード、モニターに接続し(または SSH でアクセスし)、JPS パッケージをインストールします。

bash
sudo apt update
sudo apt install nvidia-jetson-services

インストール後、マイクロサービスは /opt/nvidia/jetson/services/ 配下に配置されます。

JPS サービスディレクトリ

ステップ 2. AI NVR UI のための Ingress ルーティングを追加

ingress が AI NVR の Web フロントエンドをルーティングできるように、次の内容でファイル /opt/nvidia/jetson/services/ingress/config/ai-nvr-nginx.conf を作成します。

nginx
location /emdx/ {
  rewrite ^/emdx/?(.*)$ /$1 break;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  access_log /var/log/nginx/access.log timed_combined;
  proxy_pass http://emdx_api;
}

location /ws-emdx/ {
  rewrite ^/ws-emdx/?(.*)$ /$1 break;
  proxy_set_header Host $host;
  proxy_pass http://emdx_websocket;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
}

ステップ 3. 録画の保存先を選択(任意)

デフォルトでは、VST は録画を自身のディレクトリ配下に保存します。別の場所に保存したい場合は、/opt/nvidia/jetson/services/vst/config/vst_storage.json を編集します。

json
{
    "data_path": "/home/seeed/VST/storage/data/",
    "video_path": "/home/seeed/VST/storage/video/",
    "total_video_storage_size_MB": 10000
}

パスとストレージの割り当て量は、ディスク構成に合わせて調整してください。

ステップ 4. コアサービスの起動

VST は他のサービスに依存しているため、まとめて起動します。

bash
sudo systemctl start jetson-redis
sudo systemctl start jetson-ingress
sudo systemctl start jetson-vst

これらの unit を起動すると、対応する Docker コンテナが立ち上がります。

実行中の JPS コンテナ

ローカルネットワーク上のブラウザで http://<ip-of-jetson>:81/ を開き、VST の Web UI が起動していることを確認します。

VST Web UI

ステップ 5. AI NVR リファレンスワークフローの入手

NVIDIA は AI NVR リファレンスワークフローを NGC で公開しています。JPS リファレンスワークフローのダウンロードページを開き、Download を選んでからブラウザによる直接ダウンロードを選択します。

NGC ダウンロードページ

次に、Jetson デバイス上で展開します。

bash
cd <path-of-download>
unzip files.zip
cd files
tar -xvf ai_nvr-1.1.0.tar.gz
cd ai_nvr

ステップ 6. DeepStream 出力の設定

推論結果をリアルタイムに確認するには、DeepStream パイプラインが RTSP ストリームを出力する必要があります。<path-of-ai_nvr>/config/deepstream/pn26/service-maker/ で、自分のモジュールに合った設定ファイルを編集します。Orin NX 16GB の場合は ds-config-0_nx16.yaml です。パイプラインがポート 8555 の RTSP シンクで終わっていることを確認してください。設定の全文は wiki チュートリアルに含まれています。

また、自分のモジュールに合った compose ファイル(Orin NX 16GB の場合は compose_nx16.yaml)を編集し、SDR サービスの下に次の行を追加して、DeepStream コンテナがカメラとして認識されないようにします。

yaml
WDM_WL_NAME_IGNORE_REGEX: ".*deepstream.*"

ステップ 7. AI NVR アプリケーションの起動

自分のモジュールに合った compose ファイルを選び、スタックを起動します。

bash
cd <path-of-download>/files/ai_nvr

# Orin AGX:
# sudo docker compose -f compose_agx.yaml up -d --force-recreate

# Orin NX 16GB:
sudo docker compose -f compose_nx16.yaml up -d --force-recreate

# Orin NX 8GB:
# sudo docker compose -f compose_nx8.yaml up -d --force-recreate

# Orin Nano:
# sudo docker compose -f compose_nano.yaml up -d --force-recreate

アプリケーションは、DeepStream を含む残りのコンテナを作成します。

AI NVR コンテナ

ステップ 8. カメラの追加とビデオウォールを開く

ブラウザで http://<ip-of-jetson>:30080/vst/ を開き、IP カメラを追加します。カメラの RTSP アドレスを使って、Sensor ManagementAdd device manuallySubmit の順に進みます。

センサー管理

次に、DeepStream の出力ストリームを 2 つ目のソースとして追加します。たとえば rtsp://<ip-of-jetson>:8555/ds-test です。ここでは wiki の 2 つの詳細が重要です。

  • ストリームアドレスは DeepStream の設定に依存します。
  • DeepStream ソースのカメラ名には deepstream という単語を含める必要があります。そうでないとオーバーレイが適用されません。

最後に、Video Wall に移動してすべてのソースを選択し、Start を押します。検出オーバーレイ付きの解析済みストリームと、元のカメラ映像が並んで表示されるはずです。

プロジェクトの停止

まず AI NVR アプリケーションを停止してから、プラットフォームサービスを停止します。

bash
cd <path-of-download>/files/ai_nvr
sudo docker compose -f compose_nx16.yaml down --remove-orphans

sudo systemctl stop jetson-redis
sudo systemctl stop jetson-ingress
sudo systemctl stop jetson-vst

より軽量な代替案:パイプラインを自分で作る

既製のサービスを組み合わせるのではなく、すべてのコンポーネントを理解したい場合は、4.9 セクションに同じアイデアの小さな DIY 版があります。deepstream-app が駆動する DeepStream パイプラインに、模擬 RTSP ストリーム(sim_rtsp_stream.py)を入力し、メッセージブローカーを経由するイベントメタデータのパスを備えたものです。スクリプトはコースリポジトリの 4-Computer-Vision/4.9-DeepStream-and-Jetson/code/ai-nvr にあります。完全なリファレンスワークフローを一度に扱うのは大変だと感じる場合の、良い中間ステップです。

さらに先へ

  • 検出モデルを独自のクラス向けに入れ替えたり再訓練したりして、標準の PeopleNet モデルと精度・スループットを比較する。
  • メタデータの上にイベントロジックを追加する。ライン横断、領域侵入、滞在時間アラートなど。
  • Seeed の Industrial Vision Monitoring デモのように、パイプラインと VLM を組み合わせてシーンレベルのアラートを実現する。
  • Frigate on Jetson などのオープンソースの代替手段を試し、そのアーキテクチャを JPS ベースのものと比較する。

振り返りの質問

  1. このプロジェクトのうち、モデルの品質に依存する部分はどこで、システムの設計に依存する部分はどこですか?
  2. 実際のデプロイで最初に破綻するのはどれでしょうか。モデル、ストリーム、ストレージ、それともオペレーターのワークフロー?
  3. マイクロサービスアーキテクチャはここで何をもたらし、何をコストとして要求していますか?
  4. この構成を、複数の Jetson デバイスを使った本番パイロットへどのように拡張しますか?

まとめ

この付録は、コースのデプロイ編を 1 つの具体的なシステムにまとめます。カメラを入力とし、中間で DeepStream が解析を行い、録画、イベント、ビデオウォールを出力として生み出します。取り組むことで、4.2 から 4.9 までのコンセプトが実際のエッジアプリケーションの中でどう組み合わさるかが見えてきます。

参考文献