Date de remise: 26 février 2025 à 23h59
Due date: 23h59 on February 26, 2025
Survol
Overview
Pour ce TP, vous produirez une animation qui affichera votre visage, et la 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 images.
For this homework, you will produce a morphing 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 images.
Prérequis (5%)
Cette section doit être complétée avant dimanche le 16 février 23h59 ! Cela ne devrait vous prendre que quelques minutes.
Avant même de commencer à implémenter l'algorithme de métamorphose, il nous faut votre photo, ainsi qu'une façon d'établir des correspondances entre les images. Pour ce faire, effectuez les étapes suivantes dans l'ordre :
- Prenez une photo de vous (un bon vieux selfie fait l'affaire, ou demandez de l'aide), de façon à ce que votre visage occupe à peu près la même taille dans l'image que l'exemple ci-bas. Les résultats seront plus beaux si l'arrière-plan est uniforme (un beau mur blanc, par exemple), mais ça n'est pas obligatoire.
- Rognez et redimensionnez la photo de sorte que ses dimensions soient 720x720 pixels.
- Grâce au code Python suivant, 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!
- Consultez la liste de photos disponibles sur ce Google Drive.
- Nommez le fichier de votre photo
(N+1)_NomDeFamille_Prenom.jpg
et le fichier de points (N+1)_NomDeFamille_Prenom.txt
. Ici, N
est le nombre de photos déjà présentes dans le répertoire, donc (N+1)
représente le prochain nombre. Téléversez ces deux fichiers dans le Drive mentionné ci-haut.
Prerequisites (5% for everyone)
You must perform this section before Sunday February 16th, 23h59! This should only take you a few minutes.
Before we implement anything, we need your photo as well as a way to establish correspondences across images. To do so, follow these steps in order:
- Take a photo of yourself (a good'ole selfie should do the trick, or ask for help), such that your face approximately occupies the same place in the image as in the example below. While it is not mandatory, results will look nicer if the background is uniform (a flat white wall, for example).
- Crop and resize your photo so that its dimensions are 720x720 pixels.
- Using this python code, select points on the image in the exact same way as the image below:
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!
- Consult the list of available photos in this Google Drive.
- Name the file of your photo
(N+1)_LastName_FirstName.jpg
, and the points (N+1)_LastName_FirstName.txt
. Here, N
is the number of photos already present in the Drive, so (N+1)
is the next number. Upload both these files in the Drive.
Algorithme de métamorphose (95% pour 4105, 75% pour 7105)
Les étapes de l'algorithme de métamorphose sont:
- Définir les correspondances
- Calculer une triangulation
- Créer la métamorphose:
- Calculer la transformation affine des triangles
- Calculer le fondu des couleurs
Chacune des étapes de l'algorithme sont décrites plus bas.
Morphing algorithm (95% for 4105, 75% for 7105)
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 code python.
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 same python code to select points.
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 scipy.spatial.Delaunay
en python) 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.
Attention : votre code ne devrait calculer la triangulation (la variable tri
ci-bas) qu'une seule fois ! Cette dernière doit demeurer constante tout le long du métamorphose, sinon des triangles changeront abruptement.
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 scipy.spatial.Delaunay
in python) 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.
Warning: your code should compute the triangulation (the tri
variable below) only once! The triangulation must be the same throughout the morph, otherwise triangles will abruptly change.
3. Créer la métamorphose
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. La variable tri
représente la triangulation, et stocke, pour chaque triangle, les indices des 3 points le composant.
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. The tri
variable represents the triangulation and stores, for each triangle, the indices of the 3 points forming the triangle.
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 les transformations pour vous (par exemple, les fonctions disponibles dans skimage.transform
).
Note that you cannot use functions to calculate the transformation for you (eg. functions available in skimage.transform
).
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
.
En python, 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.
In python, 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 entière 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 une grande quantité 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 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 métamorphose 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 d'utiliser 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
matplotlib.path.Path.contains_points
) 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
matplotlib.path.Path.contains_points
) 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 python: img(r,c) = img(y,x)
.
- Pay attention to the difference between row-column
(r,c)
and coordinates (x,y)
! For example, in python: img(r,c) = img(y,x)
.
Attention: vous ne pouvez pas utiliser les fonctions disponibles dans skimage.transform
, car ces dernières fournissent plusieurs aspect du TP que vous devez implémenter vous-mêmes !
Warning: you cannot use functions available in skimage.transform
, since they implement several parts of the TP that you must code yourself!
Sauvegarde vidéo
Saving a video
Pour créer une séquence vidéo, vous pouvez utiliser, par exemple, la librairie ffmpeg. 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, for example, the ffmpeg library. 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
Extra credit
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):
- (10%) Essayez de métamorphoser 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 métamorphosée hybride. Ceci est similaire à ce que vous avez effectué au travail 2, mais avec une meilleure correspondance spatiale entre les deux images. Quelle est la différence visible entre une image hybride normale et une image hybride métamorphosée?
- (10%) 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?
- (10%) Essayez de faire votre métamorphose dans un autre système de coordonnées (ex.: polaire). Est-ce que vos résultats diffèrent?
- (10%) Try to morph in another coordinate system (ex.: polar). Are the results any different?
- (20%) Implémentez un algorithme de métamorphose 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.
- (20%) 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.
- (20%) Générez une séquence métamorphosant 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.
Pour 10% : générez l'animation avec ces 19 images de deux vidéos synchronisées et alignées de Michael Jackson et John Travolta effectuant le moonwalk (merci à Gaël Letartre) (voir exemple ci-bas). Le 20% sera obtenu si vous trouvez vos propres vidéos.
- (20%) 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.
For 10%: generate the animation with these 19 images from two synchronized and aligned videos of Michael Jackson dancing the moonwalk (thanks to Gaël Letartre) (see example below). You'll get 20% if you find your own videos.
Livrables
Incluez les informations et résultats suivants dans votre rapport:
- (45% pour 4105, 35% pour 7105) Une séquence vidéo transformant le visage de la personne précédente (N-1) dans la liste en votre visage (N).
- Par exemple, si vous êtes la personne 05 dans la liste, générez une animation du visage de la personne 04 vers la vôtre.
- Cette séquence doit durer 4 secondes et être enregistrée à 25 images par secondes. Le nombre total d'images à générer est donc de 100. Le nombre d'images par secondes peut être géré par
ffmpeg
avec l'option fps=25
(voir ci-haut).
- Pour ce résultat, décrivez brièvement votre algorithme, présentez la vidéo, et également une brève discussion sur votre résultat.
- Truc : pour inclure une vidéo dans un rapport, vous pouvez utiliser le tag HTML
video
.
- Trois (3) animations supplémentaires. Pour chacune d'elles, présentez vos résultats et incluez une brève discussion.
- (40% pour 4105, 30% pour 7105) Un minimum d'une animation de métamorphose effectuée sur des objets, des animaux ou autres. Amusez-vous !
- (10%) Un minimum de deux animations de métamorphose effectuées sur vos propres photos.
- Pour ces animations, à vous de choisir le nombre d'images et la durée pour obtenir une transition progressive.
- (N%) Pour vos crédits supplémentaires, décrivez tout d'abord votre approche, présentez vos résultats et commentez. Lorsque c'est applicable, comparez vos résultats avec une autre technique.
(Le 5% manquant est pour la photo de votre visage, voir section « prérequis »).
Idées pour les discussions
L'objectif des discussions dans vos rapports est que vous nous fassiez part de vos réflexions sur vos résultats. Tentez d'être précis(es) dans vos descriptions. Voici quelques idées :
- Commentez sur la qualité des résultats. Sont-ils à la hauteur de vos attentes? Y a-t-il des régions de l'image où les problèmes sont plus visibles?
- Quand ça marche, commentez tout de même sur ce qui fait que ça marche.
- Si vous avez rencontré des problèmes sur certaines images (ou paires d'images), décrivez ces problèmes et expliquez comment vous avez tenté de les résoudre. Tentez d'expliquer pourquoi ça fonctionne mieux sur certaines images plutôt que d'autres.
- Si vos algorithmes échouent sur certaines images, décrivez les problèmes et expliquez pourquoi ils surviennent selon vous.
- Si vous avez apporté des améliorations, faites une comparaison côte à côte des résultats avant et après votre amélioration.
- Décrivez, le cas échéant, les ajustements que vous avez apportés à l'approche proposée.
Deliverables
Include the following informations and results in your report:
- (45% for 4105, 35% for 7105) A video sequence progressively morphing the face of the previous person (N-1) in the list to your own face (N).
- For example, if you're person 05 in the list, generate an animation from person 04 to you.
- This sequence must be 4 seconds long and be recorded at 25 frames per second. The total number of frames to be generated must therefore be 100. The number of frames per second can be specified to
ffmpeg
with the fps=25
option (see above).
- For this result, briefly describe your algorithm, present your video, and include a discussion on the result.
- Hint: to include a video in your report, see the
video
HTML tag.
- Three (3) additional animations. For each, present your results and include a brief discussion.
- (40% for 4105, 30% for 7105) Experiments with objects, animals and others. Have fun! Generate a minimum of one morphing animations between different pairs of such images.
- (10%) Generate a minimum of two morphing animations on your own photos.
- For these animations, you can choose your own duration and number of frames to generate a smooth transition.
- (N%) For your bells and whistles, start by describing your approach, present your results, and comment.
(The missing 5% is for your face photo, see the "prerequisites" section).
Ideas for discussions
The main objective is that you share your thoughts on your results with us. No need to write a novel, just try to be precise. Here are some ideas:
- Comment on the quality of the results. Do they live up to your expectations? Are there any regions of the image where the problems are more visible?
- If you have encountered problems on some images, describe describe these problems and explain how you tried to solve them. Try to explain why it works better on some images than others.
- If your algorithms fail on some images, describe the problems and explain why they occur in your opinion.
- If you have tried implementing improvements to a method, show a side by side comparison of your results before and after your improvement.
- Describe, if applicable, the adjustments you have made to the proposed approach.
Remise
Pour la remise de votre travail, créez un fichier tp3.zip
qui contient:
- Votre rapport en format HTML dans un dossier
tp3b/web
. Vos images doivent être dans un dossier tp3/web/images
.
- Votre séquence vidéo (visage) dans un dossier
tp3/video
.
- Vos autres séquences vidéo dans un dossier
tp3/resultats
.
- Votre code dans un dossier
tp3/code
.
Finalement, veuillez téléverser votre fichier tp3.zip
sur le portail des cours avant la date limite. La politique des retards mentionnée dans le plan de cours sera appliquée.
Attention! La taille limite permise sur le portail des cours est de 250MB.
Handing in procedure
For this homework, you must create a tp3.zip
file. In this file you'll put:
- Your report in an HTML format inside a folder named
tp3/web/
. Your result images inside a folder named tp3/web/images
.
- Your video sequence in the folder
tp3/video
.
- Your other results in the folder
tp3/resultats
.
- Your code in the folder
tp3/code
.
Finally, you should upload your tp3.zip
file on the "portail des cours" before the deadline. The late submission policy described in the course plan will be applied.
Beware! File size limit on the "portail" is 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.