TP3: Morphage de visages, partie A (English version)
Date de remise: 27 février 2020 à 23h59
Due date: 23h59 on February 27th, 2020
Survol
Overview
Pour ce TP, vous produirez une animation qui affichera votre visage, et le métamorphosera vers le visage d'un autre étudiant du cours, sous la forme d'une séquence vidéo. Lorsque le TP sera terminé, nous (les responsables du cours) allons raccorder vos vidéos afin de créer une séquence vidéo finale qui présentera une métamorphose de chacun d'entre nous. Vous devrez aussi produire des animations avec d'autres photos.
For this homework, you will produce a "morph" animation of your face into another student's face. We (your professor and TA) will connect them in order to create a final video sequence which will show a continuous morph through all the faces of the class. You will also have to produce animations with other photographs.
Préalables
Avant même de commencer à implémenter l'algorithme de morphage, il nous faut établir des correspondances entre les images. Pour ce faire, sélectionnez les points d'intérêt sur une image de votre propre visage de façon identique à celle de l'image suivante:
Par exemple, notez comment le premier point d'intérêt (1) correspond au menton, et les points subséquents (jusqu'à 13) contournent le visage à intervalles réguliers. Il est très important d'effectuer cette tâche attentivement: vous aurez besoin des points d'intérêts de vos collègues, et ils auront besoin des vôtres!
Vous devez créer un fichier texte avec des coordonnées (x,y) des caractéristiques, une paire par ligne (43 lignes au total). Nous vous fournissons du code (Matlab/Python avec OpenCV) qui vous aidera à créer ce fichier. Dès que votre fichier est prêt, veuillez l'envoyer à Luca par courriel.
Prerequisites
The points we've received so far
are here.
Before you even start implementing your morphing algorithm, you will need to define corresponding points between images by manually selecting them. You must make your selection in the exact same order as in the following image:
For example, note that the first point (1) corresponds to the chin, and the following points (up to 13) follow the face region clockwise at regular intervals. It is critical for you to do this task very carefully: you will need your colleague's points, and they will need yours!
You must create a text file with coordinates (x, y) of the features, one pair per line (43 lines in total). We are providing you with a software tool (Matlab/Python with OpenCV) to help you create this file. As soon as your file is ready, send it to Luca by email.
Algorithme de morphage (100%, 80% pour les gradués)
L'algorithme de morphage consiste à:
- Définir les correspondances
- Calculer une triangulation
- Créer le morphage:
- Calculer la transformation affine des triangles
- Calculer le fondu des couleurs
Chacune des étapes de l'algorithme sont décrites plus bas.
Morphing algorithm (100%, 80% for graduate students)
The morphing algorithm is composed of the following steps:
- Defining correspondences
- Computing a triangulation
- Create the morph
- Triangles affine transformation
- Dissolving
All of these steps are described below.
1. Définir les correspondances
1. Defining correspondences
Tout d'abord, vous devrez définir manuellement des paires de points correspondants sur les deux images. En général, plus il y a de points, mieux c'est. Pour ce faire, vous pouvez utiliser le même outil que pour la section «préalables» plus haut.
First, you will need to manually define pairs of corresponding points on the two images (usually the more points, the better the morph). You can use the Matlab tool we gave you in the "prerequesites" section above.
2. Calculer une triangulation
2. Computing a triangulation
Ensuite, vous devez séparer l'image en plusieurs triangles en utilisant les points sélectionnés à l'étape précédente. Une bonne façon de faire est d'utiliser un algorithme de triangulation. Une triangulation de Delaunay (voir delaunay
sous Matlab) est un bon choix puisque cet algorithme ne produit pas des triangles trop minces. Pour ce faire, calculez la triangulation sur la moyenne des deux ensembles de points. Ceci diminuera la déformation potentielle des triangles, et réduira les déformations. Ne calculez pas deux triangulations: la triangulation doit être la même tout le long du morphage.
Then you will need to divide the image into several parts using your previously selected points. A good way is to use a triangulation algorithm. The Delaunay triangulation (see delaunay
in Matlab) is a good choice since this algorithm does not produce triangles that are too thin. Compute the triangulation on the average of the two sets of points, to decrease visual deformations. Do not compute two triangulations: the triangulation must be the same throughout the morph.
3. Créer le morphage
3. Create the morph
Vous devez écrire la fonction suivante:
You must write the following function:
morphed_img = morph(img1, img2, img1_pts, img2_pts, tri, warp_frac, dissolve_frac);
qui produit une distorsion entre img1
et img2
en utilisant la correspondance des points img1_pts
et img2_pts
et la structure de triangulation tri
. Les paramètres warp_frac
et dissolve_frac
contrôlent respectivement la distorsion de forme ainsi que le niveau de fondu. Plus particulièrement, les images img1
et img2
sont d'abord transformées en une forme intermédiaire contrôlée par warp_frac
et le fondu est ensuite fait en fonction de dissolve_frac
. Ces paramètres varient de 0 à 1. Ce sont les seuls paramètres qui varieront entre chaque trame de l'animation. Pour la trame de départ, ils devraient être chacun égal à 0 et, pour la trame finale, ils devraient être chacun à 1.
which produces a distortion between img1
and img2
using the correspondence points img1_pts
and img2_pts
and tri
the triangulation structure. The warp_frac
and dissolve_frac
parameters respectively control the distortion of the shape and the level of dissolution. Specifically, images img1
and img2
are first transformed into an intermediate shape which is a weighted mean of both points (where the weight is warp_frac
). The level of dissolution is made according to dissolve_frac
. These parameters vary from 0 to 1. These are the only parameters that should vary between each frame of the animation. At the start, they should each be equal to 0 and, for the final frame, they should each be equal to 1.
3.1 Transformation affine des triangles
3.1 Triangles affine transformation
Cela consiste à calculer la déformation de chaque triangle de la triangulation à partir des images originales jusqu'à un point intermédiaire entre ces deux images. Cela se fait en calculant simplement une matrice de transformation affine entre deux triangles. Ces transformations doivent être calculées indépendamment pour chaque paire de triangles.
The main task is to calculate the distortion of each triangle of the triangulation from the original images to the intermediate morph. This can be done by computing an affine transformation matrix between the triangles. These matrices must be computed independently for each pair of triangles.
Notez que vous ne pouvez pas utiliser les fonctions calculant pour vous les transformations (par exemple, imtransform
, cp2tform
, maketform
, etc.).
Note that you cannot use functions to calculate the transformation for you (eg. imtransform
, cp2tform
, maketform
, etc..).
3.2 Fondu des couleurs
3.2 Dissolving
Après avoir calculé les transformations affines, il vous faut maintenant obtenir la couleur de chacun des pixels. Pour chaque triangle, calculez la transformation affine inverse qui vous permettra d'aller lire la couleur associée à chaque pixel dans les deux images, et d'en calculer une moyenne pondérée. La poids de chaque image correspond à dissolve_frac
et 1-dissolve_frac
.
After the affine transforms are computed, you must now compute the color for each pixel. For each triangle, compute the inverse affine transform, use it to look up the color associated to each pixel in both images, and compute their weighted average. The weight for each image corresponds to (1 - dissolve_frac
) and dissolve_frac
.
Les fonctions Matlab pointLocation
pour trouver les pixels à l'intérieur d'un triangle, et interp2
pour l'interpolation en 2D vous seront utiles. En python, il n'y a pas d'équivalent direct pour pointLocation
. Vous pouvez utiliser matplotlib.path.Path.contains_points
et l'adapter à vos besoins. La fonction scipy.interpolate.RectBivariateSpline
effectue l'interpolation en 2D. Nous vous conseillons fortement d'utiliser ces fonctions.
The Matlab functions pointLocation
for finding the pixels inside a triangle, and interp2
for 2D interpolation will be helpful. In python, there is no direct equivalent to pointLocation
. You can use matplotlib.path.Path.contains_points
and adapt it to your needs, however. The function scipy.interpolate.RectBivariateSpline
performs 2D interpolation. We strongly recommend you use these functions.
Arrière-plan
Background
Finalement, il vous reste à déterminer quoi faire avec les pixels à l'extérieur de l'objet. Pour ce faire, rajoutez des points d'intérêts en bordure de l'image (aux quatre coins, ou de façon plus dense), et traitez-les comme les autres dans votre algorithme. De cette façon, l'image en entier est transformée.
Finally, you have to decide what to do with the pixels outside the region of interest. To do so, add interest points on the image border (at each corner of the image, or more densely), and treat them like the others in your algorithm. This way, the entire image is transformed.
Conseils
Tips
- Sélectionnez beaucoup de points d'intérêt dans les deux images.
- Select a lot of points to create your video.
- Lors de la création de la séquence, augmentez
warp_frac
avant même d'augmenter dissolve_frac
. Autrement, les caractéristiques pourraient ne pas être correctement alignées lors du fondu. Cela est plus important/utile lorsque vous effectuez du morphage entre des visages.
- When creating the sequence, increase
warp_frac
a lot before even increasing dissolve_frac
. Otherwise, the features may not be properly aligned when dissolved. This is more important/useful when you perform morphing with faces.
- Il est important que vous utilisiez la transformation inverse pour remplir votre image intermédiaire. Donc, pour chaque triangle dans l'image intermédiaire, vous regardez la position (x,y) des pixels à l'intérieur de ceux-ci (en utilisant
tsearch
) et vous appliquez les transformations inverses pour trouver les valeurs dans les images originales. Cela est illustré dans l'image plus haut.
- It is important that you use the inverse transformation to complete your morphed picture. So, for each triangle in the morphed image, you look at the position (x, y) of the pixels inside them (using
tsearch
) and you apply the inverse transformations to find the values in the original images. This is illustrated in the images above.
- Faites attention à bien différencier les lignes-colonnes
(r,c)
des coordonnées (x,y)
! Par exemple, dans Matlab: img(r,c) = img(y,x)
.
- Pay attention to the difference between row-column
(r,c)
and coordinates (x,y)
! For example, in Matlab: img(r,c) = img(y,x)
.
Sauvegarde vidéo
Saving a video
Pour créer une séquence vidéo, vous pouvez utiliser les fonctions Matlab suivantes, ou encore la librairie ffmpeg. Avec Matlab:
- Séquence vidéo: vous pouvez créer une séquence vidéo grâce à l'objet appelé
VideoWriter
. Voyez exemple de code ici.
- GIF animé: vous pouvez créer un GIF animé grâce à cet exemple de code. Ces derniers peuvent être rajoutés facilement à une page web.
Avec ffmpeg, la commande suivante générera le fichier test.mp4
à partir d'images individuelles nommées file_00001.png
, file_00002.png
, ...:
ffmpeg -i file_%05d.png -c:v libx264 -vf "fps=25,format=yuv420p" test.mp4
To create a video sequence, you can use the following Matlab functions, or the ffmpeg library. With Matlab:
- Video sequence: you can create a video sequence with the
VideoWriter
object. See here for example code.
- Animated GIF: you can create an animated GIF with this example code. These files can easily be embedded into webpages.
With ffmpeg, the following command will create a video file test.mp4
from individual input images named file_00001.png
, file_00002.png
, ...:
ffmpeg -i file_%05d.png -c:v libx264 -vf "fps=25,format=yuv420p" test.mp4
Crédits supplémentaires
Bells and Whistles
Essayez ces idées pour approfondir vos connaissances (et augmenter votre note):
Try these ideas to increase your understanding on this subject (and your score):
- (jusqu'à 10 points) Essayez de morpher une image filtrée avec un filtre passe-bas et une image filtrée avec un filtre passe-haut dans le but de créer une image morphée hybride. Ceci est similaire à ce que vous avez effectué au travail 2, mais avec une plus grande correspondance spatiale entre les deux images. Quelle est la différence visible entre une image hybride normale et une image hybride morphée?
- (up to 10 points) Try to morph a low-pass filtered image with a high-pass filtered image to create a morphed hybrid image. This is similar to what you have implement in your second homework, but with now a higher spatial correspondance between both images. What is the visual difference between an normal hybrid image and a morphed hybrid image?
- (jusqu'à 10 points) Essayez de faire votre morphage dans un autre système de coordonnées (ex.: polaire). Est-ce que vos résultats diffèrent?
- (up to 10 points) Try to morph in another coordinate system (ex.: polar). Are the results any different?
- (jusqu'à 20 points) Implémentez un algorithme de morphage n'utilisant pas des triangles. Plusieurs options sont possibles. Par exemple, vous pouvez calculer une transformation pour chaque pixel en faisant une estimation du moindre carrée pondérée où les poids sur les points de contrôle sont déterminés par la distance de ces points au pixel en question. Vous pouvez également implémenter la technique utilisée pour générer la vidéo de Michael Jackson « Black and White », qui est décrite dans l'article de Beier et Neely 1992.
- (up to 20 points) Implement a non-triangle based morphing algorithm. There are a lot of possibilities out there. For example, you could try to compute a weighted least-squares estimate of the transform at each pixel, where the weights on the control points are determined by the distance from the pixel in question. You could also try the technique that was used in Michael Jackson's "Black and White" clip which was published in a 1992 paper by Beier and Neely.
- (jusqu'à 20 points) Générez une séquence morphant une vidéo vers une autre vidéo. Pour que les résultats soient convaincants, les deux vidéos doivent concorder. Par exemple, deux personnes effectuant les mêmes mouvements de façon synchronisée. Afin de réduire la quantité de travail manuel, vous pouvez identifier les points d'intérêts dans quelques images seulement, et interpoler leurs positions pour les autres images de la séquence.
- (up 20 points) Generate a sequence morphing a video towards another video. For the results to be convincing, both videos need to correspond to synchronized motions. For example, two persons could be performing the same actions synchronously. In order to reduce manual labor, you can identify interest points in a few images only, and interpolate their positions in the other images.
Livrables
Pour cette partie du travail, vous n'avez pas à remettre de rapport. Par contre, vous devez nous remettre des fichiers montrant les résultats de votre implantation de morphage, ainsi que votre code. Le rapport que vous allez remettre à la prochaine partie devra contenir ces résultats ainsi que des explications sur tout ce que vous nous montrez pour cette partie.
- (50%, 40% pour gradués) Une séquence vidéo transformant votre visage vers le visage de l'étudiant qui vous suit dans la liste.
- Générez une séquence de 5 secondes à un minimum de 20 images par seconde.
- Pour les livrables suivants, vous pouvez remettre vos résultats en GIF animé plutôt qu'une séquence vidéo. C'est parfois plus facile d'intégrer un GIF animé à une page web, et nous ne vous imposons pas de contraintes quant à la durée et au nombre d'images par seconde.
- (40%, 30% pour gradués) Un minimum de trois animations de morphage effectuées sur des objets, des animaux ou autres. Amusez-vous!
- (10%) Un minimum de deux animations de morphage effectuées sur vos propres photos!
- (N%) Illustrer les crédits supplémentaires que vous avez implémentés. Assurez-vous que les fichiers fournis soient explicites (ou bien mettez un court fichier texte explicatif avec ceux-ci).
- Assurez-vous de décrire et/ou commenter vos résultats. Voici quelques questions pour vous inspirer: 1) y a-t-il des résultats qui sont plus convaincants que d'autres? 2) pourquoi? 3) quels sont les avantages et les inconvénients de l'approche?
Deliverables
For this part of the homework, you do not have to provide a report. However, you need to give us files showing results of your morphing implementation, as well as your code. The report that you will have to deliver for the next homework part will have to contains these results and explain everything you showed us in this part.
- (50%, 40% for grads) Generate a video sequence, morphing your face into another student's face. Create an animation morphing your face into the following one in the list, in order.
- Generate a 5-second sequence at a minimum of 20 frames per second.
- For the following deliverables, you can give results in the animated GIF format instead of a video sequence. It is usually easier to include them in a web page.
- (40%, 30% for grads) Experiments with objects, animals and others. Have fun! Generate at least three morphing between different pairs of images.
- (10%) A minimum of two morphing results obtained on your own photos!
- (N%) Illustrate all the bells and whistles you have implemented. Make sure the files provided speak for themselves (or put with these results a short text file in which you explain everything).
- Make sure you describe and/or comment on your results. To give you inspiration, some questions you can ask yourself: 1) are there results that are more convincing than others? 2) why? 3) what are the pros and cons of the approach?
Remise
Pour la remise de votre travail, créez un fichier tp3a.zip
qui contient:
- Les images de vos résultats dans un dossier
tp3a/web/images
.
- Assurez-vous qu'il n'y a aucun caractère spécial (accent, ponctuation, espace, etc.) dans les noms de vos fichiers, images, etc.
- Votre code doit être dans un dossier
tp3a/code
. N'incluez pas les images que vous avez utilisées pour produire vos résultats dans ce dossier dans le but de ne pas alourdir le fichier.
- Votre séquence vidéo doit être dans un dossier
tp3a/video
.
Finalement, veuillez téléverser votre fichier tp3a.zip
sur le portail des cours avant la date limite. La politique des retards mentionnée dans le plan de cours sera appliquée. Pour toute question concernant la procédure de remise ou le travail lui-même, utilisez Piazza!
Pour la partie A,
vous n'avez pas à remettre de rapport (il viendra dans la
partie B). De plus, rappelez-vous que la taille limite permise sur le portail des cours est de 250MB.
Handing in procedure
For this homework, you must create a tp3a.zip
file. In this file you'll put:
- Your result images inside a folder named
tp3a/web/images
.
- Make sure none of the files have special characters (e.g. accents, punctuation, spaces, etc.) in their filenames.
- Your code should be put inside the folder
tp3a/code
. Do not include the images you have used to generate your results inside this folder, as this will likely generate huge files.
- Your video sequence must be in the folder
tp3a/video
.
Finally, you should upload this file (tp3a.zip
) on the "portail des cours" before the deadline. The late submission policy described in the course plan will be applied. For any question regarding the submission process or the project as such, use Piazza!
For part A,
you do not need to hand in a report (it will come in
part B). Also, remember the file size limit on the "portail": 250MB.
Remerciements
Thanks
Merci à Alyosha Efros d'avoir créé le TP original qui a servi d'inspiration pour celui-ci!
Many thanks to Alyosha Efros for creating the assignment which inspired this one!
Retour à la page web du cours.
Back to the class webpage.