适合人群:玩 Jetson / VLM / 多模态 Agent、想做“实时视频问答”的开发者与研究生
阅读收益:搞清「单帧检测 vs 离线短视频理解 vs 在线滚动记忆」的差别,并拿到可跑的双 2B 部署路径
硬件验证:reComputer Mini(Jetson AGX Orin 64GB)· JetPack 7.2
完整 Wiki:https://wiki.seeedstudio.com/streaming_vision_agent_on_jetson/
开源仓库:https://github.com/xbs0325/Streaming-Vision-Agent-Orin
灵感来源:WorldMM(CVPR 2026 Highlight)多模态记忆思路 —— 本 demo 是边缘侧在线滚动窗口适配,并非论文离线 EgoLife 复现
痛点先说清楚:大多数 Jetson 视觉 Demo 其实“没有记忆”
市面上常见两类演示:
单帧检测:每一帧彼此独立,物体离开画面,历史就没了
离线短片段理解:录几秒视频,丢给 VLM 跑一遍 —— 片段结束,对话也断了
两边都很难回答这种问题:
“刚才桌上放下去的是什么?” “那个东西是什么时候消失的?” “一分钟前画面里发生了什么?”
因为系统没有跨时间的在线状态。
Streaming Vision Agent要做的事是:在边缘设备上维护一段在线滚动的多模态记忆(视觉嵌入、情节事件、语义事实),摄像头还在跑的时候,你就能带着证据帧 / 片段去 Ask。
设计灵感来自 WorldMM(CVPR 2026)的动态多模态记忆思路;本文对应的是 Seeed Jetson 上的实时滚动窗口 demo,不是论文 benchmark 复刻。
架构一览:记忆在写,问答不堵
| 层 | 作用 |
|---|---|
| Visual memory | VLM2Vec 帧嵌入 + JPEG 证据(约每 5 秒) |
| Episodic memory | Qwen3-VL-2B#1:出现 / 移动 / 消失等事件(约每 45 秒) |
| Semantic facts | 实体状态(is_at/absent_from/usually_at)+ 时间线 |
| Ask | 检索记忆 → Qwen3-VL-2B#2结合轨迹与证据作答 |
数据流可以记成:
Camera ──► visual @ ~5s (VLM2Vec) └──► episodic @ ~45s (Qwen3-VL-2B recognition) Ask ──► retrieve memory ──► Qwen3-VL-2B answer
浏览器打开:
http://<jetson-ip>:8790/
就能看到:实时画面、滚动记忆状态、Ask 交互。
为什么要加载两个 Qwen3-VL-2B?一个负责后台识别写记忆,一个负责前台问答。双实例 + 独立锁 / CUDA stream,避免 Ask 被 recognition 堵住。显存紧可以用--shared-2b共用一个 2B(Ask 会等 recognition)。
硬件与资源门槛(先看再下模型)
| 项目 | 配置 |
|---|---|
| 设备 | reComputer J501 Mini |
| 已验证 | J501 Mini ·JetPack 7.2(L4T 39.2.0) |
| 内存 / 磁盘 | 建议 64 GB RAM· ≥50 GB 可用磁盘(模型 + venv) |
| 摄像头 | USB UVC / V4L2(/dev/video0) |
这套默认是双 2B 实时链路,资源胃口不小;Orin 64GB 级别会舒服很多。
部署步骤(按顺序来)
1. 克隆仓库
git clone https://github.com/xbs0325/Streaming-Vision-Agent-Orin.git cd Streaming-Vision-Agent-Orin2. 创建 Jetson Python 环境
bash script/jetson_setup.sh默认 venv:~/leucus/.venv-worldmm(可用环境变量WORLDMM_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_ENDPOINT3. 下载模型
bash script/jetson_download_models.sh| 模型 | 默认双 2B 直播是否必需 |
|---|---|
| Qwen3-VL-2B-Instruct | 是(加载两次:recognition + Ask) |
| 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。首次下载视网络而定,建议提前留足磁盘和时间。
启动实时 Demo
接好 USB 摄像头后:
bash run.sh # 或: python script/orin_live.py --ui-port 8790 --window-min 8 \ --visual-interval 5 --episodic-interval 45浏览器访问:
http://<jetson-ip>:8790/
默认就是dual 2B。常用可选参数:
| 参数 | 含义 |
|---|---|
--episodic-model 8b | 用 Qwen3-VL-8B 加强识别 |
--shared-2b | 单 2B 兼任两角(省显存;Ask 会等 recognition) |
--window-min 10 | 拉长滚动记忆窗口 |
可选冒烟测试:
python script/orin_smoke.py --vlm qwen3vl-2b --seconds 20 \ --vlm2vec-base "$WORLDMM_MODELS/Qwen2-VL-2B-Instruct"演示效果:你应该观察到什么
Wiki 上提供了三段 CDN 演示视频(建议直接点开看滚动记忆 + Ask):
https://files.seeedstudio.com/wiki/Jetson_AGX_Orin/streaming_vision_agent_demo_01.mp4
https://files.seeedstudio.com/wiki/Jetson_AGX_Orin/streaming_vision_agent_demo_02.mp4
https://files.seeedstudio.com/wiki/Jetson_AGX_Orin/streaming_vision_agent_demo_03.mp4
场景预期:
| 场景 | 预期行为 |
|---|---|
| 稳定视角 | 实时帧 + 状态 pill;episodic / visual 计数随时间增加 |
| 在画面中心放置/拿走物体(或其他操作) | 确认后出现 episodic 事件;可问 “刚才放下了什么?” |
| Ask:“What was just put down?” | 回答引用时间线 / 事实,并可附带证据 JPEG 或片段 |
识别侧用了中心偏置触发,以及 FULL + CENTER crop,减轻边缘手部 / 鼠标干扰。
使用心态:短窗口双 2B demo 里,个别 Ask 回合可能出现「文字说的是 A,检索到的证据图是稍早的 B」——检索会贴最近视觉证据,不一定是完美身份对齐。交互时尽量居中、一次一个物体,结果会干净很多。
本 Demo 默认模型一览
| 角色 | 默认模型 |
|---|---|
| Episodic recognition | Qwen3-VL-2B-Instruct(实例 #1) |
| Ask / answer | 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_hubFileMetadataError | unset 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 应走独立 stream |
| 端口占用 | fuser -k 8790/tcp后重开 |
项目地址:GitHub - xbs0325/Streaming-Vision-Agent-Orin: Streaming Vision Agent for Jetson AGX Orin (JP7). Dual Qwen3-VL-2B rolling memory. Inspired by WorldMM. · GitHub
边缘侧 VLM 正从「跑通一张图」走向「跑通一段时间」。Streaming Vision Agent 把视觉 / 情节 / 语义三层记忆压进 Jetson 的滚动窗口,并拆成双 2B 避免问答与写记忆互抢——这比再贴一张 YOLO 框,更接近「能对话的现场视觉 Agent」。
如果你已经在 Orin 上跑过 Qwen-VL,下一步不妨试试:让模型记住过去几十秒,而不是只看当前帧。
评论区欢迎聊聊:你更想用它做桌面助手、产线追溯,还是安防回放提问?
致谢(论文引用)
本边缘 demo 灵感来自WorldMM— Dynamic Multimodal Memory Agent for Long Video Reasoning(CVPR 2026 Highlight),将 visual / episodic / semantic 三层记忆思路适配到 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} }同时感谢 HippoRAG、VLM2Vec 以及上游 WorldMM 实现(Apache-2.0)。