La version CUDA de Simple Photogrammetry GUI 1.1.6 pour Linux pèse 1 411 971 576 octets. La version CPU reste au-dessus de 1,38 milliard d’octets, la bêta AMD/HIP monte à 1,44 milliard, et même l’archive Windows approche maintenant 324 Mo.2 Ces chiffres paraissent presque absurdes face au mode d’emploi affiché dans le README : choisir le dossier des photos, choisir le dossier de sortie, cliquer sur une qualité puis attendre textured.obj.1

En réalité, la taille raconte assez bien le projet. Edin Spiegel n’a pas cherché à remplacer COLMAP, OpenMVS, PoissonRecon, mvs-texturing, PyMeshLab ou Brush ; il a accepté qu’ils restent spécialisés, puis il a déplacé vers son application tout ce qui rend leur assemblage pénible pour quelqu’un qui veut seulement reconstruire un objet.1 Les chemins, les dépendances, les formats intermédiaires, le choix GPU, les relances et les logs cessent d’être une recette à suivre manuellement et deviennent une partie du logiciel.

La colle

Le clic sur Start déclenche d’abord une séquence COLMAP : extraction des features, association des images, calibration du graphe de vues puis reconstruction globale. L’exhaustive_matcher est le choix par défaut, mais un matching séquentiel reste disponible dans les réglages.1 COLMAP fournit déjà ces briques en ligne de commande, chacune avec ses paramètres, ses fichiers et ses attentes propres ; le GUI ne les simplifie donc pas en les réécrivant, il les enchaîne dans un ordre connu.3

Une fois les caméras alignées, COLMAP corrige les images et exporte le modèle dans plusieurs représentations. InterfaceCOLMAP fait ensuite passer la scène vers OpenMVS, qui densifie le nuage de points et peut aussi fabriquer le maillage.14 Spiegel a toutefois choisi PoissonRecon comme mesher par défaut : SurfaceTrimmer nettoie ensuite le résultat, un petit utilitaire Python basé sur PyMeshLab réduit le nombre de faces, puis mvs-texturing applique les photographies enregistrées sur la géométrie.156

Le fichier final s’appelle banalement textured.obj. Entre le dossier de photos et ce fichier, le programme aura pourtant manipulé une base COLMAP, une reconstruction sparse, une reconstruction dense, du texte, du NVM, du .mvs et du .ply.1 C’est là que se trouve une bonne partie de sa valeur : aucun de ces formats n’intéresse vraiment la personne qui scanne une pièce mécanique ou une figurine, mais l’étape suivante en dépend.

Petits échecs

La photogrammétrie échoue rarement de manière aussi élégante qu’une exception propre. Une étape peut manquer de mémoire, reconstruire trop peu de caméras, produire un fichier que la suivante ne sait pas ouvrir ou trébucher sur quelque chose d’aussi trivial qu’un nom contenant un espace. La release 1.1.6 corrige justement ce dernier cas : des espaces dans les noms d’images pouvaient faire échouer la densification, alors l’application copie désormais les fichiers et les renomme avant le calcul.2

Ce genre de correction explique mieux le projet qu’un inventaire de features. La reconstruction 3D n’est pas devenue meilleure parce qu’un fichier a changé de nom ; en revanche, une panne que chaque utilisateur devait diagnostiquer devient un comportement connu de l’application.

La densification OpenMVS montre la même logique à une échelle plus intéressante. Selon la qualité choisie, le premier essai utilise une résolution maximale de 2560, 1920 ou 1024 pixels. Si model_dense.mvs n’apparaît pas, le programme relance DensifyPointCloud et ramène la résolution à 70 % de la précédente ; cette boucle prévoit jusqu’à cinq passages avant d’abandonner.1 Sous Windows, les .dmap restés dans le dossier temporaire sont également nettoyés entre les essais.

Le maillage possède sa propre boucle. Avec OpenMVS, le paramètre de décimation augmente progressivement et le programme prévoit jusqu’à dix essais ; avec PoissonRecon, la profondeur dépend du niveau de qualité, avant le trimming et la décimation finale.1 Rien de tout cela ne garantit qu’un mauvais jeu de photos sera sauvé, mais une partie des reprises autrefois manuelles devient reproductible.

