제 2 장 — 인스펙터 (Expert View)

가져오기 전의 빈 인스펙터: 왼쪽 사이드바에 Images 카운터 0과 드롭 힌트 "Drop images here / or tap + to import"가 표시됩니다. 오른쪽 인스펙터는 완전히 작동하지만 프리셋은 정보용일 뿐입니다 (활성 학습 없음). 기본 프리셋 "Preview" (5K iters) 가 표시되어 있습니다. Camera Alignment는 Apple Photogrammetry, Densification은 Classic, SSIM Weight는 0.20, Render Scale은 50%입니다. Training Metrics ("Start training to see live metrics") 와 Loss History ("Loss curve will appear during training") 의 비어 있는 상태도 표시됩니다.

가져오기 후의 인스펙터: 헤더 상태 "60 images ready". 이미지 사이드바는 60개의 가져온 프레임 (frame_0001.jpg에서 frame_0945.jpg 까지, 빠른 반복을 위한 부분 집합으로 960-Cam Bouquet 데이터셋의 16번째 프레임마다 하나) 을 모두 나열합니다. 자동 Render Scale 로직은 이미지 해상도 (1536×2048 = 3.1 MP) 를 검사하여 Render Scale을 그에 맞게 조정합니다. Play 버튼 (왼쪽 아래 녹색) 이 이제 활성화되어 있고 활성 프리셋으로 학습을 시작합니다.

학습 중인 인스펙터: 제목 표시줄에 전체 진행률 "RadianceKit — Training NN %"가 표시됩니다. 뷰포트는 실행 중인 Gaussian 재구성을 실시간으로 렌더링합니다 (50회 반복마다 업데이트됨 — Live Preview 간격은 Settings → General → Training → Live Preview에서 설정 가능). 뷰포트 아래의 메트릭 바: 현재 Loss, Learning Rate, Gaussian Count, 그리고 반복 카운터 (예: Preview 프리셋의 경우 1,600/5,000). 인스펙터 프리셋 카드 "Preview"는 어떤 매개변수든 내장 기본값에서 벗어나면 "Modified" 배지를 표시합니다. 사이드바 "Log"는 SfM 및 학습 단계 이벤트를 수집합니다.

