- Busca cenas em arquivos de vídeo, como os de dashcam, usando linguagem natural e recorta automaticamente o trecho correspondente com um sistema de busca semântica
- Usa o modelo Google Gemini Embedding 2 para gerar embeddings do próprio vídeo em vetores e armazená-los no ChromaDB, comparando-os diretamente com consultas em texto
- Faz embedding dos vídeos em chunks sobrepostos com ffmpeg e, na busca, retorna o trecho mais semelhante com velocidade em frações de segundo
- Recursos de pré-processamento e salto de quadros estáticos reduzem o custo de chamadas à API, com custo de cerca de US$ 2,84 para indexar 1 hora de vídeo
- Aproveita o recurso de embedding direto de vídeo do Gemini Embedding 2 para permitir busca semântica rápida em vídeos com várias horas de duração sem precisar gerar legendas
Visão geral
- SentrySearch é uma ferramenta de busca semântica em vídeos de dashcam (semantic search); quando o usuário digita uma consulta em linguagem natural, ela retorna um clip recortado (trimmed clip) contendo a cena correspondente
- Usa o modelo Google Gemini Embedding 2 para gerar embeddings do próprio vídeo em vetores e armazená-los em um banco de dados local ChromaDB
- A consulta em texto é embutida no mesmo espaço vetorial para encontrar os trechos de vídeo mais semelhantes
- O resultado da busca é automaticamente recortado e salvo a partir do arquivo original, oferecendo velocidade de busca em subsegundos (sub-second)
Como funciona
- O vídeo é dividido em trechos sobrepostos (overlapping chunks), e cada trecho é diretamente embutido pelo modelo Gemini Embedding
- Cada vetor de embedding é armazenado no ChromaDB; na busca, a consulta em texto é convertida para o mesmo espaço vetorial e comparada
- O trecho com maior similaridade é automaticamente recortado do vídeo original e salvo como clip
- O ffmpeg é usado para divisão e recorte do vídeo; se não estiver instalado no sistema, o
imageio-ffmpeg é usado automaticamente
Instalação e configuração inicial
- Pode ser instalado em ambiente com Python 3.10 ou superior com o seguinte comando
- após
git clone, execute pip install -e .
- O comando
sentrysearch init configura a chave da API Gemini e a salva no arquivo .env
- Um embedding de teste é executado para validar a chave
- Na configuração manual, é possível copiar
.env.example e adicionar a chave da API diretamente
Principais comandos e opções
-
index
- Faz a indexação varrendo recursivamente os arquivos
.mp4 dentro da pasta especificada
- Cada arquivo é dividido em vários chunks para embedding
- Opções
--chunk-duration : duração do chunk (em segundos)
--overlap : duração da sobreposição entre chunks
--no-preprocess : pula o downscale e a redução de quadros
--target-resolution : resolução-alvo no pré-processamento (padrão: 480p)
--target-fps : taxa de quadros-alvo no pré-processamento (padrão: 5fps)
--no-skip-still : também embute todos os trechos com quadros estáticos
-
search
- Exemplo:
sentrysearch search "red truck running a stop sign"
- Os resultados são exibidos com a pontuação de similaridade, e o melhor resultado é automaticamente recortado e salvo
- Se a pontuação de similaridade estiver abaixo do limiar padrão (0,35), é exibido um prompt de confirmação
- Opções
--results N : número de resultados a exibir
--output-dir DIR : caminho para salvar os clips
--no-trim : desativa o recorte automático
--threshold : ajusta o limiar de similaridade
-
stats
- Exibe o número total de chunks indexados e a quantidade de arquivos originais
-
--verbose
- Exibe informações de depuração, como dimensão do embedding, tempo de resposta da API e pontuação de similaridade
Contexto técnico
- Gemini Embedding 2 consegue fazer embedding direto de vídeo e compará-lo no mesmo espaço vetorial de 768 dimensões das consultas em texto
- Não é necessário gerar legendas nem fazer captioning de frames separadamente
- Por exemplo, uma consulta em texto como “red truck at a stop sign” pode ser comparada diretamente com um clip de vídeo de 30 segundos
- Isso permite busca semântica abaixo de um segundo mesmo em vídeos com várias horas de duração
Estrutura de custos
- Na configuração padrão (chunks de 30 segundos com 5 segundos de sobreposição), o custo para indexar 1 hora de vídeo é de cerca de US$ 2,84
- A API Gemini processa apenas 1 frame por segundo do vídeo enviado
- O pré-processamento faz downscale para 480p e 5fps com o objetivo de otimizar a velocidade de envio e evitar timeouts
-
Otimizações para reduzir custos
- Pré-processamento (preprocessing) : reduz o tamanho do upload e o tempo de envio
- Salto de quadros estáticos (still-frame skipping) : pula o embedding de trechos sem mudança visual
- Eficaz em vídeos gravados por muito tempo enquanto o carro está estacionado
- Como a consulta de busca faz apenas embedding de texto, o custo é quase zero
- Opções adicionais de ajuste
--chunk-duration, --overlap : controlam o número de chamadas à API
--no-skip-still : faz embedding de todos os chunks
--target-resolution, --target-fps : ajustam a qualidade do pré-processamento
--no-preprocess : envia os chunks originais sem alterações
Limitações e melhorias futuras
- A detecção de quadros estáticos usa uma heurística baseada na comparação do tamanho de arquivos JPEG, o que pode deixar passar movimentos sutis ou incluir incorretamente trechos estáticos
- A qualidade da busca depende dos limites entre chunks; se um evento estiver dividido entre dois chunks, ele pode não ser capturado perfeitamente
- No futuro, isso pode ser melhorado com divisão baseada em detecção de cenas (scene detection)
- O Gemini Embedding 2 está atualmente em fase preview, então o comportamento da API e os preços podem mudar
Compatibilidade e requisitos
- Funciona com qualquer arquivo de vídeo no formato
.mp4 e não se limita a vídeos do Tesla Sentry Mode
- Explora recursivamente todos os arquivos
.mp4, independentemente da estrutura de pastas
- Requisitos
- Python 3.10 ou superior
ffmpeg instalado (ou uso automático de imageio-ffmpeg)
- Chave da API Gemini obrigatória (é possível obter uma chave gratuita em: aistudio.google.com/apikey)
1 comentários
Comentários no Hacker News
Achei essa abordagem de implementação muito legal. Embeddings ainda parecem meio mágicos
Mas a maior preocupação é o potencial de essa tecnologia levar a uma sociedade de vigilância no mundo real
Hoje já existem inúmeras câmeras, mas é impossível uma pessoa assistir a todas as imagens, então ainda existe certo grau de anonimato e privacidade
Porém, se a IA puder analisar todos os vídeos em tempo real e detectar pessoas ou comportamentos específicos em linguagem natural, o panóptico pode virar realidade
Pode haver usos positivos, como detecção de crimes ou de quedas, mas sem regulação o resultado pode ser muito perigoso
Dizem que ele integra vários sistemas de câmeras, ALPR e alertas, e permite consultas em linguagem natural sobre vídeos
Também disseram que, no futuro, câmeras instaladas por cidadãos serão integradas. No fim, se isso se conectar a um serviço como o app Citizen, podemos acabar num mundo em que a câmera do vizinho fica ligada diretamente ao sistema da polícia
É uma direção realmente preocupante
Por isso, acho importante processar esse tipo de coisa com modelos locais, para que o vídeo não saia do dispositivo
Mas a direção geral dessa tecnologia precisa ser pensada com muito cuidado
O problema surge quando algo é implantado em larga escala, como Flock ou Ring, ou quando uma única empresa tem acesso a todos os vídeos
Parece que a IA multimodal vai provocar uma corrida armamentista entre detecção e inserção de anúncios
No passado, experimentei remover anúncios com IA usando um modelo anterior ao Gemini, mas essa tecnologia nova parece muito mais poderosa e deve conseguir identificar, silenciar ou remover anúncios imediatamente
Resumi os experimentos relacionados aqui
No fim, os anúncios não vão desaparecer. O provedor de IA pode receber uma whitelist de anúncios ou, pior ainda, a própria IA pode acabar promovendo produtos anunciados
Comprei uma dashcam da Rexing há alguns meses, mas acessar os vídeos é tão inconveniente que estou pensando em montar meu próprio sistema
Quero conseguir navegar e baixar os vídeos sem precisar tirar o cartão SD
Enquanto rolava as gravações, pensei: “seria ótimo poder buscar esta cena em linguagem natural”, e ao ver este projeto já tive vontade de aplicar a ideia na hora
Obrigado por compartilhar
Fiquei pensando se isso poderia ser aplicado a um software de edição de vídeo
Por exemplo, num plugin para o Premiere, algo como “remova todas as cenas com gatos” e ele gerar automaticamente uma EDL (Edit Decision List)
O SentrySearch já retorna timestamps precisos de entrada/saída para consultas em linguagem natural e faz cortes automáticos com ffmpeg
Expandir isso para uma EDL ou um plugin para o Premiere seria uma evolução natural
Não sou especialista em Premiere, mas se alguém quiser tentar um exportador de EDL ou um plugin, eu toparia ajudar revisando e fazendo merge de PRs
Se alguém começar, seria ótimo avisar em uma issue no GitHub
Tenho curiosidade se isso também pode funcionar com modelos locais
Isso também parece interessante para monitoramento residencial, não só para dashcams
Avançando rapidamente para frente e para trás, dá para encontrar com facilidade uns 30 segundos de alguém se aproximando da porta
Uma vez passei horas revisando vídeos para ver se meu gato tinha saído quando a porta abriu, mas na verdade ele estava escondido dentro de casa
Eu também estou tocando um projeto com embeddings, embora ainda esteja em fase de protótipo
No meu caso, não é com Gemini, e sim um sistema para criar quebra-cabeças de associação reversa (reverse connections) para jogos
Dá para ver mais sobre isso aqui
Vi a parte do código que verifica se “o trecho de vídeo é majoritariamente um frame estático”, e acho que daria para automatizar isso combinando os parâmetros select e scene do ffmpeg
Eu trabalho na área de content/video intelligence
O Gemini é uma ferramenta realmente muito adequada para esse tipo de caso de uso
Ri ao ver, na demo, a busca por “quando um carro com suporte para bicicleta atrás me fechou à noite”
Provavelmente encontrar esse carro foi a verdadeira motivação para criar o projeto