Dans cette partie, il fallait implémenter un algorithme de morphage. Le morphage a pour but de trouver une image de destination
La première étape consiste à indiquer des points de correspondance entre l’image 1,
Ensuite, nous calculons une triangulaiton de Delaunay de notre scène. Pour ce faire, nous calculons le point moyen entre chaque correspondance et calculons notre triangulation,
Une fois la triangulation calculée, nous calculons les points intermédiaires
\begin{equation}
P_D=(1-\alpha)\cdot P_1 + \alpha\cdot P_2
\end{equation}
\begin{equation}
\vec{x}=A^{-1}\vec{b}
\end{equation}
\begin{equation}
\begin{bmatrix}
a \\
b \\
c \\
e \\
f \\
g \\
\end{bmatrix}
=
\begin{bmatrix}
x_1 & y_1 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & x_1 & y_1 & 1 \\
x_2 & y_2 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & x_2 & y_2 & 1 \\
x_3 & y_3 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & x_3 & y_3 & 1 \\
\end{bmatrix}^{-1}
\begin{bmatrix}
x’_1 \\
y’_1 \\
x’_2 \\
y’_2 \\
x’_3 \\
y’_3 \\
\end{bmatrix}
\end{equation}
\begin{equation}
I_D=(1-\beta)\cdot C_1 + \beta\cdot C_2
\end{equation}
En choisissant plusieurs valeurs de
code/morph.py
code/a.py
Discussion : Nous pouvons voir que le résultat est intéressant. Or, à cause des lunnettes, la déformation est un peu bizarre près des yeux. Également, la capuche du hoodie gâche un peu le rendu. Malgré cela, nous pouvons voir que la transformation est fluide et sans discontinuité importante.
- Beethoven vers Mozart
code/morph.py
code/a.py
Discussion : La transformation des deux génies musicaux est impressionnante, d’autant plus que nous opérons une transformation sur des portraits peinturés et que celle-ci est très fluide. Mis à part le collet de beethoven, la transition du visage est presque parfaite. Il faut dire que le fond quasi identique de la photo aide.
- Trump vers un orang-outan
code/morph.py
code/a.py
Discussion : Nous avions fait la transformation de deux génies. Pourquoi ne pas faire ici tout le contraire? La transformation est encore extrêmement fluide et impressionnante. Le plus marquant est la bouche qui reste quasi-identique tout au long de la transformation.
- Labeaume vers un pitbull
code/morph.py
code/a.py
Discussion : Pourquoi ne pas s’acharner encore un peu sur les politiciens? Ici, la transformation est un défi puisque les deux images sont très différentes. Nous pouvons voir que la transformation est beaucoup moins fluide. Sûrement à cause d’un choix de points plus ardu. Or, la transformation est quand même appréciable.
- 25 cents vers 2 dollars
code/morph.py
code/a.py
Discussion : Voici un moyen efficace de payer sa session unicersitaire… Malheureusement, on peut voir que la transition est moins fluide que les autres. Le déplacement entre les deux images et le choix des points difficile ont compliqué le travail pour obtenir une bonne transformation. Nous pouvons apercevoir les triangles formées lors de la transormation des pièces. Peut-être aurait-il fallu prendre plus de points autour de celles-ci.
- L’auteur vers tintin
code/morph.py
code/a.py
Discussion : Ici, un autre défi. Transformer l’auteur vers une figurine de tintin. Le résultat est tout de même impressionnant. De petites discontinuités existent autour du visage, mais l’ensemble du visage se transforme assezs bien. À gauche, on peut observer un artéfact venant d’un problème de la première version du code. En effet, il existait des cas rares où plus d’une valeur étaient inscritent au frontière d’un triangle, ce qui saturait les pixels et donnait des lignes blanches. Le code a été réglé pour la partie B.
Dans cette partie, il fallait utiliser un détecteur de visage pour trouver des points de correspondance sur toutes les images de la base de données Utrecht .
Pour calculer un visage moyen, il suffit de calculer les points moyens
code/morph.py
code/b1.py
Discussion : Nous pouvons voir que les points moyens forment une tête moyenne que l’on reconnait à l’oeil tout de suite. Le résultat est donc la tête moyenne de tous les étudiants de la classe. Il est intéressant de voir l’influence de la barbe et des lunnettes, ce qui nous porte à croire que la pilosité faciale et les lunnettes sont majoritaires dans la classe. Il est est de même pour le sourire, puisque nous pouvons voir des dents sur le visage moyen.
code/get_faces_pts.py
code/morph.py
code/b1.py
Discussion : Contrairement aux points que nous avons sélectionnés nous même, les points de dlib sont concentrés à l’intérieur du visage et il y en a plus. Comme nous pouvons le voir sur la figure de la forme du visage, le maillage est plus dense et arrête aux sourcils. Ainsi, contrairement au visage moyen construit avec nos points, le visage moyen construit avec dlib est plus flou à l’extérieur du visage et plus défini à l’intérieur. Puisque les points sont plus concentrés autour des yeux et de la bouche, nous voyons moins les lunnettes et voyons plus le sourire dans le visage moyen.
code/get_utrech_pts.py
code/morph.py
code/b1.py
Discussion : Nous voyons que la forme du visage est à peu près similaire à la forme du visage formée de nos points. Nous pouvons voir également que le visage est un visage masculin dû à la majorité des images masculines. Également, nous pouvons voir que la bouche tend vers le sourire, mais n’en est pas tout à fait un. Cela est dû au mélange entre les images avec et sans sourire.
Dans cette partie, il fallait constuire le visage moyen des hommes et des femmes pour masculaniser ou féminiser un visage. Nous avons aussi fait la moyenne des visages avec sourire et sans sourire pour tenter de rajouter ou d’enlever le sourire d’un visage.
code/get_mean_faces.py
code/morph.py
code/b2.py
Discussion :
Le choix de plusieurs
code/get_mean_faces.py
code/morph.py
code/b2.py
Discussion : Il se passe la même chose que pour la masculanisation, mais le résultat moyen est différent. Nous voyons bien la prohiminence des traits féminins. Le plus impressionnant sont les yeux et la bouche qui deviennent très féminin.
code/get_mean_faces.py
code/morph.py
code/b2.py
Discussion : Il se passe encore la même chose que pour les deux autres images. Mais le résultat est beaucoup plus décevant. Probablement parce que le visage de la photo initiale a déjà un sourire et que l’effet du visage moyen avec sourire est minime.
code/get_mean_faces.py
code/morph.py
code/b2.py
Discussion : Il se passe toujours la même chose que pour les trois autres images. Le résultat est encore décevant. Même si dans l’ensemble, le visage a une expression plus sérieuse, l’effet est minime. On voit tout de même une différence entre le visage moyen sans sourire et le visage moyen avec sourire. Et ce qui est intéressant est que cette différence ne se voit pas seulement avec la bouche. Les yeux ont aussi une expression différente. L'image moyenne générale tant qu'à elle représente presque le point milieu entre le avec sourire et le sans sourire. Or, puisqu'il y moins d'image avec sourire (58 vs 73), c'est l'expression du sans sourire qui l'emporte et on ne voit pas les dents sur l'image mohyenne de toutes les images.
Animation : Pour avoir un résultat plus intéressant, on peut choisir des points de correspondance seulement autour de la bouche du sourire moyen et du visage intitial et générer un vidéo de transformation. Voilà le résultat. Même si la fin est un peu étrange dû au redimensionnement de l'image pour le vidéo, nous avons un peu l'impression que le visage est en train de sourir.