Pular para o conteúdo principal

Streaming Vision Agent no Jetson

Introdução

A maioria dos demos de visão no Jetson param em detecção de quadro único (cada quadro é independente) ou entendimento de clipe curto offline (executar um VLM uma vez em alguns segundos de vídeo gravado). Nenhum deles mantém estado ao longo de um stream contínuo ao vivo, então depois que um objeto sai de cena — ou depois que o clipe termina — normalmente você não consegue perguntar “o que acabou de acontecer há pouco?” com evidências. Um Streaming Vision Agent mantém uma curta memória multimodal contínua online na borda — embeddings visuais, eventos episódicos e fatos semânticos — e responde perguntas com quadros e clipes de evidência enquanto a câmera ainda está rodando.

Este wiki implanta um demo em tempo real em dispositivos Jetson da Seeed (verificado em reComputer Mini J5012 · JetPack 7.2). Uma câmera USB alimenta uma interface no navegador; duas instâncias independentes de Qwen3-VL-2B lidam com reconhecimento e Ask para que as respostas não bloqueiem as gravações de memória em segundo plano.

dica

O design é inspirado por as ideias de memória multimodal do WorldMM (CVPR 2026). Este demo tem como alvo uma janela contínua online no Jetson — não é uma reprodução dos benchmarks offline EgoLife do artigo. Veja Inspiration & acknowledgments.

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

Visão geral

CamadaFunção
Memória visualEmbeddings de quadro VLM2Vec + evidência JPEG (~a cada 5 s)
Memória episódicaQwen3-VL-2B #1 — eventos de aparecer / mover / desaparecer (~a cada 45 s)
Fatos semânticosEstado de entidade (is_at / absent_from / usually_at) + linha do tempo
AskRecupera memória → Qwen3-VL-2B #2 responde com trajetória + evidência

Abra http://<jetson-ip>:8790 para vídeo ao vivo, memória contínua e Ask.

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

Hardware compatível

ItemConfiguração
DispositivosreComputer J501 Mini
VerificadoreComputer J501 Mini · JetPack 7.2 (L4T 39.2.0)
RAM / Disco64 GB de RAM recomendados · ≥50 GB de disco livre para modelos + venv
CâmeraUSB UVC / V4L2 (/dev/video0)

Instalação

1. Clonar o repositório

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

2. Criar o ambiente Python no Jetson

bash script/jetson_setup.sh

Caminho padrão do venv: ~/leucus/.venv-worldmm (substitua com WORLDMM_VENV).

Ative e defina as variáveis de ambiente:

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
cuidado

Não defina HF_ENDPOINT=https://hf-mirror.com neste stack — isso pode quebrar os downloads do huggingface_hub.

3. Baixar modelos

bash script/jetson_download_models.sh
ModeloNecessário para live padrão dual-2B
Qwen3-VL-2B-InstructSim (carregado duas vezes: reconhecimento + Ask)
Qwen3-Embedding-4BSim
Qwen2-VL-2B-Instruct + VLM2Vec-V2.0Sim (memória visual)
Qwen3-VL-8B-InstructOpcional (WORLDMM_DOWNLOAD_8B=1 ou --episodic-model 8b)

Os pesos do Qwen são baixados via ModelScope; VLM2Vec via Hugging Face (huggingface.co). O primeiro download pode levar algum tempo dependendo da rede.

Executar o Demo ao Vivo

Conecte uma câmera USB e então:

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

Abra em um navegador:

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

O runtime padrão é dual 2B (instâncias de modelo, locks e streams CUDA separados). Flags opcionais:

FlagSignificado
--episodic-model 8bReconhecimento mais forte com Qwen3-VL-8B
--shared-2bUm 2B para ambos os papéis (menos VRAM; Ask espera pelo reconhecimento)
--window-min 10Janela de memória contínua mais longa

Smoke test (opcional)

Captura curta + verificação do pipeline:

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

Resultados do Demo

Clipes curtos no CDN de arquivos da Seeed mostrando memória contínua e respostas Ask na interface ao vivo.

nota

Em alguns turnos de Ask (veja os clipes e miniaturas de evidência acima), a resposta em texto pode nomear um objeto enquanto o JPEG / clipe de evidência recuperado mostra um objeto diferente de um momento anterior na janela contínua. Isso é esperado em um demo de memória curto dual-2B: a recuperação pode anexar a evidência visual mais próxima em vez de uma correspondência perfeita de identidade. Prefira interações com um objeto de cada vez, centralizado no quadro, para resultados mais limpos.

O que você deve ver

CenaComportamento esperado
Visão estável da mesaQuadro ao vivo + indicadores de status; contadores episódicos / visuais aumentam com o tempo
Colocar / remover um objeto (por exemplo, estojo de fones) no centro da visãoEvento episódico após confirmação; Ask pode responder “o que acabou de ser colocado?”
Perguntar “What was just put down?”A resposta cita linha do tempo / fatos; JPEG ou clipe de evidência opcional

O reconhecimento usa gatilhos enviesados para o centro e painéis de recorte FULL + CENTER para reduzir distração de mãos / mouse na borda da imagem.

Modelos usados neste Demo

FunçãoModelo padrão
Reconhecimento episódicoQwen3-VL-2B-Instruct (instância #1)
Ask / respostaQwen3-VL-2B-Instruct (instância #2)
Embedding de textoQwen3-Embedding-4B
Embedding visualQwen2-VL-2B-Instruct + VLM2Vec-V2.0 LoRA

Solução de problemas

ProblemaSolução
Não é possível abrir /dev/video0Verifique ls /dev/video*; tente --device /dev/video1
huggingface_hub FileMetadataErrorunset HF_ENDPOINT; evite hf-mirror
Conflito entre Hub / transformersMantenha huggingface_hub>=0.34,<1 (fixado em jetson_setup.sh)
OOM / muito lentoNão execute outros demos pesados de GPU em paralelo; tente --shared-2b ou --episodic-interval mais longo
Ask parece bloqueadoConfirme que você não está usando --shared-2b; o dual-2B padrão deve responder em um stream separado
Porta em usofuser -k 8790/tcp e depois reinicie

Recursos

Inspiração e Agradecimentos

Este demo de borda é inspirado pelo WorldMM — um agente de memória multimodal dinâmica para raciocínio em vídeos longos (CVPR 2026 Highlight). Adaptamos a ideia das três memórias (visual / episódica / semântica) para uma janela contínua em tempo real no 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}
}

Também agradecemos ao HippoRAG, VLM2Vec e à implementação original do WorldMM (Apache-2.0).

Suporte Técnico e Discussão de Produtos

Obrigado por escolher nossos produtos! Estamos aqui para oferecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...