grosses modifs

This commit is contained in:
Laureηt 2023-09-05 10:53:38 +02:00
parent 509496d7b1
commit 6bf2160b33
Signed by: Laurent
SSH key fingerprint: SHA256:kZEpW8cMJ54PDeCvOhzreNr4FSh6R13CMGH/POoO8DI
35 changed files with 433 additions and 149 deletions

BIN
assets/gen_points_1.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_points_2.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_points_3.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_points_4.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_points_5.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_points_6.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_points_7.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_1.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_2.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_3.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_4.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_5.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_6.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_7.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gen_surface_8.gif (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/generative-overview.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/gp_double.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_efficiency.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_efficiency_1_pca.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_guidance.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_massflow.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_massflow_1_pca.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_q2.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_train.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_train_30_pca.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_train_32_pod.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/gp_unconditional.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/kpfcnn-results.png (Stored with Git LFS)

Binary file not shown.

BIN
assets/ldm-simplified.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
assets/result_points.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/result_points_variations.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/result_surface.gif (Stored with Git LFS)

Binary file not shown.

BIN
assets/result_surface_variations.gif (Stored with Git LFS)

Binary file not shown.

11
check.sh Executable file
View file

@ -0,0 +1,11 @@
for file in assets/*
do
filename=$(basename $file)
if grep -q $filename pdf/paper.tex; then
echo "$filename used in paper.tex"
elif grep -q $filename slides/slides.md; then
echo "$filename used in slides.md"
else
echo "$filename NOT USED !!!!!!"
fi
done

View file

@ -20,9 +20,10 @@ title: Projet de fin d'étude
<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
Hello, \
aujourd'hui prez pfe, \
dont sujet porte sur... \
mon but aujourd'hui, expliquer ces 3 lignes
-->
---
@ -42,7 +43,7 @@ Et mon but aujourd'hui c'est de vous présenter ce queces 3 lignes veulent dire
</div>
<!--
Petit sommaire pour cadrer un peu les parties de ma présentation
Petit sommaire pour cadrer prez
- Présentation brève de Safran et contexte Stage
- Présentation de mes données
@ -56,91 +57,175 @@ 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 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.
Safran génère des revenus principalement grâce à la vente de moteur pour la propulsion d'avion civiles.
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)
- à gauche: cfm56 moteur civile le plus vendu au monde, depuis 1978
- à droite: m88, moteur militaire, équipe les rafales (Dassault)
- aussi des moteur helico...
-->
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.
## Détails d'un moteur d'avion
<div class="flex items-center h-full">
<img src="https://avr-global.com/wp-content/uploads/2019/06/03-b-moteur-turbine-gaz-2-2.png" class="ml-20 h-full">
</div>
<a href="https://avr-global.com/aerospace/" class="absolute bottom-0 font-extralight mb-1 mr-2 right-0 text-xs">AV&R Global</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
<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>
<style scoped>
p {
margin-bottom: 0 !important;
}
</style>
<div class="absolute bottom-0">
<div class="flex items-center w-full h-110">
29773 nœuds, 59328 triangles et 89100 arêtes.
<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é.
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.
Donc travaille sur graphe/maillage, \
mais connectivité "locales" (voisins proches dans l'espace) \
donc utiliser seulement le nuage de points
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...)
Ça nous arrange, \
car connectivité des maillages trop complexe (quadratique), \
et techniques reconstruire surface from points
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.
On aurait aussi pu travailler direct CAO (primitives), \
mais bcp plus complexe car reprez pas unique via CAO, \
et zero littérature.
-->
---
## Modèles génératifs (traditionnels)
## 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"/>
<!--
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.
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"
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...
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, 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)
Inconvénient, \
c'est long, à cause de la simu, \
nous on voudrait avoir le processus inverse \
(perf -> aube) pas (aube -> perf)
-->
---
## Modèles génératifs (deep learning)
## Problème inverse, Modèles génératifs
<img src="https://lilianweng.github.io/posts/2021-07-11-diffusion-models/generative-overview.png" class="m-auto h-110"/>
<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>
<!--
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).
Approximer le problème inverse, \
solution, utiliser des réseaux de neurones, modèles génératifs.
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.
Y'a globalement 4 grosses familles de modèles génératifs (gan, vae, nf, dm).
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.
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.
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).
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
-->
---
@ -158,69 +243,164 @@ La famille qui nous interesse le plus ici c'est les modèles de diffusion, réce
</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.
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.
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).
Ce mapping apprendre via 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).
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)
Convergence atteinte, \
on est capable de débruiter des données.
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)
-->
---
## Forward process
## Diffusion 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>
<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>
<!--
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
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.
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)
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).
-->
---
## Reverse process
## Diffusion 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>
<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, on voit que le nuage de point gaussien au départ ressemble de plus en plus progressivement à une aube.
Si on effectue le reverse process, \
nuage de point gaussien ressemble 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.
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-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 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>
<!--
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).
Présentation des LDM qui permettent de traiter plus efficacement nos données.
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.
Part du constat que si l'on trace pour t, \
l'erreur de reconstruction (RMSE, distortion) en fonction de t, \
(on prend x_0, on le bruite x_t, on prédit x_0_hat, pour chaque t), \
le Rate (issue de l'ELBO, une KLD) en fonction de t, \
(KLD=#bits nécéssaire pour passer de P à Q), \
on combine les deux pour avoir distortion en fonction de rate. \
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.
On observe qu'on a deux domaine dans le processus de 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. \
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
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 plus petit, donc modèle plus 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.
-->
---
@ -233,38 +413,52 @@ Dans notre cas, puisque la structure des données s'y porte bien (bien réguliè
<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, \
capable de générer des données ressemble certaine densité proba. \
(non conditionné)
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.
Cependant on veut générer données ressemblent densité proba jointe avec classe. \
(conditionné).
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.
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.
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, \
là on fait tout en même temps...
-->
---
## Résultats
## Générations par diffusion latente (conditionnée)
<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 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>
<!--
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).
-->
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.
## 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.
Une solution ça serait simu cfd, mais trop long, \
donc on va utiliser des modèles de regression, plus légers et rapides.
-->
---
@ -283,18 +477,18 @@ Problème, on est incapable de voir visuellement la différence entre une aube c
<!--
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:
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
* bien moins paramétriques (on cherche juste un noyau).
-->
---
## Vérification par Gaussian Process (GP)
## "Entrainement" d'un GP sur Rotor37_1200
<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">
<img src="/assets/gp_train_30_pca.png" class="m-auto w-full">
</div>
<!--
@ -305,36 +499,73 @@ On s'assure juste que leurs prédictions sont correctes par rapport à des donn
---
## Vérification par Gaussian Process (GP)
## Analyse de générations non conditionnées
<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">
<img src="/assets/gp_unconditional.png" 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)
## Analyse de générations progressivement conditionnées
<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
je fais varier gamma entre 0 et 1.
Figure du haut, on conditionne sur deux trucs en même temps, ça marche plutot bien.
conditionné sur out_massflow = -1
-->
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.
---
## 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]
-->
---
@ -346,10 +577,18 @@ La figure du bas, montre comment on peut régler le conditionnement, on peut fai
### 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
<p></p>
</div>
### Axes d'amélioration
---
## 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
@ -383,6 +622,10 @@ La figure du bas, montre comment on peut régler le conditionnement, on peut fai
<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">