Segmentation Avancée : Le Duel RANSAC vs DBSCAN
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.
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.
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 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.
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.
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.
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.
📊 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 ?
Rejoindre l'Elite (120h)