Capstone 12 Video de la comprensión de la tubería (Escena, QA, búsqueda)
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 hours
El problema
El video de larga forma QA es el problema multimodal más hambriento de ancho de banda en la escala de 2026. Gemini 2.5 Pro puede leer un video de 2 horas de forma nativa, pero ingerir 100 horas de video en un cuerpo consultable todavía requiere un índice de nivel de escena. La forma de producción combina la segmentación de escena (TransNetV2 o PySceneDetect), la subtítulo por escena con un VLM (Gemini 2.5, Qwen3-VL-Max, o Molmo 2), la alineación de transcripción (Whisper-v3-turbo con timestamps de palabras) y un índice multi-vector que almacena la subtítulo, el marco de incorporación y la transcripción lado a lado. La línea de preguntas responde con sellos de tiempo (inicio, final) más vistas previas de los cuadros.
Los puntos de referencia son públicos (ActivityNet-QA, NeXT-GQA) más su propio conjunto personalizado de 100 consultas.
Concepto
Tres tuberías corren en paralelo en la ingesta. Scene segmentationcorta el video en escenas. VLM captioninggenera una leyenda por escena y un marco incorporado desde un marco de teclado. ASR alignmentSe trata de un sistema de captura de tiempo de nivel de palabra. Las tres corrientes se unen por (scene_id, rango de tiempo). Cada escena obtiene tres tipos de vectores en un índice multi-vector (Qdrant): captura de captura, captura de keyframe, captura de transcripción.
En el momento de la consulta, la pregunta de lenguaje natural dispara contra los tres vectores; los resultados se fusionan con RRF; un adaptador de tierra temporal (estilo TimeLens) refina la ventana (inicio, final) dentro de la escena superior. El sintetizador VLM (Gemini 2.5 Pro o Qwen3-VL-Max) toma la consulta + escenas superiores + cuadros recortados y respuestas con sellos de tiempo citados y una vista previa de cuadros.
La medición de las alucinaciones es importante. Las preguntas de conteo ("¿cuántas personas entran en la habitación?") y tipo de acción ("¿el chef derrama antes de agitar?") son notoriamente poco confiables.
Arquitectura
video file / URL
|
v
PySceneDetect / TransNetV2 (scene segmentation)
|
+--- per-scene keyframe --- VLM caption + frame embedding
| (Gemini 2.5 Pro / Qwen3-VL-Max / Molmo 2)
|
+--- audio channel --- Whisper-v3-turbo ASR + word timestamps
|
v
multi-vector Qdrant: {caption_emb, keyframe_emb, transcript_emb}
|
query:
dense queries against all three -> RRF merge -> top-k scenes
|
v
TimeLens / VideoITG temporal grounding (refine start/end within scene)
|
v
VLM synth: query + top scenes + frame previews
|
v
answer + (start, end) timestamps + frame thumbs + citationsEl establo
- Segmentación de escenas: TransNetV2 (estado de la técnica 2024-26) o PySceneDetect
- ASR: Whisper-v3-turbo a través de un susurro más rápido con sello de tiempo de palabras
- VLM capricho + respuesta: Gemini 2.5 Pro o Qwen3-VL-Max o Molmo 2
- Aterrizaje temporal: adaptador con TimeLens-100K o VideoITG
- Indice: Qdrant con soporte multivectorial (capción / marco / transcripción)
- Interfaz de usuario: Next.js 15 con reproductor de vídeo HTML5 y miniaturas de escena
- Eval: ActivityNet-QA, NeXT-GQA, conjunto de 100 preguntas etiquetado a mano
- Indicador de referencia de alucinación: subconjuntos de conteo y tipo de acción con etiquetas manuales
Construye el mismo
- Ingest walker.Acceptar URL de YouTube o MP4 locales. Reducir a 720p si es necesario. Persistir
{video_id, file_path}¿ Qué ?
- Scene segmentation.Ejecutar TransNetV2 o PySceneDetect para producir
[{scene_id, start_ms, end_ms, keyframe_path}]Objetivo 100 horas: 6K-8K escenas.
- ASR pass.Ejecutar Whisper-v3-turbo en audio; exportar timestamps de nivel de palabra; dividir en recortes de transcripción por escena.
- VLM captioning.Por escena, llame Gemini 2.5 Pro (o Qwen3-VL-Max) con el marco de teclas y una plantilla de captura corta. Produce captura + incorporación de marco.
- Multi-vector index.Colección de Qdrant con tres vectores nombrados.
{video_id, scene_id, start_ms, end_ms, keyframe_url}¿ Qué ?
- Query.La pregunta de lenguaje natural dispara tres preguntas densas; se fusionan con la fusión de rango recíproca; top-k=5 escenas.
- Temporal grounding.Ejecutar el adaptador de estilo TimeLens en la escena superior para refinar la ventana (inicio, final) dentro de la escena.
- VLM synth.Llame a Gemini 2.5 Pro con consulta + 3 clips de escena (como imágenes o clips cortos) + transcripciones.
(video_id, start_ms, end_ms)las citas.
- Eval.Ejecutar ActivityNet-QA y NeXT-GQA. Construir un conjunto personalizado de 100 consultas. Informar precisión general + desglose por clase (contado, acción, descriptiva).
Usalo
$ 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]Envío
outputs/skill-video-qa.mdSe le da una URL de YouTube o un video subido, la tubería indexa las escenas y responde preguntas con citas marcadas en el tiempo.
| Weight | Criterion | How it is measured |
|---|---|---|
| 25 | Temporal grounding IoU | Intersection-over-union on held-out grounding set |
| 20 | QA accuracy | NeXT-GQA and custom 100-query |
| 20 | Ingest throughput | Hours of video per dollar spent |
| 20 | UI and citation UX | Timestamp links, thumbnail strip, jump-to-frame |
| 15 | Hallucination rate | Counting and action-type accuracy separately |
| 100 |
Los ejercicios
- Cambiar Gemini 2.5 Pro por Qwen3-VL-Max en el pase de subtítulos.
- Reducir la incorporación de cuadros por escena a un vector en lugar de multi-vector.
- Construir un modo "conte estricto": el sintetizador extrae cada instancia contada con un sello de tiempo y el usuario hace clic para verificar.
- Costo de ingesta de referencia: horas de vídeo por dólar en tres opciones VLM.
- Añadir una transcripción diarizada por altavoz: ejecutar la diarización de altavoces de pyannote en el audio e incrustar transcripciones por altavoz.
Términos clave
| Term | What people say | What it actually means |
|---|---|---|
| Scene segmentation | "Shot detection" | Cutting video into scenes at shot boundaries |
| Multi-vector index | "Caption + frame + transcript" | Qdrant collection with named vectors per representation |
| Temporal grounding | "When exactly did it happen" | Refining the (start, end) window for a query answer |
| Frame embedding | "Visual representation" | A vector embedding of a keyframe; used for scene-visual similarity |
| RRF fusion | "Reciprocal rank fusion" | Merge strategy across multiple ranked lists; a classic hybrid-retrieval trick |
| Counting hallucination | "Miscount" | Known failure mode of VLMs on "how many X" questions |
| ActivityNet-QA | "Video-QA benchmark" | Long-form video QA accuracy benchmark |
Leer más
- AI2 Molmo 2 abrir los puestos de control de VLM
- TimeLens (CVPR 2026) Terreno temporal a escala
- Gemini Video long-context la referencia alojada
- VideoDB Referencia de la API CRUD para vídeo
- Twelve Labs Marengo + Pegasus Referencia comercial
- TransNetV2 Modelo de segmentación de escenas
- PySceneDetect alternativa clásica abierta
- ActivityNet-QA Valoración de referencia
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.