647 lines
18 KiB
Markdown
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>
|