C’est une distinction assez nette entre un script personnel et un outil transmissible. Dans le premier cas, la personne qui connaît la chaîne sait quel fichier effacer, quelle option réduire ou quelle commande relancer ; dans le second, ces réflexes doivent être transformés en décisions que le programme peut prendre sans cette mémoire tacite.

Livrer la pile

L’installation est l’autre endroit où cette mémoire tacite disparaît. Sous Windows, l’application vérifie COLMAP, OpenMVS, mvs-texturing, Brush, PoissonRecon, SurfaceTrimmer et plusieurs exécutables auxiliaires ; s’il manque quelque chose, elle propose de récupérer les dépendances et distingue aujourd’hui les paquets CUDA, CPU et AMD.1 Le support AMD/HIP reste explicitement bêta dans la 1.1.6, qui demande d’ailleurs aux utilisateurs Windows ayant déjà installé les dépendances CPU de les télécharger à nouveau.2

Sous Linux, la stratégie consiste plutôt à livrer les dépendances avec l’AppImage. Le dépôt propose aussi des builds Nix CPU et CUDA afin de fixer l’environnement et de placer les exécutables aux emplacements attendus par l’application.1 Cette décision explique beaucoup mieux les 1,4 Go que l’idée d’une interface Flutter mystérieusement énorme : le paquet transporte une grande partie de l’atelier nécessaire pour que le bouton Start fonctionne de la même manière ailleurs.

La version 1.1.6 ajoute en plus un bouton pour re-télécharger cette pile, améliore l’extraction sous Windows et introduit la voie AMD/HIP.2 Ce sont des fonctions d’installateur, mais elles sont directement liées au taux de réussite réel d’un scan : un excellent pipeline dont la moitié des binaires manquent reste un excellent pipeline inutilisable.

Garder les logs

Spiegel n’a pas essayé de masquer toute la plomberie. La fenêtre principale ne demande que les dossiers et la qualité, tandis que les réglages avancés conservent le type de matching, le nombre de threads CPU, le choix OpenMVS ou PoissonRecon, des arguments supplémentaires de meshing et le nombre d’étapes du Gaussian splat.1

Depuis la 1.1.6, stdout et stderr des processus peuvent aussi être affichés dans la fenêtre.12 Le bouton Stop maintient de son côté une liste des programmes lancés et les interrompt ensemble. Pour un logiciel qui cherche à réduire la quantité de commandes visibles, ce choix est sain : le chemin normal reste court, mais l’utilisateur n’est pas enfermé dans une animation de chargement quand quelque chose casse.

Deux chemins

Le début du pipeline sert maintenant à autre chose qu’un maillage OBJ. En basculant vers Gaussian Splatting, l’application garde l’extraction et l’alignement des caméras, puis passe les données à Brush au lieu de poursuivre vers OpenMVS et le texturing ; le réglage par défaut prévoit 30 000 étapes d’entraînement.17

Cette bifurcation confirme le niveau auquel le projet est réellement utile. Spiegel n’a pas construit un moteur 3D universel, il a construit un chemin commun jusqu’au point où plusieurs moteurs peuvent reprendre des photos déjà préparées et des caméras déjà estimées. Hackaday a présenté le projet dans le même esprit, comme un assemblage d’utilitaires existants destiné à rendre la photogrammétrie plus accessible sans obliger chaque nouvel utilisateur à monter la chaîne lui-même.8

On retrouve ce problème dans beaucoup de logiciels open source : les moteurs spécialisés sont parfois excellents longtemps avant qu’il existe un produit agréable autour d’eux. Entre les deux, il faut choisir les versions, convertir les formats, installer les dépendances, faire remonter les erreurs et décider quoi tenter lorsque l’étape 7 n’a pas laissé le fichier que l’étape 8 attend.

Simple Photogrammetry GUI place cette responsabilité dans le logiciel. Les 1,4 Go du bundle en sont presque la mesure physique.