TP5: Insertion d'objets virtuels Posez une question sur ce TP!

HW5: Adding virtual objects (Version française) Ask us a question!

Date limite: 14 avril 2021 à 23h59 Deadline: 23h59 on April 14th, 2021

Résumé

Le but de ce projet est de vous familiariser avec les images à haute plage dynamique (High Dynamic Range ou HDR), l'éclairage à base d'images (Image Based Lighting ou IBL), et de leurs applications. À la fin de ce travail, vous serez en mesure de créer des images HDR à partir d'ensembles d'images à plage dynamique faible (Low Dynamic Range ou LDR) et, aussi, d'ajouter des objets 3D dans les photos en utilisant des techniques d'éclairage à base d'images.

La photographie HDR est la méthode de capture des photos contenant une plage dynamique plus grande que ce que les photos normales contiennent (c'est-à-dire qu'elles contiennent des valeurs de pixels en dehors de la plage standard des images LDR entre 0-255 et contiennent plus de précision). La plupart des méthodes pour créer des images HDR impliquent la fusion de plusieurs images LDR à diverses expositions, ce que vous ferez dans ce projet.

Les images HDR sont utilisées dans une grande variété d'applications, telles que l'amélioration du contraste, l'art hyper-réaliste, des ajustements d'intensité post-traitement, et l'éclairage à base d'images. Nous allons nous concentrer sur leur utilisation dans l'éclairage à base d'images, spécifiquement sur la "ré-illumination" d'objets virtuels. Une façon de ré-illuminer un objet est de capturer une image HDR panoramique 360 ​​degrés (omnidirectionnelle) d'une scène qui fournit des informations d'éclairage sur tous les angles incident à la caméra (d'où le terme éclairage à base d'images). La capture d'une telle image est difficile avec des caméras standards, car cela nécessite à la fois de l'assemblage de photos et de la conversion LDR à HDR. Une alternative plus facile consiste à capturer une photographie HDR d'un miroir sphérique ce qui fournit les mêmes informations d'éclairage omnidirectionnel.

Dans ce TP, nous utiliserons l'approche du miroir sphérique. Une image HDR de ce miroir nous permettra de ré-illuminer des modèles 3D et de les composer harmonieusement dans des images.

Le travail à effectuer est divisé en trois étapes principales:

  1. Capturer plusieurs expositions d'une sphère métallique (optionnel cette année);
  2. Convertir les images capturées en une carte de radiance à haute plage dynamique ;
  3. Effectuer le rendu d'objets artificiels dans une photo en utilisant cette carte de radiance.

Ces étapes sont décrites plus bas.

Overview

The goal of this project is to familiarize yourself with high dynamic range (HDR) imaging, image-based lighting (IBL), and their applications. By the end of this project, you will be able to create HDR images from sequences of low dynamic range (LDR) images and also learn how to composite 3D models seamlessly into photographs using image-based lighting techniques.

HDR photography is the method of capturing photographs containing a greater dynamic range than what normal photographs contain (i.e. they store pixel values outside of the standard LDR range of 0-255 and contain higher precision). Most methods for creating HDR images involve the process of merging multiple LDR images at varying exposures, which is what you will do in this project.

HDR images are widely used by graphics and visual effects artists for a variety of applications, such as contrast enhancement, hyper-realistic art, post-process intensity adjustments, and image-based lighting. We will focus on their use in image-based lighting, specifically relighting virtual objects. One way to relight an object is to capture an 360 degree panoramic (omnidirectional) HDR photograph of a scene, which provides lighting information from all angles incident to the camera (hence the term image-based lighting). Capturing such an image is difficult with standard cameras, because it requires both panoramic image stitching and LDR to HDR conversion. An easier alternative is to capture an HDR photograph of a spherical mirror, which provides the same omni-directional lighting information (up to some physical limitations dependent on sphere size and camera resolution).

In this homework, we will take the spherical mirror approach. With this panoramic HDR image, we can then relight 3D models and composite them seamlessly into photographs.

