Mise à jour du README: classification sol, options CLI, structure complète
- Section classification du sol (SMRF/PMF/CSF + auto-détection) - Pré-traitement ELM + outlier dans le workflow - Options --ground-classification et --force-classification - Paramètres GPU et classification dans la table des options - Structure des dossiers avec temp/ et tests/ - Section tests unitaires - Aucun lien externe Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
142
README.md
142
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)
|
## 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 |
|
| 18 | **Photographie aérienne IGN** | Orthophotographie WMTS |
|
||||||
| 19 | **Carte topographique IGN** | Plan IGN V2 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
|
## Architecture modulaire
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -43,14 +70,15 @@ lidar_pipeline/
|
|||||||
├── __main__.py # Point d'entrée: python -m lidar_pipeline
|
├── __main__.py # Point d'entrée: python -m lidar_pipeline
|
||||||
├── cli.py # argparse + logging + main()
|
├── cli.py # argparse + logging + main()
|
||||||
├── gpu.py # CuPy/numpy abstraction (HAS_GPU, to_gpu, to_cpu, xp_*)
|
├── 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)
|
├── visualizations.py # Fonctions generate_* (19 visualisations)
|
||||||
├── ign.py # Téléchargement tuiles IGN + overlay
|
├── ign.py # Téléchargement tuiles IGN + overlay
|
||||||
├── rendering.py # Colormaps, tif_to_png, rapport PDF
|
├── rendering.py # Colormaps, tif_to_png, rapport PDF
|
||||||
└── pipeline.py # LidarArchaeoPipeline (orchestration + registry)
|
├── 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
|
## Installation Docker
|
||||||
|
|
||||||
@ -80,22 +108,22 @@ docker build -t lidar-lidar .
|
|||||||
### Options du script run.sh
|
### Options du script run.sh
|
||||||
```
|
```
|
||||||
./run.sh [options]
|
./run.sh [options]
|
||||||
-r RESOLUTION Résolution en m/px (défaut: 0.5)
|
-r RESOLUTION Résolution en m/px (défaut: 0.5)
|
||||||
-w WORKERS Nombre de workers parallèles (défaut: 1)
|
-w WORKERS Nombre de workers parallèles (défaut: 1)
|
||||||
-g Activer l'accélération GPU
|
-g Activer l'accélération GPU NVIDIA
|
||||||
-v Mode verbeux (timestamps + niveaux)
|
-v Mode verbeux (timestamps + niveaux)
|
||||||
--debug Mode debug (détails internes fichier:ligne)
|
--debug Mode debug (détails internes fichier:ligne)
|
||||||
-f / --force Régénérer tous les fichiers même si les WebP existent
|
-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)
|
--force-classification Reclassifier le sol même si le fichier .las existe déjà
|
||||||
-h Afficher l'aide
|
--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
|
### Exemples
|
||||||
```bash
|
```bash
|
||||||
# Traitement standard
|
# Traitement standard avec GPU
|
||||||
./run.sh
|
|
||||||
|
|
||||||
# Avec accélération GPU
|
|
||||||
./run.sh -g
|
./run.sh -g
|
||||||
|
|
||||||
# GPU + mode verbeux
|
# GPU + mode verbeux
|
||||||
@ -104,17 +132,29 @@ docker build -t lidar-lidar .
|
|||||||
# GPU + 4 workers parallèles
|
# GPU + 4 workers parallèles
|
||||||
./run.sh -g -w 4
|
./run.sh -g -w 4
|
||||||
|
|
||||||
# Haute résolution + GPU + debug
|
# Haute résolution (0.2m/px)
|
||||||
./run.sh -g -v -r 0.2
|
./run.sh -g -r 0.2
|
||||||
|
|
||||||
# Forcer la régénération de tous les fichiers
|
# Forcer la régénération de tous les fichiers
|
||||||
./run.sh -g --force
|
./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)
|
# Traiter un fichier spécifique (test rapide)
|
||||||
./run.sh -g --file LHD_FXX_1000_6882_PTS_LAMB93_IGN69.copc
|
./run.sh -g --file LHD_FXX_1000_6882_PTS_LAMB93_IGN69.copc
|
||||||
|
|
||||||
# Traiter deux fichiers spécifiques
|
# 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
|
./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
|
### Utilisation directe Docker
|
||||||
@ -122,29 +162,29 @@ docker build -t lidar-lidar .
|
|||||||
# Traitement standard
|
# Traitement standard
|
||||||
docker run --rm -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output lidar-lidar
|
docker run --rm -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output lidar-lidar
|
||||||
|
|
||||||
# Avec GPU
|
# Avec GPU + classification forcée
|
||||||
docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output lidar-lidar
|
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
|
# Mode verbeux
|
||||||
docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data/output \
|
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
|
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
|
## 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
|
├── 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
|
│ ├── visualisations/ # Images WebP par fichier LAZ
|
||||||
│ │ ├── fichier_6881/ # Un sous-dossier par fichier LAZ
|
│ │ ├── fichier_6881/ # Un sous-dossier par fichier LAZ
|
||||||
│ │ │ ├── ..._hillshade_multi.webp
|
│ │ │ ├── ..._hillshade_multi.webp
|
||||||
@ -153,18 +193,18 @@ docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data
|
|||||||
│ │ │ └── ... (19 visualisations)
|
│ │ │ └── ... (19 visualisations)
|
||||||
│ │ └── fichier_6882/
|
│ │ └── fichier_6882/
|
||||||
│ │ └── ...
|
│ │ └── ...
|
||||||
│ └── rapports/ # Rapports PDF A3 par fichier
|
│ └── rapports/ # Rapports PDF A3 par fichier
|
||||||
│ ├── fichier_6881_rapport.pdf
|
│ ├── fichier_6881_rapport.pdf
|
||||||
│ └── fichier_6882_rapport.pdf
|
│ └── fichier_6882_rapport.pdf
|
||||||
├── lidar_pipeline/ # Package Python modulaire
|
├── lidar_pipeline/ # Package Python modulaire
|
||||||
│ ├── __init__.py
|
│ ├── cli.py # Arguments CLI + logging
|
||||||
│ ├── cli.py
|
│ ├── gpu.py # Abstraction CuPy/numpy
|
||||||
│ ├── gpu.py
|
│ ├── dtm.py # Classification sol + DTM
|
||||||
│ ├── dtm.py
|
│ ├── visualizations.py # 19 fonctions generate_*
|
||||||
│ ├── visualizations.py
|
│ ├── ign.py # Tuiles IGN
|
||||||
│ ├── ign.py
|
│ ├── rendering.py # Colormaps, WebP, PDF
|
||||||
│ ├── rendering.py
|
│ ├── pipeline.py # Orchestration
|
||||||
│ └── pipeline.py
|
│ └── tests/ # Tests unitaires
|
||||||
├── process_lidar.py # Point d'entrée compatible
|
├── process_lidar.py # Point d'entrée compatible
|
||||||
├── Dockerfile
|
├── Dockerfile
|
||||||
├── run.sh
|
├── 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 |
|
| Résolution | `-r` | 0.5 | Résolution en mètres par pixel |
|
||||||
| Workers | `-w` | 1 | Nombre de CPU pour traitement parallèle |
|
| 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 |
|
| Output | `-o` | /data/output | Dossier de sortie |
|
||||||
| Force | `-f/--force` | off | Régénérer même si les WebP existent |
|
| 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) |
|
| Verbose | `-v` | off | Mode verbeux (timestamps + niveaux) |
|
||||||
| Debug | `--debug` | off | Mode debug (détails internes) |
|
| 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
|
2. **Dépressions** — Zones de collecte d'eau, dolines
|
||||||
3. **Negative Openness** — Fossés et tranchées
|
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
|
## Dépannage
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@ -225,4 +276,7 @@ docker system prune -a
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Erreur mémoire
|
### Erreur mémoire
|
||||||
Augmenter la mémoire Docker à 16Go+ pour les gros fichiers LiDAR HD.
|
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.
|
||||||
Reference in New Issue
Block a user