TP3: Morphage de visages

HW3: Faces morphing

Date limite: 16 mars 2014 à 23h59

Due Date: 23h59 on March 16th, 2014

bush obama morph Source: doobybrain.com

Résumé

Overview

Pour ce TP, vous allez produire 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 tous les visages du cours.

En plus de cette séquence vidéo démontrant cette métamorphose, vous devrez générer, en utilisant votre algorithme de morphage (morphing), une image moyenne des visages de tous les étudiants de la classe.

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.

In addition to the morph animation, you will also use your morpher to create the picture of the average face in the class.

Préalables

Nous avons reçu les points de tout le monde, merci! Ils sont disponibles ici.

Avant même de commencer à implémenter l'algorithme de morphage, il nous faut établir des correspondances entre les images. Pour ce faire, on sélectionne des points d'intérêts correspondants dans chaque image. Sélectionnez les points d'intérêts 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 un outil Matlab qui vous aidera à créer ce fichier. Dès que votre fichier est prêt, veuillez l'envoyer à Maxime par courriel.

Prerequisites

We've received points from everyone, thanks! They 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 Matlab tool to help you create this file. As soon as your file is ready, send it to Maxime by email.

Détails

L'algorithme de morphage consiste à:

  1. Définir les correspondances
  2. Calculer une triangulation
  3. Créer le morphage:
    1. Calculer la transformation affine des triangles
    2. Calculer le fondu des couleurs

Chacune des étapes de l'algorithme sont décrites plus bas.

Details

The morphing algorithm is composed of the following steps:

  1. Defining correspondences
  2. Triangulation
  3. Morph
    1. Triangles affine transformation
    2. Dissolving

All of these steps are described below.

Définir les correspondances

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, utilisez 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.

Calculer une triangulation

Triangulation

Ensuite, vous devez découper l'image en plusieurs parties 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. Vous pouvez calculer la triangulation de Delaunay sur l'une des deux images, et d'utiliser cette même triangulation sur l'autre image. Ne calculez pas deux triangulations, car elle doit demeurer la même tout le long du morph. Par contre, une meilleure approche serait de calculer la triangulation sur une forme intermédiaire (i.e. la moyenne des deux ensembles de points) pour diminuer la déformation potentielle des triangles.

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. You can calculate the Delaunay triangulation on one of two sets of points, but not both, since the triangulation must be the same throughout the morph. However, a better approach would be to calculate the triangulation on an intermediate form (i.e. the average of the two sets of points) to decrease the potential deformation of triangles.

Créer le morphage

Morph

Vous devez écrire une fonction Matlab:

You must write a Matlab 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.

Transformation affine des triangles
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 de Matlab calculant pour vous les transformations (par exemple, imtransform, cp2tform, maketform, etc.).

Note that you cannot use Matlab functions to calculate the transformation for you (eg. imtransform, cp2tform, maketform, etc..).

Fondu des couleurs
Dissolving

Lorsque vous connaissez les transformations affines, il vous faut maintenant calculer la couleur de chacun des pixels. Pour chaque triangle, calculez la transformation affine inverse, qui vous permettre 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 tsearch et interp2 pourront vous être utile. Notez que tsearch suppose que votre triangulation est toujours de Delaunay. Dans notre cas, ce n'est pas toujours vrai -- il est possible que vous commenciez avec une triangulation de Delaunay, mais que, lors du morphage, les triangles deviennent trop minces et qu'ils cessent d'être de Delaunay. Nous vous suggérons donc d'utiliser l'implémentation suivante de tsearch qui fonctionne sur toute la triangulation. Il vous faudra la compiler en tapant mex mytsearch.cpp dans Matlab. Si cette implémentation ne semble pas fonctionner pour vous, contactez nous le plus rapidement possible.

The tsearch and interp2 functions may be helpful. Note, however, that tsearch assumes that your triangulation is always Delaunay. In our case, this is not always true - it is possible that you start with a Delaunay triangulation, but that during the morph, triangles become too thin and cease to be Delaunay. We suggest using the following implementation of tsearch which works on any triangulation (compile by typing mex mytsearch.cpp in Matlab). If the implementation is not working for you, contact us as soon as possible.

Conseils

Tips

Sauvegarde vidéo

Saving a video

Il est facile de créer une séquence vidéo en Matlab grâce à l'objet appelé VideoWriter. Il s'utilise comme suit:

vw = VideoWriter([filename '.mp4']);
vw.FrameRate = 30; % selection du nombre de trames par seconde du video
open(vw);
% calculs!
writeVideo(vw,img); %pour chaque trame (img)
close(vw); %une fois toutes les images ajoutés au video
Nous vous demandons de créer une séquence de 4 secondes à 30 trames par secondes. La transformation devrait donc se faire en 4*30 = 120 étapes.

It is easy to create a video in Matlab with the object called VideoWriter. It is used as follows:

vw = VideoWriter([filename '.mp4']);
vw.FrameRate = 30; %selection du nombre de trames par seconde du video
open(vw);
%calculs!
writeVideo(vw,img); %pour chaque trame (img)
close(vw); %une fois toutes les images ajoutés au video

We ask you to create a sequence of 4 seconds at 30 frames per second. Therefore, the transformation should be made of 4*30 = 120 steps.

Calcul du "visage moyen"

Computing the "average face"

