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

  1. 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}.

  2. 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.

  3. 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.

  4. 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.

  5. Índice multivetorial. Coleção do Qdrant com três vetores nomeados. Payload: {video_id, scene_id, start_ms, end_ms, keyframe_url}.

  6. 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.

  7. Localização temporal. Execute o adaptador estilo TimeLens na cena principal para refinar a janela de início/fim dentro dela.

  8. 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).

  9. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).