projet-fin-etude-rapport/slides/slides.md
2024-10-11 20:44:03 +02:00

647 lines
18 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>
<!--
Hello, \
aujourd'hui prez pfe, \
dont sujet porte sur... \
mon but aujourd'hui, expliquer ces 3 lignes
-->
---
## 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 prez
- 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-full">
<figure>
<img src="/assets/SAF2012_0009786-1.jpg" class="h-81">
<figcaption class="text-center">CFM56-7B</figcaption>
</figure>
<figure>
<img src="/assets/SAF2013_0105143-1.jpg" class="h-81">
<figcaption class="text-center">M88</figcaption>
</figure>
</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, mais la thématique c'est les trucs qui volent. \
safran génère des revenus majoritairement grâce vente de moteur propulsion avion civiles
- à gauche: cfm56 moteur civile le plus vendu au monde, depuis 1978
- à droite: m88, moteur militaire, équipe les rafales (Dassault)
- aussi des moteur helico...
-->
---
## Détails d'un moteur d'avion
<div class="flex items-center h-full">
<img src="/assets/turbine_decoupe.webp" class="ml-20 h-full">
</div>
<a href="https://www.thingiverse.com/thing:1327093" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">Thingiverse catiav5ftw</a>
<!--
Lors de mon stage, \
équipe de Safran Tech, \
département recherche de Safran, \
explore nouveaux procédés, nouvelles générations moteurs
Dans mon cas, \
travaille amélioration processus génération, \
aubes des turbines des compresseurs
-->
---
## Dataset Rotor37_1200
<style scoped>
p {
margin-bottom: 0 !important;
}
</style>
<div class="flex items-center w-full h-110">
<div class="w-65">
1200 échantillons
- 1000 train (87%)
- 200 validation (13%)
Maillages
- 29773 nœuds
- 59328 triangles
- 89100 arêtes
Champs physiques
- Température
- Pression
- Énergie
- Densité
</div>
<div class="w-65">
40 paramètres de déformations
Input CFD
- Vitesse de rotation
- Vitesse du vent
Output CFD
- Input Massflow
- Output Massflow
- Compression Rate
- Isentropic efficiency
- Polytropic efficiency
</div>
<div class="flex items-center flex-col bg-black h-full w-60 ml-auto">
<img src="/assets/rotor37_surface.gif" class="m-auto h-full">
<img src="/assets/rotor37_points.gif" class="m-auto h-full">
</div>
</div>
<!--
Rotor37_1200, le dataset sur lequel j'ai principalement travaillé.
Donc travaille sur graphe/maillage, \
mais connectivité "locales" (voisins proches dans l'espace) \
donc utiliser seulement le nuage de points
Ça nous arrange, \
car connectivité des maillages trop complexe (quadratique), \
et techniques reconstruire surface from points
On aurait aussi pu travailler direct CAO (primitives), \
mais bcp plus complexe car reprez pas unique via CAO, \
et zero littérature.
-->
---
## Problème direct
<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"/>
<!--
On veut c'est générer trucs ressemblent rotor37. \
pour ça on peut appliquer le problème direct, \
si on veut trouver aube qui respecte un certaine critère de perf, \
"l'exploration d'un espace paramètre"
On prend CAO, \
on échantillone, passer sous simu, \
relèver les perfs, on optimise pour resampler, \
repeat ad vitam eternam.
À la fin, on a normalement au moins une aube qui nous convient.
Inconvénient, \
c'est long, à cause de la simu, \
nous on voudrait avoir le processus inverse \
(perf -> aube) pas (aube -> perf)
-->
---
## Problème inverse, Modèles génératifs
<img src="/assets/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>
<!--
Approximer le problème inverse, \
solution, utiliser des réseaux de neurones, modèles génératifs.
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, \
les trois premiers, on veut apprendre à génerer distrib x' qui ressemble très fortement à x.
Formelement pendant training on veut apprendre l'identité, \
mais particularité dans leur archi, par exemple \
VAE on passe par un goulot étranglement, espace latent, \
GAN on a une architecture adversarial, etc. \
NF on utilise des transfo continue reversible bijectives \
y'a plusieurs avantages et inconvenients à chaque méthode.
Ce qui nous interesse le plus ici c'est diffusion, récent et potentiel. \
le principe, trouver processus réversible discret stochastique \
entre distrib données et une autre distrib qu'on connait parfaitement math
-->
---
## 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>
<!--
Plusieurs méthodes pour faire dla diffusion, \
la + simple d'entre elles c'est DDPM. \
Le principe, apprendre mapping entre données et gaussienne isotropique.
Plus exactement, apprendre mapping inverse car, \
Pour passer données à gaussienne on ajoute juste du bruit, \
Pour process inverse, approximer réseau débruiteur (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), \
on opti le réseau à prédire le bruit que l'on a ajouté (eps).
Convergence atteinte, \
on est capable de débruiter des données, \
(plusieurs étape, itérativement)
Intéressant lorsqu'on part d'un bruit blanc (xT), \
et que l'on demande quand même au réseau de débruiter. \
Le réseau hallucine informations là où y'en a pas, \
et génère finalement nouvelle donnée même distrib de celles qu'il a apprises. (algo 2)
-->
---
## Diffusion forward process
<div class="flex items-center h-100">
<figure>
<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>
<figcaption class="text-center">Corruption progressive d'un échantillon, via un bruit gaussien (cf. algorithm 1)</figcaption>
</figure>
</div>
<!--
On peut l'appliquer à nos aubes,
example du forward process sur une aube 3D, \
(subsample 2048 points et normalisé donc un peu applati), \
à la fin on obtient truc qui ressemble à une gaussienne. \
(mapping discret, ici 100 pas de temps).
Ce genre de données input réseau capable traiter des pointcloud, \
comme par exemple un réseau basés sur des KPConvs, \
ou autre archi style PointNet, \
ou PVCNN qui travaille sur reprez voxel des points, \
(cf rapport).
-->
---
## Diffusion reverse process
<div class="flex items-center h-100">
<figure>
<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>
<figcaption class="text-center">Débruitage itératif d'un nuage gaussien (cf. algorithm 2)</figcaption>
</figure>
</div>
<!--
Si on effectue le reverse process, \
nuage de point gaussien ressemble progressivement à une aube.
Le résultat (kp-fcnn) est pas mal, \
mais reste une bonne quantité de bruit, \
(bonne chance reconstruction surface), \
surement améliorable hyperparmètres, \
mais meilleurs méthodes depuis 2020.
-->
---
## Latent Diffusion Model (LDM)
<div class="flex items-center w-full h-full flex-col justify-evenly">
<div class="flex items-center w-full h-72 justify-evenly">
<figure>
<img src="https://ar5iv.labs.arxiv.org/html/2112.10752/assets/img/generativevscompressive4.jpg" class="m-auto h-70">
</figure>
<div>
$\displaystyle x_0 \approx \hat{x}_0 = \frac{ x_t - \sqrt{1 - \overline\alpha_t} \epsilon_\theta(x_t) }{ \sqrt{\overline\alpha_t} }$
$\displaystyle \text{RMSE} = \sqrt{ \frac{ \| x_0 - \hat{x}_0 \|^2_2 }{ D } }$
$$\begin{align*}
\text{Rate} &= \frac{1}{2 \sigma^2_q(t)} \frac{ \overline\alpha_{t-1} ( 1 - \alpha_t )^2 }{ (1 - \overline\alpha_t)^2 } \| x_0 - \hat{x}_0 \|^2_2 \\
&= \text{D}_{\text{KL}} \left[ q(x_{t-1} | x_t, x_0) \| p_\theta(x_{t-1} | x_t) \right]
\end{align*}$$
</div>
</div>
<figure>
<img src="/assets/ldm-simplified.png" class="w-160">
<figcaption class="text-center">Nouvelle pipeline, ajout d'une transformation en amont</figcaption>
</figure>
</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>
<!--
auteur du papier observent que si prend x0, \
et que pour tout t allant de 0 a T, \
calcul RMSE (distortion) + Rate (KLD reverse process et approx), \
et que l'on trace RMSE fonction de Rate, \
on obtient ceci.
Interprétaion, deux zones dans processus diffusion, \
un domaine nécéssite bcp de bits et encode peu de distortion, \
l'autre inverse, peu bits, bcp de distortion, \
donc un peu du gachi de réseau neurone le perceptuel, \
on aimerait travailler uniquement sur la partie semantique. \
On peut le faire si trouve espace alternatif aux données, \
Espace latent sont une possibilité, \
utilisation, par ex, d'autoencoder, qui s'occuper du perceptuel, \
la diffusion préoccupe que du semantic. \
Ça revient à modifier la pipeline de diffusion comme suit: \
avantage, latent space petit, donc modèl, petit, simple, rapide...
-->
---
## Générations par diffusion latente (non conditionnée)
<div class="grid grid-cols-4 col-auto self-center justify-items-center w-full h-100 bg-black">
<img src="/assets/gen_points_1.gif" class="w-50">
<img src="/assets/gen_points_2.gif" class="w-50">
<img src="/assets/gen_points_3.gif" class="w-50">
<img src="/assets/gen_points_4.gif" class="w-50">
<img src="/assets/gen_points_5.gif" class="w-50">
<img src="/assets/gen_points_6.gif" class="w-50">
<img src="/assets/gen_points_7.gif" class="w-50">
<img src="/assets/gen_surface_1.gif" class="w-50">
</div>
<!--
Si on applique nos diffusion latente via une PCA, \
on obtient ceci.
Nuages de point de très bonne qualité, \
on a plus le bruit qu'on avait avec KP-FCNN, \
bonus PCA, même ordre des points, on peut copier connectivité aube nominale, \
pas besoin méthode reconstruction dans ce cas.
-->
---
## 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>
<!--
Jusqu'à présent, avec tout ce que j'ai dit, \
capable de générer des données ressemble données d'entrée. \
(non conditionné)
Cependant on veut générer données ressemblent données d'entrée specifiques. \
On pourrait très bien entrainer un modèle par classe, \
mais c'est long et en plus nous on a pas de classes discète.
Il existe plusieurs méthode pour faire cela, \
l'un d'entre elle etant cfg.
Principe entrainer notre réseau diffusion conjointement, \
prédiction non conditionnée et conditionnée.
On complexifie un peu plus l'apprentissage, \
mais sampling pouvoir choisir quel densité de proba on veut gen.
-->
---
## Générations par diffusion latente (conditionnée)
<div class="grid grid-cols-4 col-auto self-center justify-items-center w-full h-100 bg-black">
<img src="/assets/gen_surface_1.gif" class="w-50">
<img src="/assets/gen_surface_2.gif" class="w-50">
<img src="/assets/gen_surface_3.gif" class="w-50">
<img src="/assets/gen_surface_4.gif" class="w-50">
<img src="/assets/gen_surface_5.gif" class="w-50">
<img src="/assets/gen_surface_6.gif" class="w-50">
<img src="/assets/gen_surface_7.gif" class="w-50">
<img src="/assets/gen_surface_8.gif" class="w-50">
</div>
<!--
Si on fait génération conditionné, ça marche encore.
Problème, \
incapable visuellement différence entre aubes conditionné, \
là par exemple toutes conditonnés même critère physqiue, \
et ça se voit pas trop.
Une solution ça serait simu cfd, mais trop long, \
donc on va utiliser des modèles de regression, plus légers et rapides.
-->
---
## 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, probabilistiques.
* supervisé, au même sens que SVM, K-NN, ...
* non paramétrique (techniquement hyper-paramétrique, à cause noyau).
* fournir des intervals de confiance
-->
---
## "Entrainement" d'un GP sur Rotor37_1200
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_train_30_pca.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.
-->
---
## Analyse de générations non conditionnées
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_unconditional.png" class="m-auto w-full">
</div>
---
## Analyse de générations progressivement conditionnées
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_guidance.gif" class="m-auto w-full">
</div>
<!--
je fais varier gamma entre 0 et 1.
conditionné sur out_massflow = -1
-->
---
## Analyse de générations conditionnées (massflow)
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_massflow.gif" class="m-auto w-full">
</div>
<!--
on fait varier entre -3 et 3.
gamma = 2.5.
ça suit bien le conditionnement, \
sur les bords ça déconne un peu, pas très grave, \
mais ça doit venir du GP qui ne généralise pas la regression, \
car génération correctes visuellement, \
il faudrait verif avec une CFD là.
correlation avec in_massflow et compression_rate, \
normal car correlé physiquement.
-->
---
## Analyse de générations conditionnées (efficiency)
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_efficiency.gif" class="m-auto w-full">
</div>
<!--
pareil, mais pour l'efficiency
-->
---
## Analyse de générations conditionnées (double)
<div class="flex flex-col items-center h-100">
<img src="/assets/gp_double.gif" class="m-auto w-full">
</div>
<!--
pareil, mais là on conditionne \
efficiency = 1 \
massflow = [-3, 3]
-->
---
## Conclusion
<div class="h-100 flex flex-col text-2xl justify-center">
### Travail réalisé
- Génération conditionnée d'aubes par diffusion
- Release d'un code réutilisable en interne
- Rédaction d'une déclaration d'invention
</div>
---
## Conclusion
<div class="h-100 flex flex-col text-2xl justify-center">
### Perspectives
- 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>
<!--
bon résultats, mais y'a des points au milieu de l'aube, donc c'est chiant pour reconstruction surface. En plus on peut moins facilement appliquer ce qu'on a fait avec les GPs ici.
-->
---
<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>