사용자 가이드

Kapitel 4 — Aux-Fenster

메인 윈도우(3D 뷰포트와 Inspector) 외에도 RadianceKit은 여섯 개의 추가 윈도우를 관리하며, 이들 모두 Help 메뉴에서 열 수 있다. 이 메뉴에는 위에서 아래로 여덟 개의 항목이 있다: User Guide (⌘?), Keyboard Shortcuts (⌘/), Open Training Logs… (⇧⌘L), Open Exports Folder…, Manage Storage…, Pareto Dashboard… (⇧⌘D), Holdout Analysis… (⇧⌘H), BayesOpt Console… (⇧⌘B). 두 개의 "Open …" 항목은 앱 윈도우가 아니라 Finder를 여는 것이므로, 여기서는 더 다루지 않는다. 세 개의 윈도우 — Dashboard, Holdout, BayesOpt — 는 독립 적인 분석 도구다: 메인 윈도우와 무관하게 동작하며 디스크에 있는 JSON 파일을 읽거나 쓴다. 이 세 윈도우는 각각 Help 메뉴를 통해 열고, 그 안에서 직접 분석하고자 하는 파일이나 폴더를 선택한다 — "Open Reports Folder…", "Open transforms.json…", 혹은 "Start" 버튼을 통해서다. 이 세 윈도우만은 번역되어 있지 않다: 버튼, 슬라이더, 열 제목은 어떤 언어판에서도 영어로 표시된다. 여기서 언급하는 표기들은 화면에서 그대로 볼 수 있다.

세 개의 단순한 윈도우(User Guide, Keyboard Shortcuts, Manage Storage)와 두 개의 폴더 메뉴 항목(Open Training Logs / Open Exports Folder)은 각 조작 요소마다 짧은 항목으로 정리되어 있다. 세 개의 분석 윈도우는 더 자세히 문서화되어 있다 — 각각 윈도우에서 무엇을 보게 되는지, 언제 열어야 하는지, 그리고 표시되는 그림을 어떻게 해석해야 하는지 설명하는 도입부와 함께.

이 장의 끝에는 메인 윈도우의 Inspector에 대한 상호 참조 섹션이 있다: 트레이닝이 진행되는 동안 Live Loss 차트와 Gaussian Count 표시에서 어떤 정보를 유의미하게 읽어낼 수 있는지에 대한 내용이다.

사용자 가이드 (W1–W4)

User-Guide-Fenster mit Sidebar links und gerendertem Markdown-Inhalt rechts
왼쪽에 사이드바, 오른쪽에 렌더링된 마크다운 콘텐츠가 있는 사용자 가이드 창

이것은: 앱과 함께 제공되는 guide_<sprache>.md를 렌더링하는 내장 도움말 창이다. 언어는 설정(General 탭 → Language)에서, 그리고 그곳에 "System"으로 되어 있으면 macOS 언어 설정에서 유추된다. 레이아웃은 클래식하다: 왼쪽에 모든 제목을 담은 사이드바, 오른쪽에 본문.

특정 항목에 대한 빠른 상기가 필요할 때 — 즉 키워드 대체용으로. 상세한 레퍼런스는 이 매뉴얼이며, 내장 도움말 창은 빠르게 찾아볼 수 있는 요약본이다. 앱 릴리스마다 함께 업데이트되지만 내용은 더 피상적으로 유지된다.

W1NavigationSplitView (사이드바 + 디테일)

위치

Help → User Guide (⌘?).

기술적 설명

콘텐츠 트리를 위한 좁은 사이드바(최소 180 pt 너비)와 실제 마크다운 콘텐츠를 위한 스크롤 가능한 디테일 영역으로 구성된 2단 레이아웃. 창은 최소 크기 700 × 500 pt를 가진다. 처음 열 때 창은 앱 번들에서 알맞은 guide_<lang>.md를 로드하고(폴백 guide_en.md), 이를 블록 레코드(H1–H4 제목, 단락, 목록, 표, 구분선)로 파싱하며, 사이드바를 위해 제목 구조를 별도로 추출한다. 인라인 서식(굵게, 기울임, 코드 스팬)은 내장된 마크다운 엔진을 통해 렌더링된다. 언어는 앱 설정에서 읽어오는데, 중국어(zh-Hans)와 브라질 포르투갈어 (pt-BR)의 경우 특수하게 처리되어 전체 로케일 태그로 유지된다. 이 변형들은 각각 zh, pt와 구별되기 때문이다.

W2List (제목 사이드바)

위치

사용자 가이드 창의 왼쪽 열.

기술적 설명

현재 마크다운 문서의 모든 H2, H3 제목에 대한 목록. H2 항목은 들여쓰기 없이 중간 굵기의 글꼴로 나타나며, H3 항목은 왼쪽에 16 pt 들여쓰기와 축소된 전경 스타일로 나타난다. 다른 모든 레벨 — H1은 물론 H4 이하도 — 사이드바에 나타나지 않는데, 이는 그렇지 않으면 사이드바가 복잡해지기 때문이다. 앵커 ID는 제목 텍스트에서 슬러그화를 통해 생성된다(소문자 변환 + 공백을 대시로 + 문자/숫자/대시로 필터링 — GitHub가 마크다운 앵커에 사용하는 것과 동일한 알고리즘이며, 따라서 문서에 대한 외부 URL도 잠재적으로 같은 앵커에 도달할 수 있다). 목록은 네이티브 macOS 스타일을 사용한다.

W3Button (제목 → 앵커 이동)

위치

사이드바 행마다 하나의 버튼.

기술적 설명

모든 사이드바 항목은 현재 앵커를 설정하는 버튼이지만, 시각적으로는 목록 항목처럼 보인다. 그러면 관찰자 변수가 0.3초에 걸친 부드러운 애니메이션으로 해당 앵커로의 스크롤 이동을 트리거한다. 이동 후 앵커 값은 다시 초기화되는데, 그래야 같은 앵커를 다시 클릭했을 때도 다시 발동하기 때문이다(그렇지 않으면 값이 변하지 않아서 관찰자가 다시 트리거되지 않는다).

W4ScrollView (디테일 콘텐츠)

위치

오른쪽 열.

기술적 설명

지연 렌더링을 사용하는 스크롤 가능한 수직 스택 콘텐츠 영역. 더 긴 가이드는 200개가 넘는 마크다운 블록을 가질 수 있기 때문이다 — 지연 렌더링을 사용하지 않는 방식은 모든 블록을 동시에 인스턴스화해야 할 것이다. 각 블록은 고유한 ID를 받는데, 제목 앵커(레벨과 무관하게 모든 제목이 받음) 또는 인덱스 플레이스홀더 중 하나다. 최대 너비는 720 pt, 패딩은 가로 32 / 세로 24로, 긴 줄도 읽기 좋은 레이아웃을 유지한다. 표는 셀 단위로 수평 스택과 구분선으로 렌더링되며, 인라인 코드는 내장 마크다운 엔진을 통해 렌더링된다. 실제 코드 블록은 현재 단락으로 처리된다 — 도움말 창의 알려진 제약 사항이다.

키보드 단축키 (W5–W6)

Keyboard Shortcuts 창 — Navigation/Views/Capture/Editor/Training 다섯 그룹, 왼쪽에 단축키 열, 오른쪽에 설명
Keyboard Shortcuts 창 — Navigation/Views/Capture/Editor/Training 다섯 그룹, 왼쪽에 단축키 열, 오른쪽에 설명

다섯 섹션으로 나뉜 정적인 참조 목록. Navigation: Mouse Drag (Orbit/Fly), Shift+Drag/Right-Drag (Pan), Scroll (Zoom), WASD (Fly-Through 이동), Q/E (Up/Down), F (Toggle Orbit/Fly), Double-click (Re-center), Cmd+Scroll (FoV 조정). Views: R (Reset Camera), T (Auto-Rotation), P (Camera Playback), B (Background-Cycle), 0–9 (Training-Cam으로 점프 1=10%/5=50%/0=last), Left/Right Arrow (Prev/Next Cam). Capture: S (Screenshot to Desktop), V (Turntable-Video), C (Copy Camera Info). Editor: Tab (Edit 모드), Click/Drag (Paint-Select), Option+Click (Deselect), X / Delete (선택 항목 삭제), Cmd-Z (마지막 삭제 되돌리기), [ / ] (브러시 크기 축소/확대), Esc (선택 해제). Training: Option+Space (트레이닝 일시정지/재개), Cmd+E (장면 내보내기). 여기에는 이게 전부다 — Start, Cancel과 연장 기능은 Training 메뉴에서 이용할 수 있다 (1장 참고).

