Pipeline LiDAR: 19 visualisations archéologiques, corrections SVF/Openness, légendes explicites
- Corriger SVF: ray-tracing 16 azimuts (inversion DEM remplacée) - Corriger Openness: angle zénith/nadir sur 8 directions (min/max filter remplacé) - Ajouter MSRM (LRM multi-échelle 5/10/25/50/100m) - Ajouter TPI multi-échelle (5m + 100m) - Ajouter détection dépressions (remplissage hydrologique) - Ajouter SAILORE (LRM adaptatif f(pente)) - Ajouter rugosité de surface (écart-type local 5m) - Ajouter anomalies statistiques (z-score + Moran's I) - Ajouter ondelette Mexican Hat (CWT 5 échelles) - Ajouter texture GLCM (contraste + entropie - homogénéité) - Ajouter accumulation de flux (D8) - Retirer geomorphons et VAT composite - Répertoire par fichier LAZ dans visualisations/ - Support multi-CPU (-w/--workers) - Légendes explicites avec différenciation entre techniques similaires - Docker: uid/gid 1000:1000 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
11
Dockerfile
11
Dockerfile
@ -26,15 +26,20 @@ RUN pip3 install --no-cache-dir \
|
|||||||
'laspy[laspy]' \
|
'laspy[laspy]' \
|
||||||
scikit-image \
|
scikit-image \
|
||||||
scikit-learn \
|
scikit-learn \
|
||||||
|
scipy \
|
||||||
tqdm
|
tqdm
|
||||||
|
|
||||||
# Copy scripts
|
# Copy scripts
|
||||||
COPY process_lidar.py /usr/local/bin/
|
COPY process_lidar.py /usr/local/bin/
|
||||||
RUN chmod +x /usr/local/bin/process_lidar.py
|
RUN chmod +x /usr/local/bin/process_lidar.py
|
||||||
|
|
||||||
# Create directories with correct permissions
|
# Create user with uid/gid 1000:1000 and run as that user
|
||||||
RUN mkdir -p /data/output /data/input && \
|
RUN groupadd -g 1000 lidar && \
|
||||||
chmod 777 /data /data/output /data/input
|
useradd -u 1000 -g lidar -m lidar && \
|
||||||
|
mkdir -p /data/output /data/input && \
|
||||||
|
chown -R lidar:lidar /data /data/output /data/input
|
||||||
|
|
||||||
|
USER lidar
|
||||||
|
|
||||||
VOLUME ["/data"]
|
VOLUME ["/data"]
|
||||||
|
|
||||||
|
|||||||
233
README.md
233
README.md
@ -2,180 +2,185 @@
|
|||||||
|
|
||||||
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 pour la détection de structures archéologiques.
|
||||||
|
|
||||||
## 🎯 Ce que détecte ce pipeline
|
## Visualisations (21 par fichier)
|
||||||
|
|
||||||
| Visualisation | Utilité archéologique |
|
### Visualisations principales
|
||||||
|--------------|----------------------|
|
| # | Visualisation | Utilité archéologique |
|
||||||
| **Hillshade multidirectionnel** | Murs, terrasses, structures linéaires, routes |
|
|---|--------------|----------------------|
|
||||||
| **Slope (Pente)** | Murs de soutènement, talus, changements brusques |
|
| 1 | **Hillshade multidirectionnel** | Murs, terrasses, structures linéaires, routes |
|
||||||
| **Sky-View Factor** | ⭐ **Top** - structures, tumulus, fondations |
|
| 2 | **Pente (Slope)** | Murs de soutènement, talus, changements brusques |
|
||||||
| **Local Relief Model** | Micro-reliefs, fossés, levées de terrain |
|
| 3 | **Aspect (Orientation)** | Direction des pentes, exposition |
|
||||||
| **Positive Openness** | Élévations, tumulus, bâtiments |
|
| 4 | **Courbure (Curvature)** | Fossés, terrasses, talus, concavité/convexité |
|
||||||
| **Negative Openness** | ⭐ **Cavités, fossés, souterrains** |
|
| 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) |
|
||||||
|
|
||||||
## 📦 Installation Docker
|
### Visualisations avancées
|
||||||
|
| # | Visualisation | Description | Détection |
|
||||||
|
|---|--------------|-------------|-----------|
|
||||||
|
| 9 | **MSRM** | Multi-Scale Relief Model (sigma 5/10/25/50/100m) | Tumulus, fossés, murs à toutes échelles |
|
||||||
|
| 10 | **TPI multi-échelle** | Topographic Position Index (5m + 100m) | Crêtes, vallées, plateformes |
|
||||||
|
| 11 | **VAT composite** | Fusion hillshade+pente+SVF en RGB | Meilleure carte unique archéologique |
|
||||||
|
| 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 | **Geomorphons** | 10 formes de terrain | Pics, crêtes, vallées, fosses, plateaux |
|
||||||
|
| 15 | **Rugosité** | Écart-type de l'élévation | Surfaces anthropiques vs naturelles |
|
||||||
|
| 16 | **Anomalies statistiques** | Z-score + Local Moran's I | Anomalies topographiques significatives |
|
||||||
|
| 17 | **Ondelette Mexican Hat** | CWT 2D multi-échelle | Tumulus, fossés circulaires |
|
||||||
|
| 18 | **Texture GLCM** | Contraste, entropie, homogénéité | Labour, surfaces archéologiques |
|
||||||
|
| 19 | **Accumulation de flux** | Algorithme D8 hydrologique | Fossés d'enceinte, routes antiques |
|
||||||
|
|
||||||
|
### Cartes de référence IGN
|
||||||
|
| # | Visualisation | Source |
|
||||||
|
|---|--------------|--------|
|
||||||
|
| 20 | **Photographie aérienne IGN** | Orthophotographie WMTS |
|
||||||
|
| 21 | **Carte topographique IGN** | Plan IGN V2 WMTS |
|
||||||
|
|
||||||
|
## Installation Docker
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clone ou copiez les fichiers dans un dossier
|
|
||||||
cd /votre/dossier/lidar
|
cd /votre/dossier/lidar
|
||||||
|
|
||||||
# Créez le dossier pour vos fichiers LAZ
|
|
||||||
mkdir -p input
|
mkdir -p input
|
||||||
|
|
||||||
# Copiez vos fichiers .laz dans input/
|
# Copiez vos fichiers .laz dans input/
|
||||||
cp /chemin/vos/fichiers/*.laz input/
|
cp /chemin/vos/fichiers/*.laz input/
|
||||||
|
|
||||||
# Build l'image Docker
|
# Build l'image Docker
|
||||||
docker-compose build
|
|
||||||
|
|
||||||
# Ou avec docker build
|
|
||||||
docker build -t lidar-archeo .
|
docker build -t lidar-archeo .
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🚀 Utilisation
|
## Utilisation
|
||||||
|
|
||||||
### Méthode 1: docker-compose (recommandé)
|
|
||||||
|
|
||||||
|
### Traitement standard (1 CPU)
|
||||||
```bash
|
```bash
|
||||||
# Traitement avec résolution 0.5m
|
|
||||||
docker-compose up
|
|
||||||
|
|
||||||
# Résolution plus fine (plus lent)
|
|
||||||
docker-compose run -e RESOLUTION=0.2 lidar process_lidar.py /data/input -o /data/output -r 0.2
|
|
||||||
```
|
|
||||||
|
|
||||||
### Méthode 2: docker run
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Basic
|
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
-v $(pwd)/input:/data/input:ro \
|
-v $(pwd)/input:/data/input:ro \
|
||||||
-v $(pwd)/output:/data/output \
|
-v $(pwd)/output:/data/output \
|
||||||
lidar-archeo
|
lidar-archeo
|
||||||
|
```
|
||||||
|
|
||||||
# Avec résolution personnalisée
|
### Traitement parallèle multi-CPU
|
||||||
|
```bash
|
||||||
|
# Utiliser 4 CPU pour traiter plusieurs fichiers en parallèle
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
-v $(pwd)/input:/data/input:ro \
|
-v $(pwd)/input:/data/input:ro \
|
||||||
-v $(pwd)/output:/data/output \
|
-v $(pwd)/output:/data/output \
|
||||||
lidar-archeo \
|
lidar-archeo \
|
||||||
process_lidar.py /data/input -o /data/output -r 0.3
|
process_lidar.py /data/input -o /data/output -w 4
|
||||||
|
```
|
||||||
|
|
||||||
# Plus de mémoire pour fichiers volumineux
|
### Résolution personnalisée
|
||||||
|
```bash
|
||||||
|
# Résolution fine (0.2m) - bâtiments individuels
|
||||||
|
docker run --rm \
|
||||||
|
-v $(pwd)/input:/data/input:ro \
|
||||||
|
-v $(pwd)/output:/data/output \
|
||||||
|
lidar-archeo \
|
||||||
|
process_lidar.py /data/input -o /data/output -r 0.2
|
||||||
|
|
||||||
|
# Résolution standard (0.5m) - recommandée archéologie
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
--memory=16g \
|
|
||||||
--memory-swap=16g \
|
|
||||||
-v $(pwd)/input:/data/input:ro \
|
-v $(pwd)/input:/data/input:ro \
|
||||||
-v $(pwd)/output:/data/output \
|
-v $(pwd)/output:/data/output \
|
||||||
lidar-archeo
|
lidar-archeo
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📁 Structure des dossiers
|
### Combinaison résolution + multi-CPU
|
||||||
|
```bash
|
||||||
|
docker run --rm \
|
||||||
|
--memory=16g \
|
||||||
|
-v $(pwd)/input:/data/input:ro \
|
||||||
|
-v $(pwd)/output:/data/output \
|
||||||
|
lidar-archeo \
|
||||||
|
process_lidar.py /data/input -o /data/output -r 0.5 -w 4
|
||||||
|
```
|
||||||
|
|
||||||
|
## Structure des dossiers
|
||||||
|
|
||||||
```
|
```
|
||||||
.
|
.
|
||||||
├── input/ # Vos fichiers .laz (monté en read-only)
|
├── input/ # Vos fichiers .laz (monté en read-only)
|
||||||
├── output/ # Résultats générés
|
├── output/ # Résultats générés
|
||||||
│ ├── DTM/ # Modèles numériques d'élévation
|
│ ├── DTM/ # Modèles numériques de terrain (GeoTIFF)
|
||||||
│ ├── visualisations/# Images PNG prêtes à l'emploi
|
│ ├── visualisations/ # Images PNG par fichier LAZ
|
||||||
│ └── rapports/ # Vues synthétiques
|
│ │ ├── fichier_6881/ # Un sous-dossier par fichier LAZ
|
||||||
|
│ │ │ ├── ..._hillshade_multi.png
|
||||||
|
│ │ │ ├── ..._svf.png
|
||||||
|
│ │ │ ├── ..._mslrm.png
|
||||||
|
│ │ │ └── ... (21 visualisations)
|
||||||
|
│ │ └── fichier_6882/
|
||||||
|
│ │ └── ...
|
||||||
|
│ └── rapports/ # Rapports PDF A3 par fichier
|
||||||
|
│ ├── fichier_6881_rapport.pdf
|
||||||
|
│ └── fichier_6882_rapport.pdf
|
||||||
├── Dockerfile
|
├── Dockerfile
|
||||||
├── docker-compose.yml
|
├── docker-compose.yml
|
||||||
└── process_lidar.py
|
└── process_lidar.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📊 Sortie générée
|
## Paramètres
|
||||||
|
|
||||||
Après traitement, dans `output/` :
|
| 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 |
|
||||||
|
|
||||||
```
|
### Résolution recommandée
|
||||||
output/
|
- `0.2` - Très fine, bâtiments individuels (lent)
|
||||||
├── DTM/
|
- `0.5` - Recommandée archéologie (équilibre vitesse/détail)
|
||||||
│ └── fichier_dtm.tif
|
- `1.0` - Rapide, grandes structures uniquement
|
||||||
├── visualisations/
|
|
||||||
│ ├── fichier_hillshade_multi.png
|
|
||||||
│ ├── fichier_svf.png # ⭐ Sky-View Factor
|
|
||||||
│ ├── fichier_lrm.png # Local Relief Model
|
|
||||||
│ ├── file_positive_openness.png # Élévations
|
|
||||||
│ ├── file_negative_openness.png # ⭐ Cavités
|
|
||||||
│ └── fichier_slope.png
|
|
||||||
└── rapports/
|
|
||||||
└── fichier_overview.png # Vue 2x3 synthétique
|
|
||||||
```
|
|
||||||
|
|
||||||
## 👁️ Interprétation
|
## Interprétation archéologique
|
||||||
|
|
||||||
### Pour détecter les cavités et souterrains
|
### Pour détecter les cavités et souterrains
|
||||||
Regardez dans cet ordre :
|
1. **Negative Openness** - Zones sombres = creux profonds
|
||||||
1. **Negative Openness** - Zones bleues foncées = creux
|
2. **Dépressions** - Carte spécifique des dolines et sinkholes
|
||||||
2. **Local Relief Model** - Zones bleues = dépressions
|
3. **Local Relief Model** - Zones bleues = dépressions
|
||||||
3. **Hillshade** - Ombres inhabituelles en forme de trous
|
4. **Hillshade** - Ombres inhabituelles en forme de trous
|
||||||
|
|
||||||
### Pour détecter structures et bâtiments anciens
|
### Pour détecter structures et bâtiments anciens
|
||||||
1. **Sky-View Factor** - Structures géométriques claires
|
1. **VAT composite** - Meilleure carte unique combinant hillshade+pente+SVF
|
||||||
2. **Positive Openness** - Zones orangées/rouges = élévations
|
2. **Sky-View Factor** - Structures géométriques claires
|
||||||
3. **Hillshade** - Lignes droites, rectangles, angles
|
3. **MSRM** - Détection multi-échelle de tous les reliefs
|
||||||
|
4. **Geomorphons** - Classification automatique des formes
|
||||||
|
|
||||||
### Pour élévations de terrain
|
### Pour anomalies statistiques
|
||||||
1. **Slope** - Changements de pente brusques
|
1. **Anomalies statistiques** - Zones significativement différentes du terrain
|
||||||
2. **Positive Openness** - Zones en hauteur
|
2. **Ondelette Mexican Hat** - Structures circulaires (tumulus, enclos)
|
||||||
3. **LRM** - Zones rouges = relief local
|
3. **Rugosité** - Surfaces anthropiques vs naturelles
|
||||||
|
4. **Texture GLCM** - Labour ancien, chemins, murs enfouis
|
||||||
|
|
||||||
## ⚙️ Paramètres
|
### 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
|
||||||
|
|
||||||
### Résolution (-r)
|
## Dépannage
|
||||||
- `0.2` - Très fine, bâtiments individuels (lent)
|
|
||||||
- `0.5` - Recommandé archéologie (équilibre)
|
|
||||||
- `1.0` - Rapide, grandes structures
|
|
||||||
|
|
||||||
### Ressources Docker
|
|
||||||
Modifiez dans `docker-compose.yml` :
|
|
||||||
```yaml
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
cpus: '4' # CPU cores
|
|
||||||
memory: 8G # RAM
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔧 Dépannage
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Vérifier que Docker fonctionne
|
# Vérifier Docker
|
||||||
docker --version
|
docker --version
|
||||||
docker-compose --version
|
|
||||||
|
|
||||||
# Voir les logs en temps réel
|
|
||||||
docker-compose up -f
|
|
||||||
|
|
||||||
# Shell dans le conteneur
|
# Shell dans le conteneur
|
||||||
docker-compose run lidar bash
|
docker run --rm -it \
|
||||||
|
-v $(pwd)/input:/data/input \
|
||||||
|
-v $(pwd)/output:/data/output \
|
||||||
|
--entrypoint bash lidar-archeo
|
||||||
|
|
||||||
# Nettoyer tout
|
# Reconstruire l'image
|
||||||
docker-compose down -v
|
docker build --no-cache -t lidar-archeo .
|
||||||
|
|
||||||
|
# Nettoyer
|
||||||
docker system prune -a
|
docker system prune -a
|
||||||
```
|
```
|
||||||
|
|
||||||
### Erreur mémoire
|
### Erreur mémoire
|
||||||
```bash
|
Augmenter la mémoire Docker à 16Go+ pour les gros fichiers LiDAR HD.
|
||||||
# Augmenter la limite mémoire dans docker-compose.yml
|
|
||||||
# Ou utiliser --memory=16g avec docker run
|
|
||||||
```
|
|
||||||
|
|
||||||
### Erreur PDAL/Whitebox
|
## Ressources
|
||||||
```bash
|
|
||||||
# Recréer l'image
|
|
||||||
docker-compose build --no-cache
|
|
||||||
```
|
|
||||||
|
|
||||||
## 📝 Prochaines améliorations
|
|
||||||
|
|
||||||
- [ ] Classification automatique des structures détectées
|
|
||||||
- [ ] Export GeoTIFF géoréférencés pour QGIS
|
|
||||||
- [ ] Interface web pour exploration interactive
|
|
||||||
- [ ] Support multi-fichiers avec mosaïque
|
|
||||||
|
|
||||||
## 📚 Ressources
|
|
||||||
|
|
||||||
- [PDAL Documentation](https://pdal.io/)
|
- [PDAL Documentation](https://pdal.io/)
|
||||||
- [WhiteboxTools](https://www.whiteboxgeo.com/manual/wbt_book/)
|
- [LiDAR Archéologie - Méthodes avancées](https://archaeologydataservice.ac.uk/)
|
||||||
- [Archéologie LiDAR](https://archaeologydataservice.ac.uk/)
|
- [Relief Visualization Toolbox](https://rvtpy.readthedocs.io/)
|
||||||
2032
process_lidar.py
2032
process_lidar.py
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user