diff --git a/README.md b/README.md index 099f4cb..c2df8ca 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Pipeline LiDAR Archéologique - Docker +# Pipeline LiDAR Archéologique -Workflow automatisé pour générer des visualisations exploitables à partir de données LiDAR pour la détection de structures archéologiques. +Workflow automatisé pour générer des visualisations exploitables à partir de données LiDAR HD (IGN) pour la détection de structures archéologiques. Tourne en Docker avec accélération GPU optionnelle (NVIDIA/CuPy). ## Visualisations (19 par fichier) @@ -35,6 +35,33 @@ Workflow automatisé pour générer des visualisations exploitables à partir de | 18 | **Photographie aérienne IGN** | Orthophotographie WMTS | | 19 | **Carte topographique IGN** | Plan IGN V2 WMTS | +## Classification du sol + +Le pipeline classifie automatiquement les points sol à partir du nuage de points bruit. Le pré-traitement suit le workflow recommandé par PDAL : + +1. **Filtre ReturnNumber** — élimine les points avec numéros de retour invalides +2. **Réinitialisation Classification** — remet toutes les classifications à 0 +3. **ELM** (Extended Local Minimum) — marque les points bas aberrants comme bruit (Classification=7) +4. **Outlier statistique** — supprime les points isolés (mean_k=8, multiplier=3.0) +5. **Classification sol** — SMRF, PMF ou CSF +6. **Extraction** — ne conserve que les points Classification=2 + +### Méthodes de classification + +| Méthode | Mode | Usage | Vitesse | +|---------|------|-------|---------| +| **SMRF** | Auto (défaut) | Terrain naturel, forêt, rocaille | Rapide | +| **PMF** | Auto (si urbain) | Zones urbaines, bâtiments, routes | Rapide | +| **CSF** | Manuel uniquement | Terrain très complexe, falaises | Lent | + +L'auto-détection analyse le ratio de retours uniques du nuage de points : ratio > 0.6 = milieu urbain → PMF, sinon → SMRF. + +### Pré-traitement ELM (terrain calcaire) + +Les paramètres ELM sont adaptés au terrain calcaire rocailleux avec végétation basse : +- `cell=5.0m` — résolution fine pour capturer le relief rocheux +- `threshold=2.0m` — seuil élevé pour ne pas marquer les affleurements comme bruit + ## Architecture modulaire ``` @@ -43,14 +70,15 @@ lidar_pipeline/ ├── __main__.py # Point d'entrée: python -m lidar_pipeline ├── cli.py # argparse + logging + main() ├── gpu.py # CuPy/numpy abstraction (HAS_GPU, to_gpu, to_cpu, xp_*) -├── dtm.py # Classification PDAL + génération DTM +├── dtm.py # Classification PDAL (SMRF/PMF/CSF + auto) + génération DTM ├── visualizations.py # Fonctions generate_* (19 visualisations) ├── ign.py # Téléchargement tuiles IGN + overlay -├── rendering.py # Colormaps, tif_to_png, rapport PDF -└── pipeline.py # LidarArchaeoPipeline (orchestration + registry) +├── rendering.py # Colormaps, tif_to_png, rapport PDF +├── pipeline.py # LidarArchaeoPipeline (orchestration + registry) +└── tests/ # Tests unitaires (pytest) ``` -Ajouter une visualisation = 1 fonction + 1 entrée dans `VIZ_STEPS` + 1 entrée dans `COLORMAPS`. Supprimer = retirer les 3 entrées correspondantes. +Ajouter une visualisation = 1 fonction + 1 entrée dans `VIZ_STEPS` + 1 entrée dans `COLORMAPS`. ## Installation Docker @@ -80,22 +108,22 @@ docker build -t lidar-lidar . ### Options du script run.sh ``` ./run.sh [options] - -r RESOLUTION Résolution en m/px (défaut: 0.5) - -w WORKERS Nombre de workers parallèles (défaut: 1) - -g Activer l'accélération GPU - -v Mode verbeux (timestamps + niveaux) - --debug Mode debug (détails internes fichier:ligne) - -f / --force Régénérer tous les fichiers même si les WebP existent - --file NOM... Traiter un ou plusieurs fichiers LAZ spécifiques (nom partiel) - -h Afficher l'aide + -r RESOLUTION Résolution en m/px (défaut: 0.5) + -w WORKERS Nombre de workers parallèles (défaut: 1) + -g Activer l'accélération GPU NVIDIA + -v Mode verbeux (timestamps + niveaux) + --debug Mode debug (détails internes fichier:ligne) + -f / --force Régénérer tous les fichiers même si les WebP existent + --force-classification Reclassifier le sol même si le fichier .las existe déjà + --ground-classification Méthode de classification: auto, smrf, pmf, csf (défaut: auto) + --file NOM... Traiter un ou plusieurs fichiers LAZ spécifiques + --test Exécuter les tests unitaires + -h Afficher l'aide ``` ### Exemples ```bash -# Traitement standard -./run.sh - -# Avec accélération GPU +# Traitement standard avec GPU ./run.sh -g # GPU + mode verbeux @@ -104,17 +132,29 @@ docker build -t lidar-lidar . # GPU + 4 workers parallèles ./run.sh -g -w 4 -# Haute résolution + GPU + debug -./run.sh -g -v -r 0.2 +# Haute résolution (0.2m/px) +./run.sh -g -r 0.2 # Forcer la régénération de tous les fichiers ./run.sh -g --force +# Reclassifier le sol seulement (sans régénérer les visualisations) +./run.sh -g --force-classification + +# Forcer la classification PMF au lieu de l'auto-détection +./run.sh -g --ground-classification pmf + +# Forcer la classification CSF (lent mais robuste sur terrain complexe) +./run.sh -g --ground-classification csf + # Traiter un fichier spécifique (test rapide) ./run.sh -g --file LHD_FXX_1000_6882_PTS_LAMB93_IGN69.copc # Traiter deux fichiers spécifiques ./run.sh -g --file LHD_FXX_1000_6881_PTS_LAMB93_IGN69.copc LHD_FXX_1000_6882_PTS_LAMB93_IGN69.copc + +# Exécuter les tests unitaires +./run.sh --test ``` ### Utilisation directe Docker @@ -122,29 +162,29 @@ docker build -t lidar-lidar . # Traitement standard docker run --rm -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output lidar-lidar -# Avec GPU -docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output lidar-lidar +# Avec GPU + classification forcée +docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output \ + lidar-lidar python3 -m lidar_pipeline /data/input -o /data/output \ + --ground-classification pmf + +# Forcer la reclassification du sol +docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output \ + lidar-lidar python3 -m lidar_pipeline /data/input -o /data/output \ + --force-classification # Mode verbeux docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output \ lidar-lidar python3 -m lidar_pipeline /data/input -o /data/output -v - -# Un ou plusieurs fichiers spécifiques -docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output \ - lidar-lidar python3 -m lidar_pipeline /data/input -o /data/output --file LHD_FXX_1000_6882_PTS_LAMB93_IGN69.copc - -# Forcer la régénération -docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output \ - lidar-lidar python3 -m lidar_pipeline /data/input -o /data/output --force ``` ## Structure des dossiers ``` . -├── input/ # Fichiers .laz (monté en read-only) +├── input/ # Fichiers .laz (monté en read-only dans Docker) ├── output/ # Résultats générés -│ ├── DTM/ # Modèles numériques de terrain (GeoTIFF) +│ ├── DTM/ # Modèles numériques de terrain (GeoTIFF) +│ ├── temp/ # Fichiers temporaires (classification .las) │ ├── visualisations/ # Images WebP par fichier LAZ │ │ ├── fichier_6881/ # Un sous-dossier par fichier LAZ │ │ │ ├── ..._hillshade_multi.webp @@ -153,18 +193,18 @@ docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data │ │ │ └── ... (19 visualisations) │ │ └── fichier_6882/ │ │ └── ... -│ └── rapports/ # Rapports PDF A3 par fichier +│ └── rapports/ # Rapports PDF A3 par fichier │ ├── fichier_6881_rapport.pdf │ └── fichier_6882_rapport.pdf -├── lidar_pipeline/ # Package Python modulaire -│ ├── __init__.py -│ ├── cli.py -│ ├── gpu.py -│ ├── dtm.py -│ ├── visualizations.py -│ ├── ign.py -│ ├── rendering.py -│ └── pipeline.py +├── lidar_pipeline/ # Package Python modulaire +│ ├── cli.py # Arguments CLI + logging +│ ├── gpu.py # Abstraction CuPy/numpy +│ ├── dtm.py # Classification sol + DTM +│ ├── visualizations.py # 19 fonctions generate_* +│ ├── ign.py # Tuiles IGN +│ ├── rendering.py # Colormaps, WebP, PDF +│ ├── pipeline.py # Orchestration +│ └── tests/ # Tests unitaires ├── process_lidar.py # Point d'entrée compatible ├── Dockerfile ├── run.sh @@ -177,9 +217,12 @@ docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data |-----------|--------|--------|-------------| | Résolution | `-r` | 0.5 | Résolution en mètres par pixel | | Workers | `-w` | 1 | Nombre de CPU pour traitement parallèle | +| GPU | `-g` | off | Activer l'accélération NVIDIA GPU | +| Classification sol | `--ground-classification` | auto | Méthode : auto, smrf, pmf, csf | +| Forcer classification | `--force-classification` | off | Reclassifier le sol même si .las existe | | Output | `-o` | /data/output | Dossier de sortie | | Force | `-f/--force` | off | Régénérer même si les WebP existent | -| File | `--file` | tous | Traiter un ou plusieurs fichiers LAZ (nom complet sans extension) | +| File | `--file` | tous | Traiter un ou plusieurs fichiers LAZ | | Verbose | `-v` | off | Mode verbeux (timestamps + niveaux) | | Debug | `--debug` | off | Mode debug (détails internes) | @@ -207,6 +250,14 @@ docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data 2. **Dépressions** — Zones de collecte d'eau, dolines 3. **Negative Openness** — Fossés et tranchées +## Tests + +```bash +./run.sh --test +``` + +Les tests tournent dans le conteneur Docker et couvrent la classification du sol (SMRF/PMF/CSF), l'auto-détection, le rendu, et les visualisations. + ## Dépannage ```bash @@ -225,4 +276,7 @@ docker system prune -a ``` ### Erreur mémoire -Augmenter la mémoire Docker à 16Go+ pour les gros fichiers LiDAR HD. \ No newline at end of file +Augmenter la mémoire Docker à 16Go+ pour les gros fichiers LiDAR HD. + +### Données LiDAR HD (IGN) +Les fichiers COPC (.laz) de l'IGN sont supportés directement. Le pipeline détecte automatiquement la méthode de classification du sol (SMRF/PMF) en analysant le ratio de retours uniques du nuage de points. \ No newline at end of file