Phase 19 - Lesson 12

Capstone 12 — Canalización de Comprensión de Video (Escenas, QA, Búsqueda)

Twelve Labs comercializó Marengo + Pegasus. VideoDB lanzó la API CRUD-para-video. Molmo 2 de AI2 publicó checkpoints abiertos de VLM. El contexto largo de Gemini procesa horas de video nativamente. TimeLens-100K definió la localización temporal a escala. La canalización de 2026 está consolidada: segmentación de escenas, descripción + embedding por escena, alineación de transcripción, índice multivectorial y una consulta que responde con timestamps de inicio/fin más visualizaciones de fotogramas (frames). El capstone consiste en ingerir 100 horas, alcanzar benchmarks públicos y medir alucinaciones en preguntas de conteo y acción.

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

El QA en videos largos es el problema multimodal que más ancho de banda consume a la escala de 2026. Gemini 2.5 Pro puede leer un video de 2 horas nativamente, pero ingerir 100 horas de video en un corpus consultable aún requiere un índice a nivel de escena. El diseño de producción combina segmentación de escenas (TransNetV2 o PySceneDetect), descripción por escena con una VLM (Gemini 2.5, Qwen3-VL-Max o Molmo 2), alineación de transcripción (Whisper-v3-turbo con timestamps a nivel de palabra) y un índice multivectorial que almacena descripción, embedding de fotograma y transcripción lado a lado. La canalización de consultas responde con timestamps de inicio/fin más visualizaciones de fotogramas.

Los benchmarks son públicos (ActivityNet-QA, NeXT-GQA) además de su propio conjunto personalizado de 100 consultas. La alucinación en preguntas de tipo conteo y acción es la clase de falla sabidamente difícil; el capstone la mide explícatamente.

Concept

Tres canalizaciones se ejecutan en paralelo en la ingesta. La segmentación de escenas corta el video en escenas. La descripción por VLM genera una descripción por escena y un embedding de fotograma a partir de un fotograma clave (keyframe). La alineación de ASR produce timestamps a nivel de palabra. Los tres flujos se unen por (scene_id, intervalo_de_tiempo). Cada escena recibe tres tipos de vectores en un índice multivectorial (Qdrant): embedding de descripción, embedding de fotograma clave y embedding de transcripción.

Al momento de la consulta, la pregunta en lenguaje natural se ejecuta contra los tres vectores; los resultados se combinan con fusión RRF; un adaptador de localización temporal (estilo TimeLens) refina la ventana de inicio/fin dentro de la escena principal. El sintetizador VLM (Gemini 2.5 Pro o Qwen3-VL-Max) recibe la consulta + principales escenas + fotogramas recortados y responde con timestamps citados y una vista previa del fotograma.

La medición de alucinaciones es fundamental. Las preguntas de conteo ("¿cuántas personas entran a la sala?") y de tipo acción ("¿el chef vierte antes de revolver?") son notoriamente poco confiables. Reporte la precisión de estas preguntas por separado de las descriptivas.

Architecture

archivo de video / URL
      |
      v
PySceneDetect / TransNetV2  (segmentación de escenas)
      |
      +--- keyframe por escena --- descripción VLM + embedding de fotograma
      |                            (Gemini 2.5 Pro / Qwen3-VL-Max / Molmo 2)
      |
      +--- canal de audio --- Whisper-v3-turbo ASR + timestamps por palabra
      |
      v
Qdrant multivectorial: {caption_emb, keyframe_emb, transcript_emb}
      |
consulta:
  consultas densas contra los tres -> fusión RRF -> top-k escenas
      |
      v
localización temporal TimeLens / VideoITG (refina inicio/fim dentro de la escena)
      |
      v
sintetizador VLM: consulta + principales escenas + vistas previas de fotogramas
      |
      v
respuesta + timestamps (inicio, fin) + miniaturas de fotogramas + citas

Stack

  • Segmentación de escenas: TransNetV2 (estado del arte de 2024-26) o PySceneDetect
  • ASR: Whisper-v3-turbo a través de faster-whisper con timestamps por palabra
  • VLM de descripción + respuesta: Gemini 2.5 Pro o Qwen3-VL-Max o Molmo 2
  • Localización temporal: adaptador entrenado con TimeLens-100K o VideoITG
  • Índice: Qdrant con soporte multivectorial (descripción / fotograma / transcripción)
  • UI: Next.js 15 con reproductor de video HTML5 y miniaturas de escena
  • Evaluación: ActivityNet-QA, NeXT-GQA, conjunto de 100 preguntas personalizadas etiquetadas a mano
  • Benchmark de alucinación: subconjuntos de preguntas de conteo y acción etiquetados a mano