학습 후의 인스펙터: 제목 표시줄에 최종 Gaussian 수 (여기서는 2 991 — 합성 Blender Bouquet 장면이 밝은 배경에 단순한 형상을 갖고 있어 매우 작음) 가 표시됩니다. 뷰포트는 완성된 점 구름을 보여 줍니다 — 궤도형 드래그 내비게이션 활성화 (장면 중심을 회전축으로). Training Metrics 섹션은 이제 최종 값들로 채워져 있고, Loss History 차트는 5 000회 반복 전체의 진행을 보여 줍니다. 아래의 Export 섹션이 이제 활성화되어 있습니다 (모든 형식 버튼이 활성).
인스펙터는 Expert Mode (⌘2) 의 오른쪽 사이드바입니다. 학습 관련 모든 매개변수를 다섯 개의 접을 수 있는 섹션 (Presets, Training Configuration, Enhancements, Metrics, Loss Chart) 으로 묶어 둡니다. 각 섹션은 헤더를 클릭하면 접을 수 있고, 순서는 드래그 앤 드롭으로 재배열할 수 있습니다 (InspectorView.swift:81-97). 기본적으로 모든 섹션이 표시되며, 앱 상태는 접기 및 순서 설정을 앱 시작 간에도 유지합니다.
인스펙터의 일부 조작 요소는 거의 동일한 형태로 설정 (제 3 장) 에서도 나타납니다 — 일반적으로 SfM 백엔드, Sky Masking과 유사한 기본값들입니다. 분리는 의도적입니다. 설정은 새로 만든 프로젝트에 대한 앱 전역 템플릿을 제공하고, 인스펙터는 현재 열려 있는 프로젝트에 대해 이 값들을 재정의합니다. 한쪽의 조작 논리를 알면 다른 쪽도 익숙하게 사용할 수 있습니다.
Expert Mode의 왼쪽 열 — Project Navigator — 은 인스펙터에 속하지 않지만 바로 옆 이웃입니다. 거기서는 가져온 이미지를 클릭하여 선택하고, 스페이스 바로 Quick Look으로 미리 보고, 마이너스 버튼이나 Delete 키로 삭제할 수 있습니다 (Cmd-Z로 되돌리기). 인스펙터는 현재 사이드바 선택을 따라 컨텍스트 별 세부 정보를 표시하지만, 다섯 개의 주요 섹션은 항상 표시됩니다.
Presets 섹션 (I1–I11)
Presets 섹션은 검증된 구성을 가장 빠르게 적용하는 방법입니다. 내장 프리셋 (Classic, MCMC, Scene-Class) 은 560+ 개의 문서화된 실험에서 나온 재현 가능한 시작점을 제공하고, 자체 프리셋은 저장, 내보내기, 가져오기, 공유할 수 있습니다. 목록은 카테고리 (Classic, MCMC, SceneClass, Custom) 별로 그룹화되어 있으며, 한 번에 둘 이상의 카테고리를 펼칠 수 있습니다. 컨텍스트 메뉴 (행 마우스 오른쪽 클릭) 를 통해 Export, Duplicate, 그리고 — 자체 프리셋의 경우 — Delete에 접근할 수 있습니다.
I1Save… 버튼
위치
인스펙터 → Presets 섹션 → Save… 버튼 (하단 동작 표시줄).
기술적 설명
텍스트 필드와 Save/Cancel 버튼이 있는 팝오버를 엽니다. 현재 TrainingConfig 상태가 새로운 사용자 정의 프리셋으로 영구화됩니다 (JSON 인코딩, 앱 전역으로 저장). 저장 동작은 81개의 학습 매개변수와 현재 Densification 전략을 모두 복사합니다. 프리셋은 어떤 내장 프리셋에서 파생되었는지에 관계없이 자동으로 Custom 카테고리에 들어갑니다. 빈 이름과 순수 공백만 입력하면 거부됩니다. 이미 존재하는 이름은 거부되지 않습니다 — 각 프리셋은 자체 내부 ID를 가지며, 중복 이름은 기술적으로 허용되나 실제로는 혼란을 줍니다.
I2Preset Name 텍스트 필드
위치
Save 팝오버 → "Preset Name" 텍스트 필드.
기술적 설명
둥근 테두리의 단순한 텍스트 필드, 넓은 형태입니다. Save 버튼을 클릭하면 값이 프리셋 이름으로 전달됩니다. UI에는 길이 제한이 없지만, 저장된 이름은 JSON 인코딩이 가능해야 하고 UI 목록에 표시될 수 있어야 합니다 — 이모지와 움라우트는 작동합니다. 팝오버를 열 때 내용은 자동으로 빈 문자열로 재설정됩니다. 필드가 트림 후 비어 있는 동안에는 Save 버튼이 비활성화 상태로 유지됩니다. 자동 추천은 없고 현재 활성 프리셋 이름이 미리 채워지지도 않습니다.
I3Cancel 버튼 (Save 대화창)
위치
Save 팝오버 → Cancel 버튼 (왼쪽).
기술적 설명
저장하지 않고 팝오버를 닫습니다. 텍스트 필드 내용을 폐기합니다 — 다음에 열 때 Save… 버튼 로직 (I1) 을 통해 다시 비워집니다. 표준 버튼 스타일, 확인 대화창 없음, 단축키 없음. 저장 경로가 실행되지 않았기 때문에 현재 TrainingConfig는 변경되지 않습니다.
I4Save 버튼 (Save 대화창)
위치
Save 팝오버 → Save 버튼 (오른쪽, 강조된 스타일).
기술적 설명
실제 영구화를 트리거합니다. 비어 있지 않은 이름을 다시 한 번 검증하고 (방어적 점검) 현재 TrainingConfig를 JSON으로 앱 저장소에 기록합니다. 그 후 팝오버를 닫습니다. 파란색으로 강조되며, 텍스트 필드가 비어 있는 동안에는 회색입니다. 저장이 실패할 경우 (예: 앱 저장소가 가득 차서 — 매우 드묾) 현재 표시되는 오류 대화창은 없습니다. 그 경우 프리셋은 다음 앱 시작 시 단순히 나타나지 않게 됩니다.
I5Export… 버튼
위치
인스펙터 → Presets 섹션 → 동작 표시줄 → Export… 버튼.
기술적 설명
현재 선택된 프리셋을 .radiancepreset 파일 (내부는 JSON) 로 내보냅니다. 프리셋이 선택되지 않았다면 비활성화됩니다. 클릭 시 앱은 미리 정해진 파일 이름 (프리셋 이름 + .radiancepreset 확장자) 이 있는 저장 대화창을 엽니다. 저장된 형식은 전체 TrainingConfig와 메타데이터 (이름, 카테고리, ID, 내장 플래그) 를 포함합니다. Finder에서 더블 클릭하면 앱이 열리지만 자동으로 가져오기를 실행하지는 않습니다. 사용자는 가져오기 버튼 (I6) 을 사용해야 합니다.
I6Import… 버튼
위치
인스펙터 → Presets 섹션 → 동작 표시줄 → Import… 버튼.
기술적 설명
.radiancepreset 파일만 허용하는 파일 대화창을 엽니다 (다중 선택 비활성화). 선택 시 JSON 파일이 로드되고 검증되어 Custom 카테고리에 삽입됩니다 — 내장 프리셋과의 충돌을 방지하기 위해 새 내부 ID로 등록됩니다. 가져오기는 내보낸 프리셋이 원래 예: 내장이었더라도 카테고리를 자동으로 Custom으로 설정합니다. 손상된 파일이나 이전 스키마 버전과 호환되지 않는 파일은 오류 대화창 없이 조용히 거부됩니다 (콘솔 로그에는 정보가 제공됨).
I7프리셋 행 (클릭으로 활성화)
위치
인스펙터 → Presets 섹션 → 각 카테고리의 각 프리셋 행.
기술적 설명
프리셋 행을 클릭하면 TrainingConfig의 모든 필드가 프리셋의 값으로 대체되고, 활성 프리셋의 ID가 기록되며, Modified 상태가 초기화됩니다. 행 앞의 활성 체크 마크는 프리셋이 선택되고 동시에 수정되지 않은 경우에만 나타납니다. TrainingConfig의 어떤 값이 변경되는 즉시 (다른 인스펙터 섹션의 슬라이더, 스테퍼, 토글), 이름 뒤에 주황색 "Modified" 배지가 나타납니다. 내장 프리셋은 덮어쓸 수 없습니다 — 수정 시 Save 버튼 (I1) 을 통해 자체 복사본을 만들어야 합니다.
I8컨텍스트 메뉴 "Export…"
위치
각 프리셋 행 마우스 오른쪽 클릭 → 첫 번째 항목 "Export…".
기술적 설명
I5 (Export… 버튼) 와 기능이 동일하지만 더 편리하게 접근할 수 있습니다 — 프리셋을 먼저 선택할 필요 없이. 클릭된 행의 프리셋을 직접 내보냅니다. 모든 프리셋 카테고리 (내장 또는 Custom) 에 동일하게 작동하며 제한이 없습니다. 내보내기에는 내장 플래그와 원래 카테고리가 포함되지만, 다시 가져올 때는 I6에 설명된 대로 카테고리가 Custom으로 매핑됩니다.
I9컨텍스트 메뉴 "Duplicate"
위치
각 프리셋 행 마우스 오른쪽 클릭 → 두 번째 항목 "Duplicate".
기술적 설명
프리셋을 Custom 카테고리에 복제합니다. 새 내부 ID를 생성하고 이름에 " Copy"를 추가한 뒤 복사본을 저장합니다. 내장 프리셋에도 작동합니다 — 그러면 복제본을 편집할 수 있습니다. 원본은 그대로 유지됩니다. TrainingConfig는 값별로 복사됩니다 (JSON 라운드트립). 따라서 원본과 복사본 사이에 참조 결합이 없습니다.
I10컨텍스트 메뉴 "Delete"
위치
자체 프리셋 행 마우스 오른쪽 클릭 → 마지막 항목 "Delete" (빨강, destructive).
기술적 설명
Custom 프리셋에서만 표시됩니다. 내장은 삭제할 수 없습니다. 항목은 파괴적인 것으로 표시되며, 컨텍스트 메뉴에 빨간색으로 나타나고 실수로 클릭하지 않도록 구분선 뒤에 배치됩니다. 확인 대화창은 없습니다 — 한 번 클릭하면 프리셋이 즉시 삭제됩니다. 삭제된 프리셋은 복원할 수 없습니다 (Cmd-Z가 여기서는 작동하지 않습니다 — 현재 빌드에서 Undo는 이미지 목록에만 있고 프리셋 작업에는 없음). 삭제된 프리셋이 막 활성 상태였다면 현재 TrainingConfig는 변경되지 않고 활성 프리셋 선택만 해제됩니다.
I11카테고리 헤더 (펼치기/접기)
위치
인스펙터 → Presets 섹션 → 각 카테고리 헤더 (Classic, MCMC, SceneClass, Custom).
기술적 설명
카테고리별 접기 상태는 서로 다른 기본값을 가집니다. Classic은 펼쳐진 상태로 시작하고, MCMC, SceneClass, Custom은 접힌 상태로 시작합니다. 상태는 영구화되지 않습니다 — 앱 재시작 시 모든 카테고리가 다시 기본 상태로 돌아갑니다. 셰브런 화살표는 애니메이션으로 회전합니다. 헤더 오른쪽의 숫자는 이 카테고리의 프리셋 수를 표시합니다. 클릭 히트 영역은 전체 헤더 영역을 포함합니다.
Training Configuration 섹션 (I12–I22)

