Générer un maillage 3D à partir d’une image avec Python

ggénérer un maillage 3D à partir d’une seule image 2D semblait une tâche très difficile il y a quelques années. De nos jours, grâce aux progrès du Deep Learning, plusieurs modèles monoculaires d’estimation de la profondeur ont été développés et peuvent fournir une carte de profondeur précise à partir de n’importe quelle image. Grâce à cette carte, il est possible de générer un maillage en effectuant une reconstruction de surface.

Introduction

L’estimation de la profondeur monoculaire consiste à estimer la valeur de la profondeur (distance par rapport à la caméra) de chaque pixel pour une seule image RVB. La sortie d’un modèle d’estimation de profondeur monoculaire est une carte de profondeur , qui est essentiellement une matrice, où chaque élément correspond à la profondeur prédite du pixel associé dans l’image d’entrée.

Une carte de profondeur. Image de l’auteur.

Les points d’une carte de profondeur peuvent être considérés comme un ensemble de points avec des coordonnées sur 3 axes. Comme la carte est une matrice, chaque élément a des composants x et y (sa colonne et sa ligne). Alors que la composante z est sa valeur stockée, qui est la profondeur prévue au point (x, y) . Dans le domaine du traitement de données 3D, une liste de points (x, y, z) est appelée un nuage de points .

Un nuage de points. Fichier original par Open3D .

A partir d’un nuage de points non structuré il est possible d’obtenir un maillage . Un maillage est une représentation d’objet 3D constituée d’un ensemble de sommets et de polygones Le type de maillage le plus courant est le maillage triangulaire , qui comprend un ensemble de triangles tridimensionnels reliés par leurs arêtes ou sommets communs. Dans la littérature, il existe quelques méthodes pour obtenir un maillage triangulaire à partir d’un nuage de points et les plus populaires sont la forme Alpha¹, le pivotement de boule² et la reconstruction de surface de Poisson³. Ces méthodes sont connues sous le nom d’ algorithmes de reconstruction de surface .

Un maillage triangulaire. Fichier original par Open3D .

La procédure utilisée dans ce guide pour générer un maillage à partir d’une image est composée de trois phases :

  1. Estimation de profondeur — la carte de profondeur de l’image d’entrée est générée à l’aide d’un modèle d’estimation de profondeur monoculaire.
  2. Construction du nuage de points — la carte de profondeur est convertie en un nuage de points.
  3. Génération de maillage — à partir du nuage de points, un maillage est généré à l’aide d’un algorithme de reconstruction de surface.

Pour suivre les différentes étapes de la procédure illustrée dans le guide vous avez besoin d’une image. Si vous n’en avez pas sous la main, vous pouvez télécharger celui-ci :

Une chambre. Image de NYU-Depth V2 .

1. Estimation de la profondeur

Le modèle d’estimation de profondeur monoculaire choisi pour ce guide est GLPN⁴. Il est disponible sur le Hugging Face Model Hub . Les modèles peuvent être récupérés à partir de ce hub en utilisant la bibliothèque Hugging Face Transformers .

Pour installer la dernière version de Transformers à partir de PyPI, utilisez :

pip installer des transformateurs

Le code ci-dessus est utilisé pour estimer la profondeur d’une image d’entrée :

Pour utiliser GLPN, la bibliothèque Transformers fournit deux classes : GLPNFeatureExtractor , utilisée pour prétraiter chaque entrée et GLPNForDepthEstimation, c’est-à-dire la classe modèle.

En raison de son architecture, la taille de sortie du modèle est :

Taille de sortie. Image générée à l’aide de CodeCogs .

Ainsi, imageest redimensionné pour obtenir à la fois la hauteur et la largeur des nombres multiples de 32. Sinon, la sortie du modèle sera plus petite que l’entrée. Ceci est nécessaire car le nuage de points sera peint en utilisant les pixels de l’image et pour ce faire, l’image d’entrée et la carte de profondeur de sortie doivent avoir la même taille.

