Chapitre 9 — Backends SfM


Le sélecteur de Camera Alignment se trouve dans la section « Cameras & Capture » de l'Inspector et est un menu déroulant, pas un segmented control (les noms des backends sont trop longs pour des segments et feraient déborder la colonne étroite de l'Inspector). Le nombre d'entrées dépend du build : la version App Store en affiche exactement deux — Apple Photogrammetry (par défaut) et Native. COLMAP est totalement absent comme backend et n'apparaît que dans les builds développeur/DMG en tant que troisième entrée (voir Q2). L'entrée native s'appelle simplement « Native » ; la mention précédente « (experimental) » ou « (Beta) » a été retirée — Native n'est plus une voie expérimentale, mais la voie qualité. Il est performant sur les scènes d'orbite au sol et les séries de photos, mais actuellement faible sur le mapping aérien/par drone (nuage de points trop épars) ; Apple Photogrammetry reste le réglage par défaut sûr. Si le type de capture sélectionné est un ensemble de photos non ordonné, l'app aligne toujours avec Native, quel que soit ce qu'affiche le sélecteur — une ligne d'information sous le sélecteur le précise explicitement, et le sélecteur reste utilisable, car sa valeur n'est pas indisponible, seulement outrepassée. Des résultats SfM externes provenant de Metashape, COLMAP ou d'un autre logiciel de photogrammétrie peuvent en plus être importés via le menu Fichier (Q3 format texte COLMAP, Q6 import de workspace) — le sélecteur ne change pas, mais les poses importées remplacent le résultat SfM. Cet import n'a rien à voir avec la question du backend COLMAP et fonctionne dans tous les builds.
SfM signifie Structure from Motion. À partir d'un ensemble de photos qui se chevauchent, le logiciel reconstruit pour chaque image la position et l'orientation de la caméra dans un système de coordonnées 3D commun. On obtient ainsi un nuage de points 3D grossier qui initialise l'entraînement par Gaussian Splatting. Le résultat SfM est l'entrée de l'entraînement proprement dit et détermine largement la qualité d'image ultérieure.
RadianceKit propose cinq voies SfM : deux backends intégrés à l'app (Q1 Apple Photogrammetry, Q4/Q5 Native), deux voies d'import depuis des outils externes (Q3 format texte COLMAP, Q6 import binaire de workspace) ainsi que Q2 COLMAP-Binary, disponible uniquement dans les builds développeur en dehors de l'App Store. Le choix approprié dépend du type de scène (orbite autour d'un objet, intérieur, vol de drone) et du fait qu'un logiciel externe fournisse déjà une reconstruction.
Q1 — Apple Photogrammetry
OÙ
Expert View → Inspector → section « Cameras & Capture » → sélecteur Camera Alignment, entrée « Apple Photogrammetry ». Réglage par défaut dans tous les builds.
TECHNIQUE
Encapsule le framework Photogrammetry intégré d'Apple, développé à l'origine pour Object Capture. Apple extrait en interne des features via un pipeline propriétaire (les étapes ne sont pas documentées publiquement), les vérifie par correspondance multi-vues, et résout l'ajustement de faisceaux (bundle adjustment) sur le Neural Engine + GPU Apple Silicon. Le backend est entièrement conforme App Store (pas de binaire externe, Sandbox=true, on-device), mais ne fournit que les poses de caméra plus un nuage de points grossier — aucune métrique de diagnostic telle que la longueur des tracks ou l'erreur de reprojection. Passe à l'échelle, selon la recommandation d'Apple, jusqu'à quelques centaines d'images. Au-delà d'environ 500 frames dans des vols de drone linéaires ou de grandes scènes en extérieur, des plantages reproductibles ou l'abandon silencieux de certaines caméras ont été observés.
Q3 — Format texte COLMAP (Metashape / ETH3D)
OÙ
Menu « File → Import COLMAP / Metashape Workspace… » (Cmd+⇧+I) OU glisser-déposer un dossier contenant sparse/0/cameras.txt.
TECHNIQUE
Lit l'export texte standardisé de COLMAP — trois fichiers texte cameras.txt, images.txt, points3D.txt dans le sous-dossier sparse/0/ — et les convertit vers le modèle interne de résultat SfM. Même définition de format que l'export binaire de COLMAP, mais en ASCII plutôt qu'en binaire. Produit dans exactement cette disposition par Agisoft Metashape, RealityCapture, PolyCam et le benchmark ETH3D. Le parseur partage la reconnaissance des modèles de caméra avec le parseur binaire et connaît les onze modèles de caméra standard de COLMAP — de SIMPLE_PINHOLE et PINHOLE à SIMPLE_RADIAL (le réglage par défaut de COLMAP lui-même) et OPENCV jusqu'aux variantes fisheye. Robuste face aux lignes de commentaire et aux lignes vides. A passé à l'échelle dans les tests jusqu'à environ 1 400 caméras (ETH3D Tunnel) sans problème.
Q4 — SfM natif (incrémental)
OÙ
Expert View → Inspector → section « Cameras & Capture » → sélecteur Camera Alignment, entrée « Native » (sans la mention précédente « (experimental) »). L'incrémental est le mode par défaut de ce backend ; il n'existe pas de choix de Mapper pour Native. La ligne « Mapper » en dessous appartient exclusivement à COLMAP : dans les builds développeur, elle est visible mais grisée tant que Native est sélectionné, dans la version App Store elle est totalement absente. Les lignes véritablement natives — « FOV Override », « High-Quality » et « Native SfM Recipe » — ne disparaissent plus avec d'autres backends, mais restent affichées en grisé et indiquent, sur une ligne en dessous, ce qu'il faut modifier pour les réactiver. Tu ne peux pas basculer toi-même entre la méthode incrémentale et globale : l'incrémental est réglé par défaut de façon fixe, et l'app ne passe à la méthode globale que d'elle-même (voir Q5).
TECHNIQUE
Implémentation GPU-accélérée maison de tout le pipeline SfM : features FAST+BRIEF OU SuperPoint+LightGlue via CoreML (activé par le bouton « High-Quality » ; de toute façon actif pour les séries de photos non ordonnées), suivi d'un matching Hamming-KNN, d'une matrice fondamentale RANSAC, de la construction de tracks, de la sélection de la paire initiale, d'un bootstrap two-view (F→E plus DLT), d'un mapper incrémental glouton avec enregistrement PnP et triangulation multi-vues, puis d'un ajustement de faisceaux final via Levenberg-Marquardt réduit par Schur avec perte de Huber et jacobiennes analytiques via résolution de Cholesky. Entièrement conforme App Store : aucun binaire externe, Sandbox=true. Avec le détecteur d'effondrement intégré : il classe un résultat comme dégénéré si moins de 60 % des frames d'entrée ont été enregistrées, si le taux de points par caméra tombe sous 13, ou si le nuage de points est presque plat. Cela n'entraîne pas immédiatement le changement de méthode — l'app répète d'abord l'exécution incrémentale (elle retient le premier résultat non suspect, sinon le meilleur des essais) et ne bascule vers le mapper global (Q5) que si même le meilleur essai reste dégénéré. Empiriquement propre sur les scènes d'orbite/plateau tournant ; sur des mouvements plus généraux (vol de drone, intérieurs à géométrie complexe), le taux de réussite est plus faible — mais le détecteur intercepte ces cas. Passe à l'échelle jusqu'à environ 200 caméras de façon fiable, plus haut avec un temps de calcul nettement plus long.
Q5 — SfM natif (global)
OÙ
Est appelé automatiquement quand le mapper incrémental (Q4) déclenche le détecteur d'effondrement (moins de 60 % des frames d'entrée enregistrées, taux de points par caméra sous 13, ou nuage de points presque plat) — et seulement après que l'exécution incrémentale a été répétée et que même le meilleur essai reste dégénéré. On ne peut pas le demander manuellement : l'Inspector ne propose aucun sélecteur pour cela ni aucun autre interrupteur — l'app décide elle-même quand basculer.
TECHNIQUE
Variante globale du pipeline natif. D'abord extraction de features + matching comme en Q4, puis estimation de pose relative pour toutes les paires vérifiées, ensuite moyennage des rotations (rotation averaging, synchronise toutes les rotations de caméra dans le système de coordonnées monde) et moyennage des translations (translation averaging, basé sur LSQR sur une formulation creuse sans matrice, afin d'éviter un dépassement d'entier pour de grands ensembles de caméras). Passe à l'échelle en principe jusqu'à environ 5 000 caméras, mais en pratique la qualité chute sensiblement au-delà de quelques centaines de caméras. Est traité comme un « niveau de secours » : entre en jeu quand le mapper incrémental reste dégénéré même après répétition, et n'est lui-même pas soumis à nouveau au détecteur d'effondrement — si son résultat reste épars, c'est l'avertissement général de qualité du pipeline qui se déclenche à la place.
Q6 — Import de workspace Metashape / texte COLMAP
OÙ
Menu Fichier → « Import COLMAP / Metashape Workspace… » (Cmd+⇧+I). Glisser-déposer un dossier contenant sparse/0/cameras.{bin,txt} et images/.
TECHNIQUE
Détecte automatiquement si un dossier sélectionné par glisser-déposer ou par le panneau d'ouverture correspond à l'une des trois dispositions de workspace COLMAP (sparse/0/, sparse/, ou racine) et si la reconstruction est binaire (cameras.bin) ou en texte (cameras.txt). La voie binaire utilise le parseur binaire COLMAP, la voie texte le loader ETH3D — les deux produisent le même modèle de résultat SfM et le reste du pipeline (importer les images, démarrer l'entraînement MCMC) est agnostique vis-à-vis de la source. Les images sont ouvertes via le système de bookmarks security-scoped de la sandbox de l'app, de sorte que l'import fonctionne aussi dans la version App Store. Conçu spécialement pour le cas « export Metashape sans recalculer la reconstruction ». La détection mentionnée dans l'entrée du menu Fichier avertit dans le journal de l'app si le dossier choisi n'est pas un workspace reconnaissable.
Q7 — Recettes natives (Standard / Professional / E3 High-Accuracy)
OÙ
Expert View → Inspector → section « Cameras & Capture » → ligne « Native SfM Recipe ». Cette ligne n'est utilisable que si « Native » est choisi comme Camera Alignment et qu'un ensemble de photos non ordonné est réglé comme type de capture — sinon elle apparaît grisée et indique en dessous ce qu'il faut modifier (les règles de disponibilité figurent au chapitre 2).
TECHNIQUE
Trois niveaux du même backend natif. Ils ne modifient pas l'algorithme, mais son degré de minutie :
Standard — la recette de base sans étapes supplémentaires.
Professional — ajoute deux choses : les marqueurs AprilTag détectés entrent comme corps rigides dans le mapping et l'ajustement de faisceaux, et les poses finales font l'objet d'une re-triangulation dense (nuage de points de départ plus dense). Si la prise ne contient aucun marqueur, le détecteur ne trouve rien et seule la re-triangulation dense reste effective.
E3 High-Accuracy — s'appuie sur Professional et active en plus le frontend HQ (tuilage SuperPoint 3×3, LightGlue avec 4096 keypoints, paires de covisibilité) ainsi que le raffinement conjoint de la focale sur toutes les caméras. Cela donne les poses de caméra les plus précises et le temps de matching le plus long.
Quel backend utiliser, et quand ?
| Scénario | Backend recommandé |
|---|---|
| Premier résultat, sans se poser de questions | Q1 Apple Photogrammetry (préréglage par défaut) |
| Scan d'objet, 50–200 photos | Q1 Apple Photogrammetry |
| Qualité maximale sur la même scène | Préréglage « Maximum Quality (Native) » — Q4 Native + recette Q7 E3 |
| Prise de vue avec marqueurs AprilTag imprimés | Q4 Native + recette Q7 Professional |
| Extérieur de grande taille / drone / >500 images | Import Workspace Q6 (calculer dans Metashape ou COLMAP, puis importer) |
| Export Metashape/RealityCapture disponible | Import Q6 (SfM non nécessaire) |
| ETH3D / jeu de données académique au format texte COLMAP | Import texte COLMAP Q3 |
| Q4 s'effondre | Q5 Native global (bascule automatiquement) |
Comparaison rapide
| Backend | App Store | Sandbox | Binaire externe | Meilleur usage | Max ~caméras |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Objet en orbite | ~300 |
| Q2 Binaire COLMAP | ❌ (build développeur uniquement) | — | colmap/glomap | Extérieur (large) | ~5 000 |
| Q3 Import texte COLMAP | ✅ | ✅ | — | Bancs multi-caméras | ~1 500 |
| Q4 Natif incrémental | ✅ | ✅ | — | Objet en orbite | ~200 |
| Q5 Natif global | ✅ | ✅ | — | Repli Q4 | ~5 000 |
| Q6 Import Workspace | ✅ | ✅ | — | Réutilisation Metashape | par source |