여기에는 핵심 레버가 모입니다. 어떤 SfM 백엔드가 계산할지, Densification이 어떻게 작동할지, 몇 번의 반복을 수행할지, SSIM 가중치를 얼마로 할지 등입니다. MCMC 전략의 경우 두 가지 추가 토글 ("MCMC Quality"와 "Auto-scale by scene") 이 나타나며, Classic 모드에서는 숨겨집니다. Native SfM 백엔드의 경우 FOV 재정의 필드가 추가되며, EXIF 초점 거리가 없는 비디오 프레임에만 필요합니다.
I12Camera Alignment 선택기
위치
인스펙터 → Training Configuration → Camera Alignment (상단 세그먼트 선택기).
기술적 설명
Apple Photogrammetry와 Native (Beta) 두 가지 옵션이 있는 세그먼트 선택기입니다. 선택은 다음 카메라 재구성에서 사용되는 SfM 백엔드를 결정합니다. 동시에 어떤 추가 인스펙터 요소가 표시될지에도 영향을 줍니다. Native는 EXIF가 없는 비디오 프레임에만 필요한 FOV 재정의 (I13) 를 추가로 표시합니다. 참고: 매우 큰 야외 촬영의 경우 외부 도구 (Metashape 또는 COLMAP) 의 결과를 Workspace 가져오기로 적용할 수 있습니다 — 제 1 장 (M5) 과 제 9 장 (Q3, Q6) 참고.
I13FOV Override 필드 (Native SfM)
위치
인스펙터 → Training Configuration → FOV Override (Camera Alignment = Native일 때만 표시).
기술적 설명
숫자 텍스트 필드 (범위 0-170°), 기본값 0 = EXIF 또는 휴리스틱으로부터의 자동 결정. 입력 이미지가 초점 거리 메타데이터가 없는 비디오에서 추출된 경우 수동 입력이 필요합니다. 일반적인 값: iPhone Wide ≈ 73°, DJI Mavic Wide-Crop ≈ 70°, 풀프레임 센서 드론 ≈ 84°. 값은 [0, 170] 으로 클램프됩니다 — 범위 외 값은 직접 잘립니다. Native SfM 파이프라인 (Q4/Q5) 에만 영향을 줍니다. Apple Photogrammetry는 이 값을 완전히 무시합니다.
I15Densification 선택기
위치
인스펙터 → Training Configuration → Densification (세그먼트 선택기, 항상 표시).
기술적 설명
두 Densification 전략 사이를 전환합니다: Classic (Clone/Split/Prune과 Gradient Threshold를 사용하는 원본 3DGS 방법) 와 MCMC (Relocation과 함께 Stochastic Gradient Langevin Dynamics, NeurIPS 2024). Classic에서 MCMC로 전환할 때 앱은 MCMC 특정 필드를 검증된 기본값으로 자동 설정합니다 (Reg-Weights = 0, MCMC-Cap-Multiplier 3.0, Sample/Noise 스케줄). 이러한 자동 초기화가 없으면 오래된 프리셋이 있는 세션이 1.4.4 MCMC-Collapse 버그 (460K→5 Gaussians, Watchdog Kill) 의 영향을 받습니다. 선택기 선택은 또한 어떤 인스펙터 요소가 표시될지 결정합니다 — MCMC에서는 I16/I17이 나타납니다. 자세한 필드 효과는 제 6 장, T11–T16 (Classic) 과 T61–T73 (MCMC) 에 있습니다.
I16MCMC Quality 토글
위치
인스펙터 → Training Configuration → MCMC Quality (Densification = MCMC일 때만).
기술적 설명
Gradient Accumulation을 2단계 (활성) 또는 1단계 (비활성) 로 전환합니다. 옵티마이저 스텝이 실행되기 전에 연속된 두 개의 카메라 뷰의 그래디언트를 누적합니다. 경험적으로 (세션 33, V544a) 최종 L1 오류를 약 6% 줄입니다 (Horse-Full-MCMC에서 3-trial 평균으로 Quality 포함 0.0246, 미포함 0.0261). 대가: 학습 시간 2배. 매우 긴 학습 (200K 반복) 의 경우 추가로 10분 이상의 대기 시간이 발생합니다 — 따라서 마지막 몇 퍼센트의 품질이 정말로 필요할 때만 가치가 있습니다. 학습에만 영향을 주고, 내보내기 형식이나 뷰포트 표시에는 영향을 주지 않습니다.
I17Auto-scale by scene 토글
위치
인스펙터 → Training Configuration → Auto-scale by scene (MCMC일 때만).
기술적 설명
활성화되면 효과적인 Max-Gaussians 상한이 SfM Init 포인트 수 × MCMC-Cap-Multiplier (기본 3.0) 와 함께 확장됩니다. 예: SfM이 250K 초기 점을 제공하고 베이스 Cap = 150K, Multiplier 3.0 → 효과적 상한 = max(150K, 750K) = 750K. 비활성화되면 베이스만 엄격히 적용됩니다. v1.4.5를 위해 도입되었습니다. 1000 프레임 이상과 상응하는 높은 SfM 점 밀도의 큰 야외 촬영이 경직된 150K 기본 Cap에 의해 Densification을 굶주리게 했기 때문입니다 — 잉여 점들은 남고 새 점들은 생길 수 없었습니다. Custom 프리셋에서는 OFF 기본, MCMC 내장에서는 ON. 학습 시에만 효과, 내보내기에는 영향 없음.
I18Max Iterations 스테퍼
위치
인스펙터 → Training Configuration → GroupBox → Max Iterations.
기술적 설명
범위 1 000–100 000, 단계 1 000인 스테퍼입니다. 옵티마이저 반복의 총 수를 결정합니다. 학습 시간과 선형 상관 (절반 = 약 50% 시간). 경험적 스위트 스폿: 20K (Classic Balanced, L1≈0.028), 40K (Classic Quality, L1≈0.023), 200K (MCMC Full, L1≈0.0246). Classic에서 40K 이상은 평균적으로 거의 개선을 가져오지 않습니다 — Diminishing Returns. 변경 시 Link 기능 (I19) 이 활성이면 Densify Until이 비례적으로 함께 끌려갑니다 (기본 비율: 0.5, 즉 Densify-Until = Max/2).
I19Link/Unlink 버튼 (Densify ↔ Iterations)
위치
인스펙터 → Training Configuration → GroupBox → Max Iterations와 Densify Until 사이의 작은 Link 버튼.
기술적 설명
Densify Until과 Max Iterations의 비율을 고정하는 토글 버튼입니다. 활성 (Link 아이콘 강조) 일 때는 Max Iterations의 변경 시마다 Densify Until이 비례적으로 따라옵니다. Unlink (Link-Plus 아이콘) 일 때는 값이 독립적으로 유지됩니다. 기본은 linked입니다. 이것이 일반적인 상관관계를 반영하기 때문입니다 — 학습을 두 배 반복으로 늘리면 보통 Densification도 비례적으로 더 오래 실행하기를 원합니다. 비율은 Link 버튼 설정 시 현재 값에서 계산됩니다. 일반적인 비율은 0.5입니다 (Densify-Until = 반복 수의 절반).
I20Densify Until 스테퍼
위치
인스펙터 → Training Configuration → GroupBox → Densify Until.
기술적 설명
범위 500–50 000, 단계 500인 스테퍼입니다. Clone/Split (Classic) 또는 Relocation (MCMC) 을 통해 새 Gaussian이 더 이상 추가되지 않는 반복 인덱스를 결정합니다. 도달 후에는 위치와 색상만 정제됩니다. 값이 클수록 = Gaussian 더 많음 = 더 큰 파일, 더 긴 반복당 시간 (스텝당 GPU 시간 +30-60%). 일반적인 값: 15K (30K Max-Iter용), 20K (40K용), 100K (200K MCMC용). Link (I19) 가 활성이면 자동으로 함께 확장됩니다. Classic과 MCMC에서 다르게 작용합니다: Classic은 성장을 완전히 중지하고, MCMC는 Relocation 로직을 중지하지만 Sample/Noise 적응은 계속 실행됩니다.
I21SSIM Weight 슬라이더
위치
인스펙터 → Training Configuration → GroupBox → SSIM Weight.
기술적 설명
0.05 단계로 0.0–1.0 슬라이더, "0.20"으로 표시됩니다. L1 Loss (0.0) 와 SSIM Loss (1.0) 를 혼합합니다. L1은 픽셀당 밝기를 조이고, SSIM은 구조적 유사성 (가장자리, 로컬 통계) 을 조입니다. 기본값 0.2는 원본 3DGS 논문 (Kerbl 2023) 의 값이며 수많은 세션에서 강건한 타협안으로 역설계되었습니다. 더 높은 값 (0.5+) 은 세부 보존을 선호하지만 로컬 밝기 오류를 무시할 수 있습니다. 더 낮은 값 (< 0.1) 은 선명한 가장자리에서 세부 손실로 이어집니다. SSIM 계산은 셰이더에서 11×11 Gaussian 윈도우로 실행됩니다. 성능: 0.0 (L1만) 에서 학습이 약 8-12% 더 빠릅니다. 셰이더에서 SSIM 계산이 건너뛰어지기 때문입니다.
I22Render Scale 슬라이더
위치
인스펙터 → Training Configuration → GroupBox → Render Scale.
기술적 설명
0.25 단계로 0.25–1.0 슬라이더, "100%"로 표시됩니다. 원본 이미지 크기 대비 학습 렌더링 해상도를 확장합니다. 성능에서 가장 큰 레버: 50%는 GPU 시간을 약 75% 줄이고 (4배 적은 픽셀이므로), 25%는 약 94%. Gradient Threshold는 자동으로 함께 확장됩니다. 슬라이더 아래에 MP 단위의 실시간 해상도 표시가 나타납니다 (예: "2304×1296 (3.0 MP)"). 현재 값이 권장값과 다른 경우 주황색 글자로 "— recommended: 50%"가 표시됩니다. 권장 사항은 ~3 MP 효과적 해상도를 목표로 합니다 — Apple Silicon GPU가 가장 효율적으로 처리할 수 있는 범위입니다. 예: 4K 원본 이미지는 자동으로 25%, FullHD 이미지는 100%가 권장됩니다. 변경 시 버퍼 재할당도 트리거됩니다.
Enhancements 섹션 (I26–I29)

