3D Gaussian Splatting : La Révolution du Rendu

Oubliez les maillages, oubliez les NeRFs. Bienvenue dans l'ère de la rasterisation de gaussiennes.
Expert
40 min
PyTorch, CUDA, Colmap
"Le 3DGS n'est pas juste une amélioration incrémentale. C'est un changement de paradigme qui permet un rendu photoréaliste à 100+ FPS en 1080p, là où les NeRF peinaient à atteindre 5 FPS."

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 :

Scale Axis 1

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.

Pitfall: Une mauvaise calibration caméras (Intrinsics/Extrinsics) est fatale. Si COLMAP échoue à aligner vos images, aucun entraînement ne sauvera le résultat.
sfm_prep.sh
# 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.

train_step.py
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.

Pro Tip: Utilisez 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