Photogrammétrie avec Meshroom

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.

Plateau de prise de vue avec les différents systèmes de cibles
Plateau de prise de vue avec les différents systèmes de cibles

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.

Collection de photos
Collection de photos. Clichés CNRS UMR 7041 ArScAn. Tholos, fragment, Delphes, Musée, inv. 4313, 1 (inédit – EFA/DR). Reproduction interdite.

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).

Meshroom alignment face A
Meshroom alignment face A. Clichés CNRS UMR 7041 ArScAn. Tholos, fragment, Delphes, Musée, inv. 4313, 1 (inédit – EFA/DR). Reproduction interdite.

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 :

champvaleur
Transformation Methodfrom_markers
Landmarks Describer Typescctag3 (ne pas cocher sift ici!)
Markerscliquer 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 nomIDXYZ
0010-4.329610.45250
00213.06157.3910
003210.45254.32960
00437.391-3.06150
00544.3296-10.45250
0065-3.0615-7.3910
0076-10.4525-4.32960
0087-7.3913.06150

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 :

champvaleur
Markerid = 0
Coord xX = -4.3296
Coord yZ = 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.

node SfMTransform
node SfMTransform

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.

Mise à l'echelle de la face A
Mise à l’échelle de la face A. Clichés CNRS UMR 7041 ArScAn. Tholos, fragment, Delphes, Musée, inv. 4313, 1 (inédit – EFA/DR). Reproduction interdite.

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 dans Input de SfMAlignement ;
  • Output SfMData File de SfMAlignement va dans SfMData de PrepareDenseScene ;
  • Dans les attributes du nœud SfMAlignement, il faut indiquer les paramètres suivants et laisser les autres par défaut
champvaleur
Referencecoller ici l’adresse précedemment sauvegardée, se terminant par cameras.sfm
Alignement Methodfrom_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 les Smoothing 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.

SfMAlignement pour l'objet entier
SfMAlignement pour l’objet entier. Clichés CNRS UMR 7041 ArScAn. Tholos, fragment, Delphes, Musée, inv. 4313, 1 (inédit – EFA/DR). Reproduction interdite.

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).

Maillage final
Maillage final. Clichés CNRS UMR 7041 ArScAn. Tholos, fragment, Delphes, Musée, inv. 4313, 1 (inédit – EFA/DR). Reproduction interdite.

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 :