- Découpage du monolithe process_lidar.py (~2750 lignes) en package lidar_pipeline/ avec 9 modules (gpu, dtm, visualizations, ign, rendering, pipeline, cli, __init__, __main__) - Logging configurable: -v (verbose avec timestamps) et --debug (détails internes fichier:ligne) - Option --force pour régénérer tous les fichiers (par défaut skip les WebP existants) - Option --file NOM pour traiter un seul fichier LAZ (tests rapides) - ProcessPoolExecutor avec répertoires temporaires uniques par worker - Suppression du code mort (geomorphons, hillshade_ne, nodata_mask) - Aucun fichier TIFF résiduel après conversion WebP - setup.py pour installation pip, stub process_lidar.py compatible Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
226 lines
8.2 KiB
Markdown
226 lines
8.2 KiB
Markdown
# Pipeline LiDAR Archéologique - Docker
|
|
|
|
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 principales
|
|
| # | Visualisation | Utilité archéologique |
|
|
|---|--------------|----------------------|
|
|
| 1 | **Hillshade multidirectionnel** | Murs, terrasses, structures linéaires, routes |
|
|
| 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) |
|
|
|
|
### 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 |
|
|
|
|
### Cartes de référence IGN
|
|
| # | Visualisation | Source |
|
|
|---|--------------|--------|
|
|
| 19 | **Photographie aérienne IGN** | Orthophotographie WMTS |
|
|
| 20 | **Carte topographique IGN** | Plan IGN V2 WMTS |
|
|
|
|
## Architecture modulaire
|
|
|
|
```
|
|
lidar_pipeline/
|
|
├── __init__.py # Exports publics
|
|
├── __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
|
|
├── visualizations.py # Fonctions generate_* (20 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`.
|
|
|
|
## Installation Docker
|
|
|
|
```bash
|
|
cd /votre/dossier/lidar
|
|
mkdir -p input
|
|
|
|
# Copiez vos fichiers .laz dans input/
|
|
cp /chemin/vos/fichiers/*.laz input/
|
|
|
|
# Build l'image Docker
|
|
docker build -t lidar-lidar .
|
|
```
|
|
|
|
## Utilisation
|
|
|
|
### Traitement complet avec GPU (recommandé)
|
|
```bash
|
|
./run.sh -g
|
|
```
|
|
|
|
### Traitement standard (CPU seul)
|
|
```bash
|
|
./run.sh
|
|
```
|
|
|
|
### 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 seul fichier LAZ (pour tests)
|
|
-h Afficher l'aide
|
|
```
|
|
|
|
### Exemples
|
|
```bash
|
|
# Traitement standard
|
|
./run.sh
|
|
|
|
# Avec accélération GPU
|
|
./run.sh -g
|
|
|
|
# GPU + mode verbeux
|
|
./run.sh -g -v
|
|
|
|
# GPU + 4 workers parallèles
|
|
./run.sh -g -w 4
|
|
|
|
# Haute résolution + GPU + debug
|
|
./run.sh -g -v -r 0.2
|
|
|
|
# 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
|
|
```
|
|
|
|
### Utilisation directe Docker
|
|
```bash
|
|
# 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
|
|
|
|
# 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 seul fichier (test rapide)
|
|
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
|
|
|
|
# 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)
|
|
├── output/ # Résultats générés
|
|
│ ├── DTM/ # Modèles numériques de terrain (GeoTIFF)
|
|
│ ├── visualisations/ # Images WebP par fichier LAZ
|
|
│ │ ├── fichier_6881/ # Un sous-dossier par fichier LAZ
|
|
│ │ │ ├── ..._hillshade_multi.webp
|
|
│ │ │ ├── ..._svf.webp
|
|
│ │ │ ├── ..._mslrm.webp
|
|
│ │ │ └── ... (20 visualisations)
|
|
│ │ └── fichier_6882/
|
|
│ │ └── ...
|
|
│ └── 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
|
|
├── process_lidar.py # Point d'entrée compatible
|
|
├── Dockerfile
|
|
├── run.sh
|
|
└── README.md
|
|
```
|
|
|
|
## Paramètres
|
|
|
|
| Paramètre | Option | Défaut | Description |
|
|
|-----------|--------|--------|-------------|
|
|
| Résolution | `-r` | 0.5 | Résolution en mètres par pixel |
|
|
| 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) |
|
|
| Verbose | `-v` | off | Mode verbeux (timestamps + niveaux) |
|
|
| Debug | `--debug` | off | Mode debug (détails internes) |
|
|
|
|
### Résolution recommandée
|
|
- `0.2` — Très fine, bâtiments individuels (lent)
|
|
- `0.5` — Recommandée archéologie (équilibre vitesse/détail)
|
|
- `1.0` — Rapide, grandes structures uniquement
|
|
|
|
## Interprétation archéologique
|
|
|
|
### Pour détecter les cavités et souterrains
|
|
1. **Negative Openness** — Zones sombres = creux profonds
|
|
2. **Dépressions** — Carte spécifique des dolines et sinkholes
|
|
3. **Local Relief Model** — Zones bleues = dépressions
|
|
4. **Hillshade** — Ombres inhabituelles en forme de trous
|
|
|
|
### Pour détecter structures et bâtiments anciens
|
|
1. **MSRM** — Détection multi-échelle de tous les reliefs
|
|
2. **Sky-View Factor** — Structures géométriques claires
|
|
3. **SAILORE** — LRM adaptatif pour terrain hétérogène
|
|
4. **Anomalies statistiques** — Anomalies topographiques significatives
|
|
|
|
### Pour hydrologie et fossés
|
|
1. **Accumulation de flux** — Fossés d'enceinte, routes antiques
|
|
2. **Dépressions** — Zones de collecte d'eau, dolines
|
|
3. **Negative Openness** — Fossés et tranchées
|
|
|
|
## Dépannage
|
|
|
|
```bash
|
|
# Vérifier Docker
|
|
docker --version
|
|
|
|
# Shell dans le conteneur
|
|
docker run --rm -it -v $(pwd)/input:/data/input -v $(pwd)/output:/data/output \
|
|
--entrypoint bash lidar-lidar
|
|
|
|
# Reconstruire l'image
|
|
docker build --no-cache -t lidar-lidar .
|
|
|
|
# Nettoyer
|
|
docker system prune -a
|
|
```
|
|
|
|
### Erreur mémoire
|
|
Augmenter la mémoire Docker à 16Go+ pour les gros fichiers LiDAR HD. |