メインコンテンツまでスキップ

Jetson 上の Streaming Vision Agent

はじめに

多くの Jetson 向けビジョンデモは、単一フレーム検出(各フレームが独立)か、短いオフラインクリップの理解(数秒の録画動画に対して一度だけ VLM を実行)で止まっています。どちらも連続するライブストリーム全体で状態を保持しないため、物体が視野から外れたあとやクリップが終わったあとには、証拠付きで「さっき何が起きたのか?」と尋ねることは通常できません。Streaming Vision Agent は、エッジ側で短いオンラインロールリングマルチモーダルメモリ(視覚埋め込み、エピソードイベント、セマンティックな事実)を保持し、カメラが動作し続けている間に、証拠となるフレームやクリップとともに質問に回答します。

この Wiki では Seeed の Jetson デバイス上(reComputer Mini J5012 · JetPack 7.2 で検証)にリアルタイムデモをデプロイします。USB カメラがブラウザ UI に映像を供給し、2 つの独立した Qwen3-VL-2B インスタンスが認識と Ask を担当することで、回答処理がバックグラウンドのメモリ書き込みをブロックしないようにしています。

ヒント

この設計は、WorldMM(CVPR 2026)のマルチモーダルメモリのアイデアに着想を得ています。このデモは Jetson 上のオンラインロールリングウィンドウを対象としており、論文のオフライン EgoLife ベンチマークを再現するものではありません。Inspiration & acknowledgments を参照してください。

JetPack 7.2(L4T R39.2.0)を搭載した reComputer Mini(Jetson AGX Orin 64GB) で検証済みです。

概要

レイヤー役割
ビジュアルメモリVLM2Vec フレーム埋め込み + JPEG 証拠(約 5 秒ごと)
エピソードメモリQwen3-VL-2B #1 — 出現 / 移動 / 消失イベント(約 45 秒ごと)
セマンティックな事実エンティティ状態(is_at / absent_from / usually_at)+ タイムライン
Askメモリを検索 → Qwen3-VL-2B #2 が軌跡 + 証拠付きで回答

ライブ映像、ロールリングメモリ、Ask のために http://<jetson-ip>:8790 を開きます。

Camera ──► visual @ ~5s (VLM2Vec)
└──► episodic @ ~45s (Qwen3-VL-2B recognition)
Ask ──► retrieve memory ──► Qwen3-VL-2B answer

対応ハードウェア

項目構成
デバイスreComputer J501 Mini
検証済みreComputer J501 Mini · JetPack 7.2(L4T 39.2.0)
RAM / ディスクRAM 64 GB 推奨 · モデル + venv 用に空きディスク容量 50 GB 以上
カメラUSB UVC / V4L2(/dev/video0

インストール

1. リポジトリをクローンする

git clone https://github.com/xbs0325/Streaming-Vision-Agent-Orin.git
cd Streaming-Vision-Agent-Orin

2. Jetson 用 Python 環境を作成する

bash script/jetson_setup.sh

デフォルトの venv パス: ~/leucus/.venv-worldmmWORLDMM_VENV で上書き可能)。

有効化して環境変数を設定します:

source "${WORLDMM_VENV:-$HOME/leucus/.venv-worldmm}/bin/activate"
export PYTHONPATH="$PWD/src:$PWD:$PYTHONPATH"
export WORLDMM_ATTN_IMPL=sdpa
export WORLDMM_QWEN_DEVICE_MAP=cuda:0
export WORLDMM_DTYPE=bfloat16
export WORLDMM_MODELS="${WORLDMM_MODELS:-$HOME/leucus/models/worldmm}"
export HF_HOME="$WORLDMM_MODELS/hf_home"
unset HF_ENDPOINT
注意

このスタックでは HF_ENDPOINT=https://hf-mirror.com設定しないでくださいhuggingface_hub のダウンロードが失敗する可能性があります。

3. モデルをダウンロードする

