Suppression éclairage solaire, GPU accéléré, --file multi, tests unitaires

- Suppression de generate_solar (éclairage solaire) des visualisations
- Accélération GPU de hillshade, slope, aspect, curvature, depressions,
  anomalies, roughness, texture GLCM, flow (sink filling)
- Nettoyage mémoire GPU entre visualisations (gpu_cleanup)
- Correction OOM texture GLCM: calcul entropie bin par bin au lieu d'un
  tableau 3D massif sur GPU
- Correction bug: xp_minimum_filter manquant dans imports visualizations
- Option --file accepte plusieurs noms complets sans extension
- run.sh affiche l'aide si appelé sans arguments
- Option --test pour exécuter les tests unitaires dans Docker
- Filtre ReturnNumber>=1 intégré dans le pipeline PDAL (plus d'erreur SMRF)
- 60 tests unitaires: GPU, visualisations, rendering, DTM, pipeline, CLI
- Ajout pytest au Dockerfile

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jacquin Antoine
2026-05-10 00:57:39 +02:00
parent f07e915f6d
commit ad762e682d
17 changed files with 998 additions and 252 deletions

View File

@ -2,7 +2,7 @@
Workflow automatisé pour générer des visualisations exploitables à partir de données LiDAR pour la détection de structures archéologiques.
## Visualisations (20 par fichier)
## Visualisations (19 par fichier)
### Visualisations principales
| # | Visualisation | Utilité archéologique |
@ -11,30 +11,29 @@ Workflow automatisé pour générer des visualisations exploitables à partir de
| 2 | **Pente (Slope)** | Murs de soutènement, talus, changements brusques |
| 3 | **Aspect (Orientation)** | Direction des pentes, exposition |
| 4 | **Courbure (Curvature)** | Fossés, terrasses, talus, concavité/convexité |
| 5 | **Éclairage solaire** | Simulation de l'éclairage matinal |
| 6 | **Sky-View Factor** | Structures, tumulus, fondations (ray-tracing 16 azimuts) |
| 7 | **Local Relief Model** | Micro-reliefs, fossés, levées de terrain |
| 8 | **Positive Openness** | Élévations, tumulus, bâtiments (ray-tracing 8 directions) |
| 9 | **Negative Openness** | Cavités, fossés, souterrains (ray-tracing 8 directions) |
| 5 | **Sky-View Factor** | Structures, tumulus, fondations (ray-tracing 16 azimuts) |
| 6 | **Local Relief Model** | Micro-reliefs, fossés, levées de terrain |
| 7 | **Positive Openness** | Élévations, tumulus, bâtiments (ray-tracing 8 directions) |
| 8 | **Negative Openness** | Cavités, fossés, souterrains (ray-tracing 8 directions) |
### Visualisations avancées
| # | Visualisation | Description | Détection |
|---|--------------|-------------|-----------|
| 10 | **MSRM** | Multi-Scale Relief Model (sigma 5/10/25/50/100m) | Tumulus, fossés, murs à toutes les échelles |
| 11 | **TPI multi-échelle** | Topographic Position Index (5m + 100m) | Crêtes, vallées, plateformes |
| 12 | **Dépressions** | Remplissage cuvettes + différence | Dolines, sinkholes, zones inondables |
| 13 | **SAILORE** | LRM adaptatif (noyau = f(pente)) | Terrain hétérogène, tout relief |
| 14 | **Rugosité** | Écart-type de l'élévation | Surfaces anthropiques vs naturelles |
| 15 | **Anomalies statistiques** | Z-score + Local Moran's I | Anomalies topographiques significatives |
| 16 | **Ondelette Mexican Hat** | CWT 2D multi-échelle | Tumulus, fossés circulaires |
| 17 | **Texture GLCM** | Contraste, entropie, homogénéité | Labour, surfaces archéologiques |
| 18 | **Accumulation de flux** | Algorithme D8 hydrologique | Fossés d'enceinte, routes antiques |
| 9 | **MSRM** | Multi-Scale Relief Model (sigma 5/10/25/50/100m) | Tumulus, fossés, murs à toutes les échelles |
| 10 | **TPI multi-échelle** | Topographic Position Index (5m + 100m) | Crêtes, vallées, plateformes |
| 11 | **Dépressions** | Remplissage cuvettes + différence | Dolines, sinkholes, zones inondables |
| 12 | **SAILORE** | LRM adaptatif (noyau = f(pente)) | Terrain hétérogène, tout relief |
| 13 | **Rugosité** | Écart-type de l'élévation | Surfaces anthropiques vs naturelles |
| 14 | **Anomalies statistiques** | Z-score + Local Moran's I | Anomalies topographiques significatives |
| 15 | **Ondelette Mexican Hat** | CWT 2D multi-échelle | Tumulus, fossés circulaires |
| 16 | **Texture GLCM** | Contraste, entropie, homogénéité | Labour, surfaces archéologiques |
| 17 | **Accumulation de flux** | Algorithme D8 hydrologique | Fossés d'enceinte, routes antiques |
### Cartes de référence IGN
| # | Visualisation | Source |
|---|--------------|--------|
| 19 | **Photographie aérienne IGN** | Orthophotographie WMTS |
| 20 | **Carte topographique IGN** | Plan IGN V2 WMTS |
| 18 | **Photographie aérienne IGN** | Orthophotographie WMTS |
| 19 | **Carte topographique IGN** | Plan IGN V2 WMTS |
## Architecture modulaire
@ -45,13 +44,13 @@ 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
├── visualizations.py # Fonctions generate_* (20 visualisations)
├── 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)
```
Ajouter une visualisation = 1 fonction + 1 entrée dans `VIZ_STEPS` + 1 entrée dans `COLORMAPS`.
Ajouter une visualisation = 1 fonction + 1 entrée dans `VIZ_STEPS` + 1 entrée dans `COLORMAPS`. Supprimer = retirer les 3 entrées correspondantes.
## Installation Docker
@ -87,7 +86,7 @@ docker build -t lidar-lidar .
-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 seul fichier LAZ (pour tests)
--file NOM... Traiter un ou plusieurs fichiers LAZ spécifiques (nom partiel)
-h Afficher l'aide
```
@ -111,8 +110,11 @@ docker build -t lidar-lidar .
# Forcer la régénération de tous les fichiers
./run.sh -g --force
# Traiter un seul fichier pour test
./run.sh -g --file 6881
# 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
```
### Utilisation directe Docker
@ -127,9 +129,9 @@ docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data
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 seul fichier (test rapide)
# 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 6881
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 \
@ -148,7 +150,7 @@ docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data
│ │ │ ├── ..._hillshade_multi.webp
│ │ │ ├── ..._svf.webp
│ │ │ ├── ..._mslrm.webp
│ │ │ └── ... (20 visualisations)
│ │ │ └── ... (19 visualisations)
│ │ └── fichier_6882/
│ │ └── ...
│ └── rapports/ # Rapports PDF A3 par fichier
@ -177,7 +179,7 @@ docker run --rm --gpus all -v $(pwd)/input:/data/input:ro -v $(pwd)/output:/data
| Workers | `-w` | 1 | Nombre de CPU pour traitement parallèle |
| 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 seul fichier (pour tests) |
| File | `--file` | tous | Traiter un ou plusieurs fichiers LAZ (nom complet sans extension) |
| Verbose | `-v` | off | Mode verbeux (timestamps + niveaux) |
| Debug | `--debug` | off | Mode debug (détails internes) |