TP3: Morphage de visages

Le but de ce tp est d'implémenter le morphage de visage.

Morphage

Voici le vidéo produit avec la fonction de morphage transformant mon visage vers le visage suivant dans la liste.

In [1]:
from IPython.display import display, HTML, Image
HTML(data='<video controls alt="test" src="../video/out_normal.mp4" width="800" height="400">')
Out[1]:

Visage moyen

En utilisant la même fonction de morphage, on peut déterminer l'apparence du visage moyen.

La première étape consiste à faire la moyenne des ensembles de points pour tous les visages. On détermine ensuite la triangulation en utilisant ce nouvel ensemble de points. Il s'agit ensuite d'effectuer le morphage de tous les visages dans la classe vers le visage moyens en utilisant un paramètre de dissolution de 0.

Voici une figure représentant les visages de la classe transformé vers le visage moyen. Une photo a été laissé de côté puisque les points n'étaient pas aligné avec la photo.

In [2]:
display(Image('images/classe_moyenne.png'))

Pour obtenir le visage moyen, on doit simplement faire la moyenne de tous les visages présentées à la figure précédente.

In [3]:
display(Image('images/visage_moyen.png'))

Centrer les visages

Étant donné que les visages ne sont pas centrés dans les images originales, la transformation des visages comprend beaucoup de translation. Pour diminuer l'impact de celles-ci, il est possible d'aligner les centres de masses des deux images avant de calculer les transformations.

Le vidéo présente le résultat de cette technique.

In [4]:
HTML(data='<video controls alt="test" src="../video/out_center.mp4" width="800" height="400">')
Out[4]:

Analyse en Composante Principales

Le morphage peut également être utilisé pour augmenter la performance des Eigenfaces. En effet, les eigenfaces nécessitent d'avoir des visages alignées pour pouvoir être utilisés puisque chaque pixel correspond à une dimension. En alignant les visages sur le visage moyens, la correspondance entre les pixels et les traits est donc amplifié et l'efficacité des eigenfaces aussi.

La figure suivante présente les eigenfaces calculées à partir des photos de la classe.

In [5]:
display(Image('images/eigen.png'))

Caricatures

En utilisant la même technique que pour le visage moyen, on peut créer des caricatures amusantes. Par exemple, en utilisant les points du visage du "Grumpy Cat" comme destination et en conservant la valeur de dissolution à 0, on peut obtenir les caricatures de toute la classe en "Grumpy Cat". Les résultats sont cependant plutôt bizare.

In [6]:
display(Image('images/grumpy.jpeg'))
In [7]:
display(Image('images/classe_grumpy.png'))

Autres expériences

Voici le résultat de la transformation d'Obi Wan Kenobi.

In [8]:
HTML(data='<video controls alt="test" src="../video/obiwan.mp4" width="800" height="400">')
Out[8]: