Ce tutoriel présente les différentes étapes permettant de produire des modèles photogrammétriques de fragments statuaires à l’aide de Meshroom. Pour l’exemple, je m’appuie ici sur une captation photographique réalisée en 2019 dans les réserves du Musée archéologique de Delphes, dans le cadre d’une mission de numérisation 3D associant l’École française d’Athènes et l’équipe « Archéologie du monde grec et systèmes d’information » (UMR 7041 ArScAn) dirigée par Ph. Jockey, à laquelle j’ai eu le plaisir de participer.
Utilisateur patenté de Reality Capture, que j’ai utilisé en l’occurrence pour numériser certains éléments de cette collection, je souhaitais disposer d’une alternative pour permettre aux étudiants de produire eux-même les modèles 3D sans dépendre de l’éventuelle disponibilité de licences de logiciels tels que Metashape ou Reality Capture.
Depuis de nombreuses années, je suis donc avec attention l’évolution des différentes solutions photogrammétriques disponibles gratuitement ou en open source, et, en particulier Meshroom, qui semblait particulièrement prometteur. Toutefois, l’absence de fonctionnalités de mise à l’échelle par cible codée dans les versions exécutables précompilées réduisait jusqu’à récemment la pertinence de son utilisation dans le cadre des travaux de l’équipe. La version 2021 offre désormais cette possibilité, et il paraît utile de partager ici la méthode mise en place dans le cadre de ce projet.
Le référentiel géométrique
Initialement, afin d’être en mesure de traiter les captations photographiques sans dépendre d’un logiciel photogrammétrique spécifique, des plateaux tournants « universels » offrant plusieurs systèmes de cibles codées ont été développés et sont constitués des éléments suivants :
- Un cadran périphérique portant l’indication des degrés ;
- Les cibles en arc de cercles pouvant être reconnues par Metashape et par Reality Capture;
- Les cibles carrées de type QR code utilisables par Reality Capture;
- Les cibles en cercles concentriques (
CCTag3
) utilisées par Meshroom. - enfin, des quadrillages numérotés permettent de procéder manuellement aux mises à l’échelle, dans l’éventualité où les trois premiers systèmes ne seraient pas ou plus pris en charge.
Ces quatre systèmes se partagent donc la surface du disque et peuvent être utilisés individuellement ou simultanément, moyennant quelques conversions de coordonnées 2D.
La prise de vue
Pour obtenir une captation complète et homogène de la plupart des fragments, il s’est avéré suffisant de photographier l’objet en le faisant reposer successivement sur au moins deux de ses faces principales, chacune de ces orientations étant documentée par des prises de vue observant des variations angulaires horizontale (rotation de 15° du plateau) et verticale (3 hauteurs/inclinaisons différentes de l’appareil). Au final nous obtenons 6 passes de 24 à 25 photos, soient environ 75 photos par face et 150 pour l’objet complet. Cette quantité tout à fait raisonnable de photos rend possible leur traitement sur un PC disposant d’une configuration matérielle relativement commune, mais étant de préférence équipé d’une carte graphique avec processeur nVidia.
Production d’une scène de référence
La première étape consiste à détecter les cibles codées du plateau pour pouvoir correctement positionner et mettre à l’échelle le modèle. Comme les fragments ont été en grande partie photographiés « recto verso », les deux faces reposent successivement sur le même référentiel. Procéder à la détection des cibles sur l’intégralité des photos n’aurait donc pas de sens et générerait inutilement des erreurs, une même cible pouvant être repérée au moins à deux endroits différents relativement au fragment. Il faut donc choisir de traiter arbitrairement une face, détecter les cibles codées dans la série de photos concernée, leur assigner les coordonnées 3D en x, y, z puis créer une reconstruction partielle de l’objet intégrant les positions des prises de vues déduites et correctement référencées dans l’espace. Ces positions seront conservées et serviront de référence lorsque l’ensemble des photos de l’objet sera traité.
Pour cette étape, nous créons donc, dans le dossier de l’objet, un premier fichier Meshroom et importons les photos prises sur une seule face.
Dans le Graph Editor, nous pouvons supprimer la liaison entre le nœud StructureFromMotion et PrepareDenseScene (clic droit, puis remove
), car nous n’aurons pas besoin de mener le calcul jusqu’à la création du modèle 3D texturé.
Une fois les photos importées et reconnues, il faut impérativement activer, dans les attributs du nœud FeatureExtraction, les cases sift
et cctag3
. Nous souhaitons ici détecter les cibles codées CCTag3
(cercles concentriques) en plus des descripteurs sift
utilisés pour la mise en correspondance des photos. Lorsque l’on se rend sur les autres nœuds en aval, cette case est également cochée par défaut. Il faut absolument s’assurer que cela soit bien le cas.
On peut lancer le calcul du pipeline (bouton start
en haut, ou clic-droit sur le nœud StructureFromMotion, et compute
).
A la fin du calcul, on peut double-cliquer sur le nœud StructureFromMotion; le rendu affichera dans le 3D Viewer le nuage de point contenant les points d’appui ainsi que les positions des prises de vue. L’orientation et l’échelle de ce premier calcul sont complétement empiriques, puisqu’à ce stade le logiciel n’a aucun moyen de connaitre le référentiel géométrique des photos. Dans l’Image Viewer, on peut activer l’affichage des features
extraits des photos (clic sur les trois points à côté de HDR
). Les élements sift
correspondent aux points d’appui; les CCTag3
sont normalement correctement positionnés au centre des cibles cernées.
Mise à l’échelle : SfMTransform
Une fois cette première étape passée, il faut ajouter un nœud SfMTransform à la sortie SfMData
du nœud StructureFromMotion en y connectant l’entrée Input
(clic-droit dans le Graph Editor pour avoir accès à la liste des nœuds, rubrique ‘Utils’).
Dans l’onglet ‘Attributes’ du nœud, préciser les réglages suivants et conserver les autres options par défaut :
champ | valeur |
---|---|
Transformation Method | from_markers |
Landmarks Describer Types | cctag3 (ne pas cocher sift ici!) |
Markers | cliquer sur [+] pour créer autant de cible que nécessaire |
Chaque marker, ou cible, doit être assigné et paramétré en cliquant sur le [+]. Dans notre cas, il y en a huit. Le logiciel ne permet pas à ce jour de leur assigner automatique le bon identifiant, il faut donc le faire manuellement ou en copiant collant les valeurs dans les données du nœud.
Par ailleurs, l’identification des cibles codées a évolué par rapport aux premières versions du logiciel, il faut donc observer un décalage dans la numérotation, la première cible, autrefois appelée 001, est désormais la cible 0, la cible 002 = 1; etc. Ci-dessous le tableau des coordonnées 3D de ces cibles :
ancien nom | ID | X | Y | Z |
---|---|---|---|---|
001 | 0 | -4.3296 | 10.4525 | 0 |
002 | 1 | 3.0615 | 7.391 | 0 |
003 | 2 | 10.4525 | 4.3296 | 0 |
004 | 3 | 7.391 | -3.0615 | 0 |
005 | 4 | 4.3296 | -10.4525 | 0 |
006 | 5 | -3.0615 | -7.391 | 0 |
007 | 6 | -10.4525 | -4.3296 | 0 |
008 | 7 | -7.391 | 3.0615 | 0 |
Par convention, Meshroom utilise un système de coordonnées de type ‘camera’ : les coordonnées horizontales sont données par les axes X et -Z, la hauteur étant donnée par l’axe Y; dans les logiciels d’édition 3D, les coordonnées horizontales en revanche sont données par les axes X et Y, et la hauteur par l’axe Z.
Si l’on adopte les coordonnées fournies dans le tableau ci-dessus, l’assiette donnée par le plateau, l’horizontale, croisera perpendiculairement la grille de l’espace donné par Meshroom.
Ici, pour les besoins de la démonstration, il a été préférable de faire correspondre l’assiette du plateau à la grille de la scène 3D; les coordonnées à saisir donc été adaptées :
champ | valeur |
---|---|
Marker | id = 0 |
Coord x | X = -4.3296 |
Coord y | Z = 0 |
Coord z | -Y = -10.4525 |
Ci-dessous l’extrait de la ligne de commande permettant de définir rapidement les cibles codées, exprimées en centimètre, avec l’orientation de type Meshroom :
--markers 0:-4.3296,0.0,-10.4525 1:3.0615,0.0,-7.391 2:10.4525,0.0,-4.3296 3:7.391,0.0,3.0615 4:4.3296,0.0,10.4525 5:-3.0615,0.0,7.391 6:-10
Ci-dessous, les paramétrages attendus du nœud.
Une fois que ce nœud a été correctement paramétré, il ne reste plus qu’à le faire calculer (clic-droit puis compute
).
Un double-clic permet ensuite d’afficher le résultat dans le 3D Viewer : la reconstruction en nuage de points épars et le positionnement des prises de vue sont bien alignés dans la scène 3D.
Avant de sauvegarder et de refermer ce fichier initial, on prendra soin de copier-coller dans un fichier texte temporaire l’adresse menant aux positions calculées de ces caméras, à trouver dans le champ Output Poses
, se terminant par le fichier cameras.sfm
; ce dernier permettra d’aligner ultérieurement la reconstruction complète de l’objet.
Production de l’objet entier
Une fois la scène de référence obtenue, on peut créer un tout nouveau fichier Meshroom (*.mg) et importer l’intégralité des photos.
Avant de lancer le calcul, il va falloir procéder à quelques ajustements dans le pipeline proposé par défaut lors de la création du fichier.
- dans un premier temps, il faut ajouter un nœud SfMAlignement entre les nœuds StructureFromMotion et PrepareDenseScene;
SfMData
de StructureFromMotion va dansInput
de SfMAlignement ;Output SfMData File
de SfMAlignement va dansSfMData
de PrepareDenseScene ;- Dans les attributes du nœud SfMAlignement, il faut indiquer les paramètres suivants et laisser les autres par défaut
champ | valeur |
---|---|
Reference | coller ici l’adresse précedemment sauvegardée, se terminant par cameras.sfm |
Alignement Method | from_cameras_viewid |
- Dans les attributes du nœud DepthMap, il peut être utile de passer le paramètre
Downscale
à 4 ou 8. Plus la valeur est grande, plus le calcul pourra être rapide, au détriment de la résolution finale. Pour obtenir un résultat finalisé, il faudra par exemple rebasculer le paramètre à 2. - Dans les attributes du nœud MeshFiltering, il faut activer
Keep Only the Largest Mesh
pour supprimer les résidus du plateau, et réduire lesSmoothing Iterations
pour ne pas trop perdre les aspects de surface de la pierre; - Dans les attributes du nœud Texturing, il faudra idéalement mettre le
Texture Downscale
à 1 ou 2 dans la version finale du modèle.
Une fois ces paramétrages réalisés, on pourra lancer un calcul de l’ensemble du pipeline. Il peut être préférable de réaliser un calcul intermédiaire en rompant la liaison entre les nœuds SfMAlignment et PrepareDenseScene, pour s’assurer dans un premier temps que la mise en correspondance de toutes les photos ainsi que la mise à l’échelle de cette nouvelle scène ont fonctionné.
Ci-dessous, les captations des deux faces de l’objet sont bien assemblées, le plateau est bien présent deux fois dans le nuage de point épars et ne semble pas avoir une incidence sur les calculs.
Le pipeline, calculé dans son ensemble, produit au final un maillage texturé. Le fragment statuaire est bien isolé et se trouve détaché des quelques résidus provenant d’éléments du plateau si le paramètre Keep Only the Largest Mesh
du noeud MeshFiltering n’a pas été au préalable activé (ce qui est le cas dans la capture ci-dessous).
Dans cette éventualité, il sera toujours possible d’éditer le fichier final, au format obj (accompagné du fichier mtl et des textures png) à l’aide des outils de Meshlab (sélection du fragment avec l’outil de sélection de composant, inversion de la sélection ,puis suppression des résidus).
Au final, la qualité du maillage et des textures est très satisfaisante, moyennant un temps de calcul relativement long (par rapport à un logiciel comme Reality Capture par exemple) et des fichiers annexes nombreux et volumineux, nécessaire contrepartie de l’architecture ouverte et flexible du logiciel. Il faudrait en revanche pouvoir disposer d’élément de monitoring permettant d’évaluer l’erreur moyenne lors des opérations de mise à l’échelle.
Compte tenu du mode de licence, ce logiciel gagnerait à être déployé sur les grilles de calculs de nos grands équipements institutionnels … reste à voir ce qu’il peut donner sur des captations photographiques bien plus ambitieuses (en milliers de clichés?)…
Liens
En complément, quelques liens :
- La page des tutoriaux dans le manuel officiel du logiciel ;
- Le github de Meshroom, avec notamment les échanges à suivre dans les rubriques « issues » et « discussions » ; Voir notamment la page CCTAG du wiki et cette discussion ;
- La page consacrée à la création des supports avec cibles codées ;
- La page de présentation de la mission de numérisation au musée de Delphes.