무엇인지: 모든 단축키를 한눈에 보여주는 단순한 정적 개요 — Navigation, Views, Capture, Editor, Training. 내용은 코드에 고정되어 있으며 파일에서 불러오지 않는다.

뷰포트에서 뭔가를 가장 빠르게 처리할 방법을 찾을 때. WASD Fly-Through, 카메라 리셋용 R, 배경 순환용 B — 전부 여기 있다.

W5ScrollView (콘텐츠 영역)

위치

Help → Keyboard Shortcuts (⌘/).

기술적 설명

세로 목록이 담긴 단순한 스크롤 영역이다. 사방에 20 pt의 패딩이 있고, 사이드바 내비게이션 트리는 없다 (목록이 충분히 짧기 때문이다). 내용은 다섯 섹션(Navigation, Views, Capture, Editor, Training)으로 그룹화되어 있다. 단축키 조합마다 한 줄씩, 양쪽 열에 번역 가능한 텍스트가 들어간다. 왼쪽 열(키 코드)은 180 pt 너비로 고정되어 있어 오른쪽 설명이 수직으로 정렬된 상태를 유지한다. 스크롤 외에는 상호작용이 없다 — 줄을 클릭해도 아무 일도 일어나지 않으며, 실제 단축키는 메뉴와 뷰포트에서 작동하는 진짜 키보드 모디파이어다.

W6VStack (단축키 섹션)

위치

ScrollView 내부.

기술적 설명

16 pt 간격으로 왼쪽 정렬되어 쌓인 섹션들이다. 다섯 섹션 각각에 제목과 줄 시퀀스가 들어간다. 제목은 보조적인 Subheadline 스타일을 사용한다 — 섹션이 탐색 가능할 필요가 없기 때문에 의도적으로 Title 서식을 쓰지 않았다. 내용은 의도적으로 평평하게 구성되어 있다(Disclosure도, Search도, Filter도 없음). 그래야 이 컴포넌트가 어떤 macOS 버전에서도 변함없이 작동하고 파일도 가독성을 유지할 수 있다.

저장 공간 관리 (W7–W12)

Manage Storage 창 — 헤더에 „1,356 items · 55.1 GB total”가 표시되고, 날짜순으로 정렬된 Export-PLY 파일 테이블에 각각 아이콘 + 파일명 + 크기 + 날짜가 표시됨
Manage Storage 창 — 헤더에 „1,356 items · 55.1 GB total"가 표시되고, 날짜순으로 정렬된 Export-PLY 파일 테이블에 각각 아이콘 + 파일명 + 크기 + 날짜가 표시됨

RadianceKit이 관리하는 모든 파일의 테이블 뷰. 헤더에는 1,356개 항목, 총 55.1 GB가 표시됨. 상단 툴바: „Show in Finder" + „Refresh". 각 행에는 Export 아이콘, 파일명 (예: training_20260718T194416Z.ply), Export 날짜, 크기(이 예시에서는 7.8 MB부터 2.24 GB까지 다양함), 돋보기 아이콘(Reveal), 휴지통 아이콘 (Move to Trash)이 표시됨. 정렬은 먼저 카테고리별로, 카테고리 안에서는 날짜순(최신이 위)으로 이뤄짐. 이 화면에서는 PLY-Export가 대부분인데, 이 보관함에는 주로 트레이닝 결과물이 저장되었기 때문이다.

무엇인가: RadianceKit이 ~/Documents/RadianceKit/ 아래에 저장하는 모든 것 — 로그, Export, Scene, Capture-Bundle(iOS 동반 앱에서 온 것), Import(입력 이미지의 스테이징 사본) — 에 대한 디스크 사용량 개요. 각 항목에는 바이트 단위 크기와 두 개의 버튼이 있다: "Finder에서 보기"와 "휴지통으로 이동". 이것은 자동 정리 기능이 아니다 — 앱이 스스로 아무것도 삭제하지 않으며, 항목별로 직접 결정한다. 이 창은 번역되어 있다: 독일어로는 „Speicher verwalten"이라고 하며, 헤더의 두 버튼은 „Im Finder anzeigen"과 „Aktualisieren", 행의 버튼은 „Im Finder anzeigen"과 „In den Papierkorb legen"이라고 부른다. 아래 항목에 나오는 영어 이름은 영어판에서 사용하는 명칭이다.

디스크가 가득 찰 때. 특히 로그가 쌓이기 쉽다(트레이닝 시도마다 JSONL 하나, 그리고 _qualityMetrics.json); Export도 물론 마찬가지다(PLY는 원본 데이터 100%이며, Export당 하나씩 생성됨). 충돌 발생 후에도 유용한데, Import 스테이징 디렉터리에 입력 이미지의 오래된 사본이 남아 있을 수 있기 때문이다.

W7„Show in Finder" 버튼

위치

저장소 브라우저 창의 헤더 오른쪽 위.

기술적 설명

RadianceKit 데이터 폴더를 Finder에서 연다 — 바로 이 창이 나열하고 있는 내용이 담긴 디렉터리다. 이를 통해 폴더 구조(Logs, Exports, Scenes, Captures, Imports)를 직접 확인할 수 있고, 파일을 Finder에서 직접 이동하거나 복사할 수도 있다. 이 동작은 새 Finder 창을 열며, 이 창의 목록 자체는 그에 따라 갱신되지 않는다 — 그것을 위해 "Refresh"(W8)가 있다.

W8„Refresh" 버튼

위치

헤더, Finder 버튼 옆.

기술적 설명

백그라운드 스캔을 트리거하며, 사용자가 시작한 비동기 작업에서 실행되어 대형 디렉터리 트리를 스캔하더라도 UI가 멈추지 않는다. 실제 순회는 알려진 모든 하위 폴더(Logs, Exports, Scenes, Captures, Imports)를 거치며, 직접적인 자식 항목마다 저장소 항목을 하나씩 생성한다. 항목별로 재귀적 크기를 계산하는데 — 가능하면 실제 디스크 사용량(APFS 하드링크 공유를 포함)을 우선하고, 그렇지 않으면 논리적 파일 크기로 대체한다.

W9List (저장소 항목 목록)

위치

헤더 아래 메인 콘텐츠.

기술적 설명

각 행마다 다음과 같은 레이아웃을 가진 목록: 종류별 SF Symbol 아이콘(Logs는 문서, Exports는 업로드 화살표, Scenes는 큐브, Capture-Bundle은 iPhone, Imports는 트레이), 이름 + 부제목 (종류 라벨 + 형식화된 수정 날짜), 오른쪽의 바이트 카운터(오른쪽 정렬, 고정폭 글꼴), Reveal 버튼(돋보기 아이콘), Trash 버튼(휴지통). 정렬은 1차로 종류별(Scenes 먼저, 그다음 Exports, Logs, Captures, Imports, Other), 2차로 수정 날짜 내림차순(최신이 위)이다. 스캔이 아직 진행 중이면 해당 자리에 대신 "Scanning…" 진행 표시가 나타난다. 아무것도 찾지 못하면 트레이 아이콘과 함께 빈 상태 화면이 표시된다.

W10행 버튼 „Reveal in Finder"

위치

각 행, 오른쪽 돋보기 아이콘.

기술적 설명

Finder를 열고 해당 특정 항목(파일 또는 폴더)을 선택한다. W7과의 차이: W7은 루트 디렉터리를 열지만, W10은 정확히 이 하나의 항목을 선택한다. 실용적인 사용 흐름: 큰 항목을 확인하고, 돋보기를 클릭한 다음, 예를 들어 외부 볼륨으로 복사한다.

W11행 버튼 „Move to Trash"

위치

각 행, 돋보기 옆의 휴지통 아이콘.

기술적 설명

확인 대화상자(W12)를 실행시킨다. 확인 후에야 비로소 macOS의 표준 "휴지통으로 이동" 동작이 실행된다(즉 되돌릴 수 있으며, 직접 삭제되지 않는다). 휴지통 이동이 성공하면 항목이 목록에서 제거되고 전체 바이트 카운터가 갱신된다. 오류가 발생하면 모달 오류 대화상자가 표시된다.

