MS-DGCNN++: Multi-Scale Dynamic Graph Convolution with Scale-Dependent Normalization for Robust LiDAR Tree Species Classification
| Resource | Link |
|---|---|
| Preprint | arXiv:2507.12602 · PDF |
| Unified 3D library (large benchmarks & preprocessing) | github.com/said-ohamouddou/LIDARLearn |
MS-DGCNN++ is a hierarchical multi-scale dynamic graph CNN with scale-dependent edge encoding: raw displacement features at the local scale (small neighborhoods, low SNR for directions) and hybrid raw-plus-normalized directional features at an intermediate scale (larger neighborhoods, high SNR). A theoretical noise-sensitivity argument motivates why normalized directions have mean squared error decaying as O(1/s²) with neighbor spacing s, while raw displacements do not—supporting asymmetric encoding across scales.
This repo holds the structured ablation suite, robustness evaluations, training utilities, and tables/figures pipelines used in Section “Ablation studies and robustness” of sn-article.tex.
The large-scale state-of-the-art comparisons on STPCTLS (seven species, terrestrial laser scanning) and HeliALS (nine species, airborne laser scanning, geometry-only), including 56 models on STPCTLS as reported in the paper, were run using our open-source library LIDARLearn, which integrates MS-DGCNN++ with shared preprocessing, configs, and training scripts. For dataset preprocessing, multispectral / ALS workflows, and replication of those benchmark tables, start from LIDARLearn (preprocessing/, datasets/, scripts/, docs/).
| § Experiment | Topic | Entry point |
|---|---|---|
| Per-scale encoding | Raw vs hybrid vs asymmetric normalization | core_experiments/experiment1_ablation.py |
| Density dropout | Canopy thinning / retention | core_experiments/experiment2_density_dropout.py |
| Noise sweep | SNR crossover and degradation | core_experiments/experiment3_noise_sweep.py |
| Max-pooling provenance | Which neighbors win max pooling | core_experiments/experiment4_maxpool_provenance.py |
| Isotropy / effective rank | Feature-space geometry | core_experiments/experiment5_isotropy.py |
| Component / fusion / k-scale | Broader ablations | core_experiments/run_ablations.py, run_kscale_ablation.py |
Batch runners: run_core_experiments.sh, run_robustness.sh (noise, outliers, dropout, n-points, few-shot—after training clean checkpoints).
| Path | Purpose |
|---|---|
models/ |
msdgcnn2.py (MS-DGCNN++), msdgcnn.py, optional pointm2ae/ baseline |
core_experiments/ |
Experiments 1–5 and aggregated ablation drivers |
robustness_eval/ |
Checkpoint training + perturbation protocols |
utils/ |
CV splits, dataloaders, training loop, plots, LaTeX helpers |
data/STPCTLC/ |
Local layout for STPCTLS HDF5 and CV split JSON |
results/ |
Example outputs (JSON, TeX, figures) |
The directory name STPCTLC follows this codebase; the dataset is referred to as STPCTLS in sn-article.tex.
- Python 3.10+ recommended
- NVIDIA GPU recommended (training falls back to CPU if CUDA is unavailable)
pip install -r requirements.txtInstall PyTorch for your stack from pytorch.org (CUDA wheel vs CPU).
The models/pointm2ae/ copy here is adapted for these experiments. For the official Point-M2AE release (paper code, weights, full dependencies), see github.com/zrrskywalker/point-m2ae.
MS-DGCNN++ core paths use pure PyTorch k-NN graph features. Enabling the Point-M2AE baseline in this repo may still require CUDA extensions (pointnet2_ops, knn_cuda, etc.).
Place the HDF5 bundle expected by the loaders as:
data/STPCTLC/point_cloud_data.h5
On first run, stratified CV splits are created or reused, e.g. data/STPCTLC/cv_splits_k5_seed42.json.
Path tip: core_experiments/*.py joins relative --data_path with the core_experiments/ directory. From the repo root use an absolute path:
python core_experiments/experiment1_ablation.py --data_path "$(pwd)/data/STPCTLC"From the repository root:
chmod +x run_core_experiments.sh
./run_core_experiments.sh # experiments 1–5
./run_core_experiments.sh 1 # single experiment
./run_core_experiments.sh ablations
./run_core_experiments.sh kscalechmod +x run_robustness.sh
./run_robustness.sh train
./run_robustness.sh dropout
./run_robustness.sh noise
./run_robustness.sh outlier
./run_robustness.sh npoints
./run_robustness.sh few_shot
./run_robustness.sh allUse --help on individual Python scripts for epochs, batch size, folds, and output dirs.
Artifacts land under results/ or --output_dir: configs, metrics JSON, LaTeX tables, and figures aligned with the paper’s supplementary material workflow.
Please cite the arXiv preprint. When you use the unified benchmarking stack, cite LIDARLearn as indicated there.
@misc{ohamouddou2025msdgcnnpp,
title = {{MS-DGCNN++}: Multi-Scale Dynamic Graph Convolution with Scale-Dependent Normalization for Robust {LiDAR} Tree Species Classification},
author = {Ohamouddou, Said and El Afia, Hanaa and Boulaich, Mohamed Hamza and El Afia, Abdellatif and Chiheb, Raddouane},
year = {2025},
eprint = {2507.12602},
archivePrefix = {arXiv},
primaryClass = {cs.CV},
url = {https://arxiv.org/abs/2507.12602}
}