Photographie algorithmique - Eulerian Video Magnification

Introduction

Dans ce travail, j'ai choisi d'implémenter en Python, le papier Eulerian Video Magnification. Ce procédé permet d'amplifier les variations subtiles de mouvements normalement invisibles d'une video. Ce travail a été réalisé avec Python 3.5, Numpy 1.11, Scipy 0.17, Scikit-image 0.12.3 et imageio 1.5.

Pyramide

La première étape est de filtrer spacialement chacune des images de la vidéos avec une pyramide gaussienne ou laplacienne. La première option est adéquate particulièrement pour amplifier les changements de couleurs sur des surfaces alors que la seconde est pratique pour amplifier les fins mouvements.

Filtrage temporel

La deuxième étape est de filtrer temporellement la pyramide. Pour ce faire, on considère la série temporelle représentée par chacun des pixels de chaque pyramide. Chacune de ces séries est filtrée avec un filtre passe-bande soit de Butterworth ou en boîte. La fréquence de coupure de ces filtres est réglée pour conserver le phénomène que l'on veut observer.

Amplification du mouvement

Le mouvement isolé à l'étape précédante est multiplié par une constante de façon à l'amplifier. Il est également possible de représenter le signal dans l'espace de couleur YIQ plutôt que RGB. Dans cette espace, la première composante représente la luminance et les deux autres la chrominance. En amplifiant uniquement la chrominance, on amplifie d'avantage les changements de couleurs que de mouvements.

Niveau 2 de la pyramide
Niveau 4 de la pyramide

Reconstruction de la pyramide

Chacun des niveau de la pyramide maintenant filtré est rabattu dans une seule série d'images.

Difficultés

Le principal problème en lien avec la méthode proposée est une utilisation de la RAM extrêmement élevée. En effet, pour suivre tel quel la procédure décrite plus haut, supposons une video FULL HD de 15 s avec 6 niveaux de pyramide il faut stocker en RAM:

Non-étonnament, les videos utilisées dans le papier sont beaucoup plus petites que 1920x1080 et l'ordinateur utilisé pour les tests avait 32 Go de RAM. Le principal problème est que pour obtenir la meilleure résolution possible dans le domaine spectrale, la FFT doit être calculée sur une grande fenêtre et donc dans un monde idéal, toute la video doit être chargée en mémoire. Par contre, d'autres optimisations peuvent êtes faites pour réduire l'utilisation de RAM.

Traiter séparemment chaque niveau de la pyramide

Pour éviter d'avoir tous les niveaux de la pyramide en mémoire, il est possible d'y aller une étape à la fois. Le premier niveau est traité puis agrandi et ajouté à la video finale. Le processus est recommencé pour chaque niveau de la pyramide.

Sauter les premiers niveaux

Les premiers niveaux de la pyramide sont trop exigeant en RAM et ceux-ci sont simplement sautés. Un avantage de cette technique est que la video peut alors être réduite image par image plutot que niveau par niveau ce qui sauve beaucoup de mémoire. La vidéo originelle n'a donc jamais besoin d'être chargée au complet en RAM. Un paramètre permet de controler le nombre de niveau à sauter.

Segmenter en fonction

De grosses amélioration de l'utilisation de la RAM ont pu être faites en séparant certaines sections de code dans des fonctions. Le Garbage Collector se rend ainsi compte plus vite que des variables peuvent être libérées.

Résultats

Visage filtrée avec pyramide gaussien avec amplification du mouvement et des couleurs
Visage filtrée avec pyramide gaussien avec amplification des couleurs
Visage filtrée avec pyramide laplacienne avec amplification des mouvements et des couleurs
Visage filtrée avec pyramide laplacienne avec amplification des couleurs

Autres résultats préliminaires

Arbre
Bras


Jérôme de Courval