W12ConfirmationDialog (삭제 확인)

위치

W11에 의해 실행되며, macOS Sheet 형태로 표시됨.

기술적 설명

동적 제목 „Delete <name>?"과 함께, 항목이 휴지통으로 이동하며 그곳에서(휴지통을 비우기 전까지는) 복원 가능하다는 점을 명시적으로 알려주는 메시지 줄이 있는 표준 확인 대화상자다. 버튼은 두 개: 파괴적 동작으로 표시되는(빨간색) „Move to Trash"와 자동 Esc 바인딩이 있는 „Cancel". 이 대화상자는 이 창만 차단하고 앱 전체를 차단하지는 않는다는 의미에서 비모달(non-modal)이다 — 이는 되돌릴 수 있는 삭제에 대한 macOS 표준 방식이다.

파레토 대시보드 (W13–W22)

Pareto Dashboard — leerer Zustand vor Report-Import
파레토 대시보드 — 리포트 임포트 전의 빈 상태

빈 상태(처음 열었을 때) — 「Open Reports Folder…」라는 콜투액션이 있는 Empty-State. 트레이닝 리포트가 로드되는 즉시 데이터 포인트가 나타나며, 다음 스크린샷을 참고해줘.

Pareto Dashboard mit 384 geladenen Benchmark-Reports — Gaussians vs PSNR mit Pareto-Front, Scene/Strategy/Mip-Filter
384개의 벤치마크 리포트가 로드된 파레토 대시보드 — Gaussians vs PSNR, 파레토 프론트, Scene/Strategy/Mip 필터

헤더 툴바 우측에는 「384 reports of 384」가 표시돼(선택한 폴더의 모든 리포트가 정상적으로 파싱됨). 「Open Reports Folder…」 버튼 왼쪽에는 로드된 폴더 이름이 나오는데, 여기서는 「Benchmarks」야. 축: X-Axis 피커는 Gaussians, Y-Axis 피커는 PSNR (dB)로 설정되어 있고, 그 옆에는 「Show Pareto Front」 체크박스가 활성화되어 있어. 좌상단 범례: 파란색 = mcmc, 초록색 = classic, 주황색 = hybrid, 그리고 Mip-Splatting On/Off를 나타내는 심볼 모양도 있어. 점선으로 된 파레토 프론트 라인은 가장 좋은 PSNR 값들을 따라 이어지며, 약 30만 Gaussians 부근부터 PSNR≈30 dB에서 평평해져; 점 구름은 150만 Gaussians 이상까지 뻗어 있어. 우측 필터 칩: 30개 이상의 씬(bicycle, bonsai, family, flowers, garden, kitchen, stump, truck 및 번호가 매겨진 360-, drone-, photo- 테스트 시리즈 포함), 3개의 Strategy(classic, hybrid, mcmc), 3개의 Mip-Splatting 옵션(All, On, Off) 중 「All」이 활성화되어 있어. 현재 Scene이나 Strategy 필터는 설정되어 있지 않아서 점들이 빽빽하게 몰려 있는 거야.

이게 뭔지: 여러 트레이닝 런을 비교하는 도구야. 과거에 여러 씬을 학습시켰거나 같은 씬을 서로 다른 프리셋으로 학습시켰다면 — 벤치마크 평가를 실행할 때마다 트레이닝 런 하나당 JSON 리포트 파일이 하나 생기고, 여기에는 Final-PSNR, SSIM, LPIPS, Gaussian-Count, Wallclock 시간 등이 담겨. 이 평가를 위한 스위치가 UI에 따로 있는 건 아니고, 대시보드는 선택한 폴더에 이미 리포트로 존재하는 것을 평가해줘. 이런 리포트가 들어있는 폴더 전체를 한 번에 읽어들여서 선택 가능한 축으로 2D Scatter로 플로팅해줘. 추가로 파레토 프론트(비지배 포인트의 집합)가 점선으로 그려져.

최소 서너 개의 트레이닝 리포트를 만든 후에. 점이 이보다 적으면 프론티어 라인이 의미가 없어. 전형적인 사용 사례: 야외 씬을 재구성하려고 했고, P3 Balanced (Classic), P4 Quality (Classic), P8 Quality (MCMC), P9 Drone / Aerial 순서로 시도해봤다면 — 이제 트레이닝 시간 대비 PSNR이 가장 좋은 구성이 무엇인지, 또는 주어진 PSNR에 대해 Gaussians가 가장 적게 드는 구성이 무엇인지 알고 싶을 거야.

두 축 모두 자유롭게 선택할 수 있어(X축: Gaussians, 트레이닝 시간, PSNR, SSIM, LPIPS 등; Y축도 마찬가지). 파레토 프론트 계산은 각 지표가 「작을수록 좋음」(LPIPS, Gaussians, Training Time, BRISQUE)인지 「클수록 = 좋음」(PSNR, SSIM, FSIM, MS-SSIM)인지 알고 있어 — 그래서 어떤 축을 고르느냐에 따라 라인이 좌하단에서 우상단으로 가거나 좌상단에서 우하단으로 가고, 항상 가장 좋은 조합을 따라가. 어떤 점이 파레토 최적이라는 건 두 차원 모두에서 그 점만큼 좋거나 더 좋은 다른 점이 없다는 뜻이야(즉 그 점을 지배하는 다른 점이 없다는 것). 파레토 최적 점들은 라인 위에 있고, 다른 점들은 (축 방향에 따라) 그 오른쪽/위쪽에 있어. 라인 위에 있는 점들이 「최고의 프리셋」의 진짜 후보이고, 라인에서 멀리 떨어진 점들은 낭비된 트레이닝 시간이야.

선택을 특정 씬으로 제한할 수 있고(예를 들어 야외 런만 비교하고 싶을 때), 특정 전략(classic, hybrid, mcmc)으로 제한할 수도 있고, Mip-Splatting 켜짐/꺼짐으로 제한할 수도 있어(Mip-Splatting은 고급 사용자를 위한 선택적 설정이라서 직접 비교할 가치가 있어).

리포트 폴더 안에 「truck」 씬에 대한 리포트가 세 개 있다고 해보자: Run A(P4 Quality (Classic), 52만 4천 Gs, 105초, PSNR 23.4), Run B(P8 Quality (MCMC), 15만 Gs, 693초, PSNR 24.6), Run C(P5 Ultra Detail, 125만 Gs, 312초, PSNR 25.8). X축을 Training Time, Y축을 PSNR로 설정해봐. Run B는 우상단에, Run C는 그보다 더 우상단에, Run A는 좌하단에 위치해. 파레토 프론트는 A와 C를 연결해 — 둘 다 비지배 점이야. Run B는 「손실」이야(C가 시간과 PSNR 모두에서 더 나으니까). 결론: 「truck」에는 MCMC 방식이 이득이 안 돼; 빠르고 적당한(A) 쪽이거나 길고 아주 좋은(C) 쪽 중 하나야. C의 구성을 별도 프리셋으로 저장해 (Inspector → I1 Save Preset).

다음 동작: 가장 좋은 구성을 프리셋으로 저장하기. 구체적으로는: 파레토 포인트들을 살펴보고(호버하면 툴팁에 PSNR/SSIM/LPIPS/Gs/Time이 표시돼), 시간 대 품질의 트레이드오프에서 어떤 게 네게 가장 맞는지 정한 다음, 해당 리포트를 열어(파일명에 런 타임스탬프가 들어있어) 그 트레이닝 구성을 새 런에 복사하거나, 다음 트레이닝 세션 후 Inspector를 통해 프리셋으로 저장해.

W13「Open Reports Folder…」 버튼

위치

툴바 왼쪽 상단.

기술적 설명

「Select a folder containing benchmark .json reports」라는 안내 문구와 함께 폴더 선택 대화상자를 열어줘. 확인을 누르면 백그라운드 작업이 실행되어 폴더 내 모든 .json 파일을 순차적으로 파싱해. 잘못된 리포트(깨진 JSON, 잘못된 스키마)는 모아져서 사이드바 하단에 「N file failed to parse」로 표시돼 — 크래시는 나지 않아. 첫 번째 로드가 아직 진행 중일 때 두 번째 클릭이 발생하면 이전 작업이 취소되어, 두 결과가 동시에 상태에 쓰이지 않도록 해줘.

