Projet final : Transformations guidées par l'audio
Par Pierre-Marc Levasseur
Description
L'idée principale derrière ce projet est de générer des vidéos dont le contenu visuel est modifié par la bande audio. Pour ce faire, j'ai exploré deux types de transformations sur les images qui peuvent être paramètrées de manière intéressante par une bande audio. Donc, dans la première partie, j'ai développé un algorithme pour apparier les bandes de fréquences des images avec celle de l'audio. Dans la seconde, j'utilise mon algorithme de morphage de visage développé au tp3 et l'ensemble d'images de la base de données d'Utrecth pour générer des transformations guidées par l'audio.
Partie 1 : Appariement de bandes de fréquences audio/vidéo
Dans cette partie, mon but était d'apparier différentes bandes de fréquences d'une image avec différentes bandes de fréquences d'une piste audio pour générer une vidéo dont le contenu visuel correspond au contenu fréquentiel de la piste audio. Pour ce faire, j'ai développé un petit algorithme qui me génère une pile laplacienne à partir d'une image avec un nombre de bandes variable. Ensuite, j'ai développé une classe qui est en mesure de séparer un segment d'une piste audio en plusieurs bandes de fréquences. Pour développer cette classe, j'ai utilisé les outils de génération de filtres dans les outils de traitement de signal de Matlab. Avec ces outils en main, j'ai développé une métrique pour apparier de manière intéressante les différentes bandes de fréquences.
Métrique
La métrique est assez simple. Premièrement, les basses fréquences de l'image sont liées aux basses fréquences de l'audio et les hautes fréquences de l'image sont liées aux hautes fréquences de l'audio (et les bandes intermédiaires sont liées de la même façon). Ensuite, pour contrôler l'intensité d'une bande de fréquences de l'image, je calcul la moyenne des échantillons maximums de la bande audio correspondante et je multiplie les pixels de l'image correspondante avec la valeur trouvée. Ensuite, puisque les variations de la bande audio peuvent être très rapide, j'ai développé une classe qui gère les niveaux des différentes bandes de fréquences de l'image de manière à retenir les maximums d'intensité un peu plus longtemps. Pour chacune des bandes, je fais une gestion du niveau maximum qui ressemble à ceci : lorsqu'on atteint un nouveau niveau maximum pour une bande donnée, l'intensité de la bande de fréquences restera à ce maximum pour un certain temps d'attente (hold time). Dans mon cas, j'ai fixé ce temps d'attente à 5 frames. Quand ce temps d'attente est écoulé, le niveau d'intensité de la bande est réduit graduellement selon une certaine valeur de réduction (decay value). Dans mon cas, j'ai fixé cette valeur à -1% par frame. Finalement, dès que l'intensité d'une bande dépasse son maximum courant, son temps d'attente est réinitialisé et le processus recommence.
Algorithme
Donc, l'algorithme qui génère le vidéo suit les étapes suivantes:
- 1. Lire une image et générer la pile laplacienne.
- 2. Lire un fichier audio et sa fréquence d'échantillonage.
- 3. Calculer la quantité d'échantillon par image pour le vidéo (dans mon cas, 24 fps avec une fréquence d'échantillonage de 44.1 kHz me donne 1837.5 échantillons par image).
- 4. Calculer la longueur du vidéo (en nombre de frame) à partir de la longueur de la piste audio.
- 5. Pour chaque frame:
- - Prendre les échantillons correspondant à l'image et séparer le segment en un certains nombre de bandes de fréquences.
- - Utiliser la métrique décrite ci-dessus calculer l'intensité de chacune des bandes de fréquences.
- - Combiner la pile laplacienne avec les niveaux ajustés pour générer un frame.
Résultats
Voici quelques résultats que j'ai généré avec mon algorithme. Le premier est un simple balayage des fréquences pour nous donner une idée de comment les différentes bandes de fréquences sont liées ensembles.
Ce second résultat contient une piste audio avec un contenu fréquentiel un peu plus varié.
Ce dernier résultat a été généré à partir d'un vidéo (originale à gauche).
Difficultés et considérations techniques
Comme le résultat de ce projet n'était pas totalement claire au début, j'ai dû beaucoup expérimenter pour en arriver à un résultat intéressant. Initialement, je prenais la moyenne de chaque bandes de fréquences audio et je l'appliquait directement à la bande correspondante dans la pile laplacienne. Les résultats fonctionnaient, mais ils étaient très peu intéressant. Les variations d'intensité dans les fichiers audio peuvent être rapides et parfois assez subtil. Donc, les vidéos que je génèrais avaient tendance à clignoter et il était plutôt difficile de comprendre comment l'audio intéragissait avec l'image. C'est pourquoi j'ai développé le système de temps d'attente et de réduction graduelle d'intensité.
Ensuite, j'ai générer plusieurs vidéo assez long donc avec une grande quantité d'images (2000 images et plus). Pour être en mesure de générer les vidéos, j'ai donc dû générer les images et les sauvegarder directement sur le disque plutôt que les garder en mémoire. Ensuite, pour faire l'assemblage des images et l'ajout de la piste audio j'ai utilisé le logiciel Blender en mode "video sequence editor".
Finalement, j'ai dû éditer plusieurs fichier audio pour ajuster la longueur de la séquence ou pour faire du traitement spectral. Pour ce faire, j'ai utiliser le logiciel Reaper.
Partie 2 : Morphage de visage guidé par l'audio
Mon but dans cette deuxième partie était de générer des transformations sur des photos de visages à partir d'un fichier audio et des images de la base de données d'Utrecht. J'ai donc utilisé le détecteur de visage fournis au tp3 pour détecter les points d'intérêts de toutes les images de la base de données. Avec ces points, j'ai formé une grande matrice sur laquelle j'ai fait une analyse en composantes principales. Cette analyse me donne une série de vecteurs représentant les axes de déformation principale du visage moyen. En d'autre mots, un vecteur résultant de cette analyse représente une configuration des points qui correspond à la dispersion de l'ensemble des points dans un certain axe.
Métrique
Pour transformer une photo de visage avec l'analyse des points et un fichier audio et finalement générer un vidéo, j'ai utilisé une métrique semblable à celle de la première partie. Donc, encore une fois pour chaque image du vidéo, je prend les échantillons correspondant de la piste audio, je fais la séparation en plusieurs bandes de fréquences et je calcul la moyenne des échantillons maximums. Cette fois par contre, les valeurs calculées serviront dans la formule suivante:
P' = P + α1v1 + α2v2 + ... + αnvn
- où
P'
: Points du visage transformésP
: Points du visage originauxαi
: valeur calculée à partir d'une bande de fréquences (basses fréquences en premier)vi
: vecteur résultant de l'analyse en composantes principales en ordre d'importancen
: nombre de bandes de fréquences utilisé
Le résultat de cette formule nous donne donc les points du visage transformés par l'intensité de chacune des bandes audio dans les directions les plus importantes selon
l'analyse en composantes principales. Encore une fois, j'utilise ma mécanique de temps d'attente que j'ai développé dans la partie 1 sur chaque bande de fréquences (donc
sur les valeurs αi
dans la formule précédente).
Algorithme
L'algorithme que j'ai développé dans cette partie a la même structure générale que celui de la première partie. Il suit donc les étapes suivantes:
- 1. Charger une image et extraire les points correspondant au visage.
- 2. Charger un fichier audio et sa fréquence d'échantillonage.
- 3. Charger une source de données (dans mon cas, les points des visages de la bases de données d'Utrecht).
- 4. Calculer la quantité d'échantillon par frame.
- 5. Calculer la longueur du vidéo.
- 6. Faire l'analyse en composantes principales de la source de données.
- 7. Pour chaque frame:
- - Prendre les échantillons correspondant à l'image et séparer le segment en un certains nombre de bandes de fréquences.
- - Transformer les points du visage en utilisant la métrique ci-dessus.
- - Utiliser l'algorithme de morphage développé au tp3 pour transformer le visage et générer un frame.
Résultats
Voici quelques résultats que j'ai généré avec mon algorithme. Premièrement, pour nous donner une idée des transformations que mon algorithme peut provoquer, voici un résultat avec une photo de mon visage et une piste audio d'un balayage de fréquences.
Finalement, puisque j'avais accès aux photos des étudiants de ma classe, j'ai décidé de faire un petit montage des visages de tout le monde transformés par différentes pistes audio. Ne laissez jamais traîner vos photos!