projet-fin-etude-rapport/slides/slides.md

408 lines
17 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
download: true
---
<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>
<!--
Hello, donc je vais vous présenter aujourd'hui le travail que j'ai effectué lors de mon stage de fin d'étude, qui porte sur...
Et mon but aujourd'hui c'est de vous présenter ce queces 3 lignes veulent dire
-->
---
## 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 brève de Safran et contexte Stage
- Présentation de mes données
- Présentation de modèles pour traiter le problème
- Résultats de ces modèles
- Vérification de ces modèles
- Conclu
-->
---
## 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>
<!--
Rapidement, Safran grand groupe industriel technologique français.
Principalement aéronautique, mais pas que, plein d'autre filiales.
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...
Dans mon cas j'ai donc travaillé sur l'amélioration des aubes, qui sont un peu se genre de pales, mais à l'intérieur du moteur (non visible ici, dans le compresseur.
-->
---
## 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>
<div class="absolute bottom-0">
29773 nœuds, 59328 triangles et 89100 arêtes.
</div>
<!--
Rotor37_1200, le dataset sur lequel j'ai principalement travaillé.
Il s'agit de 1200 échantillons de déformations d'une des 37 aube du compresseur d'un moteur d'avion (déformations à partir d'une aube nominale)
Ces aubes, sous forme de maillage triangulaire, 30k nœuds, 60k triangles et 90k arêtes.
En chaque nœuds, positions 3D, normales et champs physqique (température, pression, issue de la simu cfd)
\+ pour chaque échantillons, 5 métriques globales (input/output de la simu cfd, vitesse air en entrée du moteur, l'efficacité du moteur...)
Donc on travaille avec un maillage qui est un graphe, mais connectivité assez "locales" (voisins proches dans l'espace) donc dans la suite des travaux on va souvent utiliser seulement le nuage de points.
Ça nous arrange en plus, car connectivité des maillages trop complexe à prédire (quadratique), et y'a des techniques pour reconstruire la surface juste à partir des points (ça marche plus ou moins bien, il faut souvent bcp de points)
On aurait aussi pu imaginer travailler directement sur la CAO de ces aubes, mais c'est bcp plus complexe car représentation d'une objet pas unique via CAO, et zero littérature.
-->
---
## 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"/>
<!--
Donc nous ce qu'on veut c'est générer des trucs qui ressemblent à rotor37. pour ça on peut utiliser des modèles génératifs.
Les modèles génératifs c'est pas nouveaux, si on souhaite trouver une aube qui respecte un certaine critère de performance par exemple pour un nouveau moteur, une méthode simple et largement déjà utiliser c'est "l'exploration d'un espace paramètre" (un peu comme un sweep d'hyperparamètres en deep learning).
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, à partir résultats rajouter des points, 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à. En plus nous on voudrait être capable d'avoir le processus inverse (perf -> aube)
-->
---
## 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.
Formelement pendant entrainement on veut apprendre l'identité, mais particularité dans l'archi, par exemple dans vae on passe (généralement) par un goulot d'étranglement qu'on appelle espace latent, ou GAN on a une architecture adversarial, etc.
La famille qui nous interesse le plus ici c'est les modèles de diffusion, récent et potentiel. Le principe c'est de trouver un processus réversible et discret entre notre distribution de données et une autre distribution qu'on connait parfaitement mathématiquement (qu'on sait sampler sans soucis).
-->
---
## 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 !my-0 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 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 gaussienne isotropique.
Ce mapping on va l'apprendre par l'intermédiaire d'un réseau débruiteur (c'est le d de denoising). Pour se faire (algo 1) 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ébruiter des données. Le plus intéressant c'est lorsque que l'on part d'un bruit blanc (xT) et que l'on demande quand même au réseau de débruiter. Le réseau se met à halluciner des informations là où y'en a pas, et génère finalement une nouvelle donnée qui se rapproche très fortement de celles qu'il a apprises. (algo 2)
-->
---
## 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 principe 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 (un peu empiriquement).
Et ce genre d'avantage on le voit sur figure de gauche. Nos distributions de données sont généralement divisée en deux partie si l'on regarde la quantité d'information nécéssaire à la construction d'un échantillon. On a la partie semantic, très peu d'info, grande variations, et la partie perceptuelle, bcp d'info, traite les détails.
Les espaces latents permettent de travailler uniquement sur semantic. 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.
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 se passer d'un VAE et utiliser une PCA pour obtenir un espace latent. Ça a l'avantage d'être non paramétrique, leger et rapide, 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 avec tout ce que j'ai dit, on est capable de générer des données qui ressemble à une certaine 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. On appelle ça le conditionnement.
Il existe plusieurs méthode pour faire cela, l'un d'entre elle etant cfg. Le principe c'est d'entrainer notre réseau de diffusion conjointement à la prédiction non conditionnée et conditionnée. Jusque là rien de spécial on complexifie un peu plus l'apprentissage, mais lors de l'échantillonage on va pouvoir choisir quel type de données on souhaite générer.
-->
---
## 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>
<!--
Et donc si on applique nos diffusion latente via une PCA, on obtient ceci. Un nuage de point de très bonne qualité (on a plus tout le bruit qu'on avait avec kpconv), et en bonus grâce à la pca, on peut appliquer la connectivité de l'aube nominale à notre génération pour obtenir une surface (pas besoin de méthode de reconstruction).
-->
---
## Résultats
<div class="flex items-center w-full bg-black">
<img src="/assets/result_surface_variations.gif" class="m-auto w-full">
<img src="/assets/result_points_variations.gif" class="m-auto w-full">
</div>
<!--
On peut aussi conditonner via la cfg.
Problème, on est incapable de voir visuellement la différence entre une aube conditionné, là par exemple toutes ces aubes sont conditonnés sur le même critère physqiue, et ça se voit pas trop. Une solution ça serait de passer nos générateurs dans le simu, mais trop long. Donc on va utiliser des modèles de regression.
-->
---
## 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>
<!--
On pourrait entrainer un réseau de neurones pour faire regression entre nuage de points et critère de perf. Mais y'a plus simples.
Les GP c'est des méthodes à noyau, probibilitiques. Avantage:
* fournir des intervals de confiance
* bien moins paramétriques (on cherche juste un noyau).
-->
---
## 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>
<!--
Donc on peut utiliser des GPs pour relation modes pca et perfs.
On s'assure juste que leurs prédictions sont correctes par rapport à des données de test, ici coeff détermination ~= 1 donc correct.
-->
---
## 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>
<!--
Maintenant, vérifier conditionnement génération (orange).
Figure du haut, on conditionne selon out_massflow, on le fait varier entre -2 et 2 (visible dans le titre) et si on regarde la distribution des prédictions on observe que ça suit bien le conditonnement.
Figure du bas, on fait pareil pour l'isentropic_efficiency, mais entre -3 et 3. Une fois de plus c'est bien, même dans les zones où y'a pas beaucoup de points (aux extremités).
-->
---
## Vérification par Gaussian Process (GP)
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_double.gif" class="m-auto w-full">
<img src="/assets/gp_guidance.gif" class="m-auto w-full">
</div>
<!--
Encore d'autres figures
Figure du haut, on conditionne sur deux trucs en même temps, ça marche plutot bien.
La figure du bas, montre comment on peut régler le conditionnement, on peut faire varier la guidance gamma, et donc on observe la distribution se concentrer progressivement.
-->
---
## 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
- Vérifier le conditionnement par simulation CFD
- Remplacer la PCA par une méthode paramétrique
- Travailler directement sur les CAOs
- Tester des méthodes par RL
</div>
---
<div class="h-full w-full flex justify-center items-center">
# Annexes
</div>
---
## GraphVAE
<div class="flex items-center w-full bg-black">
<img src="/assets/graphvae_surface.gif" class="m-auto w-full">
<img src="/assets/graphvae_points.gif" class="m-auto w-full">
</div>
---
## PVD
<div class="flex items-center w-full bg-black">
<img src="/assets/pvd_points.gif" class="m-auto h-100">
</div>
---
<iframe scrolling="yes" src="https://distill.pub/2017/feature-visualization/" class="h-full w-full">
</iframe>
---
<style scoped>
p {
height: 100%;
}
</style>
<embed
src="/projet-fin-etude/rapport.pdf"
type="application/pdf"
width="100%"
height="100%"
/>
<a href="/projet-fin-etude/rapport.pdf" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">Link to PDF</a>