Capitolo 9 — Backend SfM


Il picker Camera Alignment si trova nella sezione „Cameras & Capture" dell'Inspector ed è un menu a tendina, non un Segmented-Control (i nomi dei backend sono troppo lunghi per dei segmenti e farebbero saltare la stretta colonna dell'Inspector). Quante voci contiene dipende dalla build: la versione App Store ne mostra esattamente due — Apple Photogrammetry (predefinito) e Native. COLMAP manca lì completamente come backend e compare solo nelle build Developer/DMG come terza voce (vedi Q2). La voce nativa si chiama semplicemente „Native"; la precedente aggiunta „(experimental)" ovvero „(Beta)" è stata rimossa — Native non è più un percorso sperimentale, ma il percorso di qualità. È molto valido in scene di orbita e foto a livello del suolo, ma attualmente debole nel mapping aereo/con drone (nuvola di punti troppo rada); Apple Photogrammetry resta l'impostazione predefinita sicura. Se come tipo di acquisizione è selezionato un set di foto non ordinato, l'app allinea sempre con Native, indipendentemente da cosa mostra il picker — una riga di avviso sotto il picker lo comunica esplicitamente, e il picker resta utilizzabile perché il suo valore non è indisponibile, ma solo sovrascritto. I risultati SfM esterni provenienti da Metashape, COLMAP o un altro software di fotogrammetria possono inoltre essere importati tramite il menu File (Q3 formato testo COLMAP, Q6 importazione Workspace) — il picker non cambia, ma le pose importate sostituiscono il risultato SfM. Questa importazione non ha nulla a che vedere con la questione del backend COLMAP e funziona in ogni build.
SfM sta per Structure from Motion. A partire da un insieme di foto sovrapposte, il software ricostruisce per ogni immagine la posizione e la direzione di ripresa della fotocamera in un sistema di coordinate 3D comune. A tale scopo viene generata una nuvola di punti 3D grossolana, che inizializza il training con Gaussian Splatting. Il risultato SfM è l'input per il training vero e proprio e determina in modo decisivo la qualità dell'immagine successiva.
RadianceKit offre cinque percorsi SfM: due backend integrati nell'app (Q1 Apple Photogrammetry, Q4/Q5 Native), due percorsi di importazione da strumenti esterni (Q3 formato testo COLMAP, Q6 importazione binaria del Workspace) e Q2 COLMAP-Binary, disponibile solo nelle build Developer al di fuori dell'App Store. Quale sia quello giusto dipende dal tipo di scena (orbita attorno a un oggetto, ambiente interno, volo con drone) e dal fatto che un software esterno fornisca già una ricostruzione.
Q1 — Apple Photogrammetry
DOVE
Expert View → Inspector → sezione „Cameras & Capture" → picker Camera Alignment, voce „Apple Photogrammetry". Predefinito in ogni build.
TECNICO
Racchiude il framework Photogrammetry integrato di Apple, originariamente sviluppato per Object Capture. Apple estrae internamente le feature con una pipeline proprietaria (i passaggi non sono documentati pubblicamente), le verifica tramite matching multi-view e risolve il bundle adjustment sulla Neural Engine + GPU di Apple Silicon. Il backend è completamente conforme all'App Store (nessun binario esterno, Sandbox=true, on-device), ma fornisce solo pose della camera più una nuvola di punti grossolana — nessuna metrica diagnostica come lunghezza delle track o errore di riproiezione. Secondo le indicazioni di Apple, scala fino a qualche centinaio di immagini. Con più di ~500 frame in voli di drone lineari o grandi scene esterne sono stati osservati in modo riproducibile crash o lo scarto silenzioso di singole camere.
Q3 — Formato testo COLMAP (Metashape / ETH3D)
DOVE
Menu „File → Import COLMAP / Metashape Workspace…" (Cmd+⇧+I) OPPURE trascinamento di una cartella con sparse/0/cameras.txt.
TECNICO
Legge l'esportazione testuale standardizzata di COLMAP — tre file di testo cameras.txt, images.txt, points3D.txt nella sottocartella sparse/0/ — e converte nel modello interno del risultato SfM. Stessa definizione di formato dell'esportazione binaria di COLMAP, solo in ASCII anziché binario. Viene prodotto esattamente in questo layout da Agisoft Metashape, RealityCapture, PolyCam e dal benchmark ETH3D. Il parser condivide il riconoscimento del modello di camera con il parser binario e conosce tutti gli undici modelli di camera standard di COLMAP — da SIMPLE_PINHOLE e PINHOLE a SIMPLE_RADIAL (l'impostazione predefinita propria di COLMAP) e OPENCV fino alle varianti fisheye. Robusto contro righe di commento e righe vuote. Nei test scala fino a ~1 400 camere (ETH3D Tunnel) senza problemi.
Q4 — Native SfM (incrementale)
DOVE
Expert View → Inspector → sezione „Cameras & Capture" → picker Camera Alignment, voce „Native" (senza la precedente aggiunta „(experimental)"). Incrementale è la modalità predefinita di questo backend; per Native non esiste una selezione del mapper. La riga „Mapper" sottostante appartiene esclusivamente a COLMAP: nelle build Developer è visibile, ma disattivata in grigio finché è selezionato Native, nella versione App Store manca del tutto. Le righe realmente native — „FOV Override", „High-Quality" e „Native SfM Recipe" — non scompaiono più con altri backend, ma restano visibili disattivate in grigio e indicano in una riga sottostante cosa devi modificare per riattivarle. Non puoi passare da solo tra il procedimento incrementale e quello globale: l'incrementale è fisso come predefinito, e l'app passa al procedimento globale solo di propria iniziativa (vedi Q5).
TECNICO
Implementazione propria, accelerata via GPU, dell'intera pipeline SfM: feature FAST+BRIEF OPPURE SuperPoint+LightGlue tramite CoreML (attivato tramite l'interruttore „High-Quality"; nel caso di set di foto non ordinati è comunque attivo in ogni caso), seguito da matching Hamming-KNN, matrice fondamentale RANSAC, costruzione delle track, selezione della coppia iniziale, bootstrap two-view (F→E più DLT), mapper incrementale greedy con registrazione PnP e triangolazione multi-view, e bundle adjustment finale via Levenberg-Marquardt ridotto con Schur, con perdita di Huber e Jacobiani analitici tramite risoluzione di Cholesky. Completamente conforme all'App Store: nessun binario esterno, Sandbox=true. Con il rilevatore di collasso integrato: classifica un risultato come degenere se sono state registrate meno del 60 % dei frame di input, se il tasso di punti per camera scende sotto 13, oppure se la nuvola di punti è quasi piatta. A ciò non segue immediatamente il cambio di procedimento — l'app ripete prima il run incrementale (adotta il primo risultato non problematico, altrimenti il migliore dei tentativi) e passa al mapper globale (Q5) solo se anche il tentativo migliore resta degenere. Empiricamente pulito su scene orbit/turntable; su movimenti più generali (volo con drone, interni con geometria complessa) il tasso di successo è più basso — il rilevatore però intercetta questi casi. Scala in modo affidabile fino a ~200 camere, oltre con un tempo di esecuzione decisamente più lungo.
Q5 — Native SfM (globale)
DOVE
Viene richiamato automaticamente quando il mapper incrementale (Q4) attiva il rilevatore di collasso (meno del 60 % dei frame di input registrati, tasso di punti per camera sotto 13, oppure nuvola di punti quasi piatta) — e precisamente solo dopo che il run incrementale è stato ripetuto e anche il tentativo migliore è rimasto degenere. Non può essere richiesto manualmente: nell'Inspector non esiste un picker apposito né altrimenti un interruttore — decide l'app stessa quando passare.
TECNICO
Variante globale della pipeline nativa. Prima estrazione delle feature + matching come in Q4, poi stima della posa relativa per tutte le coppie verificate, quindi rotation averaging (sincronizza tutte le rotazioni della camera nel sistema di coordinate mondo) e translation averaging (basato su LSQR su una formulazione sparse matrix-free, per evitare overflow di interi con grandi quantità di camere). Scala in linea di principio fino a ~5 000 camere, in pratica la qualità cala sensibilmente oltre qualche centinaio di camere. Viene gestito come „livello di fallback": entra in gioco quando il mapper incrementale degenera anche dopo la ripetizione, e non viene esso stesso sottoposto di nuovo al rilevatore di collasso — se il suo risultato resta rado, interviene invece l'avviso generale di qualità della pipeline.
Q6 — Importazione Workspace Metashape / testo COLMAP
DOVE
Menu File → „Import COLMAP / Metashape Workspace…" (Cmd+⇧+I). Trascinamento di una cartella con sparse/0/cameras.{bin,txt} e images/.
TECNICO
Riconosce automaticamente se una cartella selezionata tramite trascinamento o pannello di apertura corrisponde a uno dei tre layout di Workspace COLMAP (sparse/0/, sparse/, oppure root) e se la ricostruzione è presente in forma binaria (cameras.bin) o testuale (cameras.txt). Il percorso binario usa il parser binario di COLMAP, il percorso testuale il loader ETH3D — entrambi producono lo stesso modello di risultato SfM e il resto della pipeline (importazione immagini, avvio del training MCMC) è agnostico rispetto alla fonte. Le immagini vengono aperte in modo security-scoped tramite il sistema di bookmark della sandbox dell'app, cosicché l'importazione funzioni anche nella versione App Store. Pensato appositamente per il caso „esportazione Metashape senza ricalcolare la ricostruzione". Il riconoscimento menzionato nella voce del menu File avvisa nel log dell'app se la cartella scelta non è un workspace riconoscibile.
Q7 — Ricette Native (Standard / Professional / E3 High-Accuracy)
DOVE
Expert View → Inspector → sezione „Cameras & Capture" → riga „Native SfM Recipe". La riga è utilizzabile solo se come Camera Alignment è selezionato „Native" e come tipo di acquisizione è impostato un set di foto non ordinato — altrimenti resta disattivata in grigio e indica sotto cosa modificare (le regole di disponibilità si trovano nel Capitolo 2).
TECNICO
Tre livelli dello stesso backend nativo. Non modificano l'algoritmo, ma quanto approfonditamente lavora:
Standard — la ricetta base senza fasi aggiuntive.
Professional — imposta inoltre due cose: i marcatori AprilTag rilevati entrano come corpi rigidi nel mapping e nel bundle adjustment, e sulle pose finali viene effettuata una ri-triangolazione densa (nuvola di punti iniziale più densa). Se l'acquisizione non contiene marcatori, il rilevatore non trova nulla e resta efficace solo la ri-triangolazione densa.
E3 High-Accuracy — si basa su Professional e attiva inoltre il frontend HQ (tassellazione SuperPoint 3×3, LightGlue con 4096 keypoint, coppie di covisibilità) nonché il raffinamento congiunto della focale su tutte le camere. Questo produce le pose della camera più nitide e il tempo di matching più lungo.
Quale backend usare quando?
| Scenario | Backend consigliato |
|---|---|
| Primo risultato, senza pensarci troppo | Q1 Apple Photogrammetry (impostazione predefinita) |
| Scansione di un oggetto, 50–200 foto | Q1 Apple Photogrammetry |
| Massima qualità sulla stessa scena | Preset „Maximum Quality (Native)" — Q4 Native + ricetta Q7 E3 |
| Ripresa con marcatori AprilTag stampati | Q4 Native + ricetta Q7 Professional |
| Grande scena esterna / drone / >500 immagini | Importazione Workspace Q6 (calcolare in Metashape o COLMAP, poi importare) |
| È disponibile un export di Metashape/RealityCapture | Importazione Q6 (SfM non necessario) |
| Set testuale ETH3D / COLMAP accademico | Importazione testo COLMAP Q3 |
| Q4 collassa | Q5 Native globale (passa automaticamente) |
Confronto rapido
| Backend | App Store | Sandbox | Binario esterno | Uso ideale | Max ~Cam |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Oggetto orbitale | ~300 |
| Q2 COLMAP Binary | ❌ (solo build sviluppatore) | — | colmap/glomap | Esterni ampi | ~5 000 |
| Q3 COLMAP-Text-Import | ✅ | ✅ | — | Bench rig | ~1 500 |
| Q4 Native incremental | ✅ | ✅ | — | Oggetto orbitale | ~200 |
| Q5 Native global | ✅ | ✅ | — | Fallback per Q4 | ~5 000 |
| Q6 Workspace-Import | ✅ | ✅ | — | Riutilizzo Metashape | per fonte |