This homework is divided into three main steps:

  1. Capturing multiple exposures of a metallic sphere;
  2. Converting these exposures into a single HDR radiance map;
  3. Rendering synthetic objects into a photograph using this panoramic radiance map.

The steps are described in more details below.

1. Capturer plusieurs expositions d'une sphère métallique

1. Capturing multiple exposures of a metallic sphere

Dans cette partie du travail, vous devez capturer plusieurs expositions d'une balle métallique placée dans la scène d'intérêt, et fusionner ces expositions en une seule image à haute plage dynamique.

Important : si vous avez une sphère réfléchissante à la maison -- une boule de Noël peut très bien faire -- alors vous pouvez essayer de capturer vos propres scènes pour des crédits supplémentaires! Cependant, si vous n'avez pas l'équipement, nous vous donnons les images nécessaires pour plusieurs scènes ici.

Matériel nécessaire

Ce dont vous avez besoin :

Necessary equipment

You will need:

Collecte de données

Pour collecter vos données,

  1. Choisissez une scène intéressante à photographier. La scène devrait avoir une surface plane sur laquelle vous pourrez placer votre miroir sphérique. Elle peut être intérieure ou extérieure. Si vous êtes à l'extérieur, vous devriez vous placer à l'ombre, le soleil vous causera probablement des problèmes.
  2. Trouvez une place fixe et rigide pour placer votre caméra. Un trépied est idéal, mais vous pouvez aussi utiliser un objet stable.
  3. Placez votre miroir sphérique sur une surface plate et assurez-vous qu'il ne bouge pas. Soyez certain que la sphère ne soit pas trop éloignée de la caméra; elle devrait occuper au moins 256x256 pixels dans l'image.
  4. Photographiez le miroir sphérique en utilisant au moins trois différents temps d'expositions. Soyez certain que la caméra ne bouge pas trop (de très petite variation sont ok, mais le point de vue devrait être fixe). Pour de meilleurs résultats, vos temps d'expositions devraient être au moins 4 fois plus long et plus court (±2 stops) que votre temps d'exposition moyen (par exemple, si votre temps moyen est de 1/40s, alors vous devriez avoir des temps d'expositions d'au moins 1/10s et 1/160s). Notez les temps d'exposition, ou assurez-vous que votre caméra enregistre cette information dans l'en-tête EXIF du fichier image.
  5. Retirez le miroir de la scène et, du même point de vue que les autres photos, prenez une autre photo de la scène avec un temps d'exposition normal (la plupart des pixels sont ni trop ni pas assez exposés). C'est dans cette image que vous allez insérer des objets virtuels.
  6. Après avoir capturé les images, chargez-les dans votre ordinateur. Dans un éditeur d'image (ou dans Matlab), découpez l'image manuellement pour conserver uniquement la sphère (voir l'exemple plus bas).
  7. De petites erreurs d'alignement pourraient se produire (dues à un déplacement de la caméra, ou une erreur de découpage). S'il y a des différences substantielles avec la position/rotation de la caméra visible dans l'ensemble d'images, tentez d'aligner les images manuellement, ou recommencez à l'étape 4.

Data collection

To collect your data,

  1. Find a good scene to photograph. The scene should have a flat surface to place your spherical mirror on (see my example below). Either indoors or outdoors will work. If you go outdoors, we recommend shooting in the shade, as the sun may cause problems.
  2. Find a fixed, rigid spot to place your camera. A tripod is best, but you can get away with less. The back of a chair, a desk, a shelve, etc. should work well enough.
  3. Place your spherical mirror on a flat surface, and make sure it doesn't roll by placing a cloth/bottle cap/etc under it. Make sure the sphere is not too far away from the camera; it should occupy at least a 256x256 block of pixels.
  4. Photograph the spherical mirror using at least three different exposures. Make sure the camera does not move too much (slight variations are OK, but the viewpoint should generally be fixed). For best results, your exposures should be at least 4 times longer and 4 times shorter (±2 stops) than your mid-level exposure (e.g. if your mid-level exposure is 1/40s, then you should have at least exposures of 1/10s and 1/160s; the greater the range the better). Record the exposure times, or make sure they are available in the EXIF header of the image file.
  5. Remove the mirror from the scene, and from the same viewpoint as the other photographs, take another picture of the scene at a normal exposure level (most pixels are neither over- or under-exposed). This will be the image that you will use for object insertion/compositing (the "background" image).
  6. After you copy all of the images to your computer, load the spherical mirror images (from step 4) into your favorite image editor and crop them down to contain only the sphere (see example below).
  7. Small alignment errors may occur (due to camera motion or cropping). If there are substantial differences in camera position/rotation among the set of images, re-take the photographs.

De gauche à droite: une photo de sphère (étape 4), sphère découpée (étape 6), scène vide (étape 5)
Left to right: a sphere photo (step 4), cut sphere (step 6), empty scene (step 5)

2. Convertir les images capturées en une carte de radiance à haute plage dynamique

2. Converting these exposures into a single HDR radiance map

HDR radiance map

Cette étape vise à calculer une carte de radiance HDR (High Dynamic Range) à partir de plusieurs expositions LDR (Low Dynamic Range). Pour ce faire, nous utiliserons l'algorithme vu durant le cours, et décrit dans les sections 2.1 et 2.2 de Debevec et Malik 1997.

Lisez attentivement cet article : le code, que vous pouvez convertir en python directement, est disponible dans l'annexe A de l'article.

La valeur observée $Z_{i,j}$ d'un pixel $i$ dans une image $j$ est fonction de la radiance d'une scène $E_i$ (inconnue) et d'un temps d'exposition $\Delta t_j$ (connue):

\[ Z_{i,j} = f(E_i \times \Delta t_j) \,. \]

Afin de rendre le problème linéaire, posons $g=\log f^{-1}$:

\[ g(Z_{i,j}) = \log(E_i) + \log(\Delta t_j) \,, \]

voir l'équation 2 dans l'article de Debevec. Ces équations peuvent être écrites sous forme matricielle, et il est alors possible de résoudre à la fois pour $g(0), \ldots, g(255)$.

Afin de rendre les résultats encore plus robustes, il nous faudra deux détails supplémentaires:

We want to build an HDR radiance map from several LDR exposures. It is highly recommended that you read Sections 2.1 and 2.2 in Debevec and Malik 1997 to help understand this process. Below is a summary.

Read the paper carefully: the code, which you can directly translate into python, is available in Appendix A of the article.

The observed pixel value $Z_{i,j}$ for pixel $i$ in image $j$ is a function of unknown scene radiance $E_i$ and known exposure duration $\Delta t_j$:

\[ Z_{i,j} = f(E_i \times \Delta t_j) \,. \]

$E_i$ is the unknown scene radiance at pixel $i$, and scene radiance integrated over some time $E_i \times \Delta t_j$ is the exposure at a given pixel. We will not solve for $f$, but for $g=\log f^{-1}$ which maps from pixel values (from 0 to 255) to the log of exposure values:

\[ g(Z_{i,j}) = \log(E_i) + \log(t_j) \]

(equation 2 in Debevec). Solving for $g$ might seem impossible (and indeed, we only recover $g$ up to a scale factor) because we know neither $g$ nor $E_i$. The key observation is that the scene is static, and while we might not know the absolute value of $E_i$ at each pixel $i$, we do know that the value remains constant across the image sequence.

To make the results robust, we consider two additional things:

3. Rendu d'objets synthétiques dans des photos

Dans cette dernière étape, nous utiliserons notre carte de radiance HDR comme source lumineuse pour effectuer de l'éclairage à base d'images et insérer des objets 3D dans la scène. Cela se divise en trois étapes:

  1. la modélisation de la scène;
  2. le rendu;
  3. la composition dans l'image originale.

Nous vous fournissons des instructions détaillées ci-bas. Si vous êtes intéressés, vous trouverez plus de détails sur cette approche dans un autre article du même Debevec, publié un an plus tard, soit en 1998.

Blender

Pour effectuer le rendu des objets virtuels, nous utiliserons le logiciel libre Blender.

Tout d'abord, téléchargez et installez la dernière version de Blender (v2.92b). Dans les fichiers fournis plus bas, trouvez le fichier ibl.blend et ouvrez le avec le logiciel. Ce fichier ibl.blend est celui qui a été utilisé pour créer le résultat dans le haut de la page. Dans le cadre de ce TP, nous vous conseillons d'utiliser ce fichier comme point de départ et de le modifier pour vos propres images et objets.

Le tutoriel suivant pourrait vous être utile pour vous familiariser avec l'interface graphique de Blender:


La capture d'écran suivante illustre l'interface de Blender (version 2.92), et identifie les sections principales (notez qu'elles peuvent être modifiées mais ces trois sections sont les plus importantes) :

3. Rendering synthetic objects into photographs

Next, we will use our HDR radiance map as an image-based light, and insert 3D objects into the scene. This consists of 3 main parts:

  1. modeling the scene;
  2. rendering;
  3. compositing into the original background image.

Specific instructions follow below; if interested, see additional details in this other Debevec paper, published one year later.

Begin by downloading/installing the latest version of Blender here (v2.92). In the example materials package below, locate the blend file and open it. This is the blend file used to create the result at the top of the page. The instructions below assume you will modify this file to create your own composite result, but feel free to create your own blend file from scratch if you are comfortable with Blender.

The following screenshot illustrates the Blender interface (version 2.92) and identifies its main sections (note that they can be modified but these three are the most important):

Voici une brève description de chacune des sections:

Modélisation de la scène

Pour insérer des objets dans une scène, nous devons, en plus de l'information d'illumination que nous avons capturée aux étapes précédentes, avoir une idée de la géométrie et des propriétés des surfaces de la scène. Dans cette étape, vous verrez comment:

  1. Modifier l'image d'arrière-plan;
  2. Modifier la source lumineuse;
  3. Modifier la "scène locale";
  4. Rajouter des objets 3D dans la scène.

Modifier l'image d'arrière-plan : Dans la section "Vue d'ensemble", cliquez tout d'abord sur la caméra, puis cliquez ensuite sur l'icône de caméra tel qu'illustré dans l'image ci-bas. Cochez ensuite "Background images" (dans la section à droite), et sélectionnez votre image "Source". Dans l'exemple, il s'agit du fichier empty.jpg que nous vous avons fourni.

background image

Pour bien voir l'image, assurez-vous que votre point de vue soit par rapport à la perspective de la caméra en appuyant sur "View->Camera" (ou "View->Cameras->Active Camera").

Modifier la source lumineuse : Cliquez maintenant sur l'onglet "World", puis dans la section "Surface". Sélectionnez votre image juste sous "Environment Texture". Pour notre exemple, il s'agit du fichier sphere.hdr. Assurez-vous que l'option "Mirror Ball" soit activée.

background image

Vous pouvez également modifier l'intensité lumineuse de la source avec le paramètre "Strength".

Modifier la "scène locale" : habituellement, nous approximons la scène réelle (près des objets) avec des plans. La scène de base vous fournit un seul plan, mais vous pouvez en rajouter d'autres pour simuler, par exemple, des ombres sur les murs, des miroirs réels présents dans la scène, etc. Pour ce faire, vous pouvez rajouter des objets (des plans) et les orienter pour qu'ils soient alignés avec les plans réels dans la scène. Lorsque c'est fait, deux choses importantes doivent être validées dans l'onglet "Object" de la section "Vue d'ensemble":

  1. L'objet doit être présent dans les deux premières "collection". Pour ce faire, sélectionnez l'objet dans la liste du haut, puis cliquez sur l'icône "Object properties", et trouvez la section "Collection". Cliquez sur "Add collection", puis sélectionnez la "Collection 2".
  2. Le "pass index" doit être de 0. Cela doit être fait pour éviter que cette scène locale apparaisse dans le masque de composition.
background image

Finalement, spécifiez les paramètres de surface ("materials") : sélectionnez un des plans, cliquez sur l'icône "Material properties", ajoutez un matériel avec une BSDF "Diffuse" et modifiez la "Color" pour qu'elle ressemble approximativement à la couleur de la photo à cet endroit.

material

Rajouter des objets 3D dans la scène: vous pouvez rajouter les modèles 3D qui vous plaisent à la scène. Vous pouvez utiliser les modèles standards à l'intérieur du fichier .blend inclus sur cette page, ou vous pouvez trouver vos propres modèles (e.g. Turbosquid, Google 3D Warehouse, DModelz, etc). Ajoutez aussi des matériaux intéressants à vos objets insérés. Ce tutoriel, ou encore celui-ci, sont d'excellentes introductions à la création et au rajout de matériaux dans Blender. Lorsque vous avez rajouté et orienté votre objet, assurez-vous que les deux étapes suivantes soient effectuées correctement dans l'onglet "Object" de la section "Vue d'ensemble":

  1. L'objet ne doit être présent que dans la première "collection".
  2. Le "pass index" doit être de 1. Cela doit être fait pour s'assurer que l'objet apparaisse dans le masque de composition.
background image

Modeling the scene

To insert objects, we must have some idea of the geometry and surface properties of the scene, as well as the lighting information that we captured in previous stages. In this step, you will manually create rough scene geometry/materials using Blender.

With the sample blend file open, add your background image to the scene. In the 3D view window near the bottom right, locate "Background Images". Make sure this is checked, and click "Add image", then click "Open" and locate your background image from step 5 of data collection. Make sure your view is from the camera's perspective by pressing "View->Camera" (or "View->Cameras->Active Camera"); you should see your image in view.

Next, model the "local scene." That is, add simple geometry (usually planes suffice) to recreate the geometry in the scene near where you'd like to insert objects. For best results, this should be close to where you placed the spherical mirror. Feel free to use the sample scene provided and move the vertices of the plane to match the surface you'd like to recreate (ignore the inserted bunny/teapot/etc for now). Once you're happy with the placement, add materials to the local scene: select a piece of local scene geometry, go to "Properties->Materials", add a Diffuse BSDF material, and change the "Color" to roughly match the color from the photograph. Note: The plane object will be rendered twice in two layers, go to "Properties->Object->Relations", check the first two layers with the Shift button pressed.

Then, add your HDR image (the radiance map made above) to the scene. In the Properties->World tab, make sure Surface="Background" and Color="Environment Texture". Locate your saved HDR image in the filename field below "Environment Texture".

Finally, insert synthetic objects into the scene. Feel free to use the standard models that I've included in the sample blend file, or find your own (e.g. Turbosquid, Google 3D Warehouse, DModelz, etc). Add interesting materials to your inserted objects as well. This tutorial is a great introduction to creating materials in Blender. Note: the object will be rendered only once in the first layer. In order to get the object mask, pass an index to each object in "Properties->Object->Relations: Pass Index:1".

Once finished, your scene should now look something like the right image below.

Rendu

Pour insérer les objets harmonieusement, nous devons suivre une procédure de composition décrite par Debevec (Section 6 de l'article de 1998). Nous pouvons directement construire le pipeline dans Blender et générer toutes les images nécessaires d'un seul coup.

C'est ce qui est illustré dans l'éditeur de graphe de Blender. Dans cette section, vous devez spécifier l'emplacement où les images seront sauvegardées. Pour ce faire, cliquez sur l'icône dans la boîte "File Output" et spécifiez l'emplacement sur votre disque dur.

background image

Si vous voulez savoir comment créer ce genre de graphe, plusieurs tutoriels sont disponibles: tutoriel sur le "node editor", exemple de composition, autre exemple.

Lorsque vous êtes prêt à effectuer le rendu, rendez-vous dans l'onglet "Output properties" de la section "Vue d'ensemble". Vous pouvez spécifier les dimensions des images produites par blender. Idéalement, elles devraient avoir la même dimension que votre image d'arrière-plan. Pour pré-visualiser le résultat sans avoir à attendre après un rendu (ce qui peut parfois être long), vous pouvez réduire le pourcentage de l'image produite, ou encore réduire le nombre d'échantillons utilisés pour chaque pixel. Pour générer vos résultats finaux, utilisez 100% de résolution, et augmentez le nombre d'échantillons afin d'obtenir des rendus de bonne qualité.

rendering

Une fois que vous être prêt à générer le rendu, simplement cliquer sur l'onglet "Render" en haut à gauche de l'écran puis sur "Render Image". Le rendu devrait alors être généré est envoyé dans le document que vous avez préalablement sélectionné.

Composition

Pour compléter l'insertion d'objets, nous allons utiliser les trois images rendues précédemment pour effectuer une composition par "rendu différentiel". Cela peut être fait par une simple équation à appliquer pour chaque pixel. Si $R$ est l'image rendue avec les objets, $E$ l'image rendue sans les objets, $M$ le masque des objets et $I$ l'image d'arrière-plan, la composition finale $C$ est calculée avec:

\[ C = M R + (1-M)(I + c(R-E)) \,. \] rendering

Cette équation est décrite dans la section 6 de l'article de Debevec 1998. Les deux premiers termes copient les objets insérés dans l'image d'arrière-plan et le troisième terme, modulé par $c$, ajoute les effets d'illumination des objets insérés (ombres, caustiques, les inter-réflexions, etc.). Fixez $c=1$ initialement, mais ensuite essayez différentes valeurs pour obtenir des ombres et inter-réflexion plus sombres ou plus claires. Vous pouvez implémenter cette étape en python.

Compositing

To finish the insertion, we will use the above rendered images to perform "differential render" compositing. This can be done using a simple pixel-wise equation. Let $R$ be the rendered image with objects, $E$ be the rendered image without objects, $M$ be the object mask, and $I$ be the background image. The final composite is computed with:

\[ C = M R + (1-M)(I + c(R-E)) \,. \]

This equation is described in sec. 6 of the 1998 Debevec paper. The first two terms effectively paste the inserted objects into the background image, and the third term adds the lighting effects of the inserted objects (shadows, caustics, interreflected light, etc), modulated by $c$. Set $c=1$ initially, but try different values to get darker or lighter shadows/interreflections. You can implement this step in python. An example of a final compositing result achieved using this is at the top of the page.

Conseils

Quelques conseils pour calculer $g$:

Quelques conseils sur Blender:

Tips

Some hints on solving for $g$:

Some tips on using Blender:

Crédits supplémentaires

Essayez une de ces idées pour approfondir vos connaissances (et augmenter votre note):

Bells and Whistles

Try one of these ideas to increase your understanding on this subject (and increase your score):

Livrables

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

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

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 :

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:

Remise

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

Finalement, veuillez téléverser votre fichier tp5.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 toutes questions concernant la procédure de remise ou le travail lui-même, posez vos questions sur PAX!

Attention! La taille limite permise sur le portail des cours est de 250MB.

Handing in procedure

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

Finally, you should upload this file (tp5.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, ask your questions on PAX!

Beware! File size limit on "portail" is 250MB. Make sure that your tp5.zip file size does not exceed 250MB.

Liens rapides

Quick links

Remerciements

Merci à Derek Hoiem et Kevin Karsch d'avoir créé le TP original qui a servi d'inspiration pour celui-ci!

Thanks

Many thanks to Derek Hoiem and Kevin Karsch for creating the assignment which inspired this one!

Retour à la page web du cours.

Back to the class webpage.