Kapitel 9 — SfM-Backends


Camera Alignment 피커는 인스펙터의 「Cameras & Capture」섹션에 있으며, 세그먼트 컨트롤이 아니라 펼침 메뉴다 (백엔드 이름이 세그먼트로 쓰기엔 너무 길어서 좁은 인스펙터 컬럼을 넘어가버린다). 항목 수는 빌드에 따라 다르다: 앱스토어 버전은 정확히 두 개 — Apple Photogrammetry (기본값)와 Native만 보여준다. COLMAP은 이 버전에서 백엔드로서 완전히 빠져 있으며, 개발자용/DMG 빌드에서만 세 번째 항목으로 나타난다 (Q2 참고). 네이티브 항목은 그냥 「Native」라고만 표시되며, 이전에 붙었던 「(experimental)」 또는 「(Beta)」 표시는 사라졌다 — Native는 더 이상 실험 단계가 아니라 품질 경로다. 바닥에 가까운 오빗 촬영이나 사진 촬영 씬에서는 강력하지만, 현재 항공/드론 매핑에서는 약한 편이다 (점군이 너무 희박함); Apple Photogrammetry는 여전히 안전한 기본값이다. 촬영 유형으로 순서 없는 사진 세트를 선택하면, 앱은 피커에 무엇이 표시되든 상관없이 항상 Native로 정렬한다 — 피커 아래의 안내 문구가 이를 명시적으로 알려주며, 피커 값은 사용 불가능한 것이 아니라 단지 우선순위에서 밀린 것이므로 피커는 여전히 조작 가능한 상태로 남는다. Metashape, COLMAP, 또는 다른 포토그래메트리 소프트웨어의 외부 SfM 결과는 File 메뉴를 통해 추가로 임포트할 수 있다 (Q3 COLMAP 텍스트 형식, Q6 워크스페이스 임포트) — 피커는 바뀌지 않지만 임포트된 포즈가 SfM 결과를 대체한다. 이 임포트는 COLMAP 백엔드 문제와는 무관하며 어떤 빌드에서든 작동한다.
SfM은 Structure from Motion의 약자다. 겹치는 사진들의 집합으로부터 소프트웨어는 각 이미지에 대해 카메라의 위치와 방향을 공통 3D 좌표계에서 재구성한다. 이 과정에서 대략적인 3D 점군이 생성되며, 이것이 Gaussian Splatting을 이용한 트레이닝의 초기값이 된다. SfM 결과는 실제 트레이닝의 입력값이며, 이후 이미지 품질을 크게 좌우한다.
RadianceKit은 다섯 가지 SfM 경로를 제공한다: 앱에 내장된 두 개의 백엔드(Q1 Apple Photogrammetry, Q4/Q5 Native), 외부 도구로부터의 두 가지 임포트 경로(Q3 COLMAP 텍스트 형식, Q6 바이너리 워크스페이스 임포트), 그리고 앱스토어 밖 개발자 빌드에서만 사용 가능한 Q2 COLMAP 바이너리. 어떤 것이 올바른 선택인지는 씬 유형(오브젝트 주변 오빗, 실내, 드론 비행)과 외부 소프트웨어가 이미 재구성 결과를 제공하는지 여부에 달려 있다.
Q1 — Apple Photogrammetry
위치
Expert View → Inspector → 「Cameras & Capture」섹션 → Camera Alignment 피커, 「Apple Photogrammetry」항목. 모든 빌드의 기본값.
기술적 설명
원래 Object Capture용으로 개발된 Apple의 내장 Photogrammetry 프레임워크를 래핑한다. Apple은 내부적으로 독자적인 파이프라인(단계들은 공개 문서화되어 있지 않음)으로 피처를 추출하고, 멀티뷰 매칭을 통해 검증한 뒤, Apple Silicon Neural Engine + GPU에서 번들 조정(bundle adjustment)을 푼다. 이 백엔드는 완전히 앱스토어 규정에 부합하며(외부 바이너리 없음, Sandbox=true, 온디바이스), 카메라 포즈와 대략적인 점군만 제공한다 — 트랙 길이나 재투영 오차 같은 진단 지표는 없다. Apple의 권장에 따라 수백 장 정도까지 스케일된다. 선형 드론 비행이나 대규모 실외 씬에서 ~500프레임을 넘으면, 재현 가능한 크래시나 개별 카메라가 조용히 버려지는 현상이 관찰되었다.
Q3 — COLMAP 텍스트 형식 (Metashape / ETH3D)
위치
메뉴 「File → Import COLMAP / Metashape Workspace…」 (Cmd+⇧+I) 또는 sparse/0/cameras.txt가 있는 폴더를 드래그 앤 드롭.
기술적 설명
표준화된 COLMAP 텍스트 익스포트를 읽는다 — sparse/0/ 하위 폴더 안의 세 개의 텍스트 파일 cameras.txt, images.txt, points3D.txt — 그리고 이를 내부 SfM 결과 모델로 변환한다. COLMAP 바이너리 익스포트와 동일한 형식 정의이며, 다만 바이너리 대신 ASCII다. Agisoft Metashape, RealityCapture, PolyCam, ETH3D 벤치마크가 정확히 이 레이아웃으로 출력한다. 파서는 카메라 모델 인식 부분을 바이너리 파서와 공유하며, COLMAP의 11개 표준 카메라 모델을 모두 인식한다 — SIMPLE_PINHOLE과 PINHOLE부터 SIMPLE_RADIAL(COLMAP 자체 기본값)과 OPENCV, 그리고 어안 렌즈 변형까지. 주석 줄과 빈 줄에 강건하다. 테스트에서 ~1,400개 카메라(ETH3D Tunnel)까지 문제 없이 스케일된다.
Q4 — Native SfM (점진적)
위치
Expert View → Inspector → 「Cameras & Capture」섹션 → Camera Alignment 피커, 「Native」항목(이전에 붙었던 「(experimental)」 표시는 없음). 점진적 방식이 이 백엔드의 기본 모드다; Native에는 Mapper 선택이 없다. 그 아래의 「Mapper」줄은 오로지 COLMAP에 속한다: 개발자 빌드에서는 Native가 선택된 동안 보이지만 회색으로 비활성화되어 있고, 앱스토어 버전에서는 아예 없다. 진짜 네이티브 전용 줄들 — 「FOV Override」, 「High-Quality」, 「Native SfM Recipe」 — 은 다른 백엔드에서 더 이상 사라지지 않고 회색으로 비활성화된 채 남아 있으며, 그 아래 한 줄로 다시 활성화하려면 무엇을 바꿔야 하는지 알려준다. 점진적 방식과 전역 방식 사이를 직접 전환할 수는 없다: 점진적이 고정 기본값이며, 전역 방식으로의 전환은 앱이 스스로 판단할 때만 일어난다(Q5 참고).
기술적 설명
전체 SfM 파이프라인의 자체 GPU 가속 구현: FAST+BRIEF 피처 또는 CoreML을 통한 SuperPoint+LightGlue(「High-Quality」스위치로 켜짐; 순서 없는 사진 세트에서는 어차피 활성화됨)에 이어, Hamming-KNN 매칭, RANSAC 기본 행렬, 트랙 구축, 초기 페어 선택, Two-View 부트스트랩(F→E 및 DLT), PnP 등록과 멀티뷰 삼각측량을 이용한 탐욕적 점진적 매퍼, 그리고 Huber 손실과 Cholesky 분해를 통한 해석적 자코비안을 사용하는 Schur-축소 Levenberg-Marquardt를 통한 최종 번들 조정. 완전히 앱스토어 규정에 부합함: 외부 바이너리 없음, Sandbox=true. 내장된 붕괴(collapse) 탐지기 포함: 등록된 입력 프레임이 60% 미만이거나, 카메라당 포인트 비율이 13 미만으로 떨어지거나, 점군이 거의 평평할 경우 결과를 퇴화(degenerate)로 분류한다. 이 경우 곧바로 방식이 전환되는 것은 아니다 — 앱은 먼저 점진적 실행을 반복하고(첫 이상 없는 결과를 채택하며, 없으면 시도 중 가장 나은 결과를 채택), 그 최선의 시도조차 퇴화 상태로 남을 때만 전역 매퍼(Q5)로 넘어간다. 오빗/턴테이블 씬에서는 경험적으로 깔끔하게 작동하지만, 더 일반적인 움직임(드론 비행, 복잡한 구조의 실내)에서는 성공률이 낮다 — 다만 탐지기가 이런 경우를 잡아낸다. ~200개 카메라까지 안정적으로 스케일되며, 그 이상에서는 실행 시간이 훨씬 길어진다.
Q5 — Native SfM (전역)
위치
점진적 매퍼(Q4)가 붕괴 탐지기를 유발할 때 자동으로 호출된다(등록된 입력 프레임이 60% 미만, 카메라당 포인트 비율 13 미만, 또는 거의 평평한 점군) — 그것도 점진적 실행이 반복된 뒤, 최선의 시도조차 퇴화 상태로 남았을 때만. 수동으로 요청할 수는 없다: 인스펙터에는 이를 위한 피커도 없고 다른 스위치도 없다 — 언제 전환할지는 앱이 스스로 판단한다.
기술적 설명
네이티브 파이프라인의 전역 변형. 먼저 Q4와 같은 피처 추출 + 매칭을 수행한 다음, 검증된 모든 페어에 대해 상대 포즈 추정을 수행하고, 이어서 회전 평균화(rotation averaging, 세계 좌표계에서 모든 카메라 회전을 동기화)와 이동 평균화(translation averaging, 대규모 카메라 집합에서 정수 오버플로를 피하기 위해 행렬 없는 희소 정식화 기반의 LSQR)를 수행한다. 원칙적으로는 ~5,000개 카메라까지 스케일되지만, 실제로는 수백 개를 넘어가면 품질이 눈에 띄게 떨어진다. 「폴백 등급」으로 취급된다: 점진적 매퍼가 반복 후에도 퇴화 상태일 때 사용되며, 자기 자신은 다시 붕괴 탐지기에 회부되지 않는다 — 결과가 희박한 채로 남으면 대신 파이프라인의 일반 품질 경고가 표시된다.
Q6 — Metashape / COLMAP 텍스트 워크스페이스 임포트
위치
File 메뉴 → 「Import COLMAP / Metashape Workspace…」 (Cmd+⇧+I). sparse/0/cameras.{bin,txt}와 images/가 있는 폴더를 드래그 앤 드롭.
기술적 설명
드래그 앤 드롭이나 열기 패널로 선택한 폴더가 세 가지 COLMAP 워크스페이스 레이아웃(sparse/0/, sparse/, 또는 루트) 중 하나에 해당하는지, 그리고 재구성 결과가 바이너리(cameras.bin)인지 텍스트(cameras.txt)인지를 자동으로 인식한다. 바이너리 경로는 COLMAP 바이너리 파서를, 텍스트 경로는 ETH3D 로더를 사용한다 — 둘 다 동일한 SfM 결과 모델을 생성하며, 파이프라인의 나머지(이미지 임포트, MCMC 트레이닝 시작)는 출처와 무관하게 동일하게 동작한다. 이미지는 앱 샌드박스의 북마크 시스템을 통해 security-scoped 방식으로 열리므로, 앱스토어 버전에서도 임포트가 작동한다. 특히 「Metashape 익스포트를 재구성 재계산 없이 사용하는」경우를 위해 설계되었다. File 메뉴 항목에 언급된 인식 로직은, 선택한 폴더가 인식 가능한 워크스페이스가 아닐 경우 앱 로그에 경고를 남긴다.
Q7 — 네이티브 레시피 (Standard / Professional / E3 High-Accuracy)
위치
Expert View → Inspector → 「Cameras & Capture」섹션 → 「Native SfM Recipe」줄. 이 줄은 Camera Alignment로 「Native」가 선택되어 있고 촬영 유형이 순서 없는 사진 세트로 설정되어 있을 때만 조작 가능하다 — 그렇지 않으면 회색으로 비활성화되어 있으며 그 아래에 무엇을 바꿔야 하는지 알려준다(가용성 규칙은 2장에 있다).
기술적 설명
동일한 네이티브 백엔드의 세 단계. 알고리즘 자체를 바꾸는 것이 아니라 얼마나 철저하게 작동하는지를 바꾼다:
Standard — 추가 단계가 없는 기본 레시피.
Professional — 추가로 두 가지를 적용한다: 인식된 AprilTag 마커가 강체(rigid body)로서 매핑과 번들 조정에 반영되고, 완성된 포즈에 대해 조밀한 재삼각측량이 수행된다(더 조밀한 초기 점군). 촬영에 마커가 없으면 탐지기가 아무것도 찾지 못하고 조밀한 재삼각측량만 효과를 낸다.
E3 High-Accuracy — Professional을 기반으로 하며 추가로 HQ 프론트엔드(3×3 SuperPoint 타일링, 4096개 키포인트를 사용하는 LightGlue, 공가시성(covisibility) 페어)와 모든 카메라에 걸친 공동 초점거리 정밀화(joint focal refinement)를 켠다. 이는 가장 선명한 카메라 포즈와 가장 긴 매칭 실행 시간을 낳는다.
어떤 백엔드를 언제 써야 할까?
| 시나리오 | 권장 백엔드 |
|---|---|
| 깊이 고민하지 않고 첫 결과물을 얻고 싶을 때 | Q1 Apple Photogrammetry (기본값) |
| 오브젝트 스캔, 사진 50~~200장 | Q1 Apple Photogrammetry |
| 동일한 씬에서 최대 품질을 얻고 싶을 때 | 프리셋 "Maximum Quality (Native)" — Q4 Native + Q7 레시피 E3 |
| 출력된 AprilTag 마커를 사용한 촬영 | Q4 Native + Q7 레시피 Professional |
| 대규모 야외 / 드론 / 500장 초과 이미지 | Q6 Workspace 임포트 (Metashape나 COLMAP에서 계산한 뒤 불러오기) |
| Metashape/RealityCapture 익스포트 결과가 있을 때 | Q6 임포트 (SfM 불필요) |
| ETH3D / 학술용 COLMAP 텍스트 세트 | Q3 COLMAP 텍스트 임포트 |
| Q4가 실패했을 때 | Q5 Native 글로벌 (자동으로 전환됨) |
빠른 비교
| 백엔드 | 앱스토어 | 샌드박스 | 외부 바이너리 | 최적 용도 | 최대 ~카메라 수 |
|---|---|---|---|---|---|
| Q1 Apple PG | ✅ | ✅ | — | 궤도 객체 | ~300 |
| Q2 COLMAP 바이너리 | ❌ (개발자 빌드에서만) | — | colmap/glomap | 대형 실외 | ~5 000 |
| Q3 COLMAP 텍스트 임포트 | ✅ | ✅ | — | 벤치 리그 | ~1 500 |
| Q4 네이티브 순차적 | ✅ | ✅ | — | 궤도 객체 | ~200 |
| Q5 네이티브 전역 | ✅ | ✅ | — | Q4-폴백 | ~5 000 |
| Q6 워크스페이스 임포트 | ✅ | ✅ | — | Metashape 재사용 | 소스 별 |