Plusieurs choses amusantes sont possibles avec le morphage. Par exemple, nous pouvons calculer le visage moyen des étudiants de la classe. Pour ce faire, il faut: 1) calculer la forme moyenne, 2) déformer tous les visages dans cette forme, et 3) calculer la moyenne de toutes ces images. Cela exige un marquage uniforme de tous les visages. C'est à cette étape que vous utiliserez les points d'intérêts sélectionnés par tous sur leur propre visage (voir section "Préalables" plus haut). Nous vous indiquerons comment récupérer ces points d'intérêts lorsque nous les aurons reçus.

Many fun things are possible with morphing. For example, we can calculate the average face of the class. This would involve: 1) computing the average shape, 2) warping all faces into that shape, and 3) averaging the colors together. This requires consistent labeling of all the faces. Everyone in the class should have manually selected the features of their face (see "prerequisites", above). Once we have all the files, we will let you know how to get them.

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):

Livrables

Comme pour le travail précédent, celui-ci sera remis dans un format page Web. Rappel: le site Web n'a pas besoin d'être esthétiquement agréable; ne faite que décrire ce que vous avez fait.

Plus précisément, la page devrait contenir:

  • Des explications de l'algorithme que vous avez implémenté. Illustrez au besoin.
  • Votre séquence vidéo, transformant votre visage vers le visage d'un autre étudiant de la classe. Les photos sont disponibles ici, et les points ici. Générez une animation de votre visage vers le visage de l'étudiant suivant, en ordre de numéro. Par exemple, dans mon cas (Jean-François), je devrais remettre l'animation entre 01-jf.jpg et 02-charles.jpg.
    • Pour ce faire, générez un fichier d'animation .gif; vous pouvez utiliser ce code pour vous aider. Assurez-vous que l'animation montre bien le processus (produire l'animation au ralenti, à 2 trames par seconde, par exemple). Expliquez vos résultats.
  • Affichez le visage moyen de la classe. Assurez-vous d'utiliser tous les visages. Commentez.
  • Expliquez les crédits supplémentaires que vous avez implémentés. Illustrez ces explications. Aussi, lorsque cela s'applique, montrez le "avant" et le "après".

Pour la remise de votre travail, créez un fichier tp3.zip qui contient

  • Votre rapport en format HTML dans un dossier tp3/web. Vos images et animation .gif doivent être dans un dossier tp3/web/images.
  • Votre code matlab doit être dans un dossier tp3/code. De préférence, ne pas inclure 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 tp3/video.

Finalement, veuillez téléverser votre fichier tp3.zip sur pixel (http://pixel.fsg.ulaval.ca) avant la date limite. Bien entendu, la politique des retards mentionnée dans le plan de cours sera appliquée. Pour toutes questions concernant la procédure de remise ou le travail en tant que tel, envoyez vos questions à l'adresse courriel du cours.

Deliverables

As in the previous homework, this one will be handed in a webpage format. Remember: the aesthetics of the website will not be evaluated, but it is important that the information be presented clearly.

More precisely, the webpage should:

  • Explain the algorithm you have implemented. Illustrate if you think it is needed.
  • Show your video sequence, morphing your face into another student's face. Face photos are available here, and points here. Create an animation morphing your face into the following one, in order. For example, I (Jean-Francois) would have to generate an animation between my face 01-jf.jpg into Charles' 02-charles.jpg.
    • Produce an "animated gif" file; you can use this code. Make sure that the animation shows the process (produce the animation with 2 frames per second, for example). Explain your results.
  • Show the mean face. Make sure to use everyone's face. Comment.
  • Explain all the bells and whistles you have implemented. Try to illustrate these explanations. Also, if applicable, show correctly the "before" and "after".

For this homework, you must create a tp3.zip file. In this file you'll put:

  • Your report in the HTML format inside a folder named tp3/web. Your images and your animation ".gif" for this web page should be inside a folder named tp3/web/images.
  • Your matlab code should be put inside the folder tp3/code. Please do not include the images you have used to produce your results inside this folder.
  • Your video sequence should be in a folder tp3/video.

Finally, you should upload the file tp3.zip on Pixel (http://pixel.fsg.ulaval.ca) before the deadline. Naturally, the late submission policy in the course plan will be applied. For any question regarding the submission process or the homework as such, send your question to the course's email address.

Attention! La taille limite permise sur Pixel est de 100MB. Assurez-vous que la taille du fichier tp3.zip n'excède pas 100MB.

Careful! The maximum allowed file size on Pixel is 100MB. Please ensure that your tp3.zip file does not exceed 100MB!

Évaluation

Ce travail est évalué sur 100 points. La répartition des points va comme suit:

  • (75 pts, 60 pts pour les étudiants gradués) pour le morphage (code, séquence vidéo, explication).
  • (25 pts, 20 pts pour les étudiants gradués) pour le visage moyen (code, image, explication).
  • (N pts) pour les crédits supplémentaire. Rappel: les étudiants gradués doivent livrer au-moins 20 pts de crédits supplémentaires.

Evaluation

This assignment is evaluated on 100 points, as follows:

  • (75 pts, 60 pts for graduate students) for the morphing (code, video sequence, explaination).
  • (25 pts, 20 pts for graduate students) for the average face (code, image(s), explaination).
  • (N pts) For any bells and/or whistles you've added in. Reminder: graduate students must add to their assignment at least 20 pts worth of bells and whistles.

Liens rapides

Quick links

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.