Files
lidar_rendu/README.md
Jacquin Antoine f07e915f6d Refactor pipeline en modules + logging verbose/debug + options CLI
- 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>
2026-05-10 00:15:29 +02:00

8.2 KiB

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

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é)

./run.sh -g

Traitement standard (CPU seul)

./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

# 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

# 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

# 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.