선택한 폴더는 영구적으로 기억되지 않아: Help → Pareto Dashboard… (⇧⌘D)로 창을 다시 열면 여기서 폴더를 다시 선택해야 해. 로드된 폴더의 이름은 그 후 버튼 오른쪽에 표시돼.

W14「X-Axis」 피커

위치

차트 위, 왼쪽.

기술적 설명

대시보드 모듈에서 사용 가능한 모든 지표 축(PSNR, SSIM, LPIPS, Gaussian-Count, 트레이닝 시간 등)을 담은 메뉴 피커야. 기본값은 Gaussian-Count. 축을 바꾸면 호버된 포인트가 초기화되는데, 이는 이전에 하이라이트된 위치가 축이 바뀐 뒤 옛 좌표계에서는 더 이상 의미가 없기 때문이야. 피커는 전체 폭을 차지하지 않도록 콘텐츠 폭으로 제한되어 있어.

W15「Y-Axis」 피커

위치

차트 위, X-Axis 옆.

기술적 설명

W14와 동일하지만 기본값이 PSNR이라는 점만 달라. 축 선택은 서로 독립적으로 저장되므로, 사용자는 의미 없는 조합도 고를 수 있어(X=PSNR, Y=PSNR — 모든 점이 대각선 위에 놓이게 돼). 이런 조합은 따로 막지 않아; 「SSIM vs PSNR」 같은 비교도 지표들이 서로 얼마나 일관성 있게 움직이는지 보는 데 흥미로울 수 있으므로 의도적으로 허용한 거야.

W16「Show Pareto Front」 토글

위치

축 피커들 오른쪽.

기술적 설명

체크박스로, 기본값은 켜짐이야. 파레토 프론트가 점 구름 위에 추가로 라인 형태로 그려져 — 점선(4–4 패턴), 회색 반투명, 선 굵기 1.5 pt. 주의: 배포된 버전에서는 이 체크박스가 차트에 영향을 주지 않아 — 체크 여부와 상관없이 프론트 라인이 항상 그려져. 프론트는 축을 바꾸거나 필터를 바꿀 때마다 다시 계산돼.

W17「Scene」 필터 칩

위치

대시보드 창의 오른쪽 사이드바.

기술적 설명

로드된 리포트에 등장하는 각 씬에 대한 필터 칩이야. 자체 Flow 레이아웃을 사용해서, 폭이 다 차면 칩이 자동으로 여러 줄로 재배치돼. 활성 칩은 강조 배경을 갖고, 비활성 칩은 중립적인 기본 Material 배경을 가져. 다중 선택이 가능하며(Set 시맨틱), 선택된 칩이 없으면 모든 씬이 「통과」된 것으로 간주돼 — 즉 「빈 선택 = 전부」라는 Set 로직이지, 「빈 선택 = 아무것도 아님」이 아니야.

W18「Strategy」 필터 칩

위치

사이드바에서 Scene 필터 아래.

기술적 설명

W17과 동일하지만 트레이닝 전략에 대한 것이야 — 전형적으로 「classic」, 「hybrid」, 「mcmc」 세 값이고, 벤치마크 리포트 JSON의 strategy 필드에서 가져와. 여러 전략의 리포트가 섞여 있고 한 종류만 보고 싶을 때(예: 「Classic은 이미 제외했으니 MCMC 런만 보여줘」) 유용해.

W19「Mip-Splatting」 필터 칩

위치

사이드바에서 Strategy 필터 아래.

기술적 설명

W17/W18처럼 Set이 아니라 3값 필터야: 「All」 / 「On」 / 「Off」. 배경: Mip-Splatting은 씬에 따라 도움이 되거나 안 되는 멀티스케일 확장 기능이야 — 그래서 기본으로 켜지 않고 의도적으로 켤 수 있는 설정으로 남아있어. Mip on/off 비교를 할 때는 명확하게 구분하고 싶은 경우가 많아. 그래서 「전부 통과」, 「Mip만 켜짐」, 「Mip만 꺼짐」 세 상태를 갖는 전용 삼항 필터가 있는 거야. 이 사이드바 섹션은 로드된 집합에 리포트가 하나라도 있으면 나타나 — 사실상 항상 나타나고, 아무것도 로드되지 않았을 때만 사라져.

W20ChipButton(필터 토글, all/on/off)

위치

헬퍼 컴포넌트로, W17/W18/W19에서 사용돼.

기술적 설명

최소한의 버튼 래퍼야. 내용: Caption 크기의 레이블 텍스트와 좌우 10 / 상하 5의 패딩. 배경은 조건부야: 활성 상태면 → 흰색 텍스트와 함께 앱 강조색; 아니면 일반 텍스트 색상을 가진 중립적인 기본 Material 배경(밝은 모드/어두운 모드에 맞춰 조정됨). 모양은 캡슐형 (알약 모양). Plain 버튼 스타일을 써서 캡슐형 Material이 시스템 테두리에 가려지지 않도록 했어.

W21차트(파레토 스캐터)

위치

대시보드의 중앙 영역.

기술적 설명

두 개의 레이어로 이루어진 Swift Charts 다이어그램: 1. 리포트당 하나의 점 — 선택된 X, Y 지표에서 위치가 정해지고, 색상은 Strategy에 따라, 심볼은 Mip 상태에 따라 결정돼. 심볼 크기는 일반적으로 80이고, 하이라이트되면(ID가 현재 호버된 리포트와 일치하면) 200이 돼. 2. 파레토 프론트를 위한 라인(W16 참고 — 항상 그려짐). 추가로 현재 호버된 점 위에는 씬 이름이 작은 캡슐 형태로 나타나.

차트 오버레이: 투명한 사각형이 마우스 움직임을 감지하고, 프레임마다 플롯 프레임 내에서 유클리드 거리로 가장 가까운 점 위치를 계산해서 거리가 24 px 미만이면 호버된 리포트를 업데이트해(아니면 초기화돼). 그래서 클릭하지 않아도 툴팁을 볼 수 있어 — 호버만 하면 충분해.

W22툴팁(호버 상세정보)

위치

차트 아래, 호버 시 표시됨.

기술적 설명

가로 스택: 씬 이름(Headline), Strategy 태그 (Caption), 구분선, 그다음 PSNR/SSIM/LPIPS/Gs/Time 지표들이 각각 작은 세로 그룹(레이블 + 모노스페이스 값)으로 나와. Mip이 활성화되어 있었다면 강조색으로 「Mip」 캡슐 태그도 추가돼. 배경은 반투명 블러이고, 모서리가 8 pt 반경으로 둥근 사각형이야. 마우스가 실제로 점 위에 있을 때만 표시되고, 벗어나면 자동으로 사라져.

Holdout Analysis (W23–W29)

Holdout Analysis — transforms.json 로드 전 빈 상태
Holdout Analysis — transforms.json 로드 전의 빈 상태

빈 상태(Empty State)와 함께 "Open transforms.json…" 콜투액션이 표시된다. NeRF-Studio 및 Instant-NGP 포맷을 지원한다. 카메라 마커는 transforms.json이 로드되는 즉시 나타난다 — 다음 그림 참조.

카메라 86개, 5개 Fold, Angular 전략이 활성화된 Holdout 지구본
카메라 86개, 5개 Fold, Angular 전략이 활성화된 Holdout 지구본

헤더에는 로드된 파일 (transforms.json)과 카메라 수("86 cameras")가 표시된다. 왼쪽 사이드바: 전략 선택기에는 두 가지 옵션이 있다 — Angular (longitudinal)이 활성화된 상태 (카메라를 오빗을 기준으로 경도각에 따라 정렬한 뒤 순환 방식으로 Fold에 분배) 대 Linear (round-robin) (동일한 순환 분배 방식이지만 시야각이 아닌 이미지 순서 기준). k-Folds 슬라이더는 5로, Test-Fold 선택기는 Fold 1로 설정되어 있다. Export 버튼은 외부 평가 도구에서 재사용할 수 있는 fold-assignment.json을 생성한다. 중앙 패널: 86개 카메라 전체의 3D 지구본 투영이 구 전체에 걸쳐 분포되어 있다 — 녹색 점 = Train, 빨간 점 = 현재 Test Fold(Fold 1, 카메라 18개). 오른쪽 사이드바(Angular Correlation): Fold별 카메라 수 + 평균 최근접 각도(Fold 1: 18 Cams / 8.5°, Fold 2: 17 / 6.1°, Fold 3: 17 / 6.2°, Fold 4: 17 / 6.7°, Fold 5: 17 / 6.4°) — 값이 작을수록 각 테스트 카메라 주변에 가까운 트레이닝 카메라가 있다는 뜻이며, 테스트가 그만큼 더 쉬워진다는 의미다.

