Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Module d'identification de la végétation et des non-classés #62

Merged
merged 41 commits into from
Sep 13, 2022

Conversation

MichelDaab
Copy link
Collaborator

No description provided.

Copy link
Collaborator

@CharlesGaydon CharlesGaydon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bonne PR, je ne vois pas de soucis de logique, et surtout des changements à apporter sur la cohérence de style / l'intégration avec les autres modules déjà existants.
Par ailleurs, pourras-tu à la fin vérifier que:

  • la documentation se créer sans soucis de formatage pour les nouvelles fonctions
  • la logique du nouveau module est elle même documentée quelque part
  • tout se lance bien en ligne de commande
  • notamment, le package peut être installé avec pip install -e (pour figer une version) et ensuite lancé en tant que module.
  • Actualiser éventuellement la doc si il y a des changements d'API !

configs/basic_identification/for_testing.yaml Show resolved Hide resolved
configs/basic_identification/default.yaml Outdated Show resolved Hide resolved
configs/data_format/default.yaml Show resolved Hide resolved
configs/data_format/default.yaml Show resolved Hide resolved
configs/data_format/legacy.yaml Show resolved Hide resolved
lidar_prod/tasks/basic_identification.py Outdated Show resolved Hide resolved
lidar_prod/tasks/basic_identification.py Outdated Show resolved Hide resolved
lidar_prod/tasks/basic_identification.py Outdated Show resolved Hide resolved
lidar_prod/tasks/basic_identification.py Outdated Show resolved Hide resolved
lidar_prod/tasks/basic_identification.py Show resolved Hide resolved
Copy link
Collaborator

@CharlesGaydon CharlesGaydon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, la structure prend vraiment une bonne forme. :) Est-ce que tu pourras jeter un coup d'oeil aux quelques commentaires non résolus encore stp ? J'en ai rajouté quelques nouveaux, généralement des détails.
Et ensuite il faudra se pencher sur la documentation, je n'ai pas vu passer de commits là dessus. :) Merci !

- "${data_format.las_dimensions.ai_vegetation_unclassified_groups}=uint"
vegetation_unclassified_detection:
# Extra dims added for storing the result of the vegetation/unclassified detection.
- "${data_format.las_dimensions.ai_building_identified}=uint"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

