Rozdział 9 — Backendy SfM


Selektor Camera Alignment w Inspectorze to kontrolka segmentowa z dwoma opcjami — Apple Photogrammetry (domyślne w buildach App Store, w pełni zgodne z sandboxem) oraz Native (Beta) (własny backend RadianceKit oparty na potoku FAST+BRIEF+GLOMAP, opracowany w Fazie 3.8/3.9, stan na 2026-05). Native (Beta) jest zwalidowane tylko dla scen orbitalnych i szybsze przy ≥1 000 klatkach niż Apple Photogrammetry, ale nie spełnia jeszcze bramki jakości §5 Fazy 3 (finalLoss ≤ 0.0115) — stąd oznaczenie Beta. Zewnętrzne wyniki SfM z Metashape, COLMAP lub innego oprogramowania fotogrametrycznego można dodatkowo zaimportować przez menu File (Q3 format tekstowy COLMAP, Q6 import workspace) — selektor się nie zmienia, ale zaimportowane pozy zastępują wynik SfM.
SfM oznacza Structure from Motion. Z zestawu nakładających się zdjęć oprogramowanie rekonstruuje dla każdego obrazu pozycję i kierunek patrzenia kamery we wspólnym układzie współrzędnych 3D. Przy tej okazji powstaje zgrubna chmura punktów 3D, która inicjalizuje trening Gaussian Splatting. Wynik SfM jest wejściem dla właściwego treningu i decyduje w znaczącym stopniu o późniejszej jakości obrazu.
RadianceKit oferuje pięć dróg SfM: dwa wbudowane backendy (Q1 Apple Photogrammetry, Q4/Q5 Native), dwie ścieżki importu z zewnętrznych narzędzi (Q3 format tekstowy COLMAP, Q6 binarny import workspace) oraz Q2 COLMAP-Binary, dostępne tylko w buildach deweloperskich poza App Store. Który jest właściwy, zależy od typu sceny (orbita wokół obiektu, wnętrze, lot dronem) oraz od tego, czy zewnętrzne oprogramowanie już dostarcza rekonstrukcję.
Q1 — Apple Photogrammetry
GDZIE
Expert View → Inspector → Konfiguracja treningu → selektor Camera Alignment, pozycja „Apple Photogrammetry".
TECHNICZNIE
Opakowuje wbudowany framework Photogrammetry firmy Apple, pierwotnie opracowany dla Object Capture. Apple wewnętrznie ekstrahuje cechy za pomocą zastrzeżonego potoku (kroki nie są publicznie udokumentowane), weryfikuje je przez dopasowywanie wielowidokowe i rozwiązuje Bundle Adjustment na Apple Silicon Neural Engine + GPU. Backend jest w pełni zgodny z App Store (brak zewnętrznego pliku wykonywalnego, Sandbox=true, on-device), ale dostarcza tylko pozy kamer plus zgrubną chmurę punktów — bez metryk diagnostycznych takich jak długość ścieżki czy błąd reprojekcji. Skaluje się zgodnie z zaleceniami Apple do kilkuset zdjęć. Przy ponad ~500 klatkach w liniowych lotach dronem lub dużych scenach plenerowych obserwowano powtarzalne crashe lub ciche odrzucanie pojedynczych kamer.
Q3 — format tekstowy COLMAP (Metashape / ETH3D)
GDZIE
Menu „File → Import COLMAP / Metashape Workspace..." (Cmd+⇧+I) LUB przeciągnięcie folderu z sparse/0/cameras.txt.
TECHNICZNIE
Czyta standardowy eksport tekstowy COLMAP — trzy pliki tekstowe cameras.txt, images.txt, points3D.txt w podfolderze sparse/0/ — i konwertuje do wewnętrznego modelu wyniku SfM. Ta sama definicja formatu co binarny eksport COLMAP, tylko jako ASCII zamiast formatu binarnego. Jest tak właśnie wysyłany przez Agisoft Metashape, RealityCapture, PolyCam oraz benchmark ETH3D. Parser dzieli rozpoznawanie modelu kamery z parserem binarnym (wszystkie typowe modele: SIMPLE_PINHOLE, PINHOLE, OPENCV, OPENCV_FISHEYE, FULL_OPENCV). Odporny na linie komentarzy i puste linie. W testach skaluje się do ~1 400 kamer (ETH3D Tunnel) bez problemów.
Q4 — Native SfM (inkrementalne)
GDZIE
Expert View → Inspector → Konfiguracja treningu → selektor Camera Alignment, pozycja „Native (Beta)". Tryb inkrementalny jest domyślnym trybem tego backendu — w Inspectorze nie ma osobnego selektora mappera. Przez CLI tryb można jawnie ustawić za pomocą –native-sfm lub –sfm-mapper incremental.
TECHNICZNIE
Własna implementacja całego potoku SfM przyspieszona przez GPU: cechy FAST+BRIEF LUB SuperPoint+LightGlue przez CoreML (z –coreml-features), następnie Hamming-KNN matching, RANSAC z macierzą fundamentalną, budowanie ścieżek, wybór pary początkowej, two-view bootstrap (F→E plus DLT), zachłanny inkrementalny mapper z rejestracją PnP i triangulacją wielowidokową oraz końcowy Bundle Adjustment przez Schur-zredukowany Levenberg-Marquardt z funkcją straty Hubera i analitycznymi jakobianami przez Cholesky-Solve. W pełni zgodny z App Store: brak zewnętrznego pliku wykonywalnego, Sandbox=true. Z wysłanym w Fazie 3.10 detektorem R2-Collapse: jeśli aplikacja zarejestruje mniej niż 60% klatek wejściowych lub współczynnik punktów na kamerę spadnie poniżej 13, automatycznie przełącza się na mapper globalny (Q5). Empirycznie czyste na scenach orbitalnych/obrotowych; na bardziej ogólnych ruchach (lot dronem, wnętrza ze złożoną geometrią) wskaźnik powodzenia jest niższy — detektor wychwytuje jednak te przypadki. Skaluje się niezawodnie do ~200 kamer, wyżej z istotnie dłuższym czasem działania.
Q5 — Native SfM (globalne)
GDZIE
Wywoływane automatycznie, gdy inkrementalny mapper (Q4) wyzwoli detektor kolapsu (zarejestrowane mniej niż 60% klatek wejściowych lub współczynnik punktów na kamerę poniżej 13). Ręczne wymuszenie tylko przez CLI –sfm-mapper global. W Inspectorze procedura globalna nie jest dostępna przez osobny selektor — aplikacja sama decyduje, kiedy się przełączyć.
TECHNICZNIE
Globalna odmiana potoku natywnego. Najpierw ekstrakcja cech + matching jak w Q4, potem oszacowanie pozy względnej dla wszystkich zweryfikowanych par, następnie Rotation Averaging (synchronizuje wszystkie obroty kamer w układzie współrzędnych świata) i Translation Averaging (LSQR oparte na bezmacierzowym sformułowaniu sparse, aby uniknąć przepełnienia liczb całkowitych przy dużych zbiorach kamer). Skaluje się w zasadzie do ~5 000 kamer, w praktyce z pogorszoną jakością powyżej kilkuset kamer — pomiar bramki akceptacji §5 Fazy 3.8 na K-1351 dał finalLoss 0.07 zamiast docelowych 0.0115. Traktowane jako „tier zapasowy": wchodzi do akcji, gdy mapper inkrementalny degeneruje, ale sam nie jest ponownie sprawdzany pod kątem jakości.
Q6 — Import workspace Metashape / COLMAP-Text (Faza Q7)
GDZIE
Menu File → „Import COLMAP / Metashape Workspace..." (Cmd+⇧+I). Przeciągnięcie folderu z sparse/0/cameras.{bin,txt} oraz images/.
TECHNICZNIE
Automatycznie rozpoznaje, czy folder wybrany przez przeciągnięcie lub Open-Panel odpowiada jednemu z trzech układów workspace COLMAP (sparse/0/, sparse/ lub root) oraz czy rekonstrukcja jest w formie binarnej (cameras.bin) czy tekstowej (cameras.txt). Ścieżka binarna używa parsera binarnego COLMAP, ścieżka tekstowa — loadera ETH3D — oba produkują ten sam model wyniku SfM i reszta potoku (import obrazów, start treningu MCMC) jest agnostyczna wobec źródła. Obrazy są otwierane przez system zakładek sandboxa aplikacji w trybie security-scoped, dzięki czemu import działa również w wersji App Store. Specjalnie dla przypadku „eksport Metashape bez ponownego liczenia rekonstrukcji". Rozpoznawanie wspomniane w pozycji menu File ostrzega w logu aplikacji, jeśli wybrany folder nie jest rozpoznawalnym workspace.
Który backend kiedy?
| Scenariusz | Zalecany backend |
|---|---|
| Skan obiektu, 50–200 zdjęć | Q1 Apple Photogrammetry |
| Duży plener / dron / >500 zdjęć | Q6 Workspace-Import (policz w Metashape lub COLMAP, potem wczytaj) |
| Istnieje eksport Metashape/RealityCapture | Q6 Import (SfM niepotrzebne) |
| ETH3D / akademicki zestaw COLMAP-Text | Q3 COLMAP-Text-Import |
| Ściśle zgodne z App Store + scena orbitalna | Q4 Native inkrementalne |
| Q4 zawodzi | Q5 Native globalne (automatycznie) |
| Dane benchmarku ETH3D | Q3 (autotest precomputed) |
Szybkie porównanie
| Backend | App Store | Sandbox | Zewnętrzny plik wykonywalny | Najlepsze użycie | Maks ~kamer |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Orbit-Object | ~300 |
| Q2 COLMAP Binary | ❌ (tylko build dev.) | — | colmap/glomap | Duży plener | ~5 000 |
| Q3 COLMAP-Text-Import | ✅ | ✅ | — | Stanowiska benchm. | ~1 500 |
| Q4 Native incremental | ✅ | ✅ | — | Orbit-Object | ~200 |
| Q5 Native global | ✅ | ✅ | — | Fallback Q4 | ~1 351 |
| Q6 Workspace-Import | ✅ | ✅ | — | Reuse Metashape | zależnie od źródła |