Build It

  1. Lector de ingesta. Acepte URLs de YouTube o MP4s locales. Reduzca la resolución a 720p si es necesario. Persista {video_id, file_path}.

  2. Segmentación de escenas. Ejecute TransNetV2 o PySceneDetect para producir [{scene_id, start_ms, end_ms, keyframe_path}]. Meta para 100 horas: aproximadamente 6k-8k escenas.

  3. Paso de ASR. Ejecute Whisper-v3-turbo en el audio; exporte timestamps a nivel de palabra; divida en fragmentos de transcripción por escena.

  4. Descripción por VLM. Para cada escena, llame a Gemini 2.5 Pro (o Qwen3-VL-Max) con el fotograma clave y una plantilla de descripción corta. Produzca descripción + embedding de fotograma.

  5. Índice multivectorial. Colección de Qdrant con tres vectores nombrados. Payload: {video_id, scene_id, start_ms, end_ms, keyframe_url}.

  6. Consulta. La pregunta en lenguaje natural dispara tres consultas densas; combine los resultados con fusión de clasificación recíproca (RRF); seleccione las principales top-k=5 escenas.

  7. Localización temporal. Ejecute el adaptador estilo TimeLens en la escena principal para refinar la ventana de inicio/fim dentro de ella.

  8. Síntesis por VLM. Llame a Gemini 2.5 Pro con la consulta + 3 principales fragmentos de escenas (como imágenes o videos cortos) + transcripciones. Exija citas de (video_id, start_ms, end_ms).

  9. Evaluación. Ejecute ActivityNet-QA y NeXT-GQA. Cree un conjunto personalizado de 100 consultas. Reporte la precisión general + desglose por clase (conteo, acción, descriptiva).

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 es el entregable. Dado una URL de YouTube o video subido, la canalización indexa las escenas y responde a preguntas con citas que contienen timestamps.

Peso Criterio Cómo se mide
25 IoU de localización temporal Intersección sobre unión en el conjunto de localización reservado (held-out)
20 Precisión de QA NeXT-GQA y 100 consultas personalizadas
20 Rendimiento de ingesta Horas de video por dólar gastado
20 UX de la UI y de citas Enlaces de timestamp, tira de miniaturas, saltar al fotograma
15 Tasa de alucinación Precisión de conteo y de tipo de acción por separado
100

Exercises

  1. Reemplace Gemini 2.5 Pro por Qwen3-VL-Max en el paso de descripción. Reporte la diferencia de calidad de la descripción en una muestra de 50 escenas evaluadas por humanos.

  2. Reduzca el embedding de fotogramas de cada escena a un solo vector agrupado en lugar de multivectorial. Mida la regresión en la recuperación.

  3. Construya un modo "conteo estricto": el sintetizador extrae cada instancia contada con un timestamp y el usuario hace clic para verificar. Mida si la verificación del usuario reduce la alucinación.

  4. Realice un benchmark del costo de ingesta: horas de video por dólar utilizando tres opciones de VLM. Elija la mejor relación costo-beneficio.

  5. Agregue transcripción con identificación de hablantes (diarización): ejecute la diarización de hablantes de pyannote en el audio e incorpore las transcripciones por hablante. Demuestre consultas como "¿qué dijo Alice sobre X?".

Key Terms

Término Lo que la gente dice Lo que realmente significa
Segmentación de escenas "Detección de tomas" División de un video en escenas en los límites de las tomas (cuts)
Índice multivectorial "Descripción + fotograma + transcripción" Colección de Qdrant con vectores nombrados por cada representación
Localización temporal "Cuándo ocurrió exactamente" Refinamiento del intervalo de tiempo (inicio, fin) para la respuesta de una consulta
Embedding de fotograma "Representación visual" Embedding vectorial de un fotograma clave; usado para similitud visual de escenas
Fusión RRF "Fusión de clasificación recíproca" Estrategia de combinación de múltiples listas jerarquizadas; un truque clásico de recuperación híbrida
Alucinación de conteo "Error de conteo" Modo de fallo conocido de las VLM en preguntas sobre "¿cuántos X?"
ActivityNet-QA "Benchmark de Video-QA" Benchmark de precisión para preguntas y respuestas en videos largos

Further Reading

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