Saltar al contenido principal

Agente de Visión en Streaming en Jetson

Introducción

La mayoría de las demos de visión en Jetson se quedan en la detección de un solo fotograma (cada fotograma es independiente) o en la comprensión de clips cortos sin conexión (ejecutar un VLM una vez sobre unos segundos de vídeo grabado). Ninguna mantiene estado a lo largo de un flujo continuo en vivo, así que después de que un objeto salga de la vista — o después de que termine el clip — normalmente no puedes preguntar “¿qué acaba de pasar hace un momento?” con evidencia. Un Agente de Visión en Streaming mantiene una breve memoria multimodal en línea y rodante en el borde — incrustaciones visuales, eventos episódicos y hechos semánticos — y responde preguntas con fotogramas y clips de evidencia mientras la cámara sigue funcionando.

Este wiki implementa una demo en tiempo real en dispositivos Jetson de Seeed (verificada en reComputer Mini J5012 · JetPack 7.2). Una cámara USB alimenta una interfaz de navegador; dos instancias independientes de Qwen3-VL-2B manejan el reconocimiento y Ask para que las respuestas no bloqueen las escrituras de memoria en segundo plano.

tip

El diseño está inspirado en las ideas de memoria multimodal de WorldMM (CVPR 2026). Esta demo se centra en una ventana rodante en línea en Jetson — no es una reproducción de los benchmarks offline EgoLife del artículo. Consulta Inspiración y agradecimientos.

Verificado en reComputer Mini (Jetson AGX Orin 64GB) con JetPack 7.2 (L4T R39.2.0).

Descripción general

CapaFunción
Memoria visualIncrustaciones de fotogramas VLM2Vec + evidencia JPEG (~cada 5 s)
Memoria episódicaQwen3-VL-2B #1 — eventos de aparición / movimiento / desaparición (~cada 45 s)
Hechos semánticosEstado de entidad (is_at / absent_from / usually_at) + línea temporal
AskRecupera memoria → Qwen3-VL-2B #2 responde con trayectoria + evidencia

Abre http://<jetson-ip>:8790 para vídeo en vivo, memoria rodante y Ask.

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

Hardware compatible

ElementoConfiguración
DispositivosreComputer J501 Mini
VerificadoreComputer J501 Mini · JetPack 7.2 (L4T 39.2.0)
RAM / DiscoSe recomiendan 64 GB de RAM · ≥50 GB de disco libre para modelos + venv
CámaraUSB UVC / V4L2 (/dev/video0)

Instalación

1. Clonar el repositorio

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

2. Crear el entorno Python en Jetson

bash script/jetson_setup.sh

Ruta predeterminada del venv: ~/leucus/.venv-worldmm (sobrescribe con WORLDMM_VENV).

Activa y configura las variables de entorno:

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
precaución

No configures HF_ENDPOINT=https://hf-mirror.com en esta pila — puede romper las descargas de huggingface_hub.

3. Descargar modelos

bash script/jetson_download_models.sh
ModeloRequerido para el modo en vivo dual-2B predeterminado
Qwen3-VL-2B-InstructSí (cargado dos veces: reconocimiento + Ask)
Qwen3-Embedding-4B
Qwen2-VL-2B-Instruct + VLM2Vec-V2.0Sí (memoria visual)
Qwen3-VL-8B-InstructOpcional (WORLDMM_DOWNLOAD_8B=1 o --episodic-model 8b)

Los pesos de Qwen se descargan a través de ModelScope; VLM2Vec a través de Hugging Face (huggingface.co). La primera descarga puede tardar un tiempo dependiendo de la red.

Ejecutar la demo en vivo

Conecta una cámara USB y luego:

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

Ábrelo en un navegador:

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

El tiempo de ejecución predeterminado es dual 2B (instancias de modelo, bloqueos y flujos CUDA separados). Flags opcionales:

FlagSignificado
--episodic-model 8bReconocimiento más potente con Qwen3-VL-8B
--shared-2bUn solo 2B para ambos roles (menos VRAM; Ask espera al reconocimiento)
--window-min 10Ventana de memoria rodante más larga

Prueba rápida (opcional)

Captura corta + comprobación del pipeline:

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

Resultados de la demo

Clips cortos en el CDN de archivos de Seeed que muestran la memoria rodante y las respuestas de Ask en la interfaz en vivo.

nota

En algunos turnos de Ask (consulta los clips y miniaturas de evidencia anteriores), la respuesta de texto puede nombrar un objeto mientras que el JPEG / clip de evidencia recuperado muestra un objeto diferente de un momento anterior en la ventana rodante. Eso es esperado en una demo de memoria corta dual-2B: la recuperación puede adjuntar la evidencia visual más cercana en lugar de una coincidencia de identidad perfecta. Prefiere interacciones con un solo objeto centrado en el encuadre para obtener resultados más limpios.

Qué deberías ver

EscenaComportamiento esperado
Vista estable de escritorioFotograma en vivo + indicadores de estado; los contadores episódicos / visuales aumentan con el tiempo
Colocar / retirar un objeto (p. ej., estuche de auriculares) en el centro de la vistaEvento episódico tras la confirmación; Ask puede responder “¿qué se acaba de dejar?”
Pregunta “What was just put down?”La respuesta cita la línea temporal / hechos; JPEG o clip de evidencia opcional

El reconocimiento utiliza disparadores sesgados al centro y paneles de recorte FULL + CENTER para reducir la distracción de manos / ratón en el borde de la imagen.

Modelos usados en esta demo

FunciónModelo predeterminado
Reconocimiento episódicoQwen3-VL-2B-Instruct (instancia #1)
Ask / respuestaQwen3-VL-2B-Instruct (instancia #2)
Incrustación de textoQwen3-Embedding-4B
Incrustación visualQwen2-VL-2B-Instruct + VLM2Vec-V2.0 LoRA

Solución de problemas

ProblemaSolución
No se puede abrir /dev/video0Comprueba ls /dev/video*; prueba --device /dev/video1
huggingface_hub FileMetadataErrorunset HF_ENDPOINT; evita hf-mirror
Conflicto entre Hub / transformersMantén huggingface_hub>=0.34,<1 (fijado en jetson_setup.sh)
OOM / muy lentoNo ejecutes otras demos pesadas de GPU en paralelo; prueba --shared-2b o un --episodic-interval más largo
Ask parece bloqueadoConfirma que no estás usando --shared-2b; el dual-2B predeterminado debería responder en un flujo separado
Puerto en usofuser -k 8790/tcp y luego vuelve a lanzar

Recursos

Inspiración y agradecimientos

Esta demo en el borde está inspirada en WorldMM — un agente de memoria multimodal dinámica para razonamiento sobre vídeo largo (CVPR 2026 Highlight). Adaptamos la idea de tres memorias (visual / episódica / semántica) a una ventana rodante en tiempo real en 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}
}

También gracias a HippoRAG, VLM2Vec y la implementación original de WorldMM (Apache-2.0).

Soporte técnico y debate sobre el producto

Gracias por elegir nuestros productos. Estamos aquí para ofrecerte diferentes tipos de soporte y garantizar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para adaptarnos a distintas preferencias y necesidades.

Loading Comments...