기능 설명: 카메라 배치를 위한 3D 시각화 도구로, 교차 검증(Cross-Validation) 로직이 내장되어 있다. transforms.json을 로드하면(Nerfstudio / Instant-NGP의 카메라 포즈 표준 포맷) 앱이 모든 카메라를 읽어들여 시야 방향을 단위 구(Unit Sphere)에 투영하고 가상 지구본 위에 작은 구 마커로 표시한다. 그런 다음 카메라를 k개의 Fold로 나누고(선택한 전략에 따라: angular 또는 linear), 트레이닝 비중은 녹색으로, 테스트 비중(Holdout)은 빨간색으로 표시하며, Fold별로 Angular-Correlation 점수를 계산해 테스트 Fold가 시야각 공간에서 트레이닝 Fold로부터 얼마나 떨어져 있는지 알려준다.

Holdout 평가를 하고 싶을 때 — 즉: 모델이 보지 못한 시야각에 얼마나 잘 일반화되는가를 확인할 때다. 트레이닝의 기본값은 "8번째 뷰마다 Holdout"이다(Mip-NeRF360 관례)이지만 이는 매우 선형적인 분할 방식이다. 예를 들어 이미지가 시간순으로 군집되어 있다면(먼저 물체의 한쪽 면, 그다음 다른 면), "8번째마다" 방식은 대표성이 없다 — 임의의 시퀀스 위치가 테스트에 들어가더라도 그 이웃 카메라들은 모두 트레이닝에 있어서 너무 쉬워진다. "angular" 방식은 대신 시야각 공간에 걸쳐 계층화(Stratify)한다: 각 Fold는 오빗의 모든 영역에서 카메라를 포함하므로, 테스트가 실제로 일반화 능력의 공백을 검증하게 된다.

Angular vs Linear: - Angular(기본값): 모든 카메라를 경도각(φ 좌표, Y축 기준)으로 정렬한 다음 순환 방식으로 k개의 Fold에 분배한다 — 링의 첫 번째 카메라는 Fold 1에, 두 번째는 Fold 2에 들어가며, k개의 카메라 후에는 다시 처음부터 순환이 시작된다. 장점: 각 Fold가 오빗의 모든 방향에서 카메라를 포함하며, 링 전체에 걸쳐 고르게 분포된다. 클래식한 오빗 촬영에 적합한데, 분할이 촬영 순서에 더 이상 좌우되지 않기 때문이다. - Linear (Round-Robin): 동일한 순환 분배 방식이지만 각도가 아닌 이미지 위치를 기준으로 한다(Fold 인덱스 = image_index modulo k). 이는 단순한 "n번째마다" 분할 방식이다. 이미지 순서에 공간적 편향이 전혀 없을 때(예: 무작위로 정렬된 드론 촬영) 잘 작동한다. 이미지가 시간순으로 군집되어 있으면 성능이 나쁘다 — 인접한 프레임이 서로 다른 Fold에 놓여 테스트가 지나치게 쉬워진다.

3D 지구본에서 바로 확인할 수 있다: 녹색 점(트레이닝)과 빨간 점(테스트). 빨간 점이 한쪽 구석에 몰려 있다면, Holdout이 좋지 않은 것이다(제대로 된 일반화 테스트가 아님). 녹색 점 사이에 고르게 분포되어 있다면 좋은 것이다. Fold별 Angular-Correlation 점수(오른쪽 사이드바, 단위: 도)는 추가로 알려준다: 값이 작을수록 = 테스트가 트레이닝에 가깝다(각 테스트 카메라 주변에 가까운 트레이닝 카메라가 있어 테스트가 쉬움); 값이 클수록 = 테스트가 트레이닝에서 멀리 떨어져 있다(일반화가 더 어려움).

Truck 씬을 251장의 이미지로 촬영했고, 메뉴 항목 M33(Export SfM transforms.json)을 통해 nerfstudio 파일을 내보냈다. Holdout 창(⇧⌘H)을 열고, "Open transforms.json…"으로 JSON을 로드한 뒤 지구본을 확인한다. k=5(기본값)면 5개의 Fold가 생긴다. "Fold 3"을 클릭한다 — 빨간 마커가 대체로 고르게 분포되어 있는지 확인한다. 그렇다면: "Export fold-assignment.json"을 클릭한다. 내보낸 파일은 외부 평가 도구용이다 (Nerfstudio, Instant-NGP); RadianceKit 자체는 이를 다시 읽어들이지 않으며 계속 자체 Holdout 표준인 "8번째마다"를 기준으로 트레이닝한다. 즉 이 창은 여기서 카메라 세트가 애초에 공정한 테스트를 가능하게 하는지 판단하는 용도다.

W23"Open transforms.json…" 버튼

위치

툴바 왼쪽 위.

기술적 설명

JSON 파일로 제한된 파일 선택 대화상자를 연다. 확인 후 Holdout 모듈이 파일을 로드한다. 로더는 nerfstudio 포맷(카메라 내부 파라미터 와 이미지 경로 및 변환 행렬이 포함된 프레임 목록)과 instant-ngp 포맷(동일한 구조) 모두를 파싱한다. 프레임별로 변환 행렬에서 시야 방향(카메라 로컬 좌표계의 z축)을 추출해 저장한다. 파싱이 실패하면 왼쪽 사이드바에 메시지가 표시된다 — 단, 이전에 이미 씬이 로드되어 있었을 때만 그렇다; 최초 시도 시에는 창이 눈에 보이는 메시지 없이 빈 상태로 남는다.

로드된 파일은 영구적으로 기억되지 않는다: 도움말 → Holdout Analysis…(⇧⌘H)로 창을 다시 열면 여기서 다시 선택해야 한다. 파일 이름은 이후 버튼 오른쪽에 표시된다.

W24"Strategy" 선택기(angular/linear)

위치

왼쪽 사이드바 위쪽.

기술적 설명

Angular와 Linear 두 가지 옵션이 있는 라디오 선택기. 전략을 변경하면 Fold가 자동으로 재계산된다. 시야 방향은 구 위의 3D 단위 벡터 목록이며, Angular 전략은 이를 경도각 φ로 정렬한 다음 순환 방식으로 Fold에 할당하고, Linear 전략은 프레임 인덱스를 기준으로 동일한 순환 할당을 수행하며 기하학적 정보는 완전히 무시한다. 따라서 두 전략 모두 동일한 크기의 Fold를 만들며, 차이는 정렬 기준에만 있다.

W25"k Folds" 슬라이더

위치

왼쪽 사이드바 중앙.

기술적 설명

3에서 10까지, 1단위 간격의 슬라이더. 값을 변경하면 Fold 계산이 자동으로 다시 실행되어, Fold 목록, 트레이닝/테스트 인덱스, Fold별 점수가 즉시 재계산된다. 선택된 값은 라벨 오른쪽에 고정폭 숫자 텍스트로 표시된다.

경험칙: k=5가 기본값이다(Fold당 20%의 테스트 비율을 제공하며, 이는 교차 검증에서 일반적인 값이다). k=10은 데이터가 매우 많고 통계적 신뢰도를 위해 더 많은 Fold가 필요할 때. k=3은 데이터가 적을 때 사용한다.

W26"Test Fold" 선택기

위치

왼쪽 사이드바, k-슬라이더 아래.

기술적 설명

메뉴 선택기. 설정된 Fold 수만큼 정확히 항목을 나열하며, "Fold 1"부터 "Fold N"까지로 표기된다. 이전에 선택된 인덱스가 k 이상이면(예: k를 10에서 5로 줄인 경우) 자동으로 0으로 재설정된다. 선택된 Test Fold는 지구본에서 빨간색으로 표시되고, 나머지는 모두 녹색으로 표시된다.