Enhancements 섹션은 핵심 학습 루프 자체를 변경하지 않고 이미지 품질을 개선하는 네 가지 기능을 그룹화합니다. 처음 세 가지 (I26-I28) 는 Post-Training 또는 Viewport 단계 입니다. Compactification은 학습 종료 후 정리하고, MetalFX와 MPS Lanczos는 순수한 뷰포트 렌더러로 실행 중인 학습에 영향을 주지 않습니다. Perceptual Loss (I29) 는 섹션 소속에도 불구하고 학습 구성 요소입니다 — 학습 중에 추가 Loss 항으로 활성화되므로 구분선을 통해 뷰포트 토글과 분리됩니다.
I26Post-Training Compactification 토글
위치
인스펙터 → Enhancements → Post-Training Compactification.
기술적 설명
V443 Post-Processing을 활성화합니다. 학습 반복 종료 후 Opacity 0.01 (1% 가시성) 미만의 Gaussian이 삭제됩니다. 경험적으로 이는 시각적 품질 손실 없이 파일 크기를 ~55-58% 줄입니다 — 이러한 Gaussian은 어쨌든 시각적으로 기여하지 않기 때문입니다. Compactification은 GPU 컴팩트 패스로 실행되며 Gaussian 수에 따라 1초 미만에서 몇 초까지 걸립니다. 학습 성능에는 영향을 주지 않습니다. 이 토글이 꺼져 있으면 보이지 않는 Gaussian도 내보내집니다 — 추가 학습 단계 (Continue Training) 용으로 형식을 사용하려는 경우에만 관련성이 있고, 그렇지 않으면 저장 공간 낭비입니다.
I27MetalFX Spatial Upscaling 토글
위치
인스펙터 → Enhancements → MetalFX Spatial Upscaling.
기술적 설명
Apple의 MetalFX Spatial Upscaler를 뷰포트 렌더러에서 활성화합니다. 학습 해상도 (I22 Render Scale 을 통해) 가 뷰포트 크기보다 낮은 경우 MetalFX는 렌더링된 프레임을 ML 기반으로 디스플레이 크기로 업스케일링합니다. 모든 스케일링 옵션 중 가장 선명한 결과를 제공합니다. ML 업스케일러 모델이 선명한 가장자리에 최적화되어 있기 때문입니다. 렌더러 파이프라인은 전환 시 실시간으로 재구성됩니다 — 재시작 없이 즉시 보입니다. MPS Lanczos (I28) 보다 우선합니다: 둘 다 활성인 경우 MetalFX가 우선합니다. 뷰포트 성능 오버헤드는 M3 GPU에서 프레임당 약 1-2ms입니다. 실시간 뷰포트에만 작용하고, 렌더링된 내보내기 (Orbit 비디오, 스크린샷) 에는 작용하지 않습니다 — 그것들은 전체 원본 해상도로 렌더링됩니다.
I28MPS Lanczos Scaling 토글
위치
인스펙터 → Enhancements → MPS Lanczos Scaling.
기술적 설명
Apple의 Metal Performance Shaders를 Lanczos 재샘플링과 함께 뷰포트 업스케일러로 활성화합니다. Lanczos는 8-Tap Sinc 필터를 사용하는 고전적 재샘플링 — 바이리니어보다 선명하며, ML이 없는 고전적 알고리즘입니다. 렌더러 파이프라인은 전환 시 실시간으로 재구성됩니다. MetalFX (I27) 도 활성이면 무시됩니다. 최소한의 오버헤드 (프레임당 <0.5ms) 이지만 품질은 MetalFX보다 낮습니다. 적용: MetalFX가 아티팩트를 만드는 장면 (예: ML 업스케일러가 가끔 "매끄럽게 다리는" 강한 선 구조) 의 대체. I27처럼 실시간 뷰포트에만 작용하고 내보내기에는 작용하지 않습니다.
I29Perceptual Loss 슬라이더
위치
인스펙터 → Enhancements → Perceptual Loss.
기술적 설명
0.01 단계로 0.0–0.2 슬라이더, 0.0에서 "Off"로, 그렇지 않으면 "0.05" 등으로 표시됩니다. 렌더링의 다중 스케일 Gaussian Blur를 Ground Truth 이미지와 비교하는 추가 Loss 항을 활성화합니다 (3 Blur 스케일). L1+SSIM만으로는 인식하지 못하는 구조적 차이를 포착합니다. V460 구현. 경험적으로 0.05-0.1의 값은 세션의 L1 점수를 몇 퍼센트 개선하지만 ~5% 학습 시간이 듭니다 (Blur 커널을 통한 추가 Forward Pass). 0.15 이상에서는 학습이 불안정해지고 L1이 다시 악화됩니다 (Loss 항이 최적화를 지배). 학습 중에 작용하고 Post-Processing에는 작용하지 않습니다 — "Enhancements" 섹션의 위치에도 불구하고 순수한 후속 업그레이드는 아닙니다.
Metrics 섹션 (I30–I38)

