projet-probleme-inverse-3D/docs/slides.md
gdamms 4384319a03 Ca avance bien 👍
Co-authored-by: Laureηt <laurent@fainsin.bzh>
Co-authored-by: pejour <pejour@users.noreply.github.com>
2023-02-01 11:51:01 +01:00

306 lines
11 KiB
Markdown

---
theme: academic
class: text-white
coverAuthor: Laurent Fainsin, Damien Guillotin, Pierre-Eliot Jourdan
coverBackgroundUrl: https://images.unsplash.com/photo-1655720408861-8b04c0724fd9?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8
coverBackgroundSource: unplash
coverBackgroundSourceUrl: https://unsplash.com/photos/Vc0CmuIfMg0
coverDate: '2023-02-01'
themeConfig:
paginationX: r
paginationY: t
paginationPagesDisabled:
- 1
title: Bureau d'étude de PI3D
---
<h2 class="opacity-50" style="font-size: 2rem;">Bureau d'étude de PI3D</h2>
<h1 style="font-size: 2.4rem;">Sujet 6 - Reformulation du MVS par level sets</h1>
---
## Plan du BE
<div class="h-100 flex items-center text-2xl">
- Définitions
- L'idée générale
- Hyposthèses
- L'algorithme
- Résultats
</div>
<!--
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
-->
---
## Définition
### Level sets
<img src="/figs/lvl7_2D.gif" class="m-auto"/>
$\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]$
<!--
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.
Définition mathématique et continue des levels sets:
Volume = Ensemble des points de l'espace tel que, l'image de ces points par une fonction valide une condition
- V -> volume (2D ici, noir à droite)
- Q -> point 2D de l'espace
- 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
-->
---
### Exemple Level sets 3D
<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>
</figure>
</div>
<!--
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.
En ce qui concerne le rendu de la surface 3D, on utilise l'ago de marching cubes.
-->
---
## Définition
### Multi-view Stereo
<img src="https://people.inf.ethz.ch/~moswald/publications/resources/Oswald-DA-2007.png" class="m-auto h-105"/>
<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>
<!--
MVS -> reconstruction 3D à partir des positions des caméras et de leur image.
-->
---
## L'idée générale
### Évolution de $u$
<img src="/figs/lvl7_2D_1.png" class="m-auto h-100"/>
<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>
<!--
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).
-->
---
## L'idée générale
### Évolution de $u$
<img src="/figs/lvl7_2D_3.png" class="m-auto h-100"/>
<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>
<!--
changement de topologie du level set
-->
---
## Hypothèses
### Discrétisation de l'espace
<img src="https://upload.wikimedia.org/wikipedia/commons/b/bc/Voxels.svg" class="m-auto mr-50 -mt-13 h-100">
<style>
span.katex {
position: absolute;
bottom: 1%;
}
</style>
### Binarisation du levelset
$\mathbb{R}^3 \to \mathbb{V} \newline \implies \mathcal{V} = \{ \textbf{v} = (x, y, z) \in \mathbb{V}, u(\textbf{v}) > 0 \}, \quad u \colon \mathbb{V} \to \{0, 1\}$
<a href="https://en.wikipedia.org/wiki/Voxel" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">Wikipedia</a>
<!--
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.
-->
---
## L'algorithme
### Initialisation du volume
- 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>
<!--
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.
-->
---
## L'algorithme
### Principe du Shape from Silhouette
<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">
<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.
-->
---
### Shape from Silhouette 3D
<div class="flex items-center">
<img src="/figs/example3D.gif" class="m-auto h-110">
<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/4da17838dd5f497faa147db5febd21d9/embed"></iframe>
</div>
<!--
25 poses, torus avec briques, génération blender, masques parfait par render raytracing (cycles).
nuage de voxel. si nuage de points -> conversion en mesh possible grace aux marching cubes.
-->
---
## L'algorithme
### Lancer de rayon (Fast Voxel Intersect)
<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>
---
### Shape from Silhouette 2D
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1069974891023056926/image.png" class="m-auto -mt-2 h-110">
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1069974281175449630/image.png" class="m-auto -mt-1 h-11">
---
## Mise à jour du volume
<img src="/figs/update.png" class="m-auto h-120">
<!--
- Sélection des voxels sur la bordure du "marbre"
- 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
-->
---
## Itération du Level Set
<div class="flex">
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1069973956787966003/Screenshot_from_2023-01-31_14-33-47.png" class="h-110">
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1069975888382410784/image.png" class="h-110">
</div>
---
## Résultats
### L'environnement
<!-- TODO -->
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070291885823889408/peanut.png"/>
---
## Résultats
### Les données
<!-- TODO: mettre les cams a guache et les mask et imagesa droite les unes sur les autres -->
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070293528288165930/peanut_cams.png"/>
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070292853282054225/Image0000.png"/>
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070292853495975988/Image0010.png"/>
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070292853764407306/Image0020.png"/>
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070292923322744903/Image0000.png"/>
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070292923549224980/Image0010.png"/>
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070292923754741770/Image0020.png"/>
---
## Résultats
### L'initialisation (Shape from Silhouette)
<img src="https://cdn.discordapp.com/attachments/953586522572066826/1070287482186383450/init.png" class="m-auto h-120">
---
## Conclusion et axes de développement
<div class="h-100 flex items-center text-2xl">
- Réalisation du SfS en 2D/3D
- Réalisation du MVS par level sets en 2D avec utilisation du SfS
- Résultat en 3D ?
- Passer en continu au lieu de binaire
</div>