La photogrammétrie est une technique de modélisation 3D où l'on aggrège des photos pour reconstituer une scène. Pour une prochaine animation, nous nous sommes essayés à plusieurs procédés. En voici quelques-uns, que vous pouvez essayer !

Avertissement. Les techniques présentées nécessitent un ordinateur assez puissant pour fonctionner. Il se peut que cela ne fonctionne pas sur toutes les machines. Pour augmenter vos chances, il convient d'utiliser un ordinateur doté d'une carte graphique récente. Toutes les cartes graphiques ne sont pas supportées. Voir plus de détails pour 3DF Zephyr et pour NeRF.

L'idée derrière tout ça

Il faut beaucoup de temps aux artistes 3D pour reconstituer fidèlement une scène en trois dimensions par le biais d'outils traditionnels comme Blender, ou Tinkercad pour nos ateliers impression 3D. La photogrammétrie permet d'obtenir un résultat (relativement) correct (relativement) rapidement. Pour cela, on commence par photographier une scène (un objet, une façade, ...) sous tous les angles. On passe ensuite les photos dans un logiciel qui les convertit automatiquement en un modèle 3D. La précision et la vitesse vont beaucoup dépendre de la qualité des prises de vue et de la puissance de l'ordinateur.

Car il s'agit bien de cela : l'ordinateur va devoir effectuer beaucoup de calculs. Tout d'abord, les images sont comparées les unes aux autres, pour pouvoir identifier des points clés qui apparaissent dans plusieurs clichés et serviront de repères. Avec, l'ordinateur calcule précisémment d'où ces photos ont été prises, en exploitant des propriétés géométriques. Enfin, et c'est là le cœur de l'opération, la scène est entièrement modélisée en calculant la profondeur de tous les éléments visibles dans les photos, à l'aide du parallaxe.

Le parallaxe est un phénomène très courant pour nous humains. Nos deux yeux ne voient pas exactement la même image car ils sont un peu décalés. Faites l'expérience :

  1. fermez un œil ;
  2. placez vos index devant votre visage, légèrement espacés l'un de l'autre, dans l'alignement de votre œil ;
  3. ouvrez l'autre œil et refermez le premier, vos doigts ne sont plus alignés, ils sont un peu décalés ;
  4. alignez de nouveau vos doigts avec l'œil, mais espacez-les beaucoup (gardez un index près du visage et l'autre bras tendu) ;
  5. inversez encore une fois vos yeux : les doigts sont encore décalés, mais cette fois-ci, la distance qui les sépare est beaucoup plus importante.

De façon plus générale, si deux objets sont proches, leur position ne changera pas beaucoup entre les images des deux yeux. Mais s'ils sont éloignés, leur position variera beaucoup. Ainsi, il est possible de calculer, à partir de la différence de position entre chaque image, la profondeur relative entre les deux objets. Mathématiquement, ce n'est pas trop complexe, car ne repose « que » sur le théorème de Thalès.

L'ordinateur utilise donc ce principe pour reconstituer la scène. En prenant deux photos d'un même objet sous deux angles légèrement différents, il détermine la profondeur relative de cet objet, et peut alors le placer dans une scène en trois dimensions. Une fois tous les objets correctements placés, une derrière étape vient ajouter les textures, en projetant les différentes photos sur ces volumes.

Premier essai

Il existe beaucoup de logiciels différents pour faire de la photogrammétrie. Nous avons essayé Meshroom et 3DF Zephyr, deux logiciels gratuits (Zephyr propose un abonnement payant optionnel pour plus de fonctionnalités). Les deux fonctionnent assez bien, mais l'interface de Zephyr et plus accessible, et accessoirement, traduite en français. Nous l'utiliserons donc pour cet exemple.

Nous commençons par choisir un sujet. Afin d'augmenter nos chances de réussite, il vaut mieux choisir une forme assez simple, uniformément et bien éclairée, autour de laquelle on peut facilement prendre des photos sous plusieurs angles. Nous optons pour deux bacs à fleurs, devant sur le parvis de la médiathèque. On en fait le tour facilement. Par beau temps l'éclairage est tout à fait convenable. Nous prenons donc une quarantaine de photos avec un téléphone, en faisant le tour des bacs, en essayant de garder un chevauchement de 70-80% entre chaque photo.

Gallerie de photos de bacs à fleurs
Quelques-unes des photos de bacs à fleurs

Nous démarrons Zephyr, et nous faisons glisser toutes les photos dedans. Une fenêtre de dialogue nous guide pour la calibration automatique des images et le choix de certains paramètres. Nous laissons les paramètres par défaut, qui sont assez généraux pour nous convenir, et démarrons le calcul de l'orientation des images. Une fois terminé, un nuage de points épars s'affiche au centre de la scène, ainsi que les positions supposées des caméras.

Nuage de points épars et positions des prises de vue
Points clés (en blanc) et positions calculées des prises de vue (en bleu)

Nous pouvons passer en revue ces positions, et éliminer les photos où l'orientation automatique a visiblement échouée. Ce petit nettoyage effectué, nous lançons la deuxième étape (depuis le menu « Méthode de travail »), la génération du modèle 3D. C'est cette étape qui utilise la technique du parallaxe pour ses calculs.

Modèle 3D
Résultat de la génération du modèle 3D

Le résultat est d'ores et déjà probant. Les deux bacs ont bien été reconstitués. Cepedant, tout ce qui se trouve autour des bacs apparaît très déformé. C'est tout à fait normal, puisque ces éléments n'apparaissent que sur peu de photos. Nous pouvons enfin lancer la dernière étape, le calcul des textures.

Résultat après le calcul des textures
Résultat après le calcul des textures

Avant d'exporter, nous utilisons les outils d'édition pour supprimer tous les éléments inutiles autour des bacs.

Suppression des éléments parasites avec l'outil d'édition

Voilà, nous pouvons désormais exporter notre objet, dans un des formats couramment utilisé pour les objets 3D (comme PLY ou OBJ). Voici ce que cela donne, à l'aide de l'outil d'animation de Zephyr :

Animation du rendu texturé

Cet objet 3D peut être retravaillé à l'aide d'autres logiciels comme MeshLab ou AccuTrans 3D (que nous avions utilisé lors de la création d'une réplique de la Chaîne des Puys) pour en faire un objet 3D imprimable classique. Il faut utiliser un outil d'extrusion, pour remplir la surface générée par Zephyr. Voici ce que cela peut donner.

Avec l'intelligence artificielle

Jusque là, nous n'avons exploré que la méthode traditionnelle, très géométrique, de la photogrammétrie. Depuis quelques temps déjà, il existe des algorithmes assez différents, qui utilisent des mécanismes d'apprentissage automatique (ou machine learning en anglais, nom plus technique que le publicitaire « intelligence artificielle »). Un modèle apprend à recréer les images qu'on lui donne en trouvant le bon modèle 3D. C'est un peu une approche en sens inverse.

Le plus connu de ces modèles est NeRF, développé Nvidia, société notamment connue pour ses cartes graphiques. Le modèle est utilisable gratuitement, de nombreux utilisateurs s'y sont donc essayés. Vous pouvez trouver nombre de ces réalisations sur le subreddit r/photogrammetry.

Nous aussi avons voulu essayer, à l'aide de l'interface instant-ngp, qui permet d'utiliser NeRF relativement facilement. D'ailleurs, au lieu de lui donner des photos, on peut lui donner une vidéo où la caméra tourne autour d'un objet. Encore une fois, nous utilisons un téléphone pour filmer une courte vidéo autour de notre imprimante 3D.

Vidéo donnée en entrée à NeRF

Nous passons ensuite la vidéo à NeRF. C'est un peu plus technique. Voici tout de même quelques instructions, extraites de la documentation de instant-npg :

  1. Placer la vidéo imprimante3d.mp4 dans un dossier
  2. Ouvrir le terminal dans ce dossier
  3. Exécuter la commande suivante :
    python [chemin-vers-instant-ngp]/scripts/colmap2nerf.py --video_in imprimante3d.mp4 --video_fps 2 --run_colmap --aabb_scale 32

    Cela extrait un certain nombre d'images de la vidéo, les place dans un dossier images, et exécute une première analyse de l'orientation de ces images, sauvegardée dans le fichier transform.json

  4. Exécuter instant-ngp, et glisser-déposer le dossier racine (qui contient la vidéo, le dossier images et le fichier transform.json)
  5. Attendre. Le modèle va commencer à s'entraîner en générant le modèle petit à petit. Au début, l'ordinateur peut sembler bloquer pendant quelques secondes, car la charge de calculs est très importante. Il est possible de réduire cette charge en augmentant les Target FPS au niveau du paramètre Dynamic resolution. Si au bout de quelques minutes, le résultat ne semble pas probant, recommencer avec une autre vidéo.

Si tout se passe bien, le modèle 3D de la scène commence à émerger. On peut alors se promener dedans, et même réaliser une petite animation à l'aide de l'outil de caméra. Voici le résultat :

Animation du rendu 3D de l'imprimante 3D par NeRF

L'aspect nuageux est un artéfact assez commun de NeRF, qui ajoute un effet étrangement intéressant au rendu final. Notez également que le caractère réfléchissant du plateau de l'imprimante est bien conservé.

La photogrammétrie en archéologie

La photogrammétrie possède de nombreuses applications, notamment en archéologie, car elle permet de reproduire fidèlement des sites entiers sans avoir à modéliser manuellement tous les détails.

Cette technique a notamment été utilisée pour reconstituer la grotte Chauvet en Ardèche et en créer une réplique pour en permettre des visites publiques. Le modèle 3D a également été réutilisé pour un jeu vidéo basé sur la réalité virtuelle, The Dawn of Art.

Miniature de la vidéo YouTube présentant un modèle 3D de la grotte Chauvet
The Dawn of Art 360 VR French - Photogrammétrie par Google Arts & Culture

Elle a également été utilisée dans la grotte de Bruniquel dans le Tarn-et-Garonne, pour reconstituer des lieux de vie de l'homme de Néandertal.

Miniature de la vidéo YouTube présentant un modèle 3D de la grotte de Bruniquel
Grotte de Bruniquel - Modèle 3D - Photogrammétrie par Archeovision

Pour en apprendre plus, vous pouvez venir à notre atelier de découverte le samedi 24 juin, dans le cadre de l'exposition Néandertal !

Article précédent Article suivant