Indexer 669 Go de vidéos GoPro avec un ordinateur M1 Max et des modèles de ML locaux
(iliashaddad.com)- Pour retrouver le moment voulu sans revoir une à une 2 207 vidéos GoPro de cyclisme, indexation et recherche des vidéos avec des modèles de ML locaux, puis envoi direct des meilleurs clips vers une timeline DaVinci Resolve
- Utilisation d’une version desktop optimisée pour Apple Silicon comme le M1 Max : il suffit de demander la scène souhaitée à un agent conversationnel pour l’envoyer directement vers la timeline de montage
- Mise en place d’un pipeline d’indexation composé de la transcription OpenAI Whisper, de l’analyse d’images (reconnaissance faciale, détection d’objets, texte à l’écran, description de scène) et d’embeddings dans une base vectorielle
- L’indexation de 628 vidéos (668,68 Go, 15 h 13 min 18 s) a nécessité au total 67 h 40 min 42 s de calcul, soit une vitesse d’environ 4,4 fois plus lente que la lecture en temps réel
- Tout le traitement s’effectue sur le GPU/CPU local, ce qui permet de rechercher dans une volumineuse bibliothèque vidéo sans cloud ; le projet est encore en cours de développement
Vue d’ensemble du projet et motivation
- 2 207 vidéos GoPro filmées lors de voyages à vélo sont stockées sur un seul SSD, et l’objectif est de pouvoir y rechercher des moments marquants sans avoir à tout revoir
- La plupart des moments ont bien été filmés avec une GoPro, mais il faut regarder les vidéos jusqu’au bout pour retrouver les bons passages, ce qui est inefficace
- Historique cycliste : 2024 Casablanca→Imsouane (plus de 470 km en 5 jours), 2023 Kenitra→Tangier (220 km en un jour et demi), avec entre les deux quelques trips en VTT
- Pour résoudre ce problème, création du projet edit-mind
- Repo GitHub : https://github.com/IliasHad/edit-mind
Pourquoi utiliser l’application desktop
- Choix de la version desktop optimisée pour Apple Silicon, qui permet de retrouver les moments voulus via un agent conversationnel et de les envoyer directement dans la timeline de montage DaVinci Resolve
- La version Docker n’a pas accès au GPU du M1 Max, et ne peut donc pas exploiter ses performances GPU
- L’application desktop utilise un processus d’indexation similaire à celui de la version source-available
Processus d’indexation
- Lorsqu’un dossier est sélectionné dans l’application desktop, seules les vidéos dont le nom commence par
GXsont explorées afin de les distinguer des vidéos du téléphone - S’il existe une piste audio, l’intégralité de la vidéo est transcrite avec le modèle OpenAI Whisper
- Le pipeline d’analyse d’images est ensuite exécuté, en découpant la vidéo en scènes individuelles à raison d’une image par seconde (1 fps)
- Il inclut un plugin de reconnaissance faciale basé sur des données faciales personnalisées, la détection d’objets, le texte affiché à l’écran, le type de plan et la description de scène
- Les données de visages, de transcription et de description de chaque scène sont vectorisées sous forme de texte documentaire puis stockées dans une base vectorielle locale
- Les frames des scènes sont intégrées dans une collection de base vectorielle d’embeddings visuels pour la recherche d’images, et l’audio des scènes est traité de la même manière
- Au final, on obtient 3 collections de base vectorielle contenant les informations vidéo
- Avec notamment les métadonnées de localisation, le nom de la caméra, les visages reconnus, les objets détectés, le texte à l’écran, la transcription et la description de chaque scène
Indicateurs de performance
- Ces mesures concernent des vidéos indexées avec le GPU et le CPU de la machine ; le projet étant encore en développement, ce ne sont pas des chiffres définitifs
-
Indicateurs globaux
- Vidéos indexées : 628
- Volume total des vidéos : 668,68 Go
- Durée totale des vidéos : 15 h 13 min 18 s
- Temps total de calcul : 67 h 40 min 42 s
- Vitesse par rapport à la lecture : 0,22×, soit environ 4,4 fois plus lent que la lecture
- Frames analysées : 57 537
-
Analyse par étape (temps total / moyenne par vidéo / part du calcul)
- Transcription : 25 h 12 min 54 s / 2 min 25 s / 37,3 %
- Analyse d’images : 24 h 55 min 42 s / 2 min 23 s / 36,8 %
- Création des scènes : 48 min 0 s / 5 s / 1,2 %
- Embedding texte : 36 min 42 s / 5 s / 0,9 %
- Embedding visuel : 11 h 49 min 17 s / 1 min 9 s / 17,5 %
- Embedding audio : 4 h 18 min 7 s / 27 s / 6,4 %
Fonctionnalités de recherche
- Préférence pour une interaction via un assistant de chat pour poser des questions sur les vidéos, avec une option pour envoyer immédiatement les résultats vers la timeline de montage DaVinci Resolve
- En mode d’indexation avancé, l’utilisation du modèle Qwen2.5-VL-7B-Instruct permet d’obtenir des données d’indexation qui comprennent et décrivent mieux les vidéos, au prix d’une indexation plus lente
- Cette approche permet d’indexer les vidéos GoPro, de retrouver et d’envoyer les scènes souhaitées, puis de produire une vidéo à partir des meilleurs clips
Comparaison matérielle et état du développement
- L’exécution sur un GPU NVIDIA comme une RTX 3060 (12 Go de VRAM) s’est révélée plus rapide que sur un M1 Max
- Le projet est toujours en cours de développement, avec des améliorations en cours sur la précision et l’optimisation des performances
Exemples de prompts utilisés
- « Trouve tous les clips où un chien aboie pendant que je fais du vélo »
- « Crée un highlight reel avec les moments les plus beaux et les plus intéressants de mon voyage à vélo »
- « Montre-moi les moments de ride à la première personne les plus rapides où l’on entend le vent, puis envoie-les à DaVinci Resolve en supprimant les scènes en double »
1 commentaires
Commentaires Hacker News
C’est amusant de voir que j’ai fait pratiquement la même chose sur une machine similaire il y a quelques jours, et que ça a aussi fini en première page de HN
https://news.ycombinator.com/item?id=48222733
https://blog.simbastack.com/indexed-a-year-of-video-locally/
Je ne connaissais pas ce projet, mais il est intéressant
Je suis en train d’ajouter plus de fonctionnalités liées aux photos à Framedex, et c’est une période enthousiasmante avec tout ce qu’on peut désormais faire en local
L’article comme le projet étaient excellents, et les modèles locaux deviennent de plus en plus performants
Je pense que ce genre de travail va se faire avec des LLM locaux
Faire tourner en local des LLM rapides, petits et puissants pour indexer des données personnelles comme des images, des vidéos ou des documents, les enrichir, puis leur appliquer des tags à partir des métadonnées enrichies
Si on veut regrouper par personne, on cherche dans les métadonnées taguées puis on groupe, si on veut retrouver une image à partir d’une description, on utilise aussi les métadonnées taguées, et si on veut organiser n’importe quoi, on passe par ces métadonnées taguées
J’espère que ça mettra fin au chaos de l’organisation des fichiers
Quand je lis « exécuter le pipeline d’analyse des frames découpe la vidéo en scènes séparées (une par seconde ou à 1 fps) » et « 57 537 frames analysées », ça devient plus clair
Ce chiffre paraît bien plus réaliste que « 669GB », et la taille totale réelle des frames traitées devait sans doute être autour de 10 à 30GB
Ce n’est pas pour rabaisser le travail, juste pour dire que si on veut le faire soi-même à la maison, il faut toujours faire le calcul côté praticité
Avec un « temps de calcul total de 67 heures 40 minutes 42 secondes », je me demande aussi s’il existe une option payante pour faire ce genre de processus plus vite. Il suffit de lancer une instance GPU ?
À ma connaissance, on n’a pas besoin de la qualité intégrale des originaux pour obtenir des résultats précis, et mes expériences vont dans ce sens
Jusqu’ici, les GPU NVIDIA comme une RTX 3060 avec 12GB de VRAM étaient bien plus rapides que le M1 Max, et je continue encore à optimiser la vitesse et la précision
Une fonctionnalité plus agréable que prévu, c’est que Google Photos et Apple Photos m’envoient des souvenirs photo et compilations de différents moments de ma vie et de celle de mes enfants sur les dix dernières années
Je suis assez optimiste sur le fait qu’il deviendra de plus en plus facile pour l’IA d’en faire plus tard de jolies petites vidéos de compilation, donc ça me motive à filmer davantage mes enfants
J’ai fait une petite expérimentation pour générer une vidéo type Spotify Wrapped, et il y a un aperçu ici https://github.com/IliasHad/edit-mind/tree/expirement/year-i...
Dans quelques années, tu vas recevoir des trucs du style « regardez le dernier vélo pas cher de BIKE BRAND, vous vous souvenez quand vous rouliez déjà en vélo BIKE BRAND »
DaVinci 21 intègre une fonction d’indexation appelée AI IntelliSearch
Ce n’est pas pour dénigrer le travail, mais c’est désormais une fonctionnalité disponible pour beaucoup d’utilisateurs. Comme il y a AI dans le nom, c’est probablement réservé aux utilisateurs Studio
Mais je me demande si les vidéos sont envoyées dans le cloud ou si le traitement se fait en local
Et je me demande aussi si on peut fournir des données de visages personnalisées pour aider à étiqueter les visages dans les vidéos
Il me semble qu’Adobe Premiere Pro a une fonction similaire, mais si j’ai bien compris, le traitement se fait dans le cloud
Beau travail
En revanche, je n’ai pas bien compris comment les reels sont créés via l’agent
Est-ce que c’est une sorte d’appel d’outil IA qui prend des liens d’images pour fabriquer un reel avec un outil de montage vidéo, ou est-ce que ça coupe et assemble les segments autour des timestamps renvoyés par l’index pour une requête donnée ?
Quand on fait une demande à l’agent, le modèle Ollama comprend la requête et utilise les outils de recherche disponibles. La recherche peut se faire sur la transcription, les visages, les informations visuelles, l’audio, ou une combinaison de tout ça
C’est similaire à la manière dont Claude ou ChatGPT utilisent un outil de recherche web pour trouver des informations en ligne
Ensuite, j’utilise Ollama pour filtrer les scènes vidéo afin d’afficher des scènes plus précises et moins redondantes, puis j’envoie le résultat à l’API de DaVinci Resolve pour créer une timeline avec les clips vidéo
Ça marche aussi pour une compilation porno ?
Ou alors il faudra un modèle décensuré, mais je ne sais pas si ça existe aussi côté vision
Tu pourrais aussi avoir envie d’ajouter du fine-tuning YOLO pour la détection de scènes et la reconnaissance faciale
J’ai eu exactement la même quand j’ai posté le projet sur Reddit
Comme DeepSeek tourne en local, est-ce que ça pourrait être utile pour ce genre d’usage ?
J’ai été surpris d’apprendre que le CPU M1 Max est un ARM/SoC et qu’il est comparable à un Intel i9 de 11e génération
Est-ce que j’ai bien compris ? Windows ARM aurait des performances similaires avec ce type de CPU ?
Référence : https://www.cpubenchmark.net/compare/4585vs4245/Apple-M1-Max...
La mémoire « unifiée » permet d’utiliser toute la mémoire système comme de la VRAM, et il y a aussi un accélérateur IA dédié
À eux deux, ces éléments permettent aux puces Apple Silicon d’écraser les CPU classiques sur ce type de charges de travail de modèles d’IA
Je ne sais pas jusqu’où Windows ARM peut aller de ce côté-là, mais je sais qu’ils utilisent des puces Qualcomm Snapdragon
Le M1 Max a une bande passante mémoire de 400GB/s, et même le tout dernier Snapdragon X2 Elite plafonne à 228GB/s
Avec un bus plus large et une latence plus faible, ce n’est tout simplement pas la même catégorie
Je n’ai pas encore essayé ce projet sur une machine Windows ni sur une configuration de ce type
https://archive.is/O6CLQ
J’ai essayé de lire l’article, mais le site principal renvoyait malheureusement une erreur Cloudflare
Le lien : https://iliashaddad.com/blog/i-indexed-669-gb-of-my-gopro-vi...