- Sistema de búsqueda semántica que busca escenas en archivos de video, como dashcams, usando lenguaje natural y recorta automáticamente ese segmento correspondiente
- Usa el modelo Google Gemini Embedding 2 para generar embeddings vectoriales del video directamente y guardarlos en ChromaDB, donde se comparan de forma directa con consultas de texto
- Con ffmpeg, divide el video en chunks superpuestos para generar embeddings y, al buscar, devuelve el segmento más similar con velocidad a nivel subsegundo
- Con funciones de preprocesamiento y omisión de fotogramas estáticos, reduce el costo de llamadas a la API; indexar 1 hora de video cuesta alrededor de $2.84
- Aprovecha la capacidad de Gemini Embedding 2 para hacer embeddings directos de video y permite búsquedas semánticas rápidas en videos de varias horas sin necesidad de generar subtítulos
Resumen general
- SentrySearch es una herramienta que realiza búsqueda semántica en videos de dashcam; cuando el usuario ingresa una consulta en lenguaje natural, devuelve un clip recortado (trimmed clip) que contiene esa escena
- Usa el modelo Google Gemini Embedding 2 para convertir el video mismo en vectores y almacenarlos en la base de datos local ChromaDB
- La consulta de texto se incrusta en el mismo espacio vectorial para encontrar los fragmentos de video más similares
- El resultado de búsqueda se recorta automáticamente desde el archivo original y se guarda, ofreciendo velocidad de búsqueda sub-second
Cómo funciona
- El video se divide en segmentos superpuestos (overlapping chunks) y cada segmento se incrusta directamente con el modelo Gemini Embedding
- Cada vector de embedding se almacena en ChromaDB, y al buscar, la consulta de texto se transforma al mismo espacio vectorial para hacer el matching
- El segmento con mayor similitud se recorta automáticamente del video original y se guarda como clip
- ffmpeg se usa para dividir y recortar el video; si no está instalado en el sistema, se usa automáticamente
imageio-ffmpeg
Instalación y configuración inicial
- Se puede instalar en un entorno con Python 3.10 o superior con el siguiente comando
git clone seguido de pip install -e .
- El comando
sentrysearch init configura la clave API de Gemini y la guarda en el archivo .env
- Se realiza un embedding de prueba para validar la clave
- Para configuración manual, se puede copiar
.env.example y agregar la clave API directamente
Comandos y opciones principales
-
index
- Escanea de forma recursiva los archivos
.mp4 dentro de la carpeta especificada y realiza la indexación
- Cada archivo se divide en varios chunks para generar embeddings
- Opciones
--chunk-duration : duración del chunk (en segundos)
--overlap : duración de superposición entre chunks
--no-preprocess : omite el downscaling y la reducción de fotogramas
--target-resolution : resolución objetivo en el preprocesamiento (480p por defecto)
--target-fps : tasa de fotogramas objetivo en el preprocesamiento (5fps por defecto)
--no-skip-still : también incrusta todos los segmentos con fotogramas estáticos
-
search
- Ejemplo:
sentrysearch search "red truck running a stop sign"
- El resultado se muestra junto con la puntuación de similitud, y el mejor resultado se recorta y guarda automáticamente
- Si la puntuación de similitud está por debajo del umbral predeterminado (0.35), se muestra un prompt de confirmación
- Opciones
--results N : cantidad de resultados a mostrar
--output-dir DIR : ruta donde se guardan los clips
--no-trim : desactiva el recorte automático
--threshold : ajusta el umbral de similitud
-
stats
- Muestra la cantidad total de chunks indexados y la cantidad de archivos originales
-
--verbose
- Muestra información de depuración como dimensión del embedding, tiempo de respuesta de la API y puntuaciones de similitud
Contexto técnico
- Gemini Embedding 2 puede incrustar video directamente y compararlo con consultas de texto dentro del mismo espacio vectorial de 768 dimensiones
- No se necesita un proceso separado de generación de subtítulos ni captioning de fotogramas
- Por ejemplo, una consulta de texto como “red truck at a stop sign” puede compararse directamente con un clip de video de 30 segundos
- Esta capacidad permite búsqueda semántica a nivel subsegundo incluso en videos de varias horas
Estructura de costos
- Con la configuración predeterminada (chunks de 30 segundos, superposición de 5 segundos), el costo de indexar 1 hora de video es de aproximadamente $2.84
- La API de Gemini procesa solo 1 fotograma por segundo del video subido
- El preprocesamiento reduce la escala a 480p y 5fps con el objetivo de optimizar la velocidad de transferencia y evitar timeouts
-
Optimizaciones para reducir costos
- Preprocesamiento (preprocessing) : reduce el tamaño de subida y el tiempo de transferencia
- Omisión de fotogramas estáticos (still-frame skipping) : omite embeddings en segmentos sin cambios visuales
- Es efectivo en videos grabados durante largos periodos mientras el vehículo está estacionado
- Como las consultas de búsqueda solo hacen embeddings de texto, el costo es casi nulo
- Opciones adicionales de ajuste
--chunk-duration, --overlap : controlan la cantidad de llamadas a la API
--no-skip-still : genera embeddings para todos los chunks
--target-resolution, --target-fps : ajustan la calidad del preprocesamiento
--no-preprocess : envía los chunks originales tal cual
Limitaciones y mejoras futuras
- La detección de fotogramas estáticos usa una heurística basada en comparar tamaños de archivos JPEG, por lo que puede pasar por alto movimientos sutiles o incluir erróneamente segmentos estáticos
- La calidad de búsqueda depende de los límites de los chunks; si un evento queda entre dos chunks, puede no capturarse perfectamente
- En el futuro, esto podría mejorar con división por chunks basada en detección de escenas (scene detection)
- Gemini Embedding 2 está actualmente en fase preview, por lo que el comportamiento y el precio de la API podrían cambiar
Compatibilidad y requisitos
- Funciona con cualquier archivo de video en formato
.mp4; no está limitado a videos de Tesla Sentry Mode
- Explora recursivamente todos los archivos
.mp4 sin importar la estructura de carpetas
- Requisitos
- Python 3.10 o superior
- Se requiere
ffmpeg instalado (o se usa automáticamente imageio-ffmpeg)
- Se requiere una clave API de Gemini (se puede obtener una clave gratuita en: aistudio.google.com/apikey)
1 comentarios
Comentarios de Hacker News
Esta implementación me parece realmente genial. Todavía hay algo de embeddings que se siente casi como magia
Pero lo que más me preocupa es la posibilidad de que esta tecnología termine llevándonos a una sociedad de vigilancia
Hoy hay muchísimas cámaras, pero como es imposible que una persona revise realmente todo el video, todavía se conserva cierto grado de anonimato y privacidad
Sin embargo, si la IA llega a analizar todo el video en tiempo real y puede detectar a una persona o acción específica con lenguaje natural, el panóptico podría volverse realidad
Puede haber usos positivos, como la detección de delitos o de caídas, pero sin regulación el resultado podría ser muy peligroso
Según dijeron, integra distintos sistemas de cámaras, ALPR y alertas, y permite hacer consultas de video en lenguaje natural
También comentaron que en el futuro se integrarán cámaras instaladas por ciudadanos. Si esto termina conectándose con servicios como la app Citizen, podríamos llegar a un mundo donde la cámara del vecino esté conectada directamente al sistema policial
Es una dirección realmente preocupante
Por eso creo que es importante procesar este tipo de cosas con un modelo local, para que el video no salga al exterior
Pero aun así hay que pensar con mucho cuidado hacia dónde va toda esta tecnología
El problema surge cuando algo como Flock o Ring se despliega a gran escala, o cuando una sola empresa puede acceder a todo el video
Creo que la IA multimodal va a provocar una carrera armamentista entre la detección de anuncios y la inserción de anuncios
Hace tiempo probé eliminar publicidad con un modelo anterior a Gemini, pero esta tecnología parece mucho más potente y podría identificar anuncios al instante para silenciarlos o quitarlos
Dejé mis pruebas relacionadas aquí
Al final los anuncios no van a desaparecer. El proveedor de IA podría recibir una whitelist de anuncios o, peor todavía, la propia IA podría promocionar productos publicitarios directamente
Hace unos meses compré una dashcam Rexing, pero acceder al video es tan incómodo que estoy pensando en armar mi propio sistema
Quiero poder explorar y descargar el video sin tener que sacar la tarjeta SD
Mientras recorría las grabaciones pensé: “ojalá pudiera buscar esta escena con lenguaje natural”, y al ver este proyecto me dieron ganas de aplicarlo de inmediato
Gracias por compartirlo
Me pregunto si esto podría aplicarse a software de edición de video
Por ejemplo, algo como decir en un plugin de Premiere: “elimíname todas las escenas donde aparezca un gato”, y que automáticamente genere una EDL (Edit Decision List)
SentrySearch ya devuelve timestamps exactos de entrada/salida para consultas en lenguaje natural y hace el recorte automáticamente con ffmpeg
Extender esto a una EDL o a un plugin de Premiere sería una evolución natural
No soy experto en Premiere, pero si alguien intenta hacer un exportador de EDL o un plugin, estaría dispuesto a ayudar revisando y mergeando PRs
Si alguien empieza, estaría bueno que lo avise en un issue de GitHub
Me pregunto si esto también podría funcionar con un modelo local
Esto también se ve interesante no solo para dashcams, sino para monitoreo del hogar
Si adelantas y retrocedes rápido, encontrar unos 30 segundos de alguien acercándose a la puerta suele ser bastante fácil
Una vez me pasé horas revisando video para ver si el gato se había escapado cuando se abrió la puerta, y al final estaba escondido dentro de la casa
Yo también estoy trabajando en un proyecto de embeddings, aunque todavía está en etapa de prototipo
En mi caso no es con Gemini, sino que estoy armando un rompecabezas de conexiones inversas (reverse connections) para juegos
Se puede ver más sobre eso aquí
Vi la parte del código que verifica si un fragmento de video es mayormente un frame estático, y creo que eso podría hacerse automáticamente combinando los parámetros select y scene de ffmpeg
Trabajo en el área de content/video intelligence
Gemini es una herramienta que encaja muy bien para este tipo de casos de uso
Me dio risa ver en la demo la búsqueda de “cuando un auto con portabicicletas atrás se me metió en la noche”
Probablemente encontrar ese auto fue la verdadera motivación para crear este proyecto