Phase 19 - Lesson 12
Capstone 12 — Pipeline de Compreensão de Vídeo (Cenas, QA, Busca)
A Twelve Labs transformou Marengo + Pegasus em produtos. A VideoDB lançou a API CRUD-para-vídeo. A Molmo 2 da AI2 publicou pesos abertos de VLM. O contexto longo do Gemini processa horas de vídeo nativamente. O TimeLens-100K definiu a localização temporal em escala. O pipeline de 2026 está consolidado: segmentação de cenas, legenda + embedding por cena, alinhamento de transcrição, índice multivetorial e uma consulta que responde com timestamps de início/fim mais visualizações de frames. O capstone consiste em ingerir 100 horas, atingir benchmarks públicos e medir alucinações em perguntas de contagem e ação.
Type: Capstone Languages: Python (pipeline), TypeScript (UI) Prerequisites: Phase 4 (CV), Phase 6 (speech), Phase 7 (transformers), Phase 11 (LLM engineering), Phase 12 (multimodal), Phase 17 (infrastructure) Phases exercised: P4 · P6 · P7 · P11 · P12 · P17 Time: 30 horas
Problem
O QA em vídeos longos é o problema multimodal que mais consome largura de banda na escala de 2026. O Gemini 2.5 Pro pode ler um vídeo de 2 horas nativamente, mas ingerir 100 horas de vídeo em um corpus consultável ainda requer um índice no nível de cena. O formato de produção combina segmentação de cenas (TransNetV2 ou PySceneDetect), legendagem por cena com uma VLM (Gemini 2.5, Qwen3-VL-Max ou Molmo 2), alinhamento de transcrição (Whisper-v3-turbo com timestamps no nível de palavra) e um índice multivetorial que armazena legenda, embedding de frame e transcrição lado a lado. O pipeline de consulta responde com timestamps de início/fim e visualizações de frames.
Os benchmarks são públicos (ActivityNet-QA, NeXT-GQA) somados ao seu próprio conjunto personalizado de 100 consultas. A alucinação em perguntas do tipo contagem e ação é a classe de falha sabidamente difícil; o capstone mede isso explicitamente.
Concept
Três pipelines rodam em paralelo na ingestão. A segmentação de cenas divide o vídeo em cenas. A legendagem por VLM gera uma legenda por cena e um embedding de frame a partir de um keyframe. O alinhamento de ASR produz timestamps no nível de palavra. Os três fluxos são unidos por (scene_id, intervalo_de_tempo). Cada cena recebe três tipos de vetores em um índice multivetorial (Qdrant): embedding de legenda, embedding de keyframe e embedding de transcrição.
No momento da consulta, a pergunta em linguagem natural é executada contra os três vetores; os resultados são combinados via fusão RRF; um adaptador de localização temporal (estilo TimeLens) refina a janela de início/fim dentro da cena principal. O sintetizador VLM (Gemini 2.5 Pro ou Qwen3-VL-Max) recebe a consulta + principais cenas + frames recortados e responde com timestamps citados e uma visualização de frame.
A medição de alucinações é fundamental. Perguntas de contagem ("quantas pessoas entram na sala?") e de ação ("o chef despeja antes de mexer?") são notoriamente não confiáveis. Relate a acurácia dessas perguntas separadamente das perguntas descritivas.
Architecture
arquivo de vídeo / URL
|
v
PySceneDetect / TransNetV2 (segmentação de cenas)
|
+--- keyframe por cena --- legenda VLM + embedding de frame
| (Gemini 2.5 Pro / Qwen3-VL-Max / Molmo 2)
|
+--- canal de áudio --- Whisper-v3-turbo ASR + timestamps por palavra
|
v
Qdrant multivetorial: {caption_emb, keyframe_emb, transcript_emb}
|
consulta (query):
consultas densas contra os três -> fusão RRF -> top-k cenas
|
v
localização temporal TimeLens / VideoITG (refina início/fim dentro da cena)
|
v
síntese VLM: consulta + principais cenas + visualizações de frames
|
v
resposta + timestamps (início, fim) + miniaturas de frames + citações
Stack
- Segmentação de cenas: TransNetV2 (estado da arte de 2024-26) ou PySceneDetect
- ASR: Whisper-v3-turbo via faster-whisper com timestamps por palavra
- VLM de legenda + resposta: Gemini 2.5 Pro ou Qwen3-VL-Max ou Molmo 2
- Localização temporal: adaptador treinado com TimeLens-100K ou VideoITG
- Índice: Qdrant com suporte multivetorial (legenda / frame / transcrição)
- UI: Next.js 15 com player de vídeo HTML5 e miniaturas de cena
- Avaliação: ActivityNet-QA, NeXT-GQA, conjunto de 100 perguntas personalizadas rotuladas manualmente
- Benchmark de alucinação: subconjuntos de perguntas de contagem e ação rotulados à mão
Build It
Leitor de ingestão. Aceite URLs do YouTube ou MP4s locais. Reduza a resolução para 720p se necessário. Persista
{video_id, file_path}.Segmentação de cenas. Execute o TransNetV2 ou o PySceneDetect para produzir
[{scene_id, start_ms, end_ms, keyframe_path}]. Meta para 100 horas: aproximadamente 6k-8k cenas.Passagem de ASR. Execute o Whisper-v3-turbo no áudio; exporte timestamps no nível de palavra; divida em trechos de transcrição por cena.
Legendagem por VLM. Para cada cena, chame o Gemini 2.5 Pro (ou o Qwen3-VL-Max) com o keyframe e um modelo simples de legenda. Produza a legenda + embedding de frame.
Índice multivetorial. Coleção do Qdrant com três vetores nomeados. Payload:
{video_id, scene_id, start_ms, end_ms, keyframe_url}.Consulta. A pergunta em linguagem natural dispara três consultas densas; mescle os resultados com fusão de classificação recíproca (RRF); selecione as principais top-k=5 cenas.
Localização temporal. Execute o adaptador estilo TimeLens na cena principal para refinar a janela de início/fim dentro dela.
Síntese por VLM. Chame o Gemini 2.5 Pro enviando a consulta + 3 principais trechos de cenas (como imagens ou vídeos curtos) + transcrições. Exija citações com
(video_id, start_ms, end_ms).Avaliação. Execute o ActivityNet-QA e o NeXT-GQA. Crie um conjunto personalizado de 100 consultas. Relate a acurácia geral + detalhamento por classe (contagem, ação, descritiva).
Use It
$ video-qa ask --url=https://youtube.com/watch?v=X "how many cars pass the intersection in the first minute?"
[scene] 23 scenes detected
[asr] transcript complete, 4m12s
[index] 69 vectors written (23 scenes x 3)
[query] top scene: scene 3 [01:32-01:54], confidence 0.84
[ground] refined window: [00:12-00:58]
[synth] gemini 2.5 pro, 1.4s
answer: 5 cars pass the intersection between 00:12 and 00:58.
citations: [scene 3: 00:12-00:58]
[frame preview at 00:14, 00:27, 00:44, 00:51, 00:57]
Ship It
outputs/skill-video-qa.md é o entregável. Dado uma URL do YouTube ou vídeo enviado, o pipeline indexa as cenas e responde a perguntas com citações contendo timestamps.
| Peso | Critério | Como é medido |
|---|---|---|
| 25 | IoU de localização temporal | Interseção sobre união no conjunto de localização reservado (held-out) |
| 20 | Acurácia de QA | NeXT-GQA e 100 consultas personalizadas |
| 20 | Vazão de ingestão | Horas de vídeo por dólar gasto |
| 20 | UX da UI e de citações | Links de timestamp, faixa de miniaturas, pular para o frame |
| 15 | Taxa de alucinação | Acurácia de contagem e tipo de ação separadamente |
| 100 |
Exercises
Substitua o Gemini 2.5 Pro pelo Qwen3-VL-Max na etapa de legendagem. Relate a diferença de qualidade da legenda em uma amostra de 50 cenas avaliadas por humanos.
Reduza o embedding de frames de cada cena para um único vetor agrupado em vez de multivetorial. Meça a regressão na recuperação.
Construa um modo "contagem estrita": o sintetizador extrai cada ocorrência contada com um timestamp e o usuário clica para verificar. Meça se a verificação por usuário reduz a alucinação.
Faça um benchmark do custo de ingestão: horas de vídeo por dólar utilizando três opções de VLM. Escolha a melhor relação custo-benefício.
Adicione transcrição com identificação de locutores (diarização): execute a diarização de locutores do pyannote no áudio e incorpore as transcrições por locutor. Demonstre consultas do tipo "o que Alice disse sobre X?".
Key Terms
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| Segmentação de cenas | "Detecção de tomadas" | Divisão de um vídeo em cenas nos limites das tomadas (cuts) |
| Índice multivetorial | "Legenda + frame + transcrição" | Coleção Qdrant com vetores nomeados para cada representação |
| Localização temporal | "Quando exatamente aconteceu" | Refinamento do intervalo de tempo (início, fim) para a resposta de uma consulta |
| Embedding de frame | "Representação visual" | Embedding vetorial de um keyframe; usado para similaridade visual de cenas |
| Fusão RRF | "Fusão de classificação recíproca" | Estratégia de combinação de múltiplas listas ranqueadas; um truque clássico de recuperação híbrida |
| Alucinação de contagem | "Erro de contagem" | Modo de falha conhecido de VLMs em perguntas sobre "quantos X" |
| ActivityNet-QA | "Benchmark de Video-QA" | Benchmark de acurácia para perguntas e respostas em vídeos longos |
Further Reading
- AI2 Molmo 2 — pesos abertos de VLM
- TimeLens (CVPR 2026) — localização temporal em escala
- Gemini Video long-context — a referência hospedada
- VideoDB — referência de API CRUD para vídeos
- Twelve Labs Marengo + Pegasus — referência comercial
- TransNetV2 — modelo de segmentação de cenas
- PySceneDetect — alternativa clássica de código aberto
- ActivityNet-QA — benchmark de avaliação de referência