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

- 同じネットワーク上に 1 台以上の IP カメラがあること(RTSP でアクセス可能)。まだカメラを持っていない場合は、まず 4.9 セクションの
sim_rtsp_stream.pyでストリームを模擬できます。 - PC から Jetson デバイスへのネットワークアクセスと、ブラウザ。
アーキテクチャの概要
このプロジェクトはゼロから書き起こすのではなく、Jetson Platform Services(JPS)のマイクロサービスを組み合わせて構成されています。
VST(Video Storage Toolkit)— カメラのオンボーディング、録画、ストレージ管理、Web UIDeepStream認識 — 物体検出(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 パッケージをインストールします。
sudo apt update
sudo apt install nvidia-jetson-servicesインストール後、マイクロサービスは /opt/nvidia/jetson/services/ 配下に配置されます。

ステップ 2. AI NVR UI のための Ingress ルーティングを追加
ingress が AI NVR の Web フロントエンドをルーティングできるように、次の内容でファイル /opt/nvidia/jetson/services/ingress/config/ai-nvr-nginx.conf を作成します。
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 を編集します。
{
"data_path": "/home/seeed/VST/storage/data/",
"video_path": "/home/seeed/VST/storage/video/",
"total_video_storage_size_MB": 10000
}パスとストレージの割り当て量は、ディスク構成に合わせて調整してください。
ステップ 4. コアサービスの起動
VST は他のサービスに依存しているため、まとめて起動します。
sudo systemctl start jetson-redis
sudo systemctl start jetson-ingress
sudo systemctl start jetson-vstこれらの unit を起動すると、対応する Docker コンテナが立ち上がります。

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

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

次に、Jetson デバイス上で展開します。
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 コンテナがカメラとして認識されないようにします。
WDM_WL_NAME_IGNORE_REGEX: ".*deepstream.*"ステップ 7. AI NVR アプリケーションの起動
自分のモジュールに合った compose ファイルを選び、スタックを起動します。
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 を含む残りのコンテナを作成します。

ステップ 8. カメラの追加とビデオウォールを開く
ブラウザで http://<ip-of-jetson>:30080/vst/ を開き、IP カメラを追加します。カメラの RTSP アドレスを使って、Sensor Management → Add device manually → Submit の順に進みます。

次に、DeepStream の出力ストリームを 2 つ目のソースとして追加します。たとえば rtsp://<ip-of-jetson>:8555/ds-test です。ここでは wiki の 2 つの詳細が重要です。
- ストリームアドレスは DeepStream の設定に依存します。
- DeepStream ソースのカメラ名には
deepstreamという単語を含める必要があります。そうでないとオーバーレイが適用されません。
最後に、Video Wall に移動してすべてのソースを選択し、Start を押します。検出オーバーレイ付きの解析済みストリームと、元のカメラ映像が並んで表示されるはずです。
プロジェクトの停止
まず AI NVR アプリケーションを停止してから、プラットフォームサービスを停止します。
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 ベースのものと比較する。
振り返りの質問
- このプロジェクトのうち、モデルの品質に依存する部分はどこで、システムの設計に依存する部分はどこですか?
- 実際のデプロイで最初に破綻するのはどれでしょうか。モデル、ストリーム、ストレージ、それともオペレーターのワークフロー?
- マイクロサービスアーキテクチャはここで何をもたらし、何をコストとして要求していますか?
- この構成を、複数の Jetson デバイスを使った本番パイロットへどのように拡張しますか?
まとめ
この付録は、コースのデプロイ編を 1 つの具体的なシステムにまとめます。カメラを入力とし、中間で DeepStream が解析を行い、録画、イベント、ビデオウォールを出力として生み出します。取り組むことで、4.2 から 4.9 までのコンセプトが実際のエッジアプリケーションの中でどう組み合わさるかが見えてきます。