Le sujet de la segmentation sémantique 3D, comme on l’a vu dans un précédent article, est de plus en plus riche à mesure que de nouveaux modèles viennent enrichir l’état de l’art scientifique.
L’enjeu pour le projet IASBIM était l’exploitation de l’un de ces modèles pour produire des nuages de points sémantisés, i.e. dont les points sont affectés à une classe au sein d’une nomenclature dépendant de la nature du problème traité. Par exemple, dans un environnement indoor, il s’agira de reconnaître dans une pièce d’un bâtiment respectivement le sol, le plafond, les murs, les fenêtres, les portes, … De cette façon, chaque point se voit attribuer un code couleur en fonction de sa classe, ce qui rend possible l’interprétation visuelle du nuage de points.
Le modèle KPConv
Notre choix pour IASBIM s’est porté sur le modèle KPConv, qui s’est avéré être un excellent compromis entre performance et facilité de prise en main. En guise de bonus, la disponibilité d’une implémentation (KPConv-PyTorch) de la méthode par les auteurs de l’article de recherche (Hugues Thomas en tête) constituait un point de départ de grande valeur pour le projet IASBIM.
Cet algorithme permet de se replacer dans une optique de convolution, particulièrement pertinente dans le cas de la segmentation sémantique 2D. Pour rappel, ce mécanisme de convolution revient à scanner une matrice donnée avec un noyau de convolution, lui-même représenté par une (ou plusieurs) matrices. Dans les algorithmes convolutionnels, les éléments du noyau de convolution sont des paramètres qui doivent être optimisés durant le processus d’apprentissage.
L’algorithme KPConv démontre ainsi que les convolutions peuvent aussi tout à fait s’appliquer aux nuages de points, côté 3D. Le noyau de convolution est ainsi défini comme un mini-nuage de points combiné localement avec les points dans le voisinage considéré.
kpconv_torch
Comme évoqué dans la section précédente, une implémentation de KPConv a été développé par Hugues Thomas et est toujours disponible sur Github.
Dans le cadre de IASBIM, nous avons développé notre propre fork de cette bibliothèque Python, de manière à produire des résultats dans le cadre du projet, avec un objectif plus long terme de reversement des contributions au dépôt initial.
Voici les principales fonctionnalités que nous avons ajoutées au code existant :
-
La réorganisation du code existant en une bibliothèque Python plus traditionnelle, avec un répertoire principal pour le code source, et un fichier
setup.py
pour l’installation du projet. Par ailleurs, la procédure d’installation a été simplifiée, avec l’intégration du code compilé dans la procédure couverte par lesetup.py
. -
La mise en place d’une Interface en Ligne de Commande (ou CLI), pour exploiter les différentes fonctionnalités offertes par la bibliothèque Python, et la clarification en parallèle de l’API haut-niveau, pour permettre les réutilisations externes. Il est ainsi possible désormais de procéder à un entraînement ou à une inférence depuis un terminal, ou depuis une autre application Python. L’API est ainsi exploitable dans une chaîne de traitement plus large, telle que celle imaginée pour le projet IASBIM. Les trois principales commandes fournies par
kpconv_torch
seront détaillées dans la section suivante. -
Le support des fichiers tiers, indépendants du jeu de données d’entrée ayant servi à l’entraînement du modèle de segmentation, pour l’exécution de la commande d’inférence. Cette fonctionnalité essentielle permet ainsi de confronter un nuage de points produit par ailleurs avec un modèle de segmentation.
-
Le support des formats
.xyz
et.las/.laz
en plus des fichiers.ply
. -
L’exécution des fonctions d’entraînement et d’inférence sur un CPU, alors que le projet initial ne s’exécute que sur un GPU. Cette fonctionnalité n’est pas intéressante en soi pour un utilisateur lambda (le temps de calcul sur CPU pour de telles applications est incompatible avec une exploitation en production). Cependant, cela a ouvert la voie à la mise en place de tests fonctionnels dans le projet. Ces tests garantissent la stabilité de la bibliothèque, et permettent de poursuivre le développement plus sereinement en termes de qualité logicielle.
-
L’écriture des résultats du processus d’inférence par lots de points sur le disque, modification critique permettant de supporter des nuages de points plus gros (en espace disque, et plus prosaïquement en nombre de points), et donc, des scènes plus complexes. Auparavant, les points étaient stockés dans la mémoire, jusqu’à la construction complète du nuage de points résultat. Dans l’exemple du jeu de données S3DIS comportant 13 classes sémantiques, la probabilité d’appartenance d’un point à une classe sémantique étant stockée sur 4 octets, un nuage de 200 millions de points correspond à près de 10Go sur la RAM…
-
La possibilité de générer en sortie du traitement d’inférence un nuage de points colorisé en fonction de la classe sémantique : au lieu de retourner un identifiant pour chaque classe, on renvoit le triplet RGB correspondant dans la nomenclature du jeu de données. Cela permet de visualiser plus rapidement les résultats de traitement, et de pouvoir comparer facilement des résultats deux-à-deux.
En outre, un gros effort de réécriture du code a été effectué, pour clarifier le code source. Cet effort s’est accompagné d’un outillage progressif de la bibliothèque avec des outils de vérification syntaxique du code, et la mise en place d’une chaîne d’intégration continue sur la forge Github du projet.
Zoom sur la CLI de kpconv_torch
Trois commandes en particulier ont retenu notre attention : le prétraitement des données d’entrée, l’entraînement d’un modèle de segmentation et l’inférence à partir d’un nuage de point tiers.
Pré-traitement
La bibliothèque kpconv_torch
supportait nativement quelques jeux de données de l’état de l’art
3D.
Cela dit, quel que soit le jeu de donnée considéré en entrée, un travail important de standardisation du format, et de préparation de la donnée est nécessaire préalablement à la confrontation avec le modèle de segmentation. En effet, chaque jeu de donnée est produit dans un format qui lui est spécifique, et l’enjeu, comme dans tout bon projet de data science qui se respecte, est de traduire cette information dans un format compréhensible par le modèle.
Ici, deux principaux éléments sont attendus, pour chaque nuage de points dans le jeu de données :
- Un fichier au format
.PLY
qui contient les données du nuage de points (position et couleur, a minima). - Un fichier
.pkl
qui contient la structuration géométrique du nuage de points résultant d’un calcul de KDTree.
Parmi les différents jeux de données supportés par la bibliothèque Python, nous nous sommes focalisés sur S3DIS, un jeu de données consacré à la modélisation 3D indoor, qui correspondait le plus au cas d’usage porté par IASBIM. Cette bibliothèque propose dans sa version brute :
- des fichiers
.txt
contenant les coordonnées et les couleurs des points, par nuage et par pièce - la même information dupliquées dans d’autres fichiers
.txt
organisés par classe sémantique, pour chaque nuage et pièce
Le processus de prétraitement doit donc reconstruire les différents nuages de points du jeu de données, en attribuant à chaque point l’identifiant qui correspond à sa classe sémantique à partir de l’organisation du répertoire de donnée brute, et procéder au calcul d’un KDTree.
Cette opération de pré-traitement était incluse dans les étapes d’entraînement et d’inférence dans la version initiale du logiciel. Par souci de clarté, c’est désormais un point d’entrée à part entière de la bibliothèque :
kpconv preprocess -s S3DIS -d /chemin/vers/la/donnée/S3DIS/brute
Entraînement
Le coeur du programme KPConv est la fonctionnalité d’entraînement des modèles de segmentation sémantique 3D. C’est à ce stade que le modèle KPConv entre en scène. C’est aussi l’étape sur laquelle nous sommes le moins intervenu dans le cadre du projet IASBIM.
En exploitant les nuages de points au format .PLY
et les KDTree produits durant le
prétraitement, puis en exploitant les propriétés géométriques des voisinages de points, les
premières couches d’un réseau de neurones convolutifs sont initialisées. Un processus
d’apprentissage profond est ensuite mis en route, jusqu’à faire converger une métrique calquée sur
l’indice de Jaccard, i.e. un ratio qui, pour un
jeu de données de validation, compare la population des points bien classés par le modèle et la
population totale des points. Le modèle est ainsi d’autant plus qualitatif que cet indice converge
vers 1.
Cette étape d’entraînement, déjà particulièrement chronophage dans le cas de l’imagerie 2D, représente a minima plusieurs heures (voire plusieurs jours) sur une machine équipée d’une carte graphique, et donc, peut difficilement être intégrée dans un processus de traitement en temps réel. Pour autant, une fois entraîné, le modèle peut-être réutilisé à l’envi, et l’entraînement poursuivi en cas de nouvelles données.
Dans kpconv_torch
, l’entraînement s’effectue à l’aide d’une simple commande dans le terminal :
kpconv train -s S3DIS -d /chemin/vers/la/donnée/S3DIS/brute -o /chemin/de/sauvegarde/du/modèle
Inférence
Le processus d’inférence est sans doute l’opération que les utilisateurs de la bibliothèque seront amenés à faire le plus souvent. C’est, en contraste avec l’entraînement, la partie de la bibliothèque qui a nécessité le plus d’effort pendant IASBIM.
En l’état, au démarrage d’IASBIM, la bibliothèque kpconv_torch
était incapable de considérer des
nuages de points tiers, inconnus du jeu de données initial, et seules les opérations d’inférence
sur des nuages de points inclus dans ces jeux de données était possibles. Cependant, l’intérêt de
ce type de bibliothèque réside justement dans le fait de tester un modèle de segmentation
sémantique sur une donnée inconnue, pour la caractériser sémantiquement, point par point. Nous nous
sommes donc attelés aux changements nécessaires pour étendre l’usage de l’outil.
Par ailleurs, un travail sur la gestion de la RAM a également été effectué, pour garantir la bonne marche de l’inférence sur des très gros nuages de points (à partir d’une centaine de millions de points) : écrire de tels nuages de points sur le disque ne peut résolument pas se faire d’une traite, compte tenu de la RAM disponible sur des postes de travail standard.
À propos de performance, mais sur le plan du temps de calcul, refaisons un rapprochement avec les modèles de segmentation sémantique 2D, pour lesquels l’opération d’inférence est généralement instantanée ou quasiment instantanée. La segmentation sémantique 3D, a minima avec KPConv, a ceci de particulier qu’elle représente également des temps de traitement importants, qui rendent également complexe son intégration dans des process temps-réel (jusqu’à quelques heures pour un nuage de points de plusieurs Go, et des centaines de millions de points). Nous n’avons pas traité ce point dans le cadre de IASBIM, mais il constitue un axe de travail prometteur pour de futurs efforts de R&D ; des initiatives existent par ailleurs dans la communauté de recherche sur ce plan (voir par exemple https://www.youtube.com/watch?v=vW9DJcFEhz8).
L’opération d’inférence avec kpconv_torch
peut s’effectuer avec la commande suivante :
kpconv test -s S3DIS -d /chemin/vers/la/donnée/S3DIS/brute -l /chemin/de/sauvegarde/du/modèle
En résumé
Les fonctionnalités présentées ici sont les fonctionnalités élémentaires de kpconv_torch
. Une
documentation de chacune de ces commandes est disponible sur le dépôt Github du
projet, n’hésitez pas à aller la consulter pour aller
plus loin, à contribuer à ce projet, ou à même directement au dépôt originel
KPConv-PyTorch.
Comment exploiter cette bibliothèque dans le contexte d’IASBIM ?
Nous illustrerons dans un prochain article la mise en pratique concrète de cette bibliothèque Python, et plus largement de la segmentation sémantique 3D, pour IASBIM. En particulier, des résultats de segmentation sémantique sur des données exploitées dans le contexte BIM illustreront ce que peut apporter cette brique technologique aux métiers du BIM.