Alors que les modèles d’estimation de la profondeur monoculaire ont du mal à obtenir des prédictions de haute qualité près des frontières, outputest recadrée au centre (ligne 33). Pour conserver les mêmes dimensions entre l’entrée et la sortie, imageil est également recadré au centre (ligne 34).

Voici quelques prédictions :

Prédiction de la profondeur d’une chambre. Image d’entrée de NYU-Depth V2 .
Prédiction de la profondeur d’une salle de jeux. Image d’entrée de NYU-Depth V2 .
Prédiction de la profondeur d’un bureau. Image d’entrée de NYU-Depth V2 .

2. Construction du nuage de points

Pour la partie traitement 3D de ce guide, Open3D sera utilisé. C’est probablement la meilleure bibliothèque Python pour ce genre de tâche.

Pour installer la dernière version d’Open3D à partir de PyPI, utilisez :

pip installer open3d

Le code suivant convertit la carte de profondeur estimée en un objet nuage de points Open3D :

Une image RGBD est simplement une combinaison d’une image RGB et de son image de profondeur correspondante. La classe PinholeCameraIntrinsic stocke ce que l’on appelle la matrice de caméra intrinsèque. Grâce à cette matrice, Open3D peut créer un nuage de points à partir d’une image RGBD avec l’espacement correct entre les points. Gardez les paramètres intrinsèques tels quels. Pour plus de détails, consultez les ressources supplémentaires à la fin du guide.

Pour visualiser le nuage de points, utilisez :

o3d.visualization.draw_geometries([pcd])

3. Génération de maillage

Parmi les différentes méthodes disponibles dans la littérature pour cette tâche, le guide utilise l’algorithme de reconstruction de surface de Poisson³. Cette méthode a été choisie car c’est celle qui donne généralement les meilleurs résultats et les plus fluides.

Ce code génère le maillage à partir du nuage de points obtenu à la dernière étape en utilisant l’algorithme de Poisson :

Tout d’abord, le code effectue la suppression des valeurs aberrantes du nuage de points. Un nuage de points peut contenir du bruit et des artefacts dus à diverses causes. Dans ce scénario, le modèle aurait pu prédire des profondeurs qui varient trop par rapport à ses voisins.

L’étape suivante est l’estimation normale. Une normale est un vecteur (donc avec une grandeur et une direction) perpendiculaire à une surface ou à un objet et pour traiter l’algorithme de Poisson il faut les estimer. Pour plus de détails sur ces vecteurs, consultez les ressources supplémentaires à la fin du guide.

Enfin, l’algorithme est exécuté. depthLa valeur définit le niveau de détail du maillage. Une valeur de profondeur plus élevée en plus d’augmenter la qualité du maillage augmente également les dimensions de sortie.

Si vous préférez visualiser le maillage à l’aide d’un programme, je vous conseille de télécharger MeshLab car certains programmes de visualisation 3D ne peuvent pas restituer les couleurs.

Voici le résultat final :

Le maillage généré. Image de l’auteur.
Le maillage généré (sous un autre angle). Image de l’auteur.

Comme le résultat final change en fonction de depthla valeur, il s’agit d’une comparaison entre différentes valeurs :

Comparaison entre différentes valeurs de profondeur. Image de l’auteur.

L’algorithme utilisant depth=5a conduit à un maillage de 375 Ko, depth=6à 1,2 Mo, depth=7à 5 Mo, depth=8à 19 Mo, depth=9à 70 Mo, et en utilisant depth=10à 86 Mo.

Conclusion

Malgré l’utilisation d’une seule image, le résultat est plutôt bon. Avec l’aide de certains montages 3D, vous pouvez obtenir des résultats encore meilleurs. Comme ce guide ne peut couvrir complètement tous les détails du traitement des données 3D, je vous conseille de lire les autres ressources ci-dessous pour mieux comprendre tous les aspects impliqués.

Leave a Reply

Your email address will not be published. Required fields are marked *