- Système de recherche sémantique qui permet de rechercher des scènes en langage naturel dans des fichiers vidéo, comme des vidéos de dashcam, puis de découper automatiquement la portion correspondante
- Utilise le modèle Google Gemini Embedding 2 pour encoder directement la vidéo en vecteurs, stockés dans ChromaDB afin de les comparer directement à des requêtes textuelles
- Les vidéos sont encodées via ffmpeg en chunks qui se chevauchent, et la recherche renvoie les passages les plus proches à une vitesse sub-seconde
- Des fonctions de prétraitement et de saut des images fixes réduisent le coût des appels API, avec un coût d’environ 2,84 $ pour indexer 1 heure de vidéo
- Exploite la fonction d’embedding vidéo direct de Gemini Embedding 2 pour permettre une recherche sémantique rapide dans des vidéos de plusieurs heures sans génération de sous-titres
Aperçu
- SentrySearch est un outil de recherche sémantique dans des vidéos de dashcam qui renvoie un clip découpé (trimmed clip) contenant la scène recherchée lorsqu’un utilisateur saisit une requête en langage naturel
- Il utilise le modèle Google Gemini Embedding 2 pour encoder directement la vidéo en vecteurs, puis les stocke dans la base locale ChromaDB
- La requête textuelle est encodée dans le même espace vectoriel afin de retrouver les fragments vidéo les plus similaires
- Le résultat de la recherche est automatiquement découpé depuis le fichier source et enregistré, avec une vitesse de recherche sub-seconde
Fonctionnement
- Les vidéos sont divisées en segments qui se chevauchent (overlapping chunks), chacun étant directement encodé via le modèle Gemini Embedding
- Chaque vecteur d’embedding est stocké dans ChromaDB, et lors d’une recherche, la requête textuelle est convertie dans le même espace vectoriel pour le matching
- Le segment avec le score de similarité le plus élevé est automatiquement découpé du fichier d’origine et enregistré comme clip
- ffmpeg est utilisé pour le découpage et le trimming des vidéos ; s’il n’est pas installé sur le système,
imageio-ffmpeg est utilisé automatiquement
Installation et configuration initiale
- Installation possible sous Python 3.10 ou supérieur avec la commande suivante
- après
git clone, exécuter pip install -e .
- La commande
sentrysearch init permet de configurer la clé API Gemini et de l’enregistrer dans le fichier .env
- un embedding de test est effectué pour valider la clé
- En configuration manuelle, il est possible de copier
.env.example puis d’ajouter directement la clé API
Commandes et options principales
-
index
- lance l’indexation en analysant récursivement les fichiers
.mp4 dans le dossier indiqué
- chaque fichier est découpé en plusieurs chunks avant encodage
- options
--chunk-duration : durée d’un chunk (en secondes)
--overlap : durée de chevauchement entre les chunks
--no-preprocess : désactive la réduction de résolution et de fréquence d’images
--target-resolution : résolution cible du prétraitement (480p par défaut)
--target-fps : fréquence d’images cible du prétraitement (5 fps par défaut)
--no-skip-still : encode aussi tous les segments d’images fixes
-
search
- exemple :
sentrysearch search "red truck running a stop sign"
- les résultats sont affichés avec leur score de similarité, et le meilleur résultat est automatiquement découpé et enregistré
- si le score de similarité est inférieur ou égal au seuil par défaut (0.35), une invite de confirmation s’affiche
- options
--results N : nombre de résultats à afficher
--output-dir DIR : chemin d’enregistrement des clips
--no-trim : désactive le découpage automatique
--threshold : ajuste le seuil de similarité
-
stats
- affiche le nombre total de chunks indexés et le nombre de fichiers source
-
--verbose
- affiche des informations de debug comme la dimension des embeddings, le temps de réponse de l’API et les scores de similarité
Contexte technique
- Gemini Embedding 2 peut encoder directement la vidéo et la comparer à des requêtes textuelles dans le même espace vectoriel à 768 dimensions
- Aucun génération de sous-titres ni captioning de frames séparé n’est nécessaire
- Par exemple, une requête textuelle comme “red truck at a stop sign” peut être comparée directement à un clip vidéo de 30 secondes
- Cette capacité permet une recherche sémantique sub-seconde même dans des vidéos de plusieurs heures
Structure des coûts
- Avec les réglages par défaut (chunks de 30 secondes, chevauchement de 5 secondes), l’indexation d’une heure de vidéo coûte environ 2,84 $
- l’API Gemini ne traite qu’1 frame par seconde dans la vidéo envoyée
- le prétraitement réduit la vidéo à 480p et 5 fps afin d’optimiser la vitesse de transfert et d’éviter les timeouts
-
Optimisations pour réduire les coûts
- prétraitement (preprocessing) : réduit la taille des données envoyées et le temps de transfert
- saut des images fixes (still-frame skipping) : évite d’encoder les segments sans changement visuel
- particulièrement utile pour les longues vidéos enregistrées pendant le stationnement
- les requêtes de recherche n’effectuent qu’un embedding texte, donc le coût est presque nul
- options d’ajustement supplémentaires
--chunk-duration, --overlap : ajustent le nombre d’appels API
--no-skip-still : encode tous les chunks
--target-resolution, --target-fps : ajustent la qualité du prétraitement
--no-preprocess : envoie les chunks d’origine tels quels
Limites et améliorations futures
- La détection des images fixes repose sur une heuristique fondée sur la comparaison de taille de fichiers JPEG, ce qui peut rater des mouvements subtils ou inclure à tort des segments statiques
- La qualité de recherche dépend des frontières de chunks ; si un événement s’étend sur deux segments, il peut ne pas être capturé parfaitement
- une amélioration future pourrait passer par un découpage basé sur la détection de scènes (scene detection)
- Gemini Embedding 2 est actuellement en phase preview, et le comportement de l’API ainsi que la tarification peuvent évoluer
Compatibilité et prérequis
- Fonctionne avec tous les fichiers vidéo au format
.mp4 et n’est pas limité aux vidéos Tesla Sentry Mode
- Explore récursivement tous les fichiers
.mp4 quelle que soit l’arborescence des dossiers
- Prérequis
- Python 3.10 ou supérieur
ffmpeg installé (ou utilisation automatique de imageio-ffmpeg)
- clé API Gemini requise (clé gratuite disponible : aistudio.google.com/apikey)
1 commentaires
Commentaires Hacker News
Je trouve cette implémentation vraiment impressionnante. Il y a toujours quelque chose de presque magique dans les embeddings
Mais ce qui m’inquiète le plus, c’est le potentiel de ce genre de technologie à nous faire basculer vers une société de surveillance
Aujourd’hui, il y a déjà d’innombrables caméras, mais en pratique personne ne peut regarder toutes les vidéos, ce qui préserve encore un certain degré d’anonymat et de vie privée
En revanche, si une IA peut analyser tous les flux en temps réel et détecter une personne ou un comportement spécifique en langage naturel, le panoptique pourrait devenir une réalité
Il y aurait bien sûr des usages positifs, comme la détection de crimes ou de chutes, mais sans régulation, les conséquences pourraient être très dangereuses
Il intégrerait différents systèmes de caméras, l’ALPR et les alertes, avec la possibilité de faire des requêtes vidéo en langage naturel
Apparemment, ils prévoient aussi d’y intégrer à l’avenir des caméras installées par des particuliers. Si cela finit par se connecter à un service comme l’app Citizen, on pourrait se retrouver dans un monde où les caméras des voisins seraient reliées directement au système de la police
C’est une direction vraiment inquiétante
C’est pour cela que je pense qu’il est important de traiter ce genre de choses avec des modèles locaux, afin que les vidéos ne quittent pas l’appareil
Mais il faut aussi réfléchir avec prudence à la trajectoire globale de cette technologie
Le problème apparaît avec des systèmes massivement déployés comme Flock ou Ring, ou lorsqu’une seule entreprise peut accéder à toutes les vidéos
J’ai l’impression que l’IA multimodale va déclencher une course aux armements entre la détection de publicité et l’insertion de publicité
J’avais déjà expérimenté la suppression de pubs par IA avec un modèle antérieur à Gemini, mais cette technologie semble bien plus puissante et pourrait identifier, couper ou supprimer les pubs presque instantanément
J’ai résumé quelques expériences liées à ça ici
Au final, les publicités ne disparaîtront probablement pas. Les fournisseurs d’IA pourraient accepter des listes blanches publicitaires, ou pire encore, l’IA elle-même pourrait promouvoir directement des produits sponsorisés
J’ai acheté une dashcam Rexing il y a quelques mois, mais l’accès aux vidéos est tellement pénible que j’ai envie de construire mon propre système
J’essaie de pouvoir parcourir et télécharger les vidéos sans avoir à retirer la carte SD
En faisant défiler les enregistrements, je me suis dit que ce serait génial de pouvoir rechercher cette scène en langage naturel, et en voyant ce projet, j’ai tout de suite eu envie de l’essayer
Merci du partage
Je me demande si cette technologie pourrait s’appliquer à un logiciel de montage vidéo
Par exemple, un plugin Premiere qui permettrait de dire « supprime-moi toutes les scènes avec un chat » et qui construirait automatiquement une EDL (Edit Decision List)
SentrySearch renvoie déjà des timestamps d’entrée et de sortie précis pour les requêtes en langage naturel, et lance automatiquement le découpage avec ffmpeg
L’étendre vers une EDL ou un plugin Premiere serait une évolution naturelle
Je ne suis pas spécialiste de Premiere, mais si quelqu’un veut tenter un exporteur EDL ou un plugin, je serais ravi d’aider pour la revue de PR et la fusion
Si vous vous lancez, ce serait bien de me prévenir via une issue GitHub
Je me demande si cela pourrait aussi fonctionner avec des modèles locaux
Ce n’est pas intéressant seulement pour les dashcams, mais aussi pour la surveillance domestique
En faisant avancer rapidement la vidéo, on peut généralement retrouver assez facilement les 30 secondes où quelqu’un s’approche de la porte
Un jour, j’ai passé des heures à faire défiler des vidéos pour vérifier si mon chat était sorti quand la porte s’était ouverte, alors qu’en réalité il était juste caché dans la maison
Je travaille moi aussi sur un projet autour des embeddings, même si ce n’est encore qu’au stade du prototype
Dans mon cas, ce n’est pas avec Gemini, mais pour créer des puzzles de connexions inversées pour des jeux
On peut voir ça ici
J’ai regardé la partie du code qui vérifie si un extrait vidéo est majoritairement composé d’images fixes, et il me semble qu’on pourrait automatiser ça avec une combinaison des paramètres select et scene de ffmpeg
Je travaille dans le domaine de la content/video intelligence
Gemini est un outil particulièrement bien adapté à ce type de cas d’usage
J’ai ri en voyant, dans la démo, la recherche du moment où « une voiture avec un porte-vélos à l’arrière m’a coupé la route la nuit »
C’était probablement la vraie motivation derrière ce projet