W27"Export fold-assignment.json" 버튼

위치

왼쪽 사이드바 아래쪽.

기술적 설명

기본 파일명이 fold-assignment.json인 저장 대화상자를 연다. 확인 후 Holdout 모듈은 현재 분할 상태를 JSON 스키마로 인코딩한다(프레임별 Fold 할당 정보와 전략 메타 블록 포함). 이 파일은 외부 평가 도구용이다 — RadianceKit은 이를 다시 읽어들이지 않는다. 카메라 파일이 로드되어 있지 않은 동안은 버튼이 비활성화(회색) 상태다. 성공 시 버튼 아래에 "Saved to (filename)"이, 쓰기 오류 시 "Export failed: …"가 표시된다 — 둘 다 버튼 바로 아래 같은 위치에, 모두 녹색 글자로 나타나므로 색상만으로는 두 경우를 구별할 수 없다.

W28SCNView (3D Camera Globe)

위치

Holdout 창의 중앙 패널.

기술적 설명

SceneKit 기반 지구본 뷰. 씬은 다음으로 구성된다: 와이어프레임 구(반지름 1.0, 36 세그먼트, 진회색), 색상이 있는 세 개의 축 막대(빨강/녹색/파랑, X/Y/Z용, 각각 길이 1.2), 그리고 카메라마다 작은 마커 구(반지름 0.03)가 단위 구 위 해당 시야 방향 위치에(와이어프레임 구 안에 묻히지 않도록 약간 바깥쪽에) 배치된다. 마커는 Fold가 바뀔 때마다 다시 생성되지 않는다 — 재생성은 프레임 목록이 변경될 때만(즉 새로운 JSON이 로드될 때만) 필요하다. 대신 매 업데이트마다 머티리얼 색상을 제자리에서(in-place) 갱신한다: 테스트 인덱스는 빨간색, 트레이닝은 녹색, 어느 쪽도 아니면 밝은 회색으로. 이렇게 하면 카메라가 N > 1000개인 경우에도 슬라이더 조작이 빠르게 유지된다.

카메라 조작이 활성화되어 있어 — 마우스로 지구본을 회전하고, 확대/축소하고, 이동할 수 있다. 조명 덕분에 마커가 평면처럼 보이지 않는다. 배경은 진회색이다.

W29FoldCard (탭으로 Fold 선택)

위치

오른쪽 사이드바, "Angular Correlation" 섹션.

기술적 설명

Fold별로 카드 뷰 하나 — 모서리가 6pt 반경으로 둥근 사각형, 패딩 10, 두 줄로 구성된 수직 레이아웃 (위쪽 "Fold N" + 카메라 개수, 아래쪽 "Mean nearest angle:" + 도 단위 값). 배경색은 조건부로 결정된다: 활성 Fold는 강조색을 반투명하게, 비활성은 중립적인 기본 머티리얼로 표시한다. 탭하면 해당 Fold가 선택되고 지구본 색상이 실시간으로 바뀐다.

"Mean nearest angle" 점수는 각 테스트 카메라에서 가장 가까운 트레이닝 카메라까지의 최소 각도의 평균값이다(내부적으로는 라디안으로 계산되고, UI에는 도 단위로 표시된다).

BayesOpt 콘솔 (W30–W39)

BayesOpt-Konsole — leerer Zustand vor Trial-Start
BayesOpt 콘솔 — 트라이얼 시작 전 빈 상태

검색 공간 선택기(RadianceKit defaults (6-dim)), 트라이얼 예산 슬라이더(기본값 40), 랜덤 시드(42) 및 컨버전스 차트, 트라이얼 로그, 검색 공간 파라미터 목록을 위한 세 개의 빈 패널로 이루어진 초기 상태. 컨버전스 차트와 트라이얼 테이블은 런이 시작되는 즉시 채워진다 — 다음 그림을 참고하라.

BayesOpt-Konsole nach 40 Trials — Convergence-Chart steigt steil bis Trial 13, Best Value 0.9943, Trial Log mit init/bo/restart-Tags
40회 트라이얼 후의 BayesOpt 콘솔 — 컨버전스 차트가 트라이얼 13까지 가파르게 상승, 최고 값 0.9943, init/bo/restart 태그가 있는 트라이얼 로그

