Hoofdstuk 9 — SfM-Backends


De Camera-Alignment-keuze in de Inspector is een segmented control met twee opties — Apple Photogrammetry (standaard voor App-Store-builds, volledig sandbox-conform) en Native (Beta) (RadianceKit's eigen FAST+BRIEF+GLOMAP-pipeline-backend, ontwikkeld in fase 3.8/3.9, stand 2026-05). Native (Beta) is alleen voor orbit-opnames gevalideerd en sneller bij ≥1.000 frames dan Apple Photogrammetry, maar haalt de Phase-3-§5-kwaliteitsgrens (finalLoss ≤ 0,0115) nog niet — vandaar de Beta-tag. Externe SfM-resultaten uit Metashape, COLMAP of andere fotogrammetrische software kunnen aanvullend via het File-menu worden geïmporteerd (Q3 COLMAP-tekstformaat, Q6 Workspace-Import) — de keuze verandert niet, maar de geïmporteerde poses vervangen het SfM-resultaat.
SfM staat voor Structure from Motion. Uit een verzameling overlappende foto's reconstrueert de software voor elk beeld de positie en kijkrichting van de camera in een gemeenschappelijk 3D-coördinatenstelsel. Daarbij wordt een grove 3D-puntenwolk gegenereerd, die de training met Gaussian Splatting initialiseert. Het SfM-resultaat is de invoer voor de eigenlijke training en is doorslaggevend voor de uiteindelijke beeldkwaliteit.
RadianceKit biedt vijf SfM-routes: twee ingebouwde backends (Q1 Apple Photogrammetry, Q4/Q5 Native), twee import-paden uit externe tools (Q3 COLMAP-tekstformaat, Q6 binaire workspace-import) plus Q2 COLMAP-Binary, dat alleen in developer-builds buiten de App Store beschikbaar is. Welke de juiste is, hangt af van het scènetype (orbit rond een object, binnenruimte, dronevlucht) en van de vraag of externe software al een reconstructie levert.
Q1 — Apple Photogrammetry
WAAR
Expert View → Inspector → Trainingsconfiguratie → Camera Alignment-keuze, item „Apple Photogrammetry".
TECHNISCH
Wrapt Apple's ingebouwde Photogrammetry-framework dat oorspronkelijk voor Object Capture werd ontwikkeld. Apple extraheert intern features met een proprietary pipeline (stappen zijn niet openbaar gedocumenteerd), verifieert ze via multi-view-matching en lost bundle-adjustment op de Apple-Silicon Neural Engine + GPU op. Het backend is volledig App-Store-conform (geen externe binary, Sandbox=true, on-device), levert echter alleen camera-poses plus een grove puntenwolk — geen diagnose-metrieken zoals tracklengte of reprojectiefout. Schaalt volgens Apple's aanbeveling tot enkele honderden beelden. Bij meer dan ~500 frames in lineaire dronevluchten of grote outdoor-scènes zijn reproduceerbaar crashes of stil verwerpen van afzonderlijke camera's waargenomen.
Q3 — COLMAP-tekstformaat (Metashape / ETH3D)
WAAR
Menu „File → Import COLMAP / Metashape Workspace…" (Cmd+⇧+I) OF drag-and-drop van een map met sparse/0/cameras.txt.
TECHNISCH
Leest de gestandaardiseerde COLMAP-tekstexport — drie tekstbestanden cameras.txt, images.txt, points3D.txt in de submap sparse/0/ — en zet die om naar het interne SfM-resultaatmodel. Zelfde formaatdefinitie als de COLMAP-binaire export, alleen als ASCII in plaats van binair. Wordt door Agisoft Metashape, RealityCapture, PolyCam en de ETH3D-benchmark in precies deze layout uitgevoerd. De parser deelt de camera-model-herkenning met de binary-parser (alle gangbare modellen: SIMPLE_PINHOLE, PINHOLE, OPENCV, OPENCV_FISHEYE, FULL_OPENCV). Robuust tegen commentaarregels en lege regels. Schaalt in tests tot ~1.400 camera's (ETH3D Tunnel) zonder problemen.
Q4 — Native SfM (incrementeel)
WAAR
Expert View → Inspector → Trainingsconfiguratie → Camera Alignment-keuze, item „Native (Beta)". Incrementeel is de standaardmodus van dit backend — in de Inspector is er geen aparte mapper-keuze. Via de CLI kun je de modus expliciet instellen met –native-sfm of –sfm-mapper incremental.
TECHNISCH
Eigen GPU-versnelde implementatie van de gehele SfM-pipeline: FAST+BRIEF-features OF SuperPoint+LightGlue via CoreML (met –coreml-features), gevolgd door Hamming-KNN-matching, RANSAC-fundamentaalmatrix, track-building, selectie van een initieel paar, two-view-bootstrap (F→E plus DLT), greedy incrementele mapper met PnP-registratie en multi-view-triangulatie en finale bundle-adjustment via Schur-reduced Levenberg-Marquardt met Huber-loss en analytische Jacobians via Cholesky-solve. Volledig App-Store-conform: geen externe binary, Sandbox=true. Met de in fase 3.10 uitgeleverde R2-collapse-detector: registreert de app minder dan 60% van de invoerframes of valt de points-per-camera-verhouding onder 13, dan wordt automatisch uitgeweken naar de globale mapper (Q5). Empirisch schoon op orbit-/turntable-scènes; op algemenere bewegingen (dronevlucht, binnenruimtes met complexe geometrie) is het slagingspercentage lager — de detector vangt deze gevallen echter af. Schaalt betrouwbaar tot ~200 camera's, hoger met aanzienlijk langere looptijd.
Q5 — Native SfM (globaal)
WAAR
Wordt automatisch aangeroepen wanneer de incrementele mapper (Q4) de collapse-detector triggert (minder dan 60% van de invoerframes geregistreerd of points-per-camera-verhouding onder 13). Handmatig forceerbaar alleen via CLI –sfm-mapper global. In de Inspector is de globale methode niet via een aparte keuze bereikbaar — de app beslist zelf wanneer hij omschakelt.
TECHNISCH
Globale variant van de native pipeline. Eerst feature-extractie + matching zoals Q4, dan relatieve-pose-schatting voor alle geverifieerde paren, vervolgens rotation-averaging (synchroniseert alle camerarotaties in het wereld-coördinatensysteem) en translation-averaging (LSQR-gebaseerd op een matrix-vrije sparse-formulering, om integer-overflow bij grote camera-aantallen te vermijden). Schaalt in principe tot ~5.000 camera's, in de praktijk kwaliteits-degraded boven enkele honderden camera's — de fase-3.8-§5-acceptatie-gate-meting op K-1351 leverde finalLoss 0,07 op in plaats van de beoogde 0,0115. Wordt als „fallback-tier" gehanteerd: komt in actie wanneer de incrementele mapper degenereert, wordt zelf echter niet opnieuw op kwaliteit getoetst.
Q6 — Metashape / COLMAP-tekst-workspace-import (fase Q7)
WAAR
File-menu → „Import COLMAP / Metashape Workspace…" (Cmd+⇧+I). Drag-and-drop van een map met sparse/0/cameras.{bin,txt} en images/.
TECHNISCH
Herkent automatisch of een via drag-and-drop of open-paneel geselecteerde map overeenkomt met een van de drie COLMAP-workspace-layouts (sparse/0/, sparse/, of root) en of de reconstructie binair (cameras.bin) of tekst (cameras.txt) is. Het binaire pad gebruikt de COLMAP-binary-parser, het tekstpad de ETH3D-loader — beide produceren hetzelfde SfM-resultaatmodel en de rest van de pipeline (beelden importeren, MCMC-training starten) is agnostisch ten opzichte van de bron. De beelden worden via het app-sandbox-bookmark-systeem security-scoped geopend, zodat de import ook in de App-Store-versie werkt. Specifiek voor het geval „Metashape-export zonder reconstructie opnieuw berekenen" bedoeld. De in het File-menu-item genoemde herkenning waarschuwt in de app-log als de gekozen map geen herkenbare workspace is.
Welk backend wanneer?
| Scenario | Aanbevolen backend |
|---|---|
| Objectscan, 50–200 foto's | Q1 Apple Photogrammetry |
| Grote outdoor / drone / >500 beelden | Q6 workspace-import (in Metashape of COLMAP berekenen, daarna inladen) |
| Metashape/RealityCapture-export aanwezig | Q6 Import (geen SfM nodig) |
| ETH3D / academische COLMAP-tekstset | Q3 COLMAP-tekstimport |
| Strikt App-Store-conform + orbit-scène | Q4 Native incrementeel |
| Q4 faalt | Q5 Native globaal (automatisch) |
| ETH3D-benchmarkgegevens | Q3 (autotest precomputed) |
Snelvergelijking
| Backend | App-Store | Sandbox | Externe binary | Beste gebruik | Max ~cams |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Orbit-Object | ~300 |
| Q2 COLMAP Binary | ❌ (alleen developer-build) | — | colmap/glomap | Outdoor large | ~5.000 |
| Q3 COLMAP-tekstimport | ✅ | ✅ | — | Bench rigs | ~1.500 |
| Q4 Native incremental | ✅ | ✅ | — | Orbit-Object | ~200 |
| Q5 Native globaal | ✅ | ✅ | — | Q4-fallback | ~1.351 |
| Q6 Workspace-Import | ✅ | ✅ | — | Metashape-Reuse | per bron |