학습이 실행되는 동안 Metrics 섹션은 학습 루프의 아홉 가지 실시간 값을 표시합니다. 학습 시작 전에는 섹션이 비어 있습니다 ("Start training to see live metrics"). 모든 값은 ~30회 반복마다 업데이트됩니다 (AsyncStream 업데이트 빈도). 섹션은 읽기 전용입니다 — 어떤 요소도 클릭하거나 변경할 수 없습니다. 더 깊은 분석을 위해서는 ~/Documents/RadianceKit/Logs/ 아래의 JSONL 학습 로그를 참고하십시오 (스크립트 python3 scripts/analyze_logs.py best 5).
I30Iteration
위치
인스펙터 → Metrics → Iteration. 읽기 전용.
기술적 설명
"4523 / 40000" 형식으로 표시됩니다 — 현재 반복과 계획된 총 반복. 학습 루프와 동기적으로 카운트되며, 루프는 ~30 Iter마다 값을 푸시합니다. 두 번째 숫자는 시작 시점의 Max Iterations 값에 해당합니다. 사용자가 그 후 스테퍼를 조정해도 변경되지 않습니다 — 실행 중인 실행은 자체 스냅샷 복사본을 사용합니다. 학습 메뉴를 통해 앱이 반복을 추가하면 (Continue Training +5K/+10K/+20K) 분모가 증가합니다.
I31Loss
위치
인스펙터 → Metrics → Loss. 읽기 전용.
기술적 설명
소수점 6자리의 Float 값 (예: "0.024385"). 결합된 L1+SSIM Loss (I21 SSIM Weight를 통해 혼합 제어) 와 선택적으로 Perceptual Loss (I29) 및 기타 정규화 항을 측정합니다. 스케일은 절대적이지 않고 장면별이며 — 대부분의 비교에 동일한 데이터셋이 필요합니다. 좋은 구성의 일반적인 최종 값: - Classic Quality 40K iters: 0.022–0.025 (Horse, Truck, Garden) - MCMC Full 200K iters: 0.024–0.028 - Outdoor Drone 30K: 0.030–0.060 (형상 때문에 더 나쁨) - Indoor 아파트: 0.018–0.025
5K 반복 후 0.10 초과 값은 SfM 문제 (나쁜 카메라 포즈) 를 시사합니다 — 중단하고 SfM을 다시 계산하십시오.
I32Learning Rate
위치
인스펙터 → Metrics → Learning Rate. 읽기 전용.
기술적 설명
과학적 표기법 표시 (예: "1.60e-04"). 위치 매개변수에 대한 현재 학습률 (3DGS에는 위치, SH-DC, SH-Rest, Opacity, Scale, Rotation에 대한 여섯 개의 독립적인 LR이 있으며 — 여기에는 위치 LR이 대표값으로 표시됨). 기본 시작값은 1.6e-4이며, 지수 감쇠를 통해 학습 종료 시 ~1.6e-6까지 떨어집니다. 감쇠는 학습 구성의 LR Schedule 필드 (제 6 장 T 필드) 를 통해 조정할 수 있습니다. LR이 비정상적으로 높게 유지되면 (예: 10K 반복 후 1e-3 이상) 잘못 로드된 구성을 시사할 수 있습니다.
I33SH Degree
위치
인스펙터 → Metrics → SH Degree. 읽기 전용.
기술적 설명
정수 0-3. 색상 표현에 대한 Spherical Harmonics 차수. 0 (DC 성분만, 즉 Gaussian당 방향 독립적 색상 — 즉 RGB 상수 하나만) 에서 시작하여 학습 진행 과정에서 점진적으로 3까지 상승합니다. 표준 스케줄은 1000/2000/3000 반복에서 차수를 1씩 올립니다. SH-3은 Gaussian당 48개의 색상 계수에 해당합니다 (RGB 채널 3개 × SH 기저 함수 16개). 더 높은 SH 차수 = 더 많은 방향 의존성 반사 (광택 표면이 다른 시점에서 올바르게 다르게 보임), 그러나 더 많은 메모리와 더 느린 학습.
I34Gaussians
위치
인스펙터 → Metrics → Gaussians. 읽기 전용.
기술적 설명
현재 모델의 Gaussian 수로, Locale 구분자로 형식화됩니다 (예: "524.318"). 성장: - Classic: SfM 초기 점 (일반적으로 50K-300K) 에서 시작하여 Clone/Split을 통해 Densify Until 직전까지 성장한 뒤 학습 종료까지 정적 (Pruning 제외) - MCMC: MCMC Cap까지 샘플 포인트 추가, 그 후 Relocation만
건강한 최종 값: - Classic Quality: 400K-700K (Horse 524K, Garden 800K) - MCMC Full: 정확히 Cap 위 (기본 150K, Auto-Scale Multiplier × SfM Count로 장면에 따라 500K-1.5M)
MCMC에서 숫자가 Cap의 < 60%로 떨어지면 → 이상 (Collapse 지표, 너무 공격적인 정규화 항을 시사).
I35GPU Memory
위치
인스펙터 → Metrics → GPU Memory. 읽기 전용.
기술적 설명
Gaussian 수 × 616 바이트 (Memory Style로 형식화) 로 Gaussian 버퍼 메모리 사용량의 추정치. 616 바이트는 완전히 갖춰진 Gaussian의 경험적 크기입니다 (위치, 스케일, 회전, Opacity, SH 계수 차수 3, Gradient Accumulator). 표시는 렌더러 오버헤드 (Tile Buffer, Sort Buffer, Backward Buffer) 를 포함하지 않습니다 — 실제 GPU 메모리 요구량은 일반적으로 이 값의 2-3배입니다. 500K Gaussian에서: 표시 ~290 MB, 실제 ~700 MB. 1.5M Gaussian에서: 표시 ~880 MB, 실제 ~2.5 GB. 64+ GB 통합 메모리의 M3 Max에서는 문제가 없지만, 18 GB의 M3 Pro에서는 이미 한계입니다.
I36Speed
위치
인스펙터 → Metrics → Speed. 읽기 전용.
기술적 설명
소수점 한 자리의 초당 반복 수 ("24.3 it/s"). 트레이너에 의해 최근 ~100 반복에 대한 슬라이딩 평균으로 계산됩니다. 일반적인 값: - Quick Preset (1K iters): 80-120 it/s (짧음, Steady State 없음) - Classic 20K @ 1.0 Render Scale (Truck 장면, M3 Max): 25-35 it/s - Classic 20K @ 0.5 Render Scale: 80-120 it/s - MCMC 200K @ 0.5 Render Scale: 25-50 it/s (Relocation 때문에 더 느림) - 1M+ Gaussian과 전체 해상도: < 10 it/s
학습 진행 과정에서 Speed 감소는 정상입니다 — 더 많은 Gaussian = 반복당 더 많은 컴퓨팅. 갑작스러운 하락 (예: 30 → 5 it/s) 은 GPU 열 스로틀링이나 경쟁 앱을 시사합니다.
I37Elapsed
위치
인스펙터 → Metrics → Elapsed. 읽기 전용.
기술적 설명
이미 경과한 시간으로 "4:23" (m:ss) 또는 "1:23:45" (h:mm:ss). 1시간부터 형식이 전환됩니다. 순수한 학습 시간만 측정합니다. 선행 단계 (SfM 계산, 이미지 가져오기) 는 포함되지 않습니다. Pause/Resume 시 시계는 계속 흐릅니다 — 즉 Wall Clock 시간이며 CPU 시간이 아닙니다.
I38ETA
위치
인스펙터 → Metrics → ETA. 읽기 전용.
기술적 설명
추정 남은 시간으로 "17:42" 또는 "1:12:35"로 표시됩니다. 계산: (Max Iterations − 현재 Iteration) / 초당 반복 수. Speed가 현재 0인 경우 (가장 처음 또는 일시 정지 시) "–"를 표시합니다. 추정치는 학습 종료 시의 일반적인 감속에 적응하지 않습니다 — 특히 MCMC와 큰 Densify Until 값의 Classic은 더 많은 Gaussian이 이미지에 들어오면서 느려지는 경향이 있습니다. 실제로는 일반적으로 초기 ETA보다 10-20% 정도 더 오래 걸립니다.
Loss Chart 섹션 (I39–I41)

