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.

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 .

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 .

La procédure utilisée dans ce guide pour générer un maillage à partir d’une image est composée de trois phases :
- 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.
- Construction du nuage de points — la carte de profondeur est convertie en un nuage de points.
- 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 :

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 :

Ainsi, image
est 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, output
est recadrée au centre (ligne 33). Pour conserver les mêmes dimensions entre l’entrée et la sortie, image
il est également recadré au centre (ligne 34).
Voici quelques prédictions :



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é. depth
La 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 :


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

L’algorithme utilisant depth=5
a 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.