Rozdział 9 — Backendy SfM


Picker Camera Alignment znajduje się w sekcji Inspectora „Cameras & Capture" i jest menu rozwijanym, a nie segmented-control (nazwy backendów są za długie na segmenty i rozsadziłyby wąską kolumnę Inspectora). Liczba wpisów zależy od buildu: wersja z App Store pokazuje dokładnie dwa — Apple Photogrammetry (domyślny) i Native. COLMAP jako backend całkowicie tam brakuje i pojawia się tylko w buildach developerskich/DMG jako trzeci wpis (patrz Q2). Wpis natywny nazywa się po prostu „Native"; dawny dopisek „(experimental)" lub „(Beta)" został usunięty — Native nie jest już ścieżką eksperymentalną, tylko ścieżką jakości. Radzi sobie świetnie w scenach z orbitą i zdjęciami wykonanymi z poziomu ziemi, obecnie jednak słabo przy mapowaniu lotniczym/dronowym (zbyt rzadka chmura punktów); Apple Photogrammetry pozostaje bezpiecznym ustawieniem domyślnym. Jeśli jako typ nagrania wybrany jest nieuporządkowany zestaw zdjęć, aplikacja zawsze wyrównuje przy pomocy Native, niezależnie od tego, co pokazuje picker — linijka informacyjna pod pickerem mówi o tym wyraźnie, a sam picker pozostaje obsługiwalny, bo jego wartość nie jest niedostępna, tylko nadpisana. 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) — picker się wtedy nie zmienia, ale zaimportowane pozy zastępują wynik SfM. Ten import nie ma nic wspólnego z pytaniem o backend COLMAP i działa w każdym buildzie.
SfM oznacza Structure from Motion. Na podstawie zbioru 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. Powstaje przy tym zgrubna chmura punktów 3D, która inicjalizuje trening Gaussian Splatting. Wynik SfM jest danymi wejściowymi do właściwego treningu i w decydującym stopniu wpływa na późniejszą jakość obrazu.
RadianceKit oferuje pięć ścieżek SfM: dwa wbudowane w aplikację 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ępny tylko w buildach developerskich poza App Store. Która z nich jest właściwa, 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 → sekcja „Cameras & Capture" → picker Camera Alignment, wpis „Apple Photogrammetry". Ustawienie domyślne w każdym buildzie.
TECHNICZNIE
Owija wbudowany framework Apple Photogrammetry, pierwotnie opracowany dla Object Capture. Apple wewnętrznie ekstrahuje cechy za pomocą zastrzeżonego potoku (kroki nie są publicznie udokumentowane), weryfikuje je poprzez dopasowanie wielowidokowe i rozwiązuje bundle adjustment na Neural Engine + GPU Apple Silicon. Backend jest w pełni zgodny z wymogami App Store (brak zewnętrznego pliku binarnego, Sandbox=true, on-device), dostarcza jednak jedynie pozy kamer plus zgrubną chmurę punktów — brak metryk diagnostycznych, takich jak długość ścieżki czy błąd reprojekcji. Skaluje się według zaleceń Apple do kilkuset zdjęć. Przy ponad ~500 klatkach w liniowych lotach dronem lub dużych scenach plenerowych zaobserwowano powtarzalne awarie 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
Odczytuje standardowy eksport tekstowy COLMAP — trzy pliki tekstowe cameras.txt, images.txt, points3D.txt w podfolderze sparse/0/ — i konwertuje na wewnętrzny model wyniku SfM. Ta sama definicja formatu co binarny eksport COLMAP, tylko w postaci ASCII zamiast binarnej. Wypisywany w dokładnie tym układzie przez Agisoft Metashape, RealityCapture, PolyCam oraz benchmark ETH3D. Parser dzieli rozpoznawanie modelu kamery z parserem binarnym i zna wszystkie jedenaście standardowych modeli kamer COLMAP — od SIMPLE_PINHOLE i PINHOLE przez SIMPLE_RADIAL (własne ustawienie domyślne COLMAP) i OPENCV aż po warianty fisheye. Odporny na linie komentarzy i puste linie. W testach skaluje się bez problemów do ~1400 kamer (ETH3D Tunnel).
Q4 — Native SfM (przyrostowy)
GDZIE
Expert View → Inspector → sekcja „Cameras & Capture" → picker Camera Alignment, wpis „Native" (bez dawnego dopisku „(experimental)"). Tryb przyrostowy jest domyślnym trybem tego backendu; dla Native nie ma wyboru mappera. Znajdująca się poniżej linia „Mapper" należy wyłącznie do COLMAP: w buildach developerskich jest widoczna, ale wyszarzona, dopóki wybrany jest Native, w wersji App Store brakuje jej całkowicie. Naprawdę natywne linie — „FOV Override", „High-Quality" i „Native SfM Recipe" — nie znikają już przy innych backendach, lecz pozostają wyszarzone i podają w linii poniżej, co trzeba zmienić, by je ponownie odblokować. Między trybem przyrostowym a globalnym nie możesz przełączać się samodzielnie: przyrostowy jest ustawiony na stałe, a na tryb globalny aplikacja przełącza się wyłącznie sama (patrz Q5).
TECHNICZNIE
Własna, przyspieszona przez GPU implementacja całego potoku SfM: cechy FAST+BRIEF LUB SuperPoint+LightGlue przez CoreML (włączane przełącznikiem „High-Quality"; przy nieuporządkowanych zestawach zdjęć aktywne i tak), następnie dopasowanie Hamming-KNN, macierz fundamentalna RANSAC, budowanie ścieżek (track building), wybór pary początkowej, bootstrap dwuwidokowy (F→E plus DLT), zachłanny mapper przyrostowy z rejestracją PnP i triangulacją wielowidokową oraz finalny bundle adjustment poprzez zredukowany metodą Schura Levenberg-Marquardt z funkcją straty Hubera i analitycznymi jakobianami przez rozkład Cholesky'ego. Całkowicie zgodny z wymogami App Store: brak zewnętrznego pliku binarnego, Sandbox=true. Z wbudowanym detektorem kolapsu: klasyfikuje wynik jako zdegenerowany, jeśli zarejestrowano mniej niż 60% klatek wejściowych, gdy współczynnik punktów na kamerę spada poniżej 13 lub gdy chmura punktów jest niemal płaska. Nie następuje wtedy od razu zmiana metody — aplikacja najpierw powtarza przebieg przyrostowy (przejmuje pierwszy niebudzący zastrzeżeń wynik, w przeciwnym razie najlepszy z prób) i dopiero wtedy przechodzi na mapper globalny (Q5), gdy nawet najlepsza próba pozostaje zdegenerowana. Empirycznie czysty w scenach orbitalnych/typu turntable; przy bardziej ogólnych ruchach (lot dronem, wnętrza o złożonej geometrii) wskaźnik powodzenia jest niższy — detektor jednak wyłapuje te przypadki. Skaluje się niezawodnie do ~200 kamer, powyżej tej liczby ze znacznie dłuższym czasem działania.
Q5 — Native SfM (globalny)
GDZIE
Wywoływany automatycznie, gdy mapper przyrostowy (Q4) uruchomi detektor kolapsu (mniej niż 60% zarejestrowanych klatek wejściowych, współczynnik punktów na kamerę poniżej 13 lub niemal płaska chmura punktów) — i to dopiero po powtórzeniu przebiegu przyrostowego, gdy nawet najlepsza próba pozostała zdegenerowana. Nie da się go wywołać ręcznie: w Inspectorze nie ma dla niego pickera ani żadnego innego przełącznika — aplikacja sama decyduje, kiedy się przełączyć.
TECHNICZNIE
Globalny wariant natywnego potoku. Najpierw ekstrakcja cech + dopasowanie jak w Q4, potem szacowanie pozy względnej dla wszystkich zweryfikowanych par, następnie uśrednianie rotacji (rotation averaging, synchronizuje wszystkie rotacje kamer w układzie współrzędnych świata) i uśrednianie translacji (translation averaging, oparte na LSQR, na bazie bezmacierzowej formuły rzadkiej, aby uniknąć przepełnienia liczb całkowitych przy dużych zbiorach kamer). Skaluje się w zasadzie do ~5000 kamer, w praktyce jakość zauważalnie spada powyżej kilkuset kamer. Traktowany jako „warstwa awaryjna": wchodzi w grę, gdy mapper przyrostowy degeneruje się nawet po powtórzeniu, i sam nie jest ponownie poddawany detektorowi kolapsu — jeśli jego wynik pozostanie rzadki, zamiast tego zgłasza się ogólne ostrzeżenie o jakości potoku.
Q6 — Import Workspace Metashape / COLMAP tekstowy
GDZIE
Menu File → „Import COLMAP / Metashape Workspace…" (Cmd+⇧+I). Przeciągnięcie folderu z sparse/0/cameras.{bin,txt} i images/.
TECHNICZNIE
Rozpoznaje automatycznie, czy folder wybrany przez przeciągnięcie lub panel otwierania odpowiada jednemu z trzech układów Workspace COLMAP (sparse/0/, sparse/ lub katalog główny) i czy rekonstrukcja jest binarna (cameras.bin), czy tekstowa (cameras.txt). Ścieżka binarna korzysta z parsera binarnego COLMAP, ścieżka tekstowa z loadera ETH3D — obie tworzą ten sam model wyniku SfM, a reszta potoku (import obrazów, uruchomienie treningu MCMC) jest agnostyczna wobec źródła. Obrazy otwierane są jako security-scoped przez system bookmarków sandboxa aplikacji, dzięki czemu import działa także w wersji App Store. Pomyślany specjalnie na przypadek „eksport z Metashape bez ponownego liczenia rekonstrukcji". Wspomniane w opisie wpisu menu File rozpoznawanie zgłasza ostrzeżenie w logu aplikacji, jeśli wybrany folder nie jest rozpoznawalnym Workspace.
Q7 — Receptury Native (Standard / Professional / E3 High-Accuracy)
GDZIE
Expert View → Inspector → sekcja „Cameras & Capture" → linia „Native SfM Recipe". Linia jest obsługiwalna tylko wtedy, gdy jako Camera Alignment wybrano „Native", a jako typ nagrania ustawiono nieuporządkowany zestaw zdjęć — w przeciwnym razie jest wyszarzona i podaje poniżej, co trzeba zmienić (zasady dostępności znajdują się w rozdziale 2).
TECHNICZNIE
Trzy poziomy tego samego natywnego backendu. Nie zmieniają algorytmu, lecz to, jak dokładnie pracuje:
Standard — podstawowa receptura bez dodatkowych etapów.
Professional — dodatkowo ustawia dwie rzeczy: wykryte markery AprilTag wchodzą jako ciała sztywne do mappingu i bundle adjustment, a na gotowych pozach wykonywana jest gęsta retriangulacja (gęstsza chmura punktów startowych). Jeśli nagranie nie zawiera markerów, detektor niczego nie znajduje i skuteczna pozostaje jedynie gęsta retriangulacja.
E3 High-Accuracy — opiera się na Professional i dodatkowo włącza frontend HQ (kafelkowanie SuperPoint 3×3, LightGlue z 4096 punktami kluczowymi, pary covisibility) oraz wspólne dopracowanie ogniskowej (focal refinement) dla wszystkich kamer. Daje to najostrzejsze pozy kamer i najdłuższy czas dopasowywania.
Które backend kiedy?
| Scenariusz | Zalecany backend |
|---|---|
| Pierwszy wynik, bez zastanawiania się | Q1 Apple Photogrammetry (ustawienie domyślne) |
| Skan obiektu, 50–200 zdjęć | Q1 Apple Photogrammetry |
| Maksymalna jakość na tej samej scenie | Preset „Maximum Quality (Native)" — Q4 Native + przepis Q7 E3 |
| Ujęcie z wydrukowanymi markerami AprilTag | Q4 Native + przepis Q7 Professional |
| Duża scena plenerowa / dron / >500 zdjęć | Import Q6 Workspace (obliczenia w Metashape lub COLMAP, następnie wczytanie) |
| Dostępny eksport z Metashape/RealityCapture | Import Q6 (SfM niepotrzebne) |
| Zbiór tekstowy ETH3D / akademicki COLMAP | Import tekstu COLMAP Q3 |
| Q4 się zawiesza | Q5 Native global (przełącza automatycznie) |
Szybkie porównanie
| Backend | App Store | Sandbox | Zewnętrzny plik binarny | Najlepsze zastosowanie | Maks. ~liczba kamer |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | Obiekt orbitalny | ~300 |
| Q2 COLMAP Binary | ❌ (tylko wersja deweloperska) | — | colmap/glomap | Duże sceny plenerowe | ~5 000 |
| Q3 Import tekstowy COLMAP | ✅ | ✅ | — | Stanowiska pomiarowe | ~1 500 |
| Q4 Natywny przyrostowy | ✅ | ✅ | — | Obiekt orbitalny | ~200 |
| Q5 Natywny globalny | ✅ | ✅ | — | Zapasowe dla Q4 | ~5 000 |
| Q6 Import Workspace | ✅ | ✅ | — | Ponowne użycie z Metashape | zależy od źródła |