je crois que certaines dimensions sont encore supprimées à tort, en particulier les inputs de vegetation_unclassified
En gros on veut :
vegetation_unclassified :
input : p_vegetation, p_building, entropy
output : ai_vegetation_unclassified_groups, p_building, entropy
building :
input ; p_building, entropy ;
output : ai_building_identified

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alors pour le building, il me semblait qu'il fallait aussi en sortie l'entropie (en tout cas c'était comme ça avant)

Pour la végétation, on ne passe plus dans la suppression des dimensions au début, donc pas besoin de préciser lesquelles on veut garder

Mais en effet il y a eu une inversion (j'ai confondu les proba de building avec un autre)

Copy link
Collaborator

@CharlesGaydon CharlesGaydon Aug 29, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah ok, je comprends. Donc l'input de vegetation_unclassified est bon.
Par contre dans l'output les probas sont demandées en uint et non plus en float. Ce n'est pas souhaité : ce sont des valeurs entre 0 et 1 et on veux bien des floats.

Pour building_output, j'avais probablement laissé l'entropie à titre indicatif, car c'est une info intéressante pour comprendre les erreurs éventuelles du modèle. Tu peux peut l'enlever maintenant pour alléger. :)

Copy link
Collaborator Author

@MichelDaab MichelDaab Aug 29, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je peux enlever entropie évidemment, mais ne serait-il pas mieux de ne pas mettre cette colone lorsqu'on est en production ? J'ai remarqué que les opération d'ajout et de suppression de colonnes sont vraiment longues.

A titre d'exemple et pour ce que j'ai en tête, une opération de détection de végétation/non classé avec pdal et suppresion/ajout de colonne prenait 80-100 sec sur un fichier donné, pour le même fichier avec laspy sans opération sur les colonnes c'était 6-8 sec.

Maintenant, c'est peut-être parce que je suis limité en mémoire sur mon PC.

Il faudrait peut-être faire un schéma clair avec quelles colonnes exactement en entrée et en sortie de chaque process (myria3D, détection végé/non classé, détection building), pour éviter au maximum ces opérations qui m'ont semblées couteuses

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je peux enlever entropie évidemment, mais ne serait-il pas mieux de ne pas mettre cette colone lorsqu'on est en production ?

On a besoin d'entropie pour building validation, et on n'en n'a plus besoin ensuite, donc oui on peut l'enlever (on veut éviter de la garder car ça alourdira les fichiers suivants sans raison).

A titre d'exemple et pour ce que j'ai en tête, une opération de détection de végétation/non classé avec pdal et suppresion/ajout de colonne prenait 80-100 sec sur un fichier donné, pour le même fichier avec laspy sans opération sur les colonnes c'était 6-8 sec.

Ce qui est le plus long avec les Cleaner c'est qu'ils nécessitent une lecture + écriture à répétition (n * 10-20secondes). Mais avec les changements que tu apporte il n'y aura pas de surcout à priori.

Il faudrait peut-être faire un schéma clair avec quelles colonnes exactement en entrée et en sortie de chaque process (myria3D, détection végé/non classé, détection building).

Je suis d'accord, ça aiderait vraiment à comprendre les choses, d'autant que le système se complexifie avec ce nouveau module. Est-ce que tu pourrais l'ajouter à cette PR ? Peut-être dans la page de doc du processus ?
Il y a http://mermaid-js.github.io/mermaid/#/ qui est adapté pour des schémas en markdown. Je ne sais pas à quel point ça peut être intégré direct dans la doc.

configs/data_format/legacy.yaml Show resolved Hide resolved
lidar_prod/application.py Show resolved Hide resolved
lidar_prod/optimization.py Show resolved Hide resolved
lidar_prod/run.py Show resolved Hide resolved
lidar_prod/tasks/basic_identification.py Show resolved Hide resolved
lidar_prod/tasks/basic_identification.py Show resolved Hide resolved
tests/conftest.py Outdated Show resolved Hide resolved
destination_path = tempfile.NamedTemporaryFile().name
detect_vegetation_unclassified(
vegetation_unclassifed_hydra_cfg,
LAS_SUBSET_FILE_VEGETATION,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Si c'est simplement de la description je veux bien une docstring :)

@CharlesGaydon CharlesGaydon changed the title Dev vegetation Module d'identification de la végétation et des non-classés Aug 26, 2022
Copy link
Collaborator

@CharlesGaydon CharlesGaydon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On est pas mal, il reste simplement de la documentation à rajouter, et un data_format à changer, ainsi que le nom de la task apply_on_building à changer vers "apply_building_module" par exemple (cf. un autre commentaire).

Par ailleurs, est-ce que tu peux vérifier que les changement d'API pour e.g. l'optimization des seuils de validation bati est bien répercuté dans toutes les pages qui le mentionnent ? Par exemple sur cette page, je crois que le nom de la tâche est modifé.

docs/source/tutorials/use.md Show resolved Hide resolved
docs/source/tutorials/use.md Show resolved Hide resolved
Copy link
Collaborator

@CharlesGaydon CharlesGaydon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alors, je vois que pdal est maintenant souvent mobilisé, et c'est bien.
Cependant ces modifications n'ont pas l'effet escompté sur les écritures/lectures.
La syntaxe permettant d'éviter les écritures / lectures est donnée dans le README de python-pdal à cette section.

En gros :

points_of_first_pipeline = pipeline1.arrays[0]
pipeline2 = pdal.Filters.X().pipeline(out_of_first_pipeline) 
pipeline2 = pipeline2 | ... | ... # other operations
pipeline2.execute()
points_of_second_pipeline = pipeline2.arrays[0]

L'idée étant alors de se transmettre des np.ndarray entre les différentes tasks, sans les écrire/lire.

@@ -1,6 +1,6 @@
# parameters
vegetation_threshold: 0.5
unclassified_threshold: 0.5
vegetation_threshold: 0.3923
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Est-ce que l'optimisation apporte un changement important par rapport aux seuils par défaut de 0.5 ? Par important j'entends au doigt mouillé une IoU qui s'élève de + de 1% après optimisation.

Car sinon, on peut tout aussi bien garder des seuils à 0.5. Ca permet d'éviter un overfitting éventuel sur les données d'optimisation.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

De tête il me semble que c'est un chouia plus que 1 pourcent, je n'ai pas les valeurs pour 0.5 sous la main mais c'est ce dont je me souviens pour les valeurs des "trials" intermédiaires qui étaient affichés. Sans vraiment de garantie

Le souci c'est plus que ce sont deux valeurs en-dessous de 0.5, donc en théorie les deux seuils peuvent être validé ensemble

Copy link
Collaborator

@CharlesGaydon CharlesGaydon Sep 1, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

De tête il me semble que c'est un chouia plus que 1 pourcent, je n'ai pas les valeurs pour 0.5 sous la main mais c'est ce dont je me souviens pour les valeurs des "trials" intermédiaires qui étaient affichés. Sans vraiment de garantie

OK. On peut garder pour l'instant. Lorsqu'on aura la nouvelle version du modèle sur données à la végétation corrigée, il faudra évaluer proprement les IoU, et enrichir la ModuleCard qui contient pour l'instant une évaluation du module bati seul.

Le souci c'est plus que ce sont deux valeurs en-dessous de 0.5, donc en théorie les deux seuils peuvent être validé ensemble

Ca peut être une bonne raison d'exiger un seuil plus élevé.

docs/source/background/production_process.md Show resolved Hide resolved
docs/source/background/production_process.md Show resolved Hide resolved
lidar_prod/application.py Outdated Show resolved Hide resolved
lidar_prod/tasks/building_completion.py Outdated Show resolved Hide resolved
Copy link
Collaborator

@CharlesGaydon CharlesGaydon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revu ; quelques typos, mais surtout : l'objectif de revoir les entrées/sorties est de diminuer les lectures et écritures. Je crois que tu as diminué les lectures grâce au passage de l'objet pipeline à travers les objets.
Par contre les écritures sont quasi-systématiques encore dans les différents sous-modules du bâti.
A mon avis on peut avoir une signature générale pour tous du type :

func(input_values: str | Pipeline, target_las_path:Optionnal[str] = None)`:
   self.pipeline = get_pipeline(input_values)

Et préciser target_las_path permet d'activer la sauvagarde.

docs/source/background/overview.md Outdated Show resolved Hide resolved
docs/source/background/overview.md Outdated Show resolved Hide resolved
lidar_prod/application.py Outdated Show resolved Hide resolved
lidar_prod/tasks/building_completion.py Outdated Show resolved Hide resolved
lidar_prod/tasks/building_completion.py Outdated Show resolved Hide resolved
lidar_prod/tasks/building_validation.py Outdated Show resolved Hide resolved
tests/lidar_prod/tasks/test_utils.py Show resolved Hide resolved
lidar_prod/tasks/building_identification.py Show resolved Hide resolved
Copy link
Collaborator

@CharlesGaydon CharlesGaydon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Une mini typo.
Tu as pu vérifier la doc ?
Sinon LGTM.
Tu peux alors :

  • Passer le numéro de version à 1.7.0 dans package_metadata (cf. un de mes coms non résolus),
  • Rebase sur main pour prendre en compte le confilt sur package_metadata
  • squash & merge cettez PR. :)

@@ -2,8 +2,8 @@

A las file goes through several steps, which alter its content.
At first we have a `Raw` las file, sent to another process (`Myria3D`) that infers the probabilities of various classes.
From there, the las file is used a first time by this module to decide if the points are vegetation, unclassified or something else, and sent to an exterior process, a `rule based segmentation`.
The las file is used a second time by this module to decide if the points are buldings or not.
From there, the las file is used a first time by this module to decide if the points are vegetation, unclassified or something else, and sent to an exterinal process, a `rule-based segmentation`.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

exterinal -> external
;)

self.pipeline = pdal.Pipeline(arrays=[las])

if target_las_path and type(target_las_path) == str:
if target_las_path:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Collaborator

@CharlesGaydon CharlesGaydon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All good.
Le workflow CICD ne semble pas s'être lancé, je crois que c'est lié au conflit avec package_metadata qui reste ; une fois qu'il passe tu peux squash and merge :)

@MichelDaab MichelDaab merged commit 7be3359 into main Sep 13, 2022
@CharlesGaydon CharlesGaydon deleted the dev-vegetation branch September 13, 2022 09:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants