Segmentation Avancée : Le Duel RANSAC vs DBSCAN

Séparer le signal du bruit : l'art algorithmique de l'isolation d'instances 3D.
Avancé
60 min
Scikit-Learn, Open3D
Scan d'intérieur segmenté : le sol détecté par RANSAC apparaît en beige, et chaque objet isolé par DBSCAN porte une couleur distincte
Les deux algorithmes de l'article, sur la même scène : RANSAC prend le plan du sol, DBSCAN sépare ce qui reste.
"Une scène 3D brute est un chaos non structuré. La segmentation est l'acte de création qui transforme ce chaos en une ontologie d'objets manipulables."

1. La Philosophie de la Segmentation 3D

La segmentation est la pierre angulaire de la compréhension de scène. Elle se divise en trois familles : la Segmentation Sémantique (label par classe), la Segmentation d'Instance (label par objet) et la Segmentation de Primitives (géométrie). Aujourd'hui, nous attaquons le cœur de la segmentation géométrique non-supervisée.

Insight: Contrairement au Deep Learning qui est "Data-Hungry", les méthodes géométriques comme RANSAC fonctionnent "Zero-Shot" sur n'importe quelle scène sans entraînement préalable.

Commençons par le roi de la robustesse : RANSAC.

2. RANSAC : La Robustesse Statistique

RANSAC (Random Sample Consensus) part d'un postulat simple : vos données contiennent des structures géométriques pures contaminées par du bruit. En sélectionnant aléatoirement un sous-ensemble minimal de points (3 pour un plan), il construit un modèle hypothétique et le valide contre l'ensemble du dataset.

ransac_core.py
import open3d as o3d

def extract_dominant_plane(pcd, threshold=0.02):
    model, inliers = pcd.segment_plane(
        distance_threshold=threshold,
        ransac_n=3,
        num_iterations=1000
    )
    [a, b, c, d] = model
    # Équation: ax + by + cz + d = 0
    print(f"Plane Equation: {a:.2f}x + {b:.2f}y + ... = 0")
    return pcd.select_by_index(inliers), pcd.select_by_index(inliers, invert=True)

La puissance de RANSAC réside dans sa capacité à ignorer les outliers. Même avec 50% de bruit, il trouvera le plan dominant. Mais attention, c'est un algorithme stochastique : le résultat n'est pas déterministe à 100% sans une graine (seed) fixée.

Une droite tracée en diagonale ; les points proches d'elle sont verts et retenus, ceux qui s'en écartent sont roses et rejetés le plan testé tiré sur trois points retenus à moins du seuil rejetés trop loin du plan Le tirage recommence des milliers de fois ; le plan qui retient le plus de points gagne.
Le principe de RANSAC, en une image. On tire trois points au hasard, on en déduit un plan, on compte ceux qui tombent à moins du seuil, et on recommence. Le seuil, matérialisé par les deux traits pâles, doit valoir l'épaisseur réelle de la surface : trop serré, le plan se fragmente ; trop large, il avale ce qui est posé dessus.

Une fois les structures géométriques (sols, murs) retirées, il nous reste des objets flottants. Comment les grouper ?

3. DBSCAN : L'Archipel de Densité

DBSCAN (Density-Based Spatial Clustering of Applications with Noise) est l'algorithme de choix pour le clustering non-paramétrique. Il ne nécessite pas de définir le nombre de clusters K à l'avance, ce qui est vital dans une scène urbaine inconnue.

density_cluster.py
import matplotlib.pyplot as plt

# Isolation des clusters
labels = np.array(objects.cluster_dbscan(
    eps=0.30,       # Rayon de voisinage (30cm)
    min_points=15,  # Densité minimale
    print_progress=True
))

max_label = labels.max()
print(f"Found {max_label + 1} individual objects")

Deux paramètres gouvernent DBSCAN : eps (la distance d'accessibilité) et min_points (la masse critique). Ces hyperparamètres sont sensibles à l'échelle. Pour un scan LiDAR aéroporté, eps=1.0m ; pour un objet scanné à main, eps=0.01m.

Le point technique : Utilisez un K-Distance Graph pour déterminer l'EPS optimal. Cherchez le "coude" (knee point) dans la courbe des distances au k-ième voisin.

4. Analyse Comparative : Le Match

Quand utiliser l'un ou l'autre ? La réponse est souvent : les deux, séquentiellement.

Critère RANSAC DBSCAN
Nature Modèle Géométrique Densité Spatiale
Formes Plans, Sphères, Cylindres Formes Arbitraires
Paramètres Threshold, Iterations Epsilon, Min Points
Complexité O(k * N) O(N log N) avec Index
Robustesse Bruit Excellent (Outliers ignorés) Bon (Classé comme bruit -1)

En ingénierie inverse (Scan-to-BIM), RANSAC est roi pour reconstruire les murs. En conduite autonome, DBSCAN est crucial pour détecter les piétons non-standard.

5. Application : Pipeline de Nettoyage Automatique

L'implémentation industrielle typique combine un filtrage statistique initial (SOR) pour retirer les artefacts de vol, suivi d'un RANSAC pour "grounder" la scène, et enfin un DBSCAN pour l'analyse d'objets.

production_pipeline.py
def auto_clean(pcd):
    # 1. Statistical Outlier Removal
    cl, ind = pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
    clean_pcd = pcd.select_by_index(ind)
    
    # 2. Ground Removal
    _, inliers = clean_pcd.segment_plane(distance_threshold=0.05, ransac_n=3, num_iterations=1000)
    objects = clean_pcd.select_by_index(inliers, invert=True)
    
    # 3. Object Clustering
    labels = objects.cluster_dbscan(eps=0.25, min_points=10)
    return objects, labels

Ce pipeline de 12 lignes constitue 80% du travail de preprocessing pour la plupart des tâches de perception machine modernes.

Sur ce sujet : Le programme de la formation, module par module.

Maîtrisez les Algorithmes Avancés

Vous souhaitez aller au-delà des bibliothèques standards et implémenter vos propres kernels de segmentation sur GPU ?

Recevoir le guide gratuit Passer le test (10 min)

Le programme et les tarifs →