3D Gaussian Splatting : La Révolution du Rendu
1. La Théorie : Pourquoi des Gaussiennes ?
Contrairement aux voxels (discrets) ou aux maillages (rigides), une Gaussienne 3D est une primitive souple définie par :
- Une position moyen (Mean) $\mu$
- Une matrice de covariance $\Sigma$ (décrivant l'étirement/rotation)
- Une opacité $\alpha$
- Une couleur dépendante de la vue (Harmoniques Sphériques)
L'astuce de génie est la projection 2D (Splatting). On projette ces ellipsoïdes sur le plan image et on les trie (Depth Sort) pour alpha-blending. C'est ce tri + rasterisation qui est différentiable.
2. Initialisation : Le Rôle de COLMAP
Le 3DGS ne part pas de zéro. Il a besoin d'un nuage de points clairsemé (Sparse Point Cloud) généré par Structure-from-Motion (SfM). Ces points servent de centres initiaux pour les gaussiennes.
# Extraction de features et matching
colmap feature_extractor --database_path db.db --image_path images/
colmap exhaustive_matcher --database_path db.db
# Reconstruction sparse
colmap mapper --database_path db.db --image_path images/ --output_path sparse/
# Conversion text pour debug
colmap model_converter --input_path sparse/0 --output_path sparse/text --output_type TXT
3. La Boucle d'Entraînement (Optimization Loop)
Le "Learning" ici n'est pas un réseau de neurones (pas de MLP !). C'est une descente de gradient stochastique (SGD) directe sur les paramètres des gaussiennes. On compare l'image rendue à l'image réelle (Loss L1 + D-SSIM), et on backpropage l'erreur pour déplacer, grossir, ou changer la couleur des gaussiennes.
def training_step(iteration):
# 1. Rasterisation Differentiable
rendered_image = rasterizer(viewpoint_cam, pc)
# 2. Calcul Loss
gt_image = viewpoint_cam.original_image
loss = (1.0 - lambda_dssim) * l1_loss(rendered_image, gt_image) + \
lambda_dssim * (1.0 - ssim(rendered_image, gt_image))
# 3. Backprop & Optimizer Step
loss.backward()
optimizer.step()
optimizer.zero_grad()
# 4. Densification (Adaptive Control)
if iteration % densification_interval == 0:
pc.densify_and_prune(grad_threshold, min_opacity, extent)
La Densification est clé : si une zone a une forte erreur de gradient (sous-reconstruite), on clone les gaussiennes (si petites) ou on les split (si trop grandes).
4. Compression et Export
Un modèle brut pèse lourd (2-4 Go). Pour le web, on quantifie les harmoniques sphériques et les
quaternions de rotation. Un fichier .ply compressé peut descendre à 100 Mo.
| Attribut | Type Brut | Type Compressé | Gain |
|---|---|---|---|
| Position | float32 (12B) | float16 (6B) | 50% |
| Rotation | float32 (16B) | uint8 (4B) | 75% |
| SH (Color) | float32 (45 * 4B) | Codebook Index (1B) | 99% |
5. L'Écosystème Python
Bien que le code original soit en CUDA/C++, des wrappers Python comme gsplat (par
Nerfstudio) rendent la tech accessible.
Nerfstudio pour démarrer. Leur pipeline intègre automatiquement
Colmap, l'entraînement et un visualiseur web socket (Viser).
ns-train splatfacto --data data/my_scene
🔮 Domptez le Rendu Neuronal
Dans notre module "Generative 3D", nous implémentons un solver Gaussian Splatting custom pour comprendre chaque ligne de l'algo.
Rejoindre la Formation Expert