우측 상단에 상태 표시 「Finished — best 0.9943 after 40 trials」, 그 옆에 「Save Best Config」 버튼; 좌측 상단에는 「Start」 버튼. 왼쪽 사이드바: 검색 공간 선택기는 RadianceKit defaults (6-dim), 트라이얼 예산 40, 랜덤 시드 42로 설정. 파라미터 목록에는 튜닝할 여섯 개의 하이퍼파라미터와 그 값 범위가 표시된다: mipSmoothing3DScale [0.05, 0.5], mipFilter2DVariance [0.1, 0.6], densifyGradThreshold [5e-07, 5e-06], ssimWeight [0.05, 0.5], mcmcNoiseScale [1e-05, 0.0001], mcmcRelocationInterval [50, 200]. 가운데: 컨버전스 차트 「Convergence (best value so far)」(X = 트라이얼 인덱스 0–40, Y = 목적 함수 값 0–1) — 파란 점 = 초기 샘플, 초록 점 = BayesOpt 어퀴지션, 주황 점 = 재시작 트라이얼 (#22는 0.5303, #31은 0.4885). 파란 최고값 선은 트라이얼 ~5까지 가파르게 상승하고, 이후 트라이얼 ~13까지는 소폭 개선에 그치며, 그 이후로는 1.0에 가까운 평탄한 고원 상태가 된다. 오른쪽 사이드바: 트라이얼 로그, 여기서는 트라이얼 #8–#36까지 스크롤된 상태로 점수와 태그(init/bo/restart)를 함께 보여준다. 우측 상단의 Save-Best-Config 버튼은 bayesopt-best.json을 기록한다.

이것은 무엇인가: 하이퍼파라미터 탐색을 위한 베이즈 최적화 콘솔이다. 베이즈 옵트는 최대한 적은 실험으로 미지의 함수의 최적점을 찾으려는 자동화된 방법이다 — 전형적으로는 「가우시안 상한선, SSIM 가중치, 덴시파이 임계값의 어떤 조합이 내 씬 클래스에 대해 최고의 PSNR을 내는가?」와 같은 질문이다. 6^4 = 1296회짜리 격자 탐색 대신, BayesOpt는 약 40–100회의 정보 기반 트라이얼로 최적값에 근접한다.

중요: 앱에 현재 배포된 버전은 최적화를 실제 트레이닝 런에 대해 실행하지 않는다(그러면 며칠이 걸릴 것이다). 대신 힐클라이밍 성격을 가진 다중 모드 랜드스케이프에 약간의 노이즈를 더한 합성 데모 목적 함수에 대해 실행한다. 이는 의도적인 설계다: 이 창은 옵티마이저의 동작(수렴 과정, 샘플 포인트, 지금까지의 최고값)을 보여주고, 검색 공간 정의를 이해하도록 돕기 위한 것이다. 실제 트레이닝 기반 BayesOpt 런(내장 프리셋 개발 시 실제로 수행된 것과 같은)은 앱 밖의 별도 평가 경로를 사용한다. 이 창은 그 과정을 지켜보기 위한 라이브 버전이다.

세 가지 활용 사례가 있다. 1. BayesOpt가 어떻게 동작하는지 이해하고 싶다면 — 데모 런을 시작하고 컨버전스 차트를 관찰하라. 2. 열다섯 개의 내장 프리셋이 완벽히 맞지 않는 새로운 씬 클래스(예: 「수족관」 또는 「골동품 가구」)를 계획 중이라면. 머릿속으로 검색 공간을 정의하고, 「Bowl demo (1-dim)」이나 「densify-until + ssim-weight + grad-thresh」로 여기서 검증한 다음, 최고 설정을 JSON으로 내보내 실제 트레이닝 런의 시작점으로 사용하라. 3. 함께 제공되는 표준 검색 공간 (Mip 서브셋, RadianceKit Defaults)을 살펴보고 싶다면 — 이들은 왼쪽 사이드바의 파라미터 패널에 나열되어 있다.

- 컨버전스 차트 (가운데 열): Y = 지금까지 도달한 최고 목적 함수 값. X = 트라이얼 인덱스. 초반에는 가파르게 상승한다 (BayesOpt는 초기 샘플들을 무작위로 시도하고, 그중 일부는 운이 좋다). 이후에는 점점 평탄해지는데, 최적값 근처 영역이 이미 탐색되었기 때문이다. 20회 이상 동안 선이 평탄하게 유지되면 런을 중단해도 좋다 — 더 이상의 트라이얼은 도움이 되지 않는다. 차트의 개별 점들은 (즉 「지금까지의 최고값」이 아니라) 개별 트라이얼 값이며, 단계별로 색상이 다르다: 파랑 = 초기 샘플, 초록 = BayesOpt 어퀴지션, 주황 = 재시작. - 트라이얼 테이블 (오른쪽 열): #1, #2, #3, … 각각 값과 단계 태그가 표시된다. 지금까지의 최고 트라이얼은 노란 별로 표시된다. 테이블에서 최고 트라이얼을 확인하고, 나중에 내보낼 때 그 파라미터 값을 확인할 수 있다. - 검색 공간 인스펙터 (왼쪽 사이드바): 선택된 프리셋의 모든 파라미터 이름과 그 탐색 범위 [lo, hi]를 보여준다. 「RadianceKit defaults (6-dim)」 프리셋을 선택한 상태라면 「densifyGradThreshold [5e-7, 5e-6]」와 같은 값을 볼 수 있다 — 즉 두 값 사이의 로그 균등 분포다.

프리셋 「RadianceKit defaults (6-dim)」, 트라이얼 예산 40, 시드 42를 선택한다. 「Start」를 클릭한다. 관찰: 처음 8회 트라이얼은 파란색(초기 샘플, 라틴 하이퍼큐브)이고, 이어지는 것은 초록색(BayesOpt 어퀴지션)이다. 컨버전스 차트는 트라이얼 ~13까지 가파르게 상승한 뒤 평탄해진다. 트라이얼 ~30–40 무렵에는 최고 값이 안정화된다. 「Save Best Config」를 클릭하면 — bayesopt-best.json이 프리셋 이름, 트라이얼 인덱스, 값, 디코딩된 파라미터 값들과 함께 저장된다. 이 JSON을 수동으로 네 프리셋 정의에 반영할 수 있다.

W30「Start」 버튼

위치

왼쪽 툴바, Idle/Finished 상태일 때.

기술적 설명

트라이얼 목록을 초기화하고 Running 상태로 전환하며, 새로운 런 ID(여러 번 Start를 클릭했을 때 스테일 감지를 위해)를 생성하고 새로운 Pause-Gate를 만든다. 그런 다음 옵티마이저를 비동기 스트림으로 실행하는 백그라운드 태스크가 시작된다. 초기 샘플의 수는 예산에 따라 늘어나지만 최대 8개까지다 — 즉 예산이 28 이상이면 전형적으로 8개의 라틴 하이퍼큐브 샘플이 사용되고, 예산이 작으면 더 적게 사용된다. 트라이얼 업데이트는 순차적으로 수신되어 목록에 추가된다. 스테일 런 방지: 진행 중에 두 번째 Start 클릭이 런 ID를 새로 설정하면, 이전 런에서 온 업데이트는 버려진다.

눈에 띄는 버튼 모양을 위해 Primary-Action 스타일을 사용한다.

W31「Pause」 버튼

위치

왼쪽 툴바, Running 상태일 때.

기술적 설명

Pause-Gate를 활성화하고 Paused 상태로 전환한다. 실제 효과는: 러너가 다음 목적 함수를 평가하기 전에 50ms 폴링 루프에서 대기한다는 것이다. 즉 현재 진행 중인 트라이얼은 끝까지 완료되지만(어차피 합성 값이라 마이크로초밖에 걸리지 않는다), 새로운 트라이얼은 시작되지 않는다. Resume이 실행되면 멈췄던 지점에서 계속된다.

W32「Stop」 버튼

위치

왼쪽 툴바, Running 및 Paused 상태일 때.

기술적 설명

러너 태스크를 중단하고 참조를 null로 만들며, (아직 paused 상태였다면) Pause-Gate를 해제한 뒤 트라이얼이 존재하면 Finished 상태로, 없으면 Idle 상태로 전환한다. 이미 계산된 트라이얼들은 목록에 그대로 남는다 — Stop이 이를 삭제하지 않는다. 파괴적 버튼 역할이라 런을 중단하기 때문에 버튼이 빨간색으로 표시된다.

W33「Resume」 버튼

위치

왼쪽 툴바, Paused 상태일 때.

기술적 설명

Pause-Gate를 해제하고 다시 Running 상태로 전환한다. 러너 태스크는 이미 실행 중이며(폴링 루프에서 대기 중이었으므로), 루프가 Pause가 해제되었음을 감지하는 즉시 계속 실행되어 다음 트라이얼을 시작한다.

W34「Save Best Config」 버튼

위치

오른쪽 툴바, 항상 표시됨(단 아직 최고 결과가 없으면 비활성화 상태).

기술적 설명

기본 파일 이름이 bayesopt-best.json이고 JSON으로 제한된 저장 대화 상자를 연다. 확인 후 페이로드 딕셔너리가 만들어진다: 프리셋 이름, 트라이얼 인덱스, 값(목적 함수 점수), 파라미터(디코딩된 파라미터 이름 → 값의 딕셔너리). 디코딩은 정규화된 검색 공간 좌표 [0,1]^d를 원래 값 범위로 역투영한다(각각 로그 균등/선형/정수 스케일에 맞게). JSON 출력은 예쁘게 정렬되어 있고 키가 정렬되어 있다. 쓰기 오류가 발생하면 (현재 데모 버전에서는) 조용히 무시된다 — 데모 경로이므로 에러 UI는 없다.

트라이얼이 하나도 실행되지 않은 동안 버튼은 회색으로 남는다.

W35「Search Space」 프리셋 선택기

위치

왼쪽 사이드바, 상단.

기술적 설명

네 가지 프리셋 옵션이 있는 메뉴 선택기: - 「RadianceKit defaults (6-dim)」 — 여섯 개의 표준 하이퍼파라미터를 모두 포함하는 완전한 표준 검색 공간. - 「Mip subset (2-dim)」 — 로그 균등인 mipSmoothing3DScale [0.05, 0.5]와 선형인 mipFilter2DVariance [0.1, 0.6]만 사용. 특정 씬 클래스에 대해 Mip-Splatting을 튜닝하고 싶을 때 유용하다. - 「densify-until + ssim-weight + grad-thresh」 — 덴시파이 관련 파라미터 세 개(로그 균등인 densifyGradThreshold, 선형인 ssimWeight, 정수형인 densifyUntilIter). - 「Bowl demo (1-dim)」 — 「BayesOpt는 이렇게 동작한다」 데모를 위한 교육용 단일 파라미터 검색 공간.

런이 실행 중인 동안에는 검색 공간을 바꿀 수 없다(옵티마이저를 혼란시킬 수 있기 때문이다).

W36「Trial Budget」 슬라이더

위치

왼쪽 사이드바, 검색 공간 선택기 아래.

기술적 설명

10부터 200까지, 단계 간격 5인 슬라이더. 기본값 40. 이는 BayesOpt가 최대 N회의 트라이얼을 수행할 수 있다는 의미다. 그중 처음 몇 개는 초기 샘플(라틴 하이퍼큐브)이며, 나머지는 실제 BayesOpt 트라이얼이다. 실전에서의 경험 법칙: d 차원의 검색 공간은 좋은 최적값을 얻기 위해 대략 d의 10배에서 20배에 해당하는 트라이얼 수가 필요하다. 즉 6차원 기본값의 경우 60–120, 2차원 Mip 서브셋의 경우 20–40, 1차원 Bowl 데모의 경우 10–20 정도다.

런이 진행되는 동안 슬라이더는 비활성화된다.

W37「Random Seed」 슬라이더

위치

왼쪽 사이드바, Budget 슬라이더 아래.

기술적 설명

1부터 100까지, 단계 간격 1인 슬라이더. 기본값 42. 시드는 초기 라틴 하이퍼큐브 샘플과 데모 목적 함수의 노이즈 성분 모두에 전달된다. 재현성: 동일한 시드 + 동일한 검색 공간 + 동일한 예산은 완전히 동일한 트라이얼 시퀀스를 만든다. 「동료들이 데모를 재현했을 때 모두 같은 런을 얻는가?」 같은 상황에 유용하다. 런이 진행되는 동안 비활성화된다.

W38차트 (Convergence)

위치

창의 가운데 열.

기술적 설명

두 개의 레이어로 구성된 Swift Charts 다이어그램: 1. 트라이얼별 「지금까지의 최고값」을 나타내는 선 — 강조 색상의 단조 증가 또는 유지되는 곡선. 2. 트라이얼마다 개별 목적 함수 값을 나타내는 점, 단계별로 색상이 다르다. 심볼 크기 40. 세 가지 단계 라벨: 「init」(파랑), 「bo」(초록), 「restart」(주황).

작은 범례가 왼쪽 상단에 단계별 색상을 보여준다. 트라이얼 목록이 비어 있을 때(첫 Start 이전)는 대신 차트 아이콘과 「Press Start to begin a BayesOpt run.」이라는 안내 문구가 있는 빈 상태 화면이 표시된다.

W39테이블 (Trial Log)

위치

창의 오른쪽 열.

기술적 설명

지연 스택 방식으로 트라이얼 행을 표시하는 스크롤 영역. 각 행은 수평 스택 구성이다: 트라이얼 번호(3자리 모노스페이스, 왼쪽), 값(모노스페이스, 오른쪽 정렬, 너비 70pt), 단계 태그(캡슐 형태, 25% 불투명도로 채워짐 — 「init」은 회색, 「bo」는 파랑, 「restart」는 주황; 이는 옆의 차트에 있는 점 색상과는 의도적으로 다른 색이다), 이 트라이얼이 현재 최고 트라이얼이면 선택적으로 노란 별이 추가된다. 새로운 트라이얼이 추가되는 즉시 자동으로 맨 아래로 이동하는 오토 스크롤 메커니즘이 있어 — 직접 스크롤하지 않아도 화면 하단에서 실시간 진행 상황을 계속 읽을 수 있다.

메인 윈도우: 손실 곡선과 Gaussian 개수 (I39–I41, 상호 참조)

메인 윈도우의 Inspector 표시 항목 중 세 가지는 별도의 설명이 필요하다. 학습이 진행되는 동안 계속 보이는 항목들이며, 곡선이 건강해 보이는지 판단하는 데 중요한 경험칙이 있기 때문이다. 이 표시들은 Inspector의 진행 상황 섹션, 펼쳐지는 손실 곡선 그룹 안에 있으며 (2장 — Inspector 참고), 위에서 다룬 Aux 윈도우의 Holdout 분석을 보완한다.

손실 곡선은 언제 건강한가? 건강한 손실 곡선은 세 단계를 보여준다. (1) 워밍업 — 처음 200–500회 반복 동안 손실이 높은 값(씬에 따라 L1+SSIM 결합 기준 일반적으로 0.15–0.25)에서 가파르게 떨어져 대략 절반이 된다. 이 단계에서 손실이 떨어지지 않는다면 대개 입력이 잘못된 것이다(이미지 손상, SfM 포즈 불량, 초기 Gaussian 개수가 너무 적음 등). (2) Densification — 약 500회부터 densifyUntilIteration (클래식은 15K, MCMC는 20K 또는 25K까지)까지 손실은 계속 떨어지며, Densify 연산이 새로운 Gaussian을 추가하고 옵티마이저가 이를 활용할 때 종종 작은 하락 폭이 나타난다. 이 단계에서 Gaussian 개수가 증가한다. (3) Refinement — 이후 손실은 점점 평평해지는 꼬리 구간으로 접어든다. 참고할 만한 전형적인 최종 값: 조명이 잘 갖춰진 오브젝트 씬(예: P4 Quality의 Tanks-&-Temples Truck)은 L1 ≈ 0.023에 도달하며, Mip-NeRF 360의 넓은 야외 씬은 태생적으로 그보다 높은 값(0.04–0.07)에 머문다.

플래토(Plateau)는 무엇을 의미하는가? 플래토(손실 곡선이 수천 회 반복 동안 수평으로 유지되는 상태)에는 두 가지 해석이 있다. (a) 모델이 수렴했고 더 이상 학습해도 개선이 없는 경우 — 좋은 경우다. (b) 모델이 갇혀 있는 경우(지역 최솟값, 나쁜 그래디언트 정보, 버퍼 한도에 도달)이다 — 나쁜 경우다. 두 경우는 차트상으로는 동일하게 보인다. 구분하는 방법: Gaussian 개수를 확인하라. 이것도 평평하고 MCMC Cap에 근접해 있다면(예: 프리셋 P8 Quality (MCMC)에서 150K 중 150K), 한계에 도달한 것이다 — Cap을 높이거나 플래토를 받아들여야 한다. Gaussian 개수는 계속 증가하는데 손실이 떨어지지 않는다면, 이는 갇힌 상태(stuck)다.

언제 중단하고 언제 계속 학습해야 하는가? 경험칙: 10K회 반복 동안 최소 손실이 개선되지 않으면 → 중단하라, 추가 반복은 낭비다. 그 전이라면: Training 메뉴 → Continue Training → "+5,000 iterations"를 통해 경계선상의 개선이 보일 경우 학습을 연장할 수 있다(이에 대한 단축키는 없다). 주의: MCMC의 경우 플래토가 실제로 진짜인 경우가 많다 — Cap이 자연스러운 한계이기 때문이다.

Gaussian 개수 플래토는 "완료" 신호가 아니다. 이는 단지 MCMC가 Cap에 도달했거나 Classic Densification이 한계에 다다랐음을 의미할 뿐이다. 진짜 "완료" 여부에 대한 질문에 답하는 것은 독립적인 테스트 세트에서 측정한 PSNR/SSIM/LPIPS뿐이다 — 이 수치는 Pareto Dashboard(W13–W22)에서 확인하는 벤치마크 리포트에 나와 있다. Holdout 윈도우(W23–W29)는 이 지표들을 제공하지 않는다. 이 창은 단지 네 카메라 세트가 학습용과 테스트용 시점으로 공정하게 나뉠 수 있는지만 판단한다.

PSNR/Holdout이 진실이고, 손실은 단지 대리 지표(Proxy)일 뿐이다. 손실은 상대적인 지표다. 모델이 학습용 View에 적응해 가는 동안 떨어진다. 하지만 손실이 낮다고 해서 자동으로 좋은 모델을 의미하지는 않는다 — 모델이 학습 이미지를 그대로 암기해버렸다면(Overfitting), 손실은 작겠지만 본 적 없는 View(Holdout)에 대한 PSNR은 나쁠 것이다. 따라서 최종 품질 평가에는 항상 End-Loss만이 아니라 Holdout 지표를 확인해야 한다.

요령 상자

- User Guide와 Keyboard Shortcuts는 정적인 도움말입니다 — 키워드로 빠르게 찾을 때 유용하고, 깊이 있는 내용은 이 매뉴얼을 참고하세요. - 디스크의 여유 공간이 10% 아래로 떨어지면 바로 Manage Storage를 여세요. 로그와 Imports 스테이징이 흔히 범인입니다. - Pareto Dashboard는 최소 서너 개의 트레이닝 리포트가 쌓인 후에야 의미가 있습니다. X축 = 비용 (Time / Gs), Y축 = 품질 (PSNR / SSIM). Pareto 프론트는 효율적인 조합들을 보여줍니다. - 다른 사람들과 PSNR 벤치마크를 공유하기 전에는 Holdout Analysis를 사용하세요 — 테스트 세트가 정말 대표성이 있는지 확인할 수 있습니다. 내보낸 폴드 분할은 외부 도구용입니다. RadianceKit은 계속 "every-8th"에 대해 학습을 진행합니다. - BayesOpt Console은 주로 탐색 공간 정의를 학습하고 살펴보기 위한 도구입니다 — 실제 트레이닝 실행이 아니라 데모 함수를 대상으로 계산합니다. - Loss 정체 구간과 Gaussian 개수 정체 구간은 따로 해석해야 합니다. Cap 한계는 "완료" 신호가 아닙니다. 진짜 품질은 오직 Holdout PSNR로만 측정됩니다. - Min-Loss 개선 없이 1만 회 반복 → 트레이닝을 중단하세요.