projet-fin-etude-rapport/slides/slides.md
2023-08-25 16:00:20 +02:00

272 lines
11 KiB
Markdown

---
theme: academic
class: text-white
coverAuthor: Laurent Fainsin
coverBackgroundUrl: https://git.fainsin.bzh/ENSEEIHT/projet-fin-etude-rapport/media/branch/master/assets/aube.jpg
coverBackgroundSource: Safran Media Library
coverBackgroundSourceUrl: https://medialibrary.safran-group.com/Photos/media/179440
coverDate: '2023-09-07'
themeConfig:
paginationX: r
paginationY: t
paginationPagesDisabled:
- 1
title: Projet de fin d'étude
---
<h2 class="opacity-50" style="font-size: 2rem;">Projet de Fin d'Étude</h2>
<h1 style="font-size: 2.4rem; line-height: normal;">Modèles génératifs pour la représentation latente d'aubes 3D sous forme de maillages non structurés</h1>
---
## Sommaire
<div class="h-100 flex items-center text-2xl">
- Présentation de Safran
- Présentation du dataset
- Modèles génératifs
- Génération par diffusion
- Résultats
- Vérifications
- Conclusion
</div>
<!--
Petit sommaire pour cadrer un peu les parties de ma présentation
-->
---
## Présentation (rapide) de Safran
<div class="flex items-center h-100">
<img src="/assets/SAF2012_0009786-1.jpg" class="m-auto h-81">
<img src="/assets/SAF2013_0105143-1.jpg" class="m-auto h-81">
</div>
<a href="https://medialibrary.safran-group.com/" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">Safran Media Library</a>
<!--
Safran grand groupe industriel technologique français.
Principalement aéronautique, mais pas que.
Safran génère des revenus principalement grâce à la vente de moteur pour la propulsion d'avion civiles.
à gauche: cfm56 moteur civile le plus vendu au monde, depuis 1978
à droite: m88, moteur militaire, équipe les rafales (Dassault)
Lors de mon stage j'ai fait partie d'une équipe de Safran Tech qui est le département recherche de Safran qui explore de nouveaux procédés pour les nouvelles générations de moteurs (mais pas que).
Dans mon cas j'ai donc travaillé sur l'amélioration des aubes, qui sont les pales qu'on peut voir ~ici, celles à l'intérieur, plusieurs étages.
-->
---
## Dataset Rotor37_1200
<div class="flex items-center w-full bg-black">
<img src="/assets/rotor37_surface.gif" class="m-auto w-full">
<img src="/assets/rotor37_points.gif" class="m-auto w-full">
</div>
<!--
pointcloud car connectivité des maillages trop complexe à prédire, et y'a des techniques pour reconstruire la surface juste à partir des points.
-->
---
## Modèles génératifs (traditionnels)
<img src="https://git.fainsin.bzh/ENSEEIHT/projet-fin-etude-rapport/media/branch/master/assets/online_adaptative_sampling_DOE.png" class="m-auto h-100 mt-10"/>
<!--
Les modèles génératifs c'est pas nouveaux, si on souhaite trouver une aube qui respèrecte un certaine critère de performance par exemple, une méthode simple et largement déjà utiliser c'est "l'exploration d'un espace paramètre".
Si on suppose qu'on a une CAO (construction d'une aube avec des objets primitifs) sous la main paramétrisé (par l'angle d'attaque, hauteur, largueur, ...). On peut échantilloner, passer sous simu, relever les perfs, interpoler, trouver des endroits interessants à explorer, échantilloner de nouveaux paramètres, répéter...
À la fin, on a normalement au moins une aube qui nous convient.
Inconvénient, c'est long, à cause de la simu, et si on veut optimiser un autre paramètre on peut pas trop réutiliser ce qu'on à là.
-->
---
## Modèles génératifs (deep learning)
<img src="https://lilianweng.github.io/posts/2021-07-11-diffusion-models/generative-overview.png" class="m-auto h-110"/>
<a href="https://lilianweng.github.io/posts/2021-07-11-diffusion-models/" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">Lilian Weng, 2021</a>
<!--
Solution: balancer des réseaux de neurones là dedans et voir si ça marche. Y'a globalement 4 grosses familles de modèles génératifs (gan, vae, nf, dm).
L'objectif de ces modèles se ressemblent un peu tous. Dans les trois premiers, on veut apprendre à génerer distrib x' qui ressemble très fortement à x. Donc en gros formelement pendant leur entrainement on veut apprendre l'identité, mais particularité dans ces réseaux, par exemple dans vae on passe (généralement) par un goulot d'étranglement qu'on appelle espace latent (z), auquel on peut donner des propriétés interessantes.
La famille qui nous interesse le plus ici c'est les modèles de diffusion, le plus récent.
-->
---
## Denoising Diffusion Probabilistic Model (DDPM)
<div class="flex flex-col items-center h-100">
<img src="/assets/ddpm_algo.png" class="m-auto w-9/10">
<img src="/assets/ddpm_example.png" class="m-auto w-full">
</div>
<p class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">
<a href="https://arxiv.org/abs/2006.11239">arxiv:2006.11239</a>,
<a href="https://cvpr2022-tutorial-diffusion-models.github.io/">CVPR 2022 Diffusion Tutorial</a>
</p>
<!--
Il existe plusieurs méthodes pour faire de la diffusion, la plus simple/connue d'entre elles c'est DDPM. Le principe de cette méthode c'est d'apprendre un mapping réversible entre nos données et une autre distribution parfaitement connue, comme une gaussienne isotropique.
Ce mapping on va l'apprendre par l'intermédiaire d'un réseau débruiteur. Pour ce faire on prend une de nos données (x0), on la bruite (xt), on la donne notre réseau, on récupère la prédiction (eps_theta) de notre réseau, qu'on utilise ensuite pour optimiser le réseau à prédire le bruit que l'on a ajouté (eps).
Une fois le réseau entrainé, on est capable de débruité des données. Le plus intéressant c'est lorsque que l'on part d'un bruit blanc et que l'on demande quand même au réseau de débruiter. Le réseau se met à halluciner des informations, et génère finalement une nouvelle donnée qui se rapproche très fortement de celles qui a apprises.
-->
---
## Forward process
<div class="flex items-center h-100">
<div class="flex items-center w-full bg-black">
<img src="/assets/aube_rotation.gif" class="m-auto w-full">
<img src="/assets/aube_forward_front.gif" class="m-auto w-full">
<img src="/assets/aube_forward_side.gif" class="m-auto w-full">
</div>
</div>
<!--
voila un example du forward process sur une aube 3D (ici subsample 2048 points et normalisé donc un peu applati)
on observe bien qu'à la fin on obtient bien quelque chose qui ressemble à une gaussienne
donc ce genre de données on peut les donner à un réseau capable de traiter des nuages de points, comme par exemple un réseau basés sur des kpconvss, ou un réseau qui travaille directement sur les points comme PointNet, ou un réseau qui travaille sur une représentation en voxel de nos points, etc. (cf rapport)
-->
---
## Reverse process
<div class="flex items-center h-100">
<div class="flex items-center w-full bg-black">
<img src="/assets/sample_rotation.gif" class="m-auto w-full">
<img src="/assets/sample_reverse_front.gif" class="m-auto w-full">
<img src="/assets/sample_reverse_side.gif" class="m-auto w-full">
</div>
</div>
<!--
Si on effectue le reverse process, on voit que le nuage de point gaussien au départ ressemble de plus en plus progressivement à une aube.
Le résultat (ici kp-fcnn) est pas mal, mais pas ouffissime car il reste une bonne quantité de bruit (bonne chance pour reconstruire la surface là), surement améliorable si on trouve de meilleurs hyperparmètres, mais on peut faire mieux.
-->
---
## Latent Diffusion Model (LDM)
<div class="flex items-center w-full h-100">
<img src="https://ar5iv.labs.arxiv.org/html/2112.10752/assets/img/generativevscompressive4.jpg" class="m-auto h-65">
<img src="https://ar5iv.labs.arxiv.org/html/2112.10752/assets/x1.png" class="m-auto h-65">
</div>
<a href="https://arxiv.org/abs/2112.10752" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">arxiv:2112.10752</a>
<!--
LDM part du constat que c'est plus efficace de travailler sur les informations latentes des données plutot que directement sur les données. Y'a toute une série de travaux sur la représentivité des réuseaux de neurones qui le prouve.
Pour ça tout ce qu'on fait c'est rajouter (généralement) un VAE en amont du modèle de diffusion pour permettre de passer de nos données à leurs représentation latente et inversement. Comme ces transformations agissent un peu comme une opération de compression (et de decompression) l'apprentissage du modèle de diffusion est plus simple.
Dans notre cas, puisque la structure des données s'y porte bien (bien régulière, noeuds tous dans le même ordre, ...) on peut utiliser une PCA pour obtenir un espace latent. Ça a l'avantage d'être non paramétrique, mais l'inconvenient d'être spécialisé sur un jeu de données (ce qui n'est pas super grave dans le cadre industriel).
-->
---
## Classifier-free Guidance (CFG)
<img src="https://perceptron.blog/assets/images/diffusion_models/diffusion_gradients_free.gif" class="m-auto h-55">
<img src="https://perceptron.blog/assets/images/diffusion_models/diffusion_free_guided_results.gif" class="m-auto h-55">
<a href="https://perceptron.blog/defusing-diffusion/" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">Paweł Pierzchlewicz</a>
<!--
Autre amélioration, jusqu'à présent on est capable de générer des données qui ressemble à une densité de probabilité x. Cependant couramment on veut générer des données qui ressemble à un sous ensemble de données (x,y) avec y la classe de x.
Il existe plusieurs méthode pour faire cela, la plus performante d'entre elles étant la cfg. Le principe c'est d'entrainer notre réseau de diffusion conjointement à la prédiction non conditionnée et conditionnée. Lors de l'échantillonage faire une interpolation linéaire entre une prédiction non condtionnée et conditonnée pour guider la génération.
-->
---
## Résultats
<div class="flex items-center w-full bg-black">
<img src="/assets/result_surface.gif" class="m-auto w-full">
<img src="/assets/result_points.gif" class="m-auto w-full">
</div>
---
## Gaussian Process (GP)
<div class="flex items-center h-100" style="overflow: hidden;">
<div style="overflow: hidden;">
<iframe scrolling="no" style="height: 50rem; margin-top: -18rem; width: 75rem; margin-left: -10rem;" src="https://distill.pub/2019/visual-exploration-gaussian-processes/">
</iframe>
</div>
</div>
<a href="https://distill.pub/2019/visual-exploration-gaussian-processes/" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">Distill</a>
---
## Vérification par Gaussian Process (GP)
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_train.gif" class="m-auto w-full">
<img src="/assets/gp_q2.png" class="m-auto w-full">
</div>
<!-- q2 = r2 = Coefficient de détermination -->
---
## Vérification par Gaussian Process (GP)
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_massflow.gif" class="m-auto w-full">
<img src="/assets/gp_efficiency.gif" class="m-auto w-full">
</div>
---
## Vérification par Gaussian Process (GP)
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_guidance.gif" class="m-auto w-full">
<img src="/assets/gp_double.gif" class="m-auto w-full">
</div>
---
## Conclusion
<div class="h-100 flex flex-col text-2xl justify-center">
### Travail réalisé
- Génération conditionnée d'aubes par diffusion
<p></p>
### Axes d'amélioration
- Remplacer la PCA par une méthode paramétrique
- Travailler directement sur les CAOs
</div>