bash script/jetson_download_models.sh
モデルデフォルトの dual-2B ライブに必須か
Qwen3-VL-2B-Instructはい(認識 + Ask 用に2 回ロード)
Qwen3-Embedding-4Bはい
Qwen2-VL-2B-Instruct + VLM2Vec-V2.0はい(ビジュアルメモリ)
Qwen3-VL-8B-Instructオプション(WORLDMM_DOWNLOAD_8B=1 または --episodic-model 8b

Qwen の重みは ModelScope 経由で、VLM2Vec は Hugging Face(huggingface.co)経由でダウンロードされます。初回ダウンロードにはネットワーク状況に応じて時間がかかる場合があります。

ライブデモを実行する

USB カメラを接続し、次を実行します:

bash run.sh
# or:
python script/orin_live.py --ui-port 8790 --window-min 8 \
--visual-interval 5 --episodic-interval 45

ブラウザで開きます:

http://<jetson-ip>:8790/

デフォルトのランタイムは dual 2B(個別のモデルインスタンス、ロック、CUDA ストリーム)です。オプションフラグ:

フラグ意味
--episodic-model 8bQwen3-VL-8B によるより強力な認識
--shared-2b1 つの 2B を両方の役割で共有(VRAM 削減; Ask が認識待ちになる)
--window-min 10より長いロールリングメモリウィンドウ

スモークテスト(任意)

短時間のキャプチャ + パイプラインチェック:

python script/orin_smoke.py --vlm qwen3vl-2b --seconds 20 \
--vlm2vec-base "$WORLDMM_MODELS/Qwen2-VL-2B-Instruct"

デモ結果

Seeed のファイル CDN 上の短いクリップで、ロールリングメモリとライブ UI における Ask の回答の様子を示します。

注記

一部の Ask ターン(上のクリップと証拠サムネイルを参照)では、テキスト回答がある物体の名前を挙げている一方で、取得された証拠 JPEG / クリップにはロールリングウィンドウ内のより前の時点別の物体が映っている場合があります。これは、短い dual-2B メモリデモでは想定される挙動です。検索が完全な同一性一致ではなく、最も近い視覚的証拠を紐付けることがあるためです。よりクリーンな結果を得るには、画面中央に 1 つの物体だけが映るようなインタラクションを推奨します。

想定される表示

シーン期待される動作
安定した机上ビューライブフレーム + ステータスピル; エピソード / ビジュアルのカウンタが時間とともに増加
中央の視野に物体(例: イヤホンケース)を置く / 取り除く確認後にエピソードイベントが発生; Ask で「さっき置かれたものは何?」と質問可能
「What was just put down?」と尋ねる回答がタイムライン / 事実を引用し、必要に応じて JPEG またはクリップの証拠を提示

認識はセンターバイアスのトリガーと FULL + CENTER クロップパネルを使用し、画像端の手やマウスによるノイズを減らしています。

このデモで使用しているモデル

役割デフォルトモデル
エピソード認識Qwen3-VL-2B-Instruct(インスタンス #1)
Ask / 回答Qwen3-VL-2B-Instruct(インスタンス #2)
テキスト埋め込みQwen3-Embedding-4B
ビジュアル埋め込みQwen2-VL-2B-Instruct + VLM2Vec-V2.0 LoRA

トラブルシューティング

問題対処
/dev/video0 を開けないls /dev/video* を確認; --device /dev/video1 を試す
huggingface_hub FileMetadataErrorunset HF_ENDPOINT; hf-mirror の使用を避ける
Hub / transformers の競合huggingface_hub>=0.34,<1 を維持(jetson_setup.sh で固定)
OOM / 非常に遅い他の重い GPU デモを同時に実行しない; --shared-2b や、より長い --episodic-interval を試す
Ask がブロックされているように感じる--shared-2b使用していないことを確認; デフォルトの dual-2B では別ストリームで回答されるはずです
ポートが使用中fuser -k 8790/tcp を実行してから再起動

リソース

インスピレーションと謝辞

このエッジデモは、長時間動画推論のための動的マルチモーダルメモリアジェントである WorldMM(CVPR 2026 Highlight)に着想を得ています。3 種類のメモリ(ビジュアル / エピソード / セマンティック)のアイデアを、Jetson 上のリアルタイムロールリングウィンドウに適用しています。

@inproceedings{yeo2026worldmm,
title = {WorldMM: Dynamic Multimodal Memory Agent for Long Video Reasoning},
author = {Yeo, Woongyeong and Kim, Kangsan and Yoon, Jaehong and Hwang, Sung Ju},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
month = {June},
year = {2026},
pages = {25599-25609}
}

また、HippoRAGVLM2Vec、および上流の WorldMM 実装(Apache-2.0)にも感謝します。

技術サポートと製品ディスカッション

弊社製品をお選びいただきありがとうございます。製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートをご用意しています。お好みやニーズに応じて選べる複数のコミュニケーションチャネルを提供しています。

Loading Comments...