IGNF / lidar-prod

A production AI brick that augments a rule-based Lidar classification with AI predictions and vector database.

Home Page:https://ignf.github.io/lidar-prod/background/production_process.html

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Problème de connexion BDUNI/BDTOPO - Optimisation des bâtiments

KlatbahII opened this issue · comments

Bonjour,
j'ai posté une issue #72 - Classification des toits plats sur Myria3D, et @CharlesGaydon m'a demandé d'ouvrir une issue sur lidar-prod, ce que je fais ici.

J'ai prédit des dalles avec myria3d et j'ai ensuite voulu essayer lidar-prod pour améliorer les résultats de la classification.
En effet, comme précisé dans l'issue que j'ai créé sur le repo de Myria3D, il y avait un problème de toits plats classifié comme SOL.

En essayant de lancer lidar-prod j'ai eu un problème au niveau des requêtes vers la BD UNI.
Voici le message d'erreur que j'ai obtenu en essayant de lancer la task optimize_building.
je simplifie les PATH utilisés pour clarifier

docker run \
-v /path/inputs:/inputs/ \
-v /path/output:/outputs/ \
lidar_prod \
python lidar_prod/run.py \
++task=optimize_building \
building_validation.optimization.todo='prepare+optimize+evaluate+update' \
building_validation.optimization.paths.input_las_dir=/inputs/ \
building_validation.optimization.paths.results_output_dir=/outputs/

Voici le message d'erreur renvoyé ("subprocess.CalledProcessError: Command 'returned non-zero exit status 1")

Error executing job with overrides: ['++task=optimize_building', 'building_validation.optimization.todo=prepare+optimize+evaluate+update', 'building_validation.optimization.paths.input_las_dir=/inputs/', 'building_validation.optimization.paths.results_output_dir=/outputs/']

Traceback (most recent call last):
  File "/lidar/lidar_prod/run.py", line 64, in main
    optimize_building(config)
  File "/lidar/lidar_prod/commons/commons.py", line 61, in timed
    result = function(*args, **kwargs)
  File "/lidar/lidar_prod/optimization.py", line 33, in optimize_building
    bvo.run()
  File "/lidar/lidar_prod/tasks/building_validation_optimization.py", line 84, in run
    self.prepare()
  File "/lidar/lidar_prod/tasks/building_validation_optimization.py", line 143, in prepare
    self.bv.prepare(src_las_path, prepared_las_path, True)
  File "/lidar/lidar_prod/tasks/building_validation.py", line 192, in prepare
    buildings_in_bd_topo = request_bd_uni_for_building_shapefile(
  File "/lidar/lidar_prod/tasks/utils.py", line 205, in request_bd_uni_for_building_shapefile
    raise e
  File "/lidar/lidar_prod/tasks/utils.py", line 192, in request_bd_uni_for_building_shapefile
    subprocess.check_output(cmd, stderr=subprocess.STDOUT, timeout=120)
  File "/opt/conda/envs/lidar_prod/lib/python3.9/subprocess.py", line 424, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/opt/conda/envs/lidar_prod/lib/python3.9/subprocess.py", line 528, in run
    raise CalledProcessError(retcode, process.args,

subprocess.CalledProcessError: 
    Command '
        [
            'pgsql2shp', 
            '-f', 
            '/tmp/tmp0crat0nr/temp.shp', 
            '-h', 
            'serveurbdudiff.ign.fr', 
            '-u', 
            'invite', 
            '-P', 
            '28de#', 
            'bduni_france_consultation', 
            "SELECT        
 st_setsrid(batiment.geometrie,2154) AS geometry,         
1 as presence         FROM batiment         
WHERE batiment.geometrie         && ST_MakeEnvelope(1573200, 2268700, 1573550, 2269050, 2154)         
AND not gcms_detruit 
UNION SELECT         st_setsrid(reservoir.geometrie,2154) AS geometry,         1 as presence         
FROM reservoir        
 WHERE reservoir.geometrie         && ST_MakeEnvelope(1573200, 2268700, 1573550, 2269050, 2154)         
AND (reservoir.nature = 'Château d''eau' OR reservoir.nature = 'Réservoir industriel')        
 AND NOT gcms_detruit"]' returned non-zero exit status 1.

Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.

J'ai essayé d'accéder à cette base de données avec PgAdmin ou QGIS en utilisant les informations de connexion présentes dans le fichier de config Default Configuration dans la variable bd_uni_connection_params et la connexion est impossible.

A la place j'ai utilisé un shapefile issu de la BD_TOPO en rajoutant un champ PRESENCE avec une valeur de 1, comme précisé dans le code.
Ce shapefile est situé dans le dossier inputs qui contient également les .las.
J'ai lancé lidar-prod depuis Docker avec cette ligne de commande(je simplifie les PATH utilisé pour clarifier ).

docker run \
-v /home/path/input:/inputs/ \
-v /home/path/outputs:/outputs/ \
lidar_prod \
python lidar_prod/run.py \
paths.src_las=/inputs \
building_validation.application.shp_path=/inputs \
paths.output_dir = /outputs/

Après cette première commande qui correspond à la tâche(task) apply_on_building, les bâtiments sont regroupés dans un ScalarField appellé Group mais la classification n'a pas été modifiée.
De plus le ScalarField qui contenait la classification/prédiction a été supprimé.

Voici l'affichage du ScalarField building obtenu avec myria3d.
building

Voici l'affichage du ScalarField PredictedClassification, vu que j'ai vu qu'il y avait eu 2 noms différents(confidence et PredictedClassification pour le ScalarField qui contient les résultats de la classification de myria3d), dans cet essai il s'appelle PredictedClassification
classification

Et voici le ScalarField généré par lidar-prod appellé Group. On obtient 26 groupes correspondants à 1 groupe par cluster de bâtiment.
group_lidar_prod

En me basant sur cette image comprise dans la documentation de lidar-prod, je pensais que lidar-prod modifierait la classification et créerait seulement 2 groupes : 0 et 1.
.

Les résultats que l'on a obtenu sont-ils la dernière étape de lidar-prod ou devait-on obtenir quelque chose de différent ?
Par rapport à mon issue sur myria3d, peut on attendre une amélioration de la classification des bâtiments aux toits plats avec lidar-prod ?

Cf. ma réponse sous IGNF/myria3d#72 pour la deuxième partie de ta question sur l'usage et les sorties de lidar-prod. Je la cite par practicité :

Pour lidar-prod : les groupes créés correspondent au résultat de la partie Building Identification. Les autres tâches peuvent modifier une classification déjà existante du bâti. On appelle ça les "candidats bâti" (le code de classification est paramétrable dans la config ici) Typiquement une classification basée sur des règles qui aurait détecté les surfaces planes, etc. Et qu'on veut améliorer/corriger avec le modèle d'IA.

Les groupes que tu observes sont donc les bâtiments suggérés dans l'illustration :

image

Pour la partie de gauche il faut au préalable des "candidats bati", dont on souhaite qu'ils soient le plus exhaustifs possibles quitte à "surclassifier" (faux positifs).

Pour le reste (credentials & BDUni) je passe le relai à @leavauchier répondre. Il y a par ailleurs la PR #91 par @MichelDaab pour cacher les credentials (qui sont public mais se veulent discrets) de la BDUni.

Décision : pour l'instant n'est pas prioritaire. PR Bienvenues.