2 points par GN⁺ 4 일 전 | 1 commentaires | Partager sur WhatsApp
  • 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 GX sont 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

 
GN⁺ 4 일 전
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

    • Mon projet a été mentionné dans les commentaires quand l’article était en première page, donc je suis allé voir
      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 ?

    • Les « 669GB », c’était la taille totale des rushes source utilisés pour le traitement, et j’ai réduit chaque frame en 720p pour accélérer la vitesse de traitement
      À 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

    • Les modèles de machine learning open source deviennent de plus en plus bons
      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...
    • Tu utilises Android et iOS tous les deux, ou bien il y a un autre avantage à garder tes médias personnels sur les deux plateformes ?
    • Ça ne te pose pas problème que Google entraîne ses modèles et ses algorithmes publicitaires avec tes enfants ?
      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

    • Je n’ai pas encore regardé ça
      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 ?

    • J’utilise du RAG, et j’ai indexé toutes les scènes vidéo individuellement dans une base de données vectorielle
      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 ?

    • Pour cet usage, il faudra probablement un LoRA. Le refus des contenus porno est très fort
      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
    • Voilà une question importante
    • Je ne sais pas pourquoi c’est toujours la même question
      J’ai eu exactement la même quand j’ai posté le projet sur Reddit
    • Quand j’ai testé Whisper il y a longtemps, il hallucinait des conversations sophistiquées à partir de simples bruits de coups et de gémissements, et il lui fallait plusieurs minutes pour les réciter ligne par ligne
    • Je ne sais pas si c’est ironique, mais je trouve la question intéressante
      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...

    • À plusieurs égards, c’est plutôt une comparaison entre des pommes et des oranges, mais les deux facteurs qui pèsent le plus sont les suivants
      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
    • La comparaison ne tient pas
      Le M1 Max a une bande passante mémoire de 400GB/s, et même le tout dernier Snapdragon X2 Elite plafonne à 228GB/s
    • Dire qu’ils sont « comparables » peut être plus ou moins vrai si on parle des performances en mono-cœur, mais côté bande passante mémoire, le M1 Max est environ 8 fois plus rapide
      Avec un bus plus large et une latence plus faible, ce n’est tout simplement pas la même catégorie
    • Je ne peux ni confirmer ni infirmer sur cette question
      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

    • Tu peux revérifier ? Je ne comprends pas bien pourquoi tu vois une erreur Cloudflare
  • Le lien : https://iliashaddad.com/blog/i-indexed-669-gb-of-my-gopro-vi...