TP3: Morphage de visages

1.A Algorithme de morphage

morph.py

L'algorithme implémenter est celui présenter dans l'énoncé. À partir des points de correspondances, on crée des triangles sur les deux images. Ensuite, on trouve les transformer des triangles de l'image moyenne vers les deux images. Par la suite, on applique la transformer à tous les pixels à l'intérieur du triangle en appliquant un fondu pour obtenir l'image morphée.

Les résultats nous montrent qu'en général l'approche est efficace pour des transformations simples (comme un visage vers un visage), mais est moins réussie pour des transformations complexes (comme les figurines). Dans les transformations moins réussies, on voit apparaître les triangles.

On peut aussi utiliser cette approche pour modifier les expressions du visage. Un exemple est produit en ajoutant un sourire au visage de Trump.

Résultats
Départ Arrivé Résultat
a
b
res
a
b
res
a
b
res
a
b
res
a
b
res
a
b
res

1.A Algorithme de Beier–Neely (Bonus)

morph.py

Le but est d'implémenter un algorithme de morphage qui n'utilise pas les triangles. Cette implémentation est l'algorithme de Beier-Neely (Source).

Au lieu d'utiliser des points et des triangles, cet algorithme trouve la correspondance entre des lignes sur un image source et destination. Pour y arriver, on trouve la correspondance pour chaque pixel avec une ligne perpendiculaire sur la ligne source et ligne destination. La figure suivante illustre ce problème avec seulement une ligne. Example

Dans le cas d'un morphage de visage, on utilise plusieurs lignes où chacune à une correspondance source et destination. Une fonction de poids est calculée en prenant compte de la distance du pixel par rapport aux lignes.

Voici un exemple avec trois lignes seulement appliquées à une seule image. Sur l'image de gauche, on voit l'image originale et sur l'image de droite la transformation est appliquée. En bleu pâle, on peut voir les lignes sources et les lignes destination sont en rouge. On remarque que la transformation n'est pas parfaite avec de grosses taches noires sur les bouts des lignes inférieur et supérieur. De plus, on remarque que les lignes noires de l'image ne superposent pas les lignes rouges de destination. Cependant, dans l'emsenble, la transformation est fonctionnelle. Test

Aussi, voici le même algorithme de morphage appliqué à un visage avec warp_frac=0.5. Test

On remarque que l'algorithme est non fonctionnel. Sur des transformations plus complexes avec un grand nombre de lignes. Pour cette raison, le morphage complet n'a pas été effectué.

1.B Calcul du "visage moyen"

average_face.py Pour trouver le visage moyen, il suffit d'utiliser l'algorithme de morphage vers la position milieu de toutes les images.

On remarque que l'approche avec dlib produit une image moyenne plus nette qu'avec les points manuels. Ceci s'explique, car le nombre de points est supérieur.

Résultats
Triangulation Image moyenne
Étudiant avec points manuels
a
res
Étudiant avec dlib
a
res
Base de données d'Utrecht
a
res

1.B Sourire et sans sourire (Bonus)

average_face.py

La même approche est utilisée, mais cette fois-ci on tri les images avec un sourire et ceux sans sourire. Sans surprise, les deux images semblent identiques à l'exception qu'un semble sourire et l'autre non.

Résultats
Triangulation Image moyenne
Sans sourire
a
res
Avec sourire
a
res

2.B Masculinisation et féminisation de votre visage

transformation.py

Pour féminiser ou masculiniser un visage, il faut d'abord trouver le visage moyen du sexe en question. Par la suite on applique un morph entre le visage moyen et le visage à transformer.

Les résultats nous montrent que ceci fonctionne, mais on voit que le visage a été altéré. On remarque aussi qu'une faible transformation (comme les deux à droite) change un peu le visage en question. Dans ces deux images, on remarque que le visage est plus petit en féminin qu'en masculin et que les poils faciaux ressortent plus avec le second.

Résultats
Original Visage moyen warp_frac=0.8 dissolve_frac=0.5 warp_frac=0.8 dissolve_frac=0.8
Féminisation
ori
avg
a
b
Masculinisation
ori
avg
a
b

2.B Animez votre visage (Bonus)

video.py

L'approche est d'effectuer un morphage d'un visage vers la pose d'un second pour chaque frame d'un vidéo. On remarque que cela fonctionne un peu dans le second vidéo, car le visage original est de face et centrer comme sur l'image source. Cependant, dans le premier vidéo, l'approche est très inefficace, car le visage original n'est pas super bien centré et l'orientation n'est pas comme sur l'image source.

Résultats :

2.B Analyse en Composantes Principales (Bonus)

acp.py

ACP permet de ressortir les caractéristiques de toutes les images en un plus faible nombre. Ainsi, avec seulement 10 composantes et l'image moyenne, il est possible de se rapprocher des 130 images sources.

Voici les 10 composantes extraites des 130 images :

Visage moyen et composantes

ACP

Le code fourni permet aussi d'ajuster chaque poids individuellement à l'aide de curseurs pour ajuster chaque trait.

Curseur d'ajustement des poids

ACP

Voici 10 visages produits avec des poids de composante aléatoires. Les composantes sont appliquées sur l'image moyenne.

Poids aléatoires

ACP