2023-01-25 19:37:03 +00:00
---
theme: academic
class: text-white
coverAuthor: Laurent Fainsin, Damien Guillotin, Pierre-Eliot Jourdan
2023-01-26 19:05:32 +00:00
coverBackgroundUrl: https://images.unsplash.com/photo-1655720408861-8b04c0724fd9?ixlib=rb-4.0.3& ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8
2023-01-25 19:37:03 +00:00
coverBackgroundSource: unplash
coverBackgroundSourceUrl: https://unsplash.com/photos/Vc0CmuIfMg0
2023-01-31 20:15:34 +00:00
coverDate: '2023-02-01'
2023-01-25 19:37:03 +00:00
themeConfig:
paginationX: r
paginationY: t
paginationPagesDisabled:
- 1
title: Bureau d'étude de PI3D
---
2023-01-31 20:15:34 +00:00
< h2 class = "opacity-50" style = "font-size: 2rem;" > Bureau d'étude de PI3D< / h2 >
2023-01-25 19:37:03 +00:00
2023-01-31 20:15:34 +00:00
< h1 style = "font-size: 2.4rem;" > Sujet 6 - Reformulation du MVS par level sets< / h1 >
2023-01-25 19:37:03 +00:00
---
2023-01-26 09:08:14 +00:00
2023-02-01 10:51:01 +00:00
## Plan du BE
< div class = "h-100 flex items-center text-2xl" >
2023-01-31 20:15:34 +00:00
2023-02-01 10:51:01 +00:00
- Définitions
- L'idée générale
- Hyposthèses
- L'algorithme
- Résultats
2023-02-01 12:54:26 +00:00
- Conclusion
2023-02-01 10:51:01 +00:00
< / div >
2023-01-31 20:15:34 +00:00
<!--
2023-02-01 10:51:01 +00:00
Notre objectif dans ce BE c'était donc d'implémenter ce procédé.
Et pour ce faire on avait besoin de faire les étapes suivantes:
- Définitions
1. Level sets
2. MVS
- L'idée générale
- Hyposthèses
1. Discrétisation de l'espace
2. Binarisation du levelset
- L'algorithme
1. Initialisation du volume
2. Mise à jour du volume
- Résultats
2023-02-01 12:54:26 +00:00
- Conclusion
2023-01-31 20:15:34 +00:00
-->
---
2023-01-26 09:08:14 +00:00
2023-02-01 10:51:01 +00:00
## Définition
### Level sets
2023-01-26 19:35:30 +00:00
2023-02-01 10:51:01 +00:00
< img src = "/figs/lvl7_2D.gif" class = "m-auto" / >
2023-01-31 20:15:34 +00:00
2023-02-01 10:51:01 +00:00
$\mathcal{V} = \{ \textbf{Q} = (X, Y) \in \mathbb{R}^2, u(\textbf{Q}) > s \}, \quad s\in [0,1], \quad u \colon \mathbb{R}^2 \to [0, 1]$
2023-01-26 19:35:30 +00:00
2023-01-26 19:53:55 +00:00
2023-01-31 20:15:34 +00:00
<!--
2023-02-01 10:51:01 +00:00
level set ≃ un seuillage. \
Ici on représente le seuillage d'une fonction par un contour rouge, avec le resultat binarisé à droite.
Ça fait un peu penser aux contours actifs, et on peut considérer les levels sets comme une généralisation des contours actifs.
2023-01-31 20:15:34 +00:00
Définition mathématique et continue des levels sets:
2023-01-26 09:08:14 +00:00
2023-01-31 20:15:34 +00:00
Volume = Ensemble des points de l'espace tel que, l'image de ces points par une fonction valide une condition
2023-02-01 10:51:01 +00:00
- V -> volume (2D ici, noir à droite)
2023-01-31 20:15:34 +00:00
- Q -> point 2D de l'espace
2023-02-01 10:51:01 +00:00
- u -> fonction indicatrice (que l'on souhaite apprendre) qui indique "l'intériorité" d'un point Q dans V
- s -> seuil qui détermine la valeur à partir de laquelle on est dans V
2023-01-31 20:15:34 +00:00
-->
2023-01-26 19:05:32 +00:00
---
2023-02-01 10:51:01 +00:00
### Exemple Level sets 3D
2023-01-26 19:35:30 +00:00
2023-02-01 10:51:01 +00:00
< div class = "flex items-center" >
< img src = "/figs/lvl7_3D.gif" class = "h-110" / >
< figure >
< img src = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/MarchingCubes.svg/350px-MarchingCubes.svg.png" class = "h-50" >
< figcaption class = "text-center" > Marching cubes< / figcaption >
2023-02-01 12:54:26 +00:00
<!-- mettre lien ici -->
2023-02-01 10:51:01 +00:00
< / figure >
< / div >
2023-01-31 20:15:34 +00:00
<!--
La définition précédente se généralise très bien aux espace de dimension supérieurs, voici un exemple 3D.
Juste on vous parle de la 2D psk c'est plus simple.
Par exemple ici on peut pas représenter u, car il nous faudrait une représentation 4D.
Par contre on peut vous montrer le résultat de V_t pour différent t.
2023-02-01 10:51:01 +00:00
En ce qui concerne le rendu de la surface 3D, on utilise l'ago de marching cubes.
2023-01-31 20:15:34 +00:00
-->
2023-01-26 19:35:30 +00:00
---
2023-02-01 10:51:01 +00:00
## Définition
### Multi-view Stereo
2023-01-26 09:08:14 +00:00
2023-02-01 10:51:01 +00:00
< img src = "https://people.inf.ethz.ch/~moswald/publications/resources/Oswald-DA-2007.png" class = "m-auto h-105" / >
2023-01-26 09:08:14 +00:00
2023-02-01 10:51:01 +00:00
< a href = "https://people.inf.ethz.ch/~moswald/publications/resources/Oswald-DA-2007.pdf" class = "absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs" > Concurrent Stereo Reconstruction, Martin R. Oswald, 2007< / a >
2023-01-26 19:05:32 +00:00
2023-01-31 20:15:34 +00:00
<!--
2023-02-01 10:51:01 +00:00
MVS -> reconstruction 3D à partir des positions des caméras et de leur image.
2023-02-01 12:54:26 +00:00
On obtient un nuage de point dense
Avec la méthode classique, il peut y avoir des décalages entre les nuages de points
Mais avec level set, on peut s'affranchir de ce problème
2023-01-31 20:15:34 +00:00
-->
---
2023-02-01 10:51:01 +00:00
## L'idée générale
### Évolution de $u$
2023-01-31 20:15:34 +00:00
2023-02-01 10:51:01 +00:00
< img src = "/figs/lvl7_2D_1.png" class = "m-auto h-100" / >
2023-01-31 20:15:34 +00:00
< a href = "https://hal.inria.fr/inria-00073673/document" class = "absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs" > Variational principles, surface evolution, PDEs, level set methods, and the stereo problem - Olivier Faugeras, Renaud Keriven, 1998< / a >
<!--
2023-02-01 10:51:01 +00:00
Faugeras et Keriven ont écrit ce "livre" pour poser pleins de preuves mathématiques sur des problèmes variationnels... dont les levels sets.
Et donc dans le leur "livre" ils montrent plusieurs exemples de levels sets.
Ils montrent un procédé pour mettre à jour u (le contour bleu) pour que celui-ci converge vers un volume capturé (le contour rouge) par des caméras (dont les poses sont connues).
2023-01-31 20:15:34 +00:00
-->
2023-01-26 19:35:30 +00:00
---
2023-01-26 19:05:32 +00:00
2023-02-01 10:51:01 +00:00
## L'idée générale
### Évolution de $u$
2023-01-31 20:15:34 +00:00
2023-02-01 10:51:01 +00:00
< img src = "/figs/lvl7_2D_3.png" class = "m-auto h-100" / >
2023-01-31 20:15:34 +00:00
< a href = "https://hal.inria.fr/inria-00073673/document" class = "absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs" > Variational principles, surface evolution, PDEs, level set methods, and the stereo problem - Olivier Faugeras, Renaud Keriven, 1998< / a >
<!--
2023-02-01 10:51:01 +00:00
changement de topologie du level set
2023-01-31 20:15:34 +00:00
-->
---
2023-02-01 10:51:01 +00:00
## Hypothèses
### Discrétisation de l'espace
2023-01-31 20:15:34 +00:00
2023-02-01 10:51:01 +00:00
< img src = "https://upload.wikimedia.org/wikipedia/commons/b/bc/Voxels.svg" class = "m-auto mr-50 -mt-13 h-100" >
2023-01-31 20:15:34 +00:00
2023-02-01 12:54:26 +00:00
< div class = "absolute top-25" >
$\mathbb{R}^3 \to \mathbb{V}$
< / div >
2023-01-31 20:15:34 +00:00
2023-02-01 10:51:01 +00:00
### Binarisation du levelset
2023-01-26 19:05:32 +00:00
2023-02-01 12:54:26 +00:00
< div class = "absolute bottom-3" >
$\mathcal{V} = \{ \textbf{v} = (x, y, z) \in \mathbb{V}, u(\textbf{v}) > 0 \}, \quad u \colon \mathbb{V} \to \{0, 1\}$
< / div >
2023-01-26 19:05:32 +00:00
2023-01-26 19:53:55 +00:00
< a href = "https://en.wikipedia.org/wiki/Voxel" class = "absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs" > Wikipedia< / a >
2023-01-31 20:15:34 +00:00
<!--
Dans un premier on va discrétiser notre espace, puisque qu'on travaille dans le monde numérique + les observations (photos caméras) que l'on va utiliser pour calculer notre levelset sont aussi des échantillons.
On va donc travailler avec une grille de pixels si on est en 2D, et un grille de voxels (V) si on est en 3D.
On va aussi simplifier le problème en binarisant notre fonction u, celle-ci désormais sort soit 0 (de l'air) ou 1 (du solide).
Et donc t on va aussi le définir égal à 0.
-->
---
2023-02-01 10:51:01 +00:00
## L'algorithme
### Initialisation du volume
2023-01-31 20:15:34 +00:00
- Définition des bornes de notre grille de voxels:
- $x \in \llbracket x_{\min}, x_{\max} \rrbracket$
- $y \in \llbracket y_{\min}, y_{\max} \rrbracket$
- $z \in \llbracket z_{\min}, z_{\max} \rrbracket$
- Définition d'une résolution de voxel:
- Pas trop grand, sinon un voxel projeté sur nos caméras comprends plusieurs pixels
- Pas trop petit, sinon plusieurs voxels se projetent sur le même pixel
- Exemple: $5.10^{-2}\ m$
- Initialisation des valeurs des voxels:
- Uniforme: $\forall \textbf{Q} = (X, Y, Z) \in \mathbb{R}, u_0(\textbf{Q}) = 1$
- Shape From Silhouette < span style = "opacity: 0.025;" > BE4 CHEH</ span >
<!--
2023-02-01 14:59:26 +00:00
Parler init volume juste avant. \
2023-01-31 20:15:34 +00:00
Comme on l'a vu dans les exemple de Faugeras, il nous faut un u_0 initial (le contour bleu). Pour ça, dans notre cas, on va dans un premier temps définir des bornes à notre grille de voxels. Il faut aussi définir la taille des voxels.
-->
2023-01-26 19:05:32 +00:00
---
2023-02-01 10:51:01 +00:00
## L'algorithme
### Principe du Shape from Silhouette
2023-01-26 19:35:30 +00:00
2023-02-01 10:51:01 +00:00
< img src = "https://www.researchgate.net/profile/Silvio-Savarese/publication/221625880/figure/fig1/AS:652956261158913@1532688312594/Shape-from-Silhouettes-The-silhouette-and-camera-location-for-each-view-forms-a-cone.png" class = "m-auto h-105" >
2023-01-31 20:15:34 +00:00
< a href = "https://ieeexplore.ieee.org/document/1024034" class = "absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs" > Implementation of a Shadow Carving System for Shape Capture, doi: 10.1109/TDPVT.2002.1024034< / a >
<!--
On suppose qu'on connait les poses de plusieurs caméras, ainsi que les masques de l'objet qu'elles capturent.
On va prendre tous les voxels de notre grille et les projeter sur chacune de nos caméras.
Si on voxel tombe à l'exterieur du masque d'au moins d'une caméra, on le supprime.
Il en résulte l'enveloppe convexe de l'objet (nuage de points / voxels).
Plus on a de caméra, meilleure sera la définition de l'enveloppe.
-->
2023-01-30 14:10:45 +00:00
2023-01-26 19:35:30 +00:00
---
2023-02-01 10:51:01 +00:00
### Shape from Silhouette 3D
2023-01-26 19:05:32 +00:00
2023-02-01 10:51:01 +00:00
< div class = "flex items-center" >
2023-02-01 12:54:26 +00:00
< img src = "/figs/example3D.gif" class = "m-auto h-100" >
2023-02-01 15:07:39 +00:00
< iframe frameborder = "0" allowfullscreen mozallowfullscreen = "true" webkitallowfullscreen = "true" allow = "autoplay; fullscreen; xr-spatial-tracking" xr-spatial-tracking execution-while-out-of-viewport execution-while-not-rendered web-share width = "100%" height = "100%" src = "https://sketchfab.com/models/e5717ee34c9e481a817a34aeacd8a48e/embed?autostart=1" class = "h-100" > < / iframe >
2023-02-01 10:51:01 +00:00
< / div >
2023-01-30 14:10:45 +00:00
2023-01-31 20:15:34 +00:00
<!--
25 poses, torus avec briques, génération blender, masques parfait par render raytracing (cycles).
2023-02-01 10:51:01 +00:00
nuage de voxel. si nuage de points -> conversion en mesh possible grace aux marching cubes.
2023-01-31 20:15:34 +00:00
-->
2023-01-30 14:10:45 +00:00
2023-01-26 19:05:32 +00:00
---
2023-02-01 10:51:01 +00:00
## L'algorithme
### Lancer de rayon (Fast Voxel Intersect)
2023-01-30 14:48:52 +00:00
2023-02-01 10:51:01 +00:00
< div class = "grid grid-cols-2 col-auto w-110 m-auto" >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1068141883810914427/fvi2.png" class = "m-auto h-55" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1068141884242931712/fvi4.png" class = "m-auto h-55" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1068141884679147602/fvi6.png" class = "m-auto h-55" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1068141885056622661/fvi8.png" class = "m-auto h-55" / >
< / div >
2023-01-31 20:15:34 +00:00
2023-02-01 16:11:30 +00:00
<!--
- Sélection des voxels sur la bordure du volume
- Vérification de la visibilité du voxel par toutes les caméras
- Récupération des couleurs visibles par les caméras
- Si !consensus et air, !update -> air
- Si consensus et air, update -> solide
- Si !consensus et solide, update -> air
- Si consensus et solide, !update -> solide
-->
2023-01-30 14:48:52 +00:00
---
2023-02-01 12:54:26 +00:00
## Résultats
### L'environnement
2023-01-31 20:15:34 +00:00
2023-02-01 12:54:26 +00:00
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070291885823889408/peanut.png" class = "m-auto h-110" / >
2023-01-31 20:15:34 +00:00
---
2023-02-01 12:54:26 +00:00
## Résultats
### Les données
2023-01-31 20:15:34 +00:00
2023-02-01 12:54:26 +00:00
< style >
img.shadowy {
box-shadow: 0 0px 6px rgb(0 0 0 / 30%);
}
< / style >
2023-01-26 19:05:32 +00:00
2023-02-01 12:54:26 +00:00
< div class = "flex items-center" >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070293528288165930/peanut_cams.png" class = "h-90" / >
< div class = "flex-col inline-flex gap-5" >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070292853282054225/Image0000.png" class = "w-100 shadowy" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070292923322744903/Image0000.png" class = "w-100 shadowy" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070292853495975988/Image0010.png" class = "w-100 shadowy" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070292923549224980/Image0010.png" class = "w-100 shadowy" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070292853764407306/Image0020.png" class = "w-100 shadowy" / >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070292923754741770/Image0020.png" class = "w-100 shadowy" / >
< / div >
< / div >
2023-01-26 19:05:32 +00:00
---
2023-02-01 12:54:26 +00:00
## Résultats
### L'initialisation (Shape from Silhouette)
2023-01-26 19:05:32 +00:00
2023-02-01 12:54:26 +00:00
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070287482186383450/init.png" class = "m-auto h-110" >
2023-01-26 19:05:32 +00:00
---
2023-02-01 10:51:01 +00:00
## Résultats
2023-02-01 12:54:26 +00:00
### Bordures
2023-01-26 19:05:32 +00:00
2023-02-01 12:54:26 +00:00
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070307308032233532/border.png" class = "m-auto h-110" >
2023-01-26 19:35:30 +00:00
---
2023-02-01 10:51:01 +00:00
## Résultats
2023-02-01 12:54:26 +00:00
### Visibilité des voxels
2023-01-31 20:15:34 +00:00
2023-02-01 12:54:26 +00:00
< div class = "h-100 flex items-center" >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070312481894973460/ray.png" class = "h-105 -ml-15 -mr-15" >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070312482243104839/selected.png" class = "h-105 -ml-15" >
< / div >
2023-01-31 20:15:34 +00:00
---
2023-02-01 10:51:01 +00:00
## Résultats
2023-02-01 12:54:26 +00:00
### Évolution du level set
2023-01-30 14:48:52 +00:00
2023-02-01 12:54:26 +00:00
< div class = "h-100 flex items-center" >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070319867946872912/evol7bis.gif" class = "m-auto h-105" >
< img src = "https://cdn.discordapp.com/attachments/953586522572066826/1070319868324360252/shape7bis.gif" class = "m-auto h-105" >
< / div >
2023-01-31 20:15:34 +00:00
---
2023-02-01 12:54:26 +00:00
## Conclusion
2023-01-31 20:15:34 +00:00
2023-02-01 12:54:26 +00:00
< div class = "h-100 flex flex-col text-2xl justify-center" >
### Ce que nous avons fait
2023-01-31 20:15:34 +00:00
- Réalisation du SfS en 2D/3D
2023-02-01 12:54:26 +00:00
- Réalisation du MVS par level sets en 2D avec initialisation par SfS
< br >
### Axes d'amélioration soon™
- Résultat en 3D
- $\{0, 1\} \to [0, 1]$
2023-01-31 20:15:34 +00:00
< / div >