Loss Chart 섹션은 학습 진행을 시간에 따라 시각화합니다. 두 차트로 구성됩니다. 큰 Loss Curve 차트 (위, 파란색) 와 작은 Gaussian Count 차트 (아래, 주황색) 입니다. 둘 다 학습 중에 실시간으로 구축되며 다음 학습 시작까지 유지됩니다. 첫 학습 전에는 영역이 비어 있습니다 ("Loss curve will appear during training"). 차트는 순수 SwiftUI Path 드로잉 (Swift Charts 프레임워크 없음) 이므로 100K+ 포인트에서도 매끄럽게 렌더링됩니다.
I39Current Loss (표시)
위치
인스펙터 → Loss Chart → 왼쪽 레이블 영역 "Current: 0.0287". 읽기 전용.
기술적 설명
마지막 Loss 샘플 포인트의 Float 값으로, 소수점 4자리로 형식화됩니다. I31 (Metrics 섹션의 Loss) 과 동일하지만 여기서는 더 간결하게 형식화됩니다. 출처는 Loss History — ~30회 반복마다 항목을 받는 목록입니다. 유한한 값만 목록에 추가됩니다 — NaN/Infinity (Gradient Explosion 버그의 경우 매우 드물게) 는 필터링됩니다.
I40Min Loss (표시)
위치
인스펙터 → Loss Chart → 오른쪽 레이블 영역 "Min: 0.0245" (녹색). 읽기 전용.
기술적 설명
현재 학습 실행에서 본 모든 Loss 값의 최솟값. Loss History에서 실시간으로 재계산됩니다 — 별도의 영속성 없음. 녹색 글자로 표시됩니다. "Min" = "Best so far"이기 때문입니다. 차트 하단의 점선 녹색 선은 이 Y 위치를 시각적으로 표시합니다. Continue Training 세션의 경우 최솟값 추적이 새로 시작됩니다 — 이전 History는 UI에서 새 것으로 대체됩니다 (추가되지 않음). 현재 학습이 이전보다 더 나쁘게 실행되면 Min 표시가 이전 최종 결과보다 클 수 있습니다.
I41Gaussian Count Chart
위치
인스펙터 → Loss Chart → 아래의 두 번째 차트 (주황색). 읽기 전용.
기술적 설명
학습 반복에 대한 Gaussian 수의 선 다이어그램. 출처: Gaussian Count History (트레이너에 의해 ~30 Iter마다 채워진 (Iter, Count) 쌍의 목록). Y 스케일은 History의 최솟값과 최댓값 사이에서 동적입니다. Classic 전략의 경우 곡선은 일반적으로 다음과 같이 보입니다: Densify Until까지 지속적으로 증가, 그 후 평평 (작은 Pruning 변동 포함). MCMC의 경우: Cap까지 가파른 상승, 그 후 수평선 (Relocation은 숫자를 일정하게 유지). 활성 학습에도 불구하고 곡선이 떨어지면 Densification이 너무 공격적으로 Prune하는 것 — 잘못된 기본값 또는 알려진 MCMC-Collapse 버그 (v1.4.4 핫픽스 주제) 의 표시.
Loss 곡선을 어떻게 읽는가?
Loss 차트는 인스펙터에서 가장 중요한 진단 도구입니다 — 다른 어떤 지표도 학습이 유용하게 진행되고 있는지 또는 막혀 있는지를 이렇게 직접적으로 보여 주지 못합니다. 일반적인 건강한 형태는 처음 1000-3000 반복에서의 빠른 하락 (~0.15에서 ~0.05로), 그 다음 학습 종료까지의 느리고 균일한 하락 (0.020-0.030으로) 입니다. 로그 스케일에서 곡선은 매끄러운 대각선처럼 보입니다.
Loss에서의 평탄 구간은 무엇을 의미하는가? 곡선이 수천 회 반복 동안 평평하게 유지되면 두 가지 가능한 해석이 있습니다. (a) 학습이 "수렴"했음 — 주어진 데이터와 설정으로 모델이 가능한 만큼 좋기 때문에 Loss가 더 이상 의미 있게 감소할 수 없습니다. 이것이 바람직합니다. 이것이 "완료"입니다. (b) 학습이 "막혀 있음" — Loss가 실제로 더 감소할 수 있지만 최적화가 정체되어 있습니다 (지역 최소값, 학습률이 너무 작음, Densification 꺼짐). 구분: Loss 값이 일반적인 좋은 범위에 있고 (0.020-0.030 Indoor/Object, 0.040-0.060 Outdoor) 곡선이 5K 반복 동안 평평하면 수렴된 것입니다. 비교 가능한 장면보다 값이 훨씬 더 높으면 (예: 0.08) 막혀 있는 것입니다.
주의 Gaussian 평탄 구간 ≠ Loss 평탄 구간. Gaussian 수의 평탄 구간은 "학습이 완료됨"을 의미하지 않습니다. Densification이 새 점을 추가하는 것을 중단했다는 것만 의미합니다 — Densify Until에 도달했거나 (Classic) MCMC Cap이 가득 찼기 때문입니다. 그 후에도 학습은 계속 실행되며 기존 점만 정제합니다. 실제 "완료" 신호는 Loss 곡선과 Iteration 표시 (I30) 에서 읽어야 하며 여기서는 아닙니다.
중단을 위한 경험 법칙: Loss 곡선이 5000+ 반복 후에도 0.08을 넘고 거의 감소하지 않으면 높은 확률로 SfM 재구성이 잘못된 것입니다. 학습을 중단하고 제 9 장에서 선택한 SfM 백엔드가 장면에 적합한지 확인하고, 필요 시 COLMAP/Native로 전환한 뒤 새로 시작하십시오. 잘못된 카메라 정렬로 2시간의 학습을 하는 것보다 더 나은 SfM에 10분을 투자하는 것이 낫습니다.
언제 인스펙터를 사용해야 하는가?
빠른 참조: 일반적인 사용 사례별로 어떤 섹션 + 어떤 컨트롤?
| 일반 작업 | 섹션 | 컨트롤 ID |
|---|---|---|
| 사전 만들어진 설정 로드 | Presets | I7 (행 클릭) |
| 자체 설정 저장 | Presets | I1 → I2 → I4 |
| 동료와 설정 공유 | Presets | I5 (Export) 또는 I6 (Import) |
| SfM 백엔드 전환 (예: Apple PG가 너무 불안정해서) | Training Configuration | I12 (제 9 장 참고) |
| EXIF 초점 거리가 없는 비디오 프레임 처리 | Training Configuration | I13 (FOV Override) |
| COLMAP 성능: Classic 대신 GLOMAP | Training Configuration | I14 |
| Classic에서 MCMC로 전환 | Training Configuration | I15 |
| 학습을 더 오래 실행 | Training Configuration | I18 (Max Iter) + I20 (Densify Until) — I19로 연결 |
| GPU 시간 절반으로 줄이기 | Training Configuration | I22 (Render Scale 50%) |
| 학습 품질 +6% (MCMC) | Training Configuration | I16 (MCMC Quality) |
| SfM 점이 많은 야외 장면 | Training Configuration | I17 (Auto-scale by scene) |
| COLMAP 경로 설정 / 전환 | Training Configuration | I23 / I24 / I25 |
| 내보내기 파일 더 작게 | Enhancements | I26 (항상 켜 둘 것) |
| 학습 시간 증가 없이 뷰포트 선명하게 | Enhancements | I27 (MetalFX) |
| MetalFX가 너무 매끄럽게 만듦 → 대안 | Enhancements | I28 (MPS Lanczos) |
| 미세 구조에서 마지막 한 방울의 세부 정보 | Enhancements | I29 (Perceptual Loss 0.05-0.1) |
| 학습 모니터링 | Metrics | I30 (진행), I36 (속도), I38 (남은 시간) |
| 품질 일찍 추정 | Metrics | I31 (5K 후 Loss < 0.05 = 좋음) |
| SfM 문제 의심 | Metrics + Loss 차트 | I31 + I39 (5K 후 Loss > 0.08 → SfM 재계산) |
| 수렴 vs 막힘 구별 | Loss Chart | I39 + I40 (Loss 평탄 구간 읽기) |
| Densification 문제 인식 | Loss Chart | I41 (Gaussian 곡선이 떨어짐 → 버그) |