TP3 : Morphage de visages

Partie A

Le but de la première partie est d'implémenter un algorithme de morphage entre deux images. L'algorithme consiste à partir de deux images, et trouver des points de correspondances entre ces dernières. Dans cette partie du TP, les points sont choisis à la main et non à l'aide d'un algorithme. Une fois les points de correspondances obtenus pour les deux images, l'algorithme va comme suit :

  1. Calculer le point moyen entre les points de l'image 1 et les points de l'image 2 (P1 et P2)
  2. Calculer une triangulation de Delaunay à partir des points obtenus.
  3. Calculer une forme intermédisaire entre nos images, à l'aide d'un paramètre α et de nos points de correspondances. Pi = (1 - α) * P1 + α * P2
  4. Calculer les matrices de transformations de chaque triangle entre la forme intermédiaire obtenue et les images de bases. Étant donnée que les matrices de transformations sont des matrices affines, nous avons seulement besoin de 3 paires de points pour trouver nos matrices. Comme nous voulons partir de notre image final vers nos images originales, il faut ensuite calculer les matrices inverses.
  5. Avec les matrices de transformations inverses, il est possible d'aller chercher la valeur RGB du pixel dans chacune des images. Notre deuxième paramètre, β, nous permet de trouver une couleur intermédiaire pour l'image finale. RGBi = (1 - β) * RGB1 + β * RGB2

Résultats

Visage

Pour créer l'animation du ci-dessous, l'algortihme ci-dessus a été répété 100 fois pour obtenir une transition de 4 secondes à 25 fps. Pour chaque image, un α et un β différent a été utilisé, en partant avec une valeur de 0 pour chacun et en finissant avec une valeur de 1.

L'effet est très bien réussi puique les photos se ressemblent beaucoup et les points ont bien été sélectionnés. Le background est également le même.

Autres résultats

Simba

Je trouvais intéressant de voir la transition entre un animal réel et un animal animé. Le résultat est très impressionant, puisque la transition se fait très bien. Le seul défaut est probablement au niveau des oreilles.

Pokémon

Quoi de mieux qu'une transformation d'un pokémon vu à l'oeil. Pikachu se transformant en Raichu. La transformation au niveau des oreilles et de la queue aurait pu être cependant mieux réalisé.

Terre

Qui a dit que la terre était ronde ? La transition est tout de même bien réussi. Il y a seulement le haut de la planètre où la transformation au niveau des nuages est un peu moins bien réussi.

Statue

La transition entre ces deux statues est également intéressant. Les deux images se ressemblent beaucoup donc la transition est moins intéressante. Par contre le résultat est bien réussi.

Hélicoptère

La transition entre un animal et un objet est également intéressant. La forme de base entre les deux images se ressemblant "un peu" fait en sorte que la transition est intéressante.

Crédits supplémentaires

Image hybride

Le but de ce crédit supplémentaire était de voir la différence entre une image hybride formée au TP2 et une image hybride réalisé à l'aide du morphage. Voici donc le résultat du TP2 et celui du TP3 respectivement.

On voit rapidement que la différence majeure vient du fait que le traits sont beaucoup mieux alignés avec le morphage. La différence à l'oeil est que avec le morphage, a forme du visage et de ces composantes ne change pas. Elle reste le même. Avec le résultat du TP2, la forme du visage peut changer et toutes les caractéristiques du visage ne sont pas alignés. Avec le morphage, on voit bien que les sourcils, les yeux, le nez ainsi que la bouche sont bien alignés, ce qui rend le résultat beaucoup plus impréssionant.

Partie B1

Le but de cette partie est de trouvé le visage moyen d'un ensemble de visage. Le même algorithme qu'à la partie A est utilisé avec des petits ajustements. L'image finale est bien entendu formé à l'aide de la forme et les couleurs moyennes de toutes les images et non seulement de deux images. Pour cette partie du TP, la librairie dlib est utilisé pour trouver les points d'intérêts sur nos images sauf pour le premier résultat.

Résultats

Étudiants de la classe

Voici le résultat du visage moyen des étudiants de GIF-4105/7105 en fonction des points d'intérêts qu'ils avaient sélectionnés pour la partie A, ainsi que la triangulation sur la moyenne des points de correspondance.

On obtient donc un visage très générique. On peut également observé des traits plus masculins dans le résultat, puisque la majorité des étudiants sont masculins.

Étudiants de la classe avec dlib

Voici le résultat du visage moyen des étudiants de GIF-4105/7105 avec les points d'intérêts obtenus avec dlib.

Les visages se ressemblent. Cependant, comme on peut le voir sur les triangulations, le haut du crane n'est pas pris en compte avec la librairie dlib. Le résultat observé au niveau des cheveux est donc moins intéressant. Le visage paraît également beaucoup plus rond sur cette photo. La bouche et les yeux sont cependant mieux défini étant donnée qu'il y a beaucoup plus de points d'intérêts.

Visages de la base d'images d'Utrecht

Voici le résultat du visage moyen des photos de la base d'images d'Utrecht.

Le résultat ressemble au précédent mais de façon encore plus générique. L'image est tellement générique que l'on dirait un robot. Les mêmes caractéristiques que le résultat précédent peuvent être observés au niveau des cheveux, des yeux et de la bouche

Crédits supplémentaires

Visages moyens de la base d'images d'Utrecht avec et sans sourire

Chaque personne ayant été prise en photo a produit une image avec sourire et une image sans sourire. Le but de ces crédits supplémentaires est de comparé le visage moyen, le visage moyen sans sourire et le visage moyen avec sourire.

Visage moyen Visage moyen sans sourire Visage moyen avec sourire

On observe que le visage moyen est bien une moyenne des deux autres images. De façon évidente, la plus grande différence est au niveau de la bouche entre le visage moyen souriant et le visage moyen non-souriant. Le reste du visage est quasi-identique pour chacune des images.

Partie B2

Le but de cette partie est de masculiniser et de féminiser notre propre visage. Cela se fait en obtenant le visage masculin et le visage féminin moyen de la base d'Utrecht et d'ensuite morpher notre visage avec les visages obtenus.

Résultats

Masculinisation

Le visage masculin moyen a donc été calculé à l'aide de la base d'Utrecht et ensuite j'ai morphé mon visage avec ce dernier pour différentes valeurs de α et β.

Visage de base Visage moyen homme Masculinisation α = 0.2, β = 0.8 Masculinisation α = 0.4, β = 0.6 Masculinisation α = 0.6, β = 0.4

Les résultats ne sont pas très convincants. On voit bien la forme des yeux, la forme du visage changé, cependant, il est difficile d'affirmer que le visage a été masculinisé. Le résultat le mieux réussi est celui du milieu.

Masculinisation

Le visage masculin moyen a donc été calculé à l'aide de la base d'Utrecht et ensuite j'ai morphé mon visage avec ce dernier pour différentes valeurs de α et β.

Visage de base Visage moyen femme Féminisation α = 0.2, β = 0.8 Féminisation α = 0.3, β = 0.6 Féminisation α = 0.5, β = 0.3

Encore une fois les résultats ne sont pas très convaicants. Le gros changement se voit au niveau des yeux. On se rend compte que la différence entre la masculinisation et la féminisation n'est pas si différente. Lorsque l'on regarde l'image moyen de l'homme et l'image moyen de la femme, on se rend compte rapidement que les deux visages sont très similaires. Il est tout de même possible d'observer un peu la féminisation dans la dernière image, cependant, mon visage devient très générique.

Crédits supplémentaires

Analyse en composantes principales

L'analyse en composantes principales permet de réduire le nombre de variables dans un ensemble et de rendre l'information moins redondante. Le but est donc de déterminer à quel endroit dans les images on observe une grande variance entre les pixels. Les outils de OpenCV ont étés utilisés pour réaliser ces crédits supplémentaires. J'ai donc choisi 20 images de la base d'images d'Utrecht pour effectuer les transformations, car une trop grande quantité d'images devient interminable au niveau du temps de processeurs. Les images sont donc lus et stockés en mémoire et leurs dimensions sont changé pour obtenir des vecteurs. OpenCV se charge ensuite de retourner le visage moyen ainsi que les eigenvectors. Le visage moyen peut-être observé ci-dessous en couleur et en teintes de gris :

Les eigenvectors sont ensuite redimensionnées en image RGB (ou grise) et il est ensuite possible de les visualiser. Les images ci-dessous sont donc normalisés pour que ce soit possible de les visualiser.


On visualise donc bien où sont les variations pour chaque visage. Il est maintenant possible de reconstruire les visages en utilisant le visage moyen et chacune des "eigen face" en leur appliquant un poids. Plus le poids est élevé pour un visage, plus ses caractéristiques apparaîtront sur l'image finale. Il est également possible de mettre un poids négatifs pour enlever certains caractéristiques. Voici quelques résultats obtenus en jouant avec les valeurs pour les visages.

Visage moyen Traits asiatiques Augmentation pilosité faciale Homme dans la trentaine Homme dans la cinquantaine

Les résultats sont très intéressant. On observe effectivement des changements de traits de façon assez importante. Le visage moyen peut donc être modifié pour obtenir des résultats beaucoup plus convaincants qu'avec la masculinisation et la féminisation. Les tests ont étés faits avec des images d'hommes seulement. Il aurait pu être intéressant d'utiliser des images de femmes. Il aurait également été intéressant d'utiliser une librairie qui permet d'obtenir les points de correspondances au niveau des cheveux pour obtenir des résultats moins flous et avec moins de ghosting.