6장 — 트레이닝 설정

전형적인 프리셋 JSON 내보내기의 예시입니다. 최상위 필드: id (UUID), name, (classic | mcmc | sceneClass | custom), (스키마 버전), (타임스탬프), (자유 텍스트). 중첩된 객체에는 재현성에 결정적인 매개변수가 담겨 있습니다 — 가져올 때 이 블록 전체가 트레이닝 설정에 읽혀 들어가며, 앱 버전의 기본값이 JSON에 없는 필드를 채웁니다 (예: 앱 업데이트 후). 프리셋을 다른 Mac으로 넘기고 싶다면 이 JSON 파일만 건네주면 됩니다.
트레이닝 설정은 RadianceKit의 모든 트레이닝 실행에서 핵심이 되는 부분입니다. 트레이닝에 영향을 미치는 모든 매개변수 — 최대 반복 횟수부터 8개의 학습률, MCMC, Mip-Splatting, Curriculum, scene-aware Cap 로직을 위한 특수 필드까지 — 를 모아 놓았습니다. 사이드바의 트레이닝 설정 섹션(Expert View)에서 편집하고, 프리셋으로 저장하거나 JSON으로 내보내 다른 Mac에 전달할 수 있습니다. 트레이닝 시에는 바로 이 객체가 그대로 고정되어 GPU 백엔드로 전달됩니다.
이 장은 파워 유저를 위한 참고 자료입니다. 트레이닝 설정에서 조정 가능한 80개 필드, 기본 제공되는 9개의 프리셋, 그리고 Gaussian Cap의 장면 종속적 결정 방식을 정리했습니다. 의심스러울 때는 선택한 프리셋이 설정하는 값이 우선합니다 — 이 값은 Inspector나 프리셋의 JSON 내보내기에서 확인할 수 있습니다.
목차:
+ Iteration (T1–T2) + Learning Rates (T3–T10) + Densification — Classic (T11–T16) + Loss (T17–T20) + SH-Degree-Progression (T21) + Performance (T22–T24) + 진단 및 포인트 클라우드 준비 (T26–T30) + Regularisierung (T31–T37) + Refinement (T38–T44) + Sky-Dome (T45–T48) + Adam + LR-Schedule (T49–T55) + Post-Processing + Apple AI (T56–T60) + MCMC-Densification (T61–T73) + Mip-Splatting (T74–T76) + Adaptive Densification (T77–T79) + Curriculum (T80–T81) + 정적 프리셋 (TP1–TP9) + 앱이 Gaussian Cap을 결정하는 방법 + 어떤 필드가 무엇을 위한 것인가? (Cheat-Sheet) + 위험한 필드
반복 횟수 (T1–T2)
T1maxIterations
세부 정보
기본값: 30,000 (Initializer), 35,000 (.full), 200,000 (.fullMCMC) 범위: 1,000 – 500,000 (UI 슬라이더), 로직 상 명확한 상한선 없음
기술적 설명
백엔드가 거치는 전체 트레이닝 반복 횟수. 하나의 반복(iteration)은 단일 트레이닝 카메라에 대한 포워드 렌더, 모든 손실(Loss) 구성 요소(L1 + SSIM + 선택적 정규화 + Sky-Mask)에 대한 백워드 패스, 그리고 한 번의 Adam 옵티마이저 스텝을 의미한다. 이 값은 다른 스케줄에 직접 영향을 미친다: Position 학습률은 0부터 T1 자체까지, 또는 T50 positionLRScheduleEndIteration까지 코사인 어닐링(Cosine-Annealing) 곡선을 따른다; Densification은 T2 densifyUntilIteration에서 멈춘다; MCMC 노이즈 감쇠(Noise-Decay)는 T69 mcmcNoiseDecayEnd에서 끝난다; SH-Degree 업그레이드는 T21에 정의된 세 지점에서 일어난다. 고전적인 Densification 방식에서는 20,000–35,000회 반복이 검증된 범위이며, MCMC에서는 60,000–200,000회다. Preset에 설정된 값보다 대폭 늘려도 추가적인 품질 향상은 거의 없다 — Adam 모멘텀이 포화되고, LR-Decay 종료 없이는 손실이 정체된다. 반대로 ~5,000회 미만으로 줄이면 기하 구조가 불완전하게 수렴한다 (Density-Control이 클론/분할할 시간이 부족하다).
T2densifyUntilIteration
세부 정보
기본값: 15,000 (Initializer), 5,000 (.full), 160,000 (.fullMCMC) 범위: 0 – T1 maxIterations
기술적 설명
Densification이 멈추는 반복 시점. 이 시점까지는 T11–T16 (Classic) 또는 T67–T70 (MCMC)에 매개변수화된 규칙에 따라 Gaussian이 복제, 분할, 프루닝되며; 그 이후에는 Gaussian 개수가 고정되고 위치, 회전, 스케일, 불투명도, SH 계수만 최적화된다 (정제 단계, Refinement-Phase). 3DGS 원 논문에서는 이 값이 T1의 50%로 설정되지만, RadianceKit의 .full Preset에서는 약 14%(35,000 중 5,000)에 불과하다: 약 5,000회 반복 이후에는 추가적인 Densification이 오히려 결과를 악화시킨다 — Floater가 늘어나고 메모리 사용량이 증가하지만 품질 향상은 없다. 반면 MCMC는 Relocation을 T1의 80%까지 진행하는데, MCMC는 유해한 Floater를 생성하지 않기 때문이다. T2를 너무 작게(< 1,000) 설정하면 Gaussian이 너무 적게 생성되고; Classic에서 너무 크게(T1의 50% 초과) 설정하면 Overgrowth와 RGB-Saturation-Outlier가 발생한다 (Outdoor-Overtraining 관련 findings 참조).
학습률 (T3–T10)
T3positionLearningRate
세부 정보
기본값: 0.00016 범위: 1e-7 – 1e-3 (권장)
기술적 설명
학습 시작 시점(반복 0)에서 각 Gaussian의 XYZ 위치에 대한 Adam 학습률. Cosine-Annealing 곡선을 따르며 학습이 진행되면서 T4 positionLearningRateFinal까지 감소한다. 기본값 0.00016은 3DGS 원 논문(Kerbl et al.~2023)에서 유래한 것으로, RadianceKit에서는 이미지 해상도를 높이더라도 이 값을 스케일링해서는 안 된다 — 위치는 픽셀 공간이 아니라 월드 좌표계에서 움직이기 때문이다. 값을 크게 높이면 (> 0.0005) Gaussian이 먼 거리를 건너뛰고 손실(loss)이 불안정해진다. 반대로 값이 지나치게 낮으면(< 0.00005) 잘못 초기화된 포인트 클라우드가 결코 제자리를 찾지 못한다. 따라서 대부분의 장면에서는 기본값이 올바른 선택이다. 참고로 .fullMCMC에서는 이 값을 의도적으로 기본값에 그대로 둔다 — MCMC는 재배치(Relocation) 로직을 위해 일정한 학습률이 필요하므로, 여기서 튜닝해봐야 얻는 것이 없다.
T4positionLearningRateFinal
세부 정보
기본값: 0.0000016 (Initializer + 논문), 0.000016 (.full, .fullMCMC — 10배 높음) 범위: 0 – T3 positionLearningRate
기술적 설명
위치 학습률 Cosine-Annealing 곡선의 최종값. 이 값은 T1 maxIterations에서, 또는 설정되어 있다면 T50 positionLRScheduleEndIteration에서 도달한다. RadianceKit의 .full 프리셋은 0.000016을 사용한다 — 즉 논문 기본값 0.0000016보다 10배 높다. 최종값을 지나치게 작게 하거나 시작값을 지나치게 크게 하면 결과가 눈에 띄게 나빠진다. 이 높은 최종값은 트레이드오프가 아니라 의도적인 선택이다: 디케이(decay)가 너무 강하면 Gaussian이 리파인먼트 단계 동안 새로 추가된 Densification 후보에 맞춰 조정되는 능력을 잃어버린다. 스케줄 단계는 단축할 수 있으며(T50 < T1), 이 경우 T1이 끝나기 전에 이미 T4에 도달하고 나머지 학습은 일정한 최소 학습률로 진행된다 — 전형적인 설정: T50 = 20 000, T1 = 35 000, 즉 리파인먼트는 0.000016으로 15 000회의 반복 동안 진행된다.
T5shDCLearningRate
세부 정보
기본값: 0.0025 (Initializer + 논문), 0.005 (.full 및 모든 MCMC 프리셋 — 2배) 범위: 0.0001 – 0.05
기술적 설명
Spherical Harmonic 색상의 DC 성분(차수 0, 즉 방향에 무관한 고정 albedo)에 대한 Adam 학습률. SH-DC는 Gaussian의 방향 독립적인 기본 톤에 해당하며, 이른바 "기본 색상"이다. RadianceKit은 Quality 프리셋에서 논문 기본값을 두 배로 늘린다 — 이는 색상 수렴을 가속화하는데, 짧은 학습(5 000회 미만의 반복)에서는 그렇게 하지 않으면 SH-DC가 제대로 형성되지 않기 때문에 필요하다. 기하학적 학습률과 달리 SH-DC에는 디케이가 없다; 학습률은 모든 반복에서 일정하게 유지된다(또는 T51의 선택적 확장 단계 디케이만 따른다). 값을 더 크게 하면(예: 0.01) 결과가 다시 나빠지고 색상이 불안정해진다.
T6shRestLearningRate
세부 정보
기본값: 0.000125 (Initializer + 논문), 0.00025 (.full 및 MCMC — 2배) 범위: 0.000001 – 0.005
기술적 설명
고차(1, 2, 3차 — 즉 뷰 방향에 의존하는, 하이라이트, 반사, 부드러운 셰이딩을 담당하는 색상 성분) SH 계수에 대한 Adam 학습률. 논문 관례에 따라 T5보다 20배 작은데, 이는 이 계수들이 개수가 제곱으로 증가하기 때문이다(1차에 3개, 2차에 5개, 3차에 7개 → Gaussian당 총 15개의 float) — 학습률을 낮추지 않으면 이미지가 과포화될 것이다. 두 단계로 나뉘어 활성화된다 — T21 shDegreeUpgradeIterations의 첫 번째 기준점까지는 0차만 활성화되며(즉 T5만), 이후 1차, 나중에 2차, 마지막으로 3차가 활성화된다. 이 값은 확산 조명이 많은 장면에서 특히 낮게 유지하는 것이 중요하다; 매우 광택이 있는 표면(자동차 도장, 물)에서는 값을 조정할 가치가 없다 — SH 표현 자체가 한계가 있기 때문이다.
T7opacityLearningRate
세부 정보
기본값: 0.05 (Initializer + 논문), 0.1 (.full, MCMC — 2배) 범위: 0.001 – 1.0
기술적 설명
각 Gaussian의 logit 불투명도에 대한 Adam 학습률. 앱은 불투명도를 제약 없는 float 값으로 저장하고 시그모이드를 통해 [0, 1] 범위로 변환한다; 학습률은 logit 공간에서 작용한다. Quality 프리셋은 논문 기본값을 0.1로 두 배 늘린다; 이는 프루닝을 더 효율적으로 만든다 — 죽은 Gaussian이 T14 pruneOpacityThreshold 이하로 더 빨리 떨어지기 때문이다. 어떤 값이 가장 잘 맞는지는 Adam 설정에 따라 달라지며, 이 둘 간의 상호작용은 단순하지 않다. 값이 낮으면(< 0.01) "죽은" Gaussian이 영원히 남아 메모리를 소모한다; 값이 너무 높으면(> 0.5) 불투명도 폭발이 일어날 수 있으므로, 옵티마이저는 logit 값을 [-15, 3] 범위로 고정한다.
T8opacityLearningRateFinal
세부 정보
기본값: 0.0 (= "디케이 없음") 범위: 0 또는 0.001 – T7 opacityLearningRate
기술적 설명
불투명도 학습률에 대한 선택적 Cosine-디케이 최종값. 0.0이면 디케이가 비활성화되고 불투명도 학습률은 학습 전체에서 T7로 일정하게 유지된다. 0.1에서 0.01로의 디케이는 결과를 현저히 악화시킨다; 따라서 기본값은 "꺼짐"으로 설정되어 있다. 이 필드의 가설은 다음과 같다: 리파인먼트 단계에서 일정한 불투명도 학습률이 진동을 일으켜, 이미 적절한 투명도 수준에 도달한 스플랫이 무작위한 그래디언트 변동에 의해 다시 이동할 수 있다는 것이다. 경험적으로는 이것이 확인되지 않는다 — logit 클램핑 로직이 이를 어차피 방지하기 때문이다. 이 필드는 향후 실험을 위해 남아 있다; 매우 긴 MCMC 실행(500K 반복 이상)도 이로부터 이득을 볼 수 있을 것이다.
T9scaleLearningRate
세부 정보
기본값: 0.005 (Initializer + 논문), 0.01 (.full, MCMC — 2배) 범위: 0.0001 – 0.1
기술적 설명
각 Gaussian의 세 스케일 성분에 대한 log 공간에서의 Adam 학습률(RadianceKit은 스케일이 양수로 유지되도록 log(scale)을 저장한다). 논문 기본값은 0.005이며, RadianceKit에서는 조정된 학습률 설정에서 더 나은 스케일 수렴을 위해 0.01로 두 배 늘렸다. 이 값이 다른 Quality 학습률과 함께 논문 기본값에 머물면, 눈에 띄게 Gaussian 수가 부족해진다 — 스케일 업데이트가 너무 느리게 따라가서 Density-Control이 복제(clone)를 할 수 없기 때문이다. 스케일은 각 Gaussian의 확장을 제어한다 — 학습이 너무 빠르면 "바늘" 형태의 Gaussian(극도로 길고 얇은 스플랫, T34 scaleRatioPruneThreshold 참고)이 생기고, 학습이 너무 느리면 스플랫이 지나치게 조밀하게 남아 Density-Control이 너무 자주 분할(split)해야 한다.
T10rotationLearningRate
세부 정보
기본값: 0.001 (Initializer + 논문), 0.002 (.full, MCMC — 2배) 범위: 0.0001 – 0.05
기술적 설명
각 Gaussian의 네 쿼터니언 성분에 대한 Adam 학습률. 쿼터니언은 매 옵티마이저 단계마다 Adam 업데이트 후 다시 정규화된다(L2-norm = 1) — 그렇지 않으면 공분산 행렬이 퇴화된다. RadianceKit은 Quality 프리셋에서 논문 기본값을 두 배로 늘리는데, 이는 회전(rotation)이 스케일/위치에 비해 절대적인 그래디언트 크기가 작기 때문이다(단위 구면 위에서는 각 단계가 짧게 유지된다) — 2배로 늘리지 않으면 35 000회 반복 구간에서 회전이 상당히 덜 수렴된 상태로 남게 된다. NeRF-Blender 장면(Lego, Chair)에서는 회전이 특히 큰 영향을 미친다 — 객체의 모서리가 5 000–10 000회 반복 후에야 제대로 정렬된다.
Densification — 클래식 (T11–T16)
T11densifyGradThreshold
세부 정보
기본값: 0.000002 (Initializer, 0.5× 해상도 기준 보정), 0.0000011 (.full, 1.0× 기준 보정), 0.000004 (.quickTest, 0.25× 기준 보정), 2e-7 (.fullClassicPaper) 범위: 1e-8 – 1e-3 (해상도 의존적)
기술적 설명
화면 공간에 투영된 위치 그래디언트의 L2 노름에 대한 임곗값으로, 이 값을 초과하면 해당 Gaussian이 복제(Clone) 또는 분할(Split) 대상으로 표시된다. 이 절대값은 학습 해상도에 직접 좌우된다 — 대략 1/해상도²로 스케일링되기 때문이다(픽셀이 많을수록 픽셀당 그래디언트는 작아진다). 따라서 T22 trainingRenderScale 단계마다 보정된 임곗값이 필요하다: 0.25× → 4e-6, 0.5× → 2e-6, 1.0× → 5e-8 … 1.1e-6 (.full). 논문의 기본값 0.0002는 NDC 정규화된 값이며 RadianceKit의 월드 공간 파이프라인과는 직접 비교할 수 없다. T52 adaptiveDensifyThreshold 플래그를 사용하면 현재 그래디언트 분포의 p98 값을 기반으로 런타임에 이 값을 계산할 수 있지만, 실제 장면에서는 이로 인해 Gaussian 개수가 극적으로 줄어드는(대량 프루닝) 현상이 발생하므로 이 플래그는 꺼둔 상태로 둔다. T77–T79는 rolling median을 통한 대안적 적응형 로직을 제공한다. 이 필드는 결코 안전하지 않다 — 값을 절반으로 줄이면 2–4배 더 많은 Gaussian이 생성되어(메모리 압박, OOM 위험) 문제가 되고, 반대로 두 배로 늘리면 장면이 densification 부족 상태가 될 수 있다.
T12densifyFromIteration
세부 정보
기본값: 500 범위: 100 – 5 000
기술적 설명
Densification이 활성화되는 첫 번째 반복 횟수. 이 시점 전에는 초기 SfM 포인트 클라우드에 대해 새로운 Gaussian을 생성하지 않고 「순수」 학습만 진행된다. 기본값 500은 3DGS 논문에서 유래한 값으로, 초기화가 안정화될 시간을 준다 — 만약 0번째 반복부터 densification이 시작된다면, 잘못 배치된 SfM 포인트들이 제자리를 찾기도 전에 여러 번 복제될 수 있다. 시작 시점을 훨씬 늦추면(예: 1 000) 결과가 약간 나빠지므로 기본값을 유지하는 것이 좋다.
T13densifyInterval
세부 정보
기본값: 100 (Initializer, MCMC), 200 (.full) 범위: 50 – 1 000
기술적 설명
두 densification 단계 사이의 반복 횟수. 논문 기본값은 100 — 100번의 반복마다 densification 후보 목록이 평가되어 복제/분할이 이루어지고, 동시에 프루닝 후보 목록(sigmoid(opacity) < T14 pruneOpacityThreshold)이 제거된다. .full에서는 200이 검증된 값이다 — 재구성 패스가 줄어들어 GPU 부담이 줄고, 각 Gaussian이 복제 동작 후 안정화될 시간을 더 많이 갖게 된다. 간격을 더 짧게 하면 Quality 설정에서는 과도한 densification이 발생한다: 이미지가 개선되지 않으면서 Gaussian 수만 크게 늘어난다. MCMC에서는 동일한 필드가 Relocation 간격으로 해석된다; MCMC 전용 로직은 T67 mcmcRelocationInterval을 참고하라.
T14pruneOpacityThreshold
세부 정보
기본값: 0.005 (Initializer, 논문, MCMC), 0.001 (.full) 범위: 0.0001 – 0.1
기술적 설명
다음 densification 단계에서 Gaussian이 삭제되는 기준이 되는 시그모이드 불투명도 임곗값. T7 opacityLearningRate 및 옵티마이저의 로짓 클램프 로직과 함께 작동한다. .full에서는 0.005 대신 0.001이 사용된다 — 특이한 시야각에서만 역할을 하는 스플랫도 더 오래 유지되어 SH 디테일에 기여하게 된다. 이보다 더 작은 값(예: 0.0001)은 별 효과가 없다: 프루닝이 너무 적게 일어나 메모리만 낭비된다. 중요한 점: Density-Control은 버퍼 용량이 다른 조치로 이미 가득 찬 상태라도 반드시 프루닝을 수행해야 한다 — 그렇지 않으면 죽은 Gaussian이 계속 쌓이고 개수가 고정된 채 멈춰버린다.
T15opacityResetInterval
세부 정보
기본값: 3 000 (Initializer + 논문), 100 000 (.full = 사실상 비활성화), 200 000 (.fullMCMC = 비활성화) 범위: 1 000 – 100 000+
기술적 설명
모든 Gaussian의 불투명도를 낮은 값(~0.01)으로 재설정하는 주기 — 「고정된」 스플랫을 다시 평가하기 위한 3DGS 논문의 기법이다. RadianceKit의 워밍업, 확률적 학습 설정, 그리고 두 배로 늘린 학습률과 결합될 경우 Opacity-Reset은 품질에 뚜렷한 손실을 초래하며, 옵티마이저의 로짓 클램프가 이미 그 기능을 어느 정도 대신하고 있다. 따라서 .full 에서는 사실상 비활성화되어 있다(100 000 > 35 000 = 절대 트리거되지 않음). .fullClassicPaper(논문 충실 버전)에서는 의도적으로 다시 3 000으로 설정되어 있다 — 이 경우 목표는 원본 논문의 Gaussian 예산을 재현하는 것이다.
T16maxScreenSize
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 (꺼짐) 또는 > 0
기술적 설명
Gaussian이 강제로 분할되기 전에 도달할 수 있는 화면 공간 최대 크기(투영된 픽셀 단위). 이 값은 0으로 설정되어 있다 — RadianceKit의 Density-Control은 대신 동일한 그래디언트 로직에서 나온 월드 공간 스케일 임곗값을 사용한다. 이 필드는 향후 Mip-Splatting(T74–T76) 실험이나 장면별 스플래팅 전략에서 유용할 수 있어 필드 목록에는 남아 있다. 값을 활성화하면(0보다 큰 값, 예: 20) 화면상에서 매우 커진 스플랫이 강제로 분할된다 — 하나의 거대한 스플랫으로는 디테일이 부족한 크고 매끈한 벽면 등에서 유용하다.
Loss (T17–T20)
T17ssimWeight
세부 정보
기본값: 0.2 (초기화 값 + 논문 + .full), 0.05 (모든 MCMC 프리셋) 범위: 0.0 – 1.0
기술적 설명
결합 Loss 함수 loss = (1 - λ) * L1 + λ * D-SSIM에서 D-SSIM 항의 가중치이며, 여기서 λ = T17. 3DGS 논문의 기본값 0.2는 Classic Densification에는 알맞은 선택이다 — 0.3만 되어도 결과가 눈에 띄게 나빠진다. 반면 MCMC에는 0.05가 적합한 값인데, MCMC는 확률적 탐색 방식 때문에 더 강한 L1 신호 비중이 필요하기 때문이다 — SSIM 가중치를 높이면 Relocation 결정이 흐려질 수 있다. SSIM은 L1보다 계산 비용이 훨씬 높다(이미지 전체에 걸친 지역적 11×11 윈도우 계산); RadianceKit은 1080p 이미지당 1 ms 이하로 처리하는 MPS 가속 구현을 사용한다. Scene Class 프리셋들은 0.082(.outdoorPreset)부터 0.171(.indoorPreset) 사이의 장면별 값을 사용한다.
T18ssimWeightRefinement
세부 정보
기본값: 0.0 (= "변경 없음, ssimWeight 유지") 범위: 0 또는 0 – 1.0
기술적 설명
T2 densifyUntilIteration 이후 Refinement 단계를 위한 선택적 SSIM 값. Refinement 단계에서 0.2를 0.3으로 올리면 결과가 L1과 SSIM 두 지표 모두에서 나빠진다 — 그래서 기본값은 0.0으로 되어 있다. 이 필드 뒤에 있던 가설은 Densification이 끝난 뒤 — 더 이상 새로운 Gaussian이 생기지 않을 때 — SSIM 비중을 높이면 구조적 선명도가 극대화될 것이라는 것이었다. 경험적으로는 틀렸다: SSIM 가중치를 높이는 것은 간접적으로 L1 가중치를 낮추는 것을 의미하며, L1은 Final Refinement 단계에서 훨씬 더 의미 있는 신호이기 때문이다. 이 필드는 향후 perceptual Loss(T60)나 Edge Loss(T19)를 활용한 실험을 위해 남겨져 있으며, 이런 경우 Refinement 전용 Loss 구성이 의미가 있을 수 있다.
T19edgeLossWeight
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 0.001 – 1.0
기술적 설명
실험적 Loss 항: L1+SSIM에 더해 이미지 가장자리를 직접 비교하는 Sobel Gradient-Domain L1 Loss의 가중치 (Ground Truth Sobel 대 렌더 Sobel). 가설: 가장자리 정보는 이미지 품질의 지각적 핵심 요소이며, 명시적인 항을 추가하면 Gaussian이 가장자리를 더 잘 맞추도록 유도할 수 있다는 것이었다. 실제로는 아무런 효과가 없다: 눈에 띄는 가중치(0.1)는 결과를 나쁘게 만들고, 작은 값(0.01)은 품질에 아무 변화도 주지 않으면서 연산 시간만 잡아먹는다. Sobel 패스는 Ground Truth와 렌더 이미지 모두에 대해 추가적인 MPS forward 연산 비용이 든다. 따라서 항상 비활성화되어 있다. 향후 사용 사례: 인공적으로 날카로운 가장자리가 많은 장면(건축물, 가구, 렌더링)은 이득을 볼 수 있으나 — Scene Class 프리셋들은 이를 위해 이 항 대신 SSIM 가중치를 조정하는 방식을 사용한다.
T20skyMaskingEnabled
세부 정보
기본값: false (초기화 값 및 모든 프리셋) 범위: boolean
기술적 설명
Sky Masking을 켠다. 이 기능은 Apple Vision 프레임워크를 이용해 각 이미지에서 하늘 영역을 마스킹하고, 해당 영역의 Loss를 0으로 설정한다. 목적: 실외 장면은 파랗거나 회색이거나 흰 하늘 픽셀 때문에 앱이 바로 그 자리에 Gaussian을 배치하게 되는 문제를 자주 겪는데 — 이것이 "floater"로 인지된다. Sky Mask가 없으면 하늘 부분의 Loss는 결코 0이 되지 않는데, 이미지 속 하늘이 미세하게 계속 변하기 때문에 앱이 이를 스플랫으로 재현하려고 끝없이 시도하기 때문이다. Vision 마스크는 학습 전에 카메라마다 한 번씩 계산되어 RAM에 유지된다. 일반적으로 T45 skyDomeEnabled와 함께 활성화된다(설정 화면의 UI 로직). 실내 장면이나 합성 렌더링에서는 비활성화 상태로 두어야 한다 — 그렇지 않으면 마스크가 천장이나 벽을 잘못해서 "하늘"로 인식할 수 있다.
SH-Degree-Progression (T21)
T21shDegreeUpgradeIterations
세부 정보
기본값: [1_000, 2_000, 3_000] (Initializer), [2_000, 5_000, 8_000] (.full, MCMC), [1_000, 2_000] (.preview — Degree 3 건너뜀) 범위: [Int], 각 값은 [0, maxIterations] 범위 내에서 단조 증가
기술적 설명
활성 SH Degree를 0→1, 1→2, 2→3으로 올리는 반복 지점. 첫 번째 마크 이전에는 DC 성분만 활성화되어 있고(즉 T5 shDCLearningRate), 첫 번째 마크 이후에는 DC + Degree-1 계수 3개, 두 번째 마크 이후에는 + Degree-2 계수 5개, 세 번째 마크 이후에는 15개 계수가 모두 활성화된다. Gaussian 하나당 필요한 메모리는 이 과정에서 단계적으로 증가한다 — 4 Floats → 16 Floats → 36 Floats → 64 Floats. Quality Preset들은 Initializer 기본값보다 승급 시점을 늦추는데, 이는 기하 구조가 먼저 안정된 뒤에 더 높은 주파수를 가진 색상 디테일이 추가되도록 하기 위해서다. 더 이른 마크인 [1K, 2K, 3K]를 사용하면 .full에서 눈에 띄게 나쁜 결과가 나온다. .preview는 Degree 2에서 멈추는데, Degree 3가 5,000회 반복 안에는 수렴하지 않고 Optimizer 용량만 소모하기 때문이다. Curriculum(T80–T81)은 이 목록을 동적으로 덮어쓰는 대체 로직을 제공한다.
Performance (T22–T24)
T22trainingRenderScale
세부 정보
기본값: 1.0 (Initializer, .full, MCMC, Scene-Class), 0.5 (.preview), 0.25 (.quickTest) 범위: 0.05 – 2.0 (일반적으로 0.25, 0.5, 1.0)
기술적 설명
학습 시 렌더링 해상도를 학습 이미지의 원본 해상도 대비 비율로 나타낸 값. 0.5로 설정하면 각 이미지는 너비 50 % × 높이 50 %로 축소되고(즉 픽셀 수는 25 %), Gaussian 렌더링은 이 축소된 해상도에서 이루어진다. 메모리와 연산량 모두 제곱에 비례해 줄어든다. 중요한 점: T11 densifyGradThreshold는 선택한 해상도에 맞춰야 한다 — 그래디언트 크기는 1/해상도²에 비례해 스케일되므로, .quickTest(0.25×)는 .full(1.0×, 1.1e-6)보다 훨씬 높은 임계값(4e-6)을 가진다. RadianceKit은 매우 큰 이미지에서 경고를 표시하고 자동으로 조정한다 — 목표 해상도는 3 MP다. 극단적으로 4K급 입력 이미지라면 0.5나 심지어 0.25가 적절할 것이며, 그렇지 않으면 어떤 Mac에서든 CPU 압축(compaction)으로만 처리하게 된다.
T23resolutionWarmupScale
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 0.1 –
기술적 설명
Densification 단계(반복 0부터 T2까지)를 Refinement 단계보다 더 낮은 해상도로 학습시킨다. .full에서는 이 기능이 꺼져 있는데, T22 = 1.0이고 Cosine-Annealing을 사용할 경우 시간 절약 효과가 미미하고 품질이 약간 저하되기 때문이다. 이 필드가 목록에 남아 있는 이유는 4K 입력과 긴 학습 과정에서는 다시 유용해질 수 있기 때문이다 — 커리큘럼(T80)이 비슷한 로직을 채택하지만, 거기서는 LR 스케줄과 결합되어 있다는 차이가 있다. 이 값이 활성화되어 있고 T80 curriculumResolutionRamp도 true인 경우, 커리큘럼이 우선하며 이 값을 덮어쓴다.
T24tileSize
세부 정보
기본값: 16 범위: 8, 16, 32
기술적 설명
래스터화 타일의 픽셀 단위 크기. Gaussian Splatting 렌더링은 타일 기반으로 동작한다: 이미지를 16×16 픽셀 크기의 타일로 나누고, 각 타일은 자신과 관련된 Gaussian들을 모아 깊이순으로 정렬한 뒤 블렌딩한다. 16은 사실상 모든 3DGS 구현체에서 사용하는 표준값이며 RadianceKit의 Metal 커널에 하드코딩되어 있다. 이 값을 변경하려면 셰이더를 다시 컴파일해야 하며, 현재 상태에서는 효과가 없다. 향후 엔진 버전이 Tile-Size를 동적으로 지원할 경우를 대비해 필드로 남겨 둔다.
진단 및 포인트 클라우드 준비 (T26–T30)
T26depthDistortionWeight
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 0.0001 – 0.05
기술적 설명
실험적 기능: 깊이 왜곡(Depth-Distortion) 정규화 손실의 가중치입니다. 렌더링 광선을 따라 깊이 방향으로 겹겹이 쌓여 있지만 개념적으로는 동일한 표면에 속하는 Gaussian들에 불이익을 줍니다 — 이는 집중된 깊이 분포를 장려하고 Floater를 줄이는 효과를 노립니다. 테스트한 모든 강도에서 결과는 개선되기보다 악화되었습니다. 이론적 장점 — 멀티뷰 일관성 향상 — 은 L1 손실에 반영되지 않는데, 이는 SfM 기하 구조가 올바르다고 암묵적으로 가정하고 Gaussian들이 단지 "겹쳐 쌓인" 것만 정리하면 된다는 가설을 전제로 하기 때문입니다. 실제로는 SfM 포인트 클라우드가 대개 가장 약한 구성 요소이지, 겹쳐 쌓임이 문제가 아닙니다. 특히 깨끗한 포즈를 가진 멀티뷰 데이터셋(합성 데이터, Ground Truth가 있는 Mip-NeRF 360)을 위해 이 옵션은 계속 제공됩니다.
T27singleViewOverfit
세부 정보
기본값: false 범위: boolean
기술적 설명
진단용 플래그: true로 설정하면 매 학습 반복마다 카메라 풀에서 무작위로 선택하는 대신 반드시 카메라 인덱스 0을 사용합니다. 목적: 모델이 단 하나의 뷰조차 오버핏하지 못한다면 (즉, 뷰 0에 대한 손실이 10,000회 반복 후에도 0에 수렴하지 않는다면), Forward/Backward 패스에 근본적인 버그가 있다는 뜻입니다. 이 스위치는 Metal 셰이더와 미분 가능 래스터라이저 커널 개발 과정에서 집중적으로 사용되었습니다. 오늘날에는 학습 백엔드를 수정한 누군가가 검증하고 싶을 때 사용하는 정상성 검사(Sanity Check) 용도로만 남아 있습니다. 화면상에는 이를 위한 스위치가 없으며 — 이 필드는 모든 프리셋에서 꺼져 있고 앞으로도 그럴 것입니다.
T28maxCameras
세부 정보
기본값: 0 (= "모든 카메라 사용") 범위: 0 또는 1 – N
기술적 설명
진단용 제한값: 처음 N개의 카메라로만 학습하고 나머지는 모두 무시합니다. 원래 목적: 카메라가 너무 많으면 그래디언트 충돌이 발생한다는 (동일한 Gaussian에 대해 너무 많은 상충되는 손실 신호가 생긴다는) 가설을 검증하기 위한 것이었습니다. 인위적인 제한은 아무런 이점을 주지 않으며 — 프레임이 많을수록 실질적으로 항상 품질이 향상됩니다. 화면상에는 이를 위한 조작 요소가 없으며, 이 필드는 모든 프리셋에서 0, 즉 "모든 카메라"로 설정되어 있습니다.
T29maxInitialPoints
세부 정보
기본값: 0 (= "모든 SfM 포인트 사용") 범위: 0 또는 1 000 – 200 000+
기술적 설명
안전장치: 학습을 시작할 때 사용하는 초기 SfM 포인트의 수를 제한합니다. 조밀한 COLMAP 재구성은 60,000개를 넘는 포인트를 생성할 수 있으며, 큰 초기 스케일에서는 픽셀당 200–300개의 Gaussian 중첩으로 이어질 수 있습니다 — 이는 학습이 수렴하지 못하는 "안개 지대"를 만들어냅니다. 약 16,000개 포인트로 서브샘플링하면(학습 엔진의 하드캡 로직) 초기 밀도가 기준 3DGS가 사용하는 수준에 맞춰지고 중첩이 극적으로 줄어듭니다. 앱은 매우 조밀한 재구성에 대해 이를 자동으로 설정하며, 이를 위한 조작 요소는 없습니다.
T30cameraClusterOutlierMultiplier
세부 정보
기본값: 10.0 (모든 프리셋에서 — 절대 덮어쓰이지 않음) 범위: 1.0 – 100.0
기술적 설명
카메라 클러스터 이상치 필터의 배율입니다. 학습 전에 학습 엔진이 모든 카메라 위치의 중심점(Centroid)과 중심점으로부터 가장 먼 카메라의 거리를 계산합니다. 중심점으로부터의 거리가 multiplier × maxCameraDistance를 초과하는 SfM 포인트는 이상치로 간주되어 버려집니다. 기본값 10배는 의도적으로 넉넉하게 설정되었습니다. 미묘한 부작용 하나: SfM이 더 조밀할수록(카메라들이 더 가까이 모여 있을수록) → 임계값이 더 작아짐 → 더 많은 포인트가 이상치로 버려집니다. SfM이 더 느슨할수록 → 임계값이 더 커짐 → 버려지는 포인트가 적어집니다. 여기서 놀라운 효과가 나타납니다: 더 조밀하고 본질적으로 더 나은 SfM 재구성이 오히려 학습을 악화시킬 수 있다는 점인데, 너무 많은 초기 포인트가 버려지기 때문입니다. 이 필드는 모든 프리셋에서 10으로 설정되어 있으며 화면에서는 조정할 수 없습니다. 5 미만의 값은 대개 너무 제한적이며, 20을 초과하면 효과가 없습니다.
정규화 (T31–T37)
T31coarseToFineBlurRadius
세부 정보
기본값: 0 (= 비활성화) 범위: 0 또는 1 – 10
기술적 설명
실험적 기능: Densification 단계 시작 시 그라운드 트루스 이미지에 적용되고 Densification(T2) 종료 시점까지 선형적으로 0으로 줄어드는 박스 블러 반경입니다. 가설: Coarse-to-Fine 학습 — 먼저 거친 구조를 학습한 뒤 세부 사항을 학습하는 방식 — 이 더 안정적인 지오메트리를 만들어 줄 것이라는 예상이었습니다. 테스트한 모든 반경에서 결과가 오히려 나빠졌습니다. 실패 원인은 Densification이 이미지 도메인의 그라디언트를 기준으로 판단하기 때문인데, 블러는 바로 "여기서 클론이 필요하다"는 신호를 약화시킵니다. 다른 밀도 제어 방식으로 향후 테스트할 수 있도록 필드 카탈로그에는 남겨 둡니다.
T32scaleRegWeight
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 0.0001 – 0.05
기술적 설명
실험적 기능: 월드 공간 스케일에 대한 L1 정규화입니다. 너무 커지는 Gaussian을 억제합니다 — 벽 전체를 하나의 Gaussian으로 덮어버리는 "메가 스플랫"을 방지합니다. 활성화하면 Gaussian 개수가 수백만 개로 폭증하고 결과는 몇 배나 나빠집니다. 원인은 스케일 정규화가 밀도 제어(density control)와 충돌하기 때문입니다 — 스케일이 작아지면 더 많은 Gaussian이 필요해지고, 이에 따라 밀도 제어가 더 자주 분할을 수행하게 되어 결국 더 많은 그라디언트 연산이 필요해집니다. 비활성화 상태이지만, Mip-Splatting 실험(T74)을 위해 문서화해 둡니다: 이 맥락에서는 스케일 하한선이 유용할 수 있습니다.
T33anisotropyRegWeight
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 0.0001 – 0.05
기술적 설명
실험적 기능: max(scale)/min(scale) 비율에 대한 페널티로, 플로터로 인식되는 극단적으로 길쭉한 "바늘" 형태의 Gaussian을 방지하기 위한 것입니다. 테스트한 모든 강도에서 결과가 눈에 띄게 나빠졌습니다. 원인은 정규화가 스플랫을 "둥근" 형태 쪽으로 강제하는데, 이는 평평한 표면(벽, 테이블, 바닥)에서는 정확히 잘못된 방향이기 때문입니다 — 그런 곳에서는 구형 Gaussian보다 평평하고 넓은 Gaussian이 더 효율적입니다. 비활성화 상태입니다. T34 scaleRatioPruneThreshold가 동일한 목적을 더 정밀하게 추구하지만, 이 역시 기본적으로 꺼져 있습니다.
T34scaleRatioPruneThreshold
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 5.0 – 100.0 (일반적으로 10.0 – 30.0)
기술적 설명
학습 후 실험적 프루닝으로, max(scale)/min(scale) 비율이 여기 설정된 선형 임계값을 초과하는 모든 Gaussian을 삭제합니다. 정규화만으로는 제거할 수 없는 극단적으로 길쭉한 "바늘/원반" 형태 플로터를 겨냥합니다. 테스트에서 프루닝은 기대한 대로 플로터를 제거했지만, 동시에 벽과 바닥의 유용한 평평한 스플랫도 함께 제거되었습니다 — 이미지에 구멍이 더 많이 생겼습니다. 따라서 기본적으로 꺼져 있습니다. 버전 1.8부터는 Inspector의 "Training" 섹션, "Runs automatically at the end of training"라는 부제목 아래 Remove Needle/Disc Floaters 스위치로 이 기능을 사용할 수 있습니다. 활성화하면 의도적으로 보수적으로 작동하며(가장 긴 축이 가장 짧은 축의 약 50배를 넘는 스플랫만 대상), 다음 학습 실행부터 적용됩니다.
T35opacityRegWeight
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 0.0001 – 0.05
기술적 설명
실험적 기능: 불투명도를 0 또는 1로 끌어당기는(즉 "반투명"에서 멀어지게 하는) 이진 교차 엔트로피 페널티입니다. 가설: 더 선명한 불투명도 분포가 이미지 선명도를 개선할 것이라는 예상이었습니다. T33과 함께 적용하면 정규화가 품질을 저하시키므로 둘 다 비활성화되어 있습니다. 주의: 1.4.3-베타에서 바로 이 필드의 기본값이 변경되는(initializer = 0.01) 버그가 발생하여 Gaussian 개수가 대량으로 소멸하는 현상(460K → 5, 단 한 번의 반복에서)이 발생했습니다. 1.4.4부터는 기본값이 0.0으로 고정되어 있습니다.
T36opacityDecayFactor
세부 정보
기본값: 0.0 (initializer = 비활성화), 0.9995 (.full, .classicBalanced — HTGS 표준) 범위: 0 (꺼짐) 또는 0.95 – 1.0
기술적 설명
HTGS 방식(Hierarchical Time-Gating, Eurographics 2025)의 구현입니다: T37 opacityDecayInterval 반복마다 각 Gaussian의 시그모이드 불투명도에 이 계수를 곱합니다. 0.9995를 100번 적용하면 밀도화(Densification) 단계당 약 95%가 유지됩니다 — 모든 불투명도에 가하는 약하지만 지속적인 하향 압력으로, 약하게 기여하는 Gaussian들을 안정적으로 T14 pruneOpacityThreshold 이하로 떨어뜨립니다. 결과는 Decay 없이 학습할 때보다 확연히 더 좋습니다. Densification 단계(T2까지) 동안만 활성화되며, 그 이후에는 Refinement 단계에서 확립된 불투명도가 안정적으로 유지되도록 Decay 없이 학습이 계속됩니다. MCMC에서는 사용되지 않습니다(MCMC는 T67 mcmcRelocationInterval + T68 mcmcDeadOpacityThreshold를 통한 자체 메커니즘을 갖고 있습니다).
T37opacityDecayInterval
세부 정보
기본값: 50 범위: 10 – 500
기술적 설명
T36 opacityDecayFactor가 적용되는 반복 간격입니다. HTGS 논문의 기본값은 50이며, .full에서도 그대로 유지됩니다. 긴 간격(200 초과)은 두 번의 적용 사이에 충분한 그라디언트 업데이트가 발생하여 불투명도가 다시 상승하기 때문에 효과를 일부 상쇄합니다. 짧은 간격(20 미만)은 Decay를 지나치게 공격적으로 만듭니다. Densification 단계에서만 활성화됩니다.
정제 (T38–T44)
T38gradientAccumulationSteps
세부 정보
기본값: 1 (= "Adam 스텝 하나당 View 하나") 범위: 1 – 8
기술적 설명
Adam 업데이트를 한 번 실행하기 전에 그래디언트를 누적할 View의 개수. > 1일 때 앱은 별도의, "unfused" 방식인 Backward-Project 경로에서 동작하며, 그래디언트를 별도 버퍼에 합산한다. 최종 적용 시에는 크기를 일정하게 유지하기 위해 1/N로 스케일링한다. 클래식 트레이닝에서는 값을 2로 두어도 품질 향상은 없고, unfused 경로가 fused보다 비용이 크기 때문에 시간만 더 든다. 반면 MCMC에서는 accum = 2가 Classic과의 품질 격차를 눈에 띄게 줄여준다 — 그래서 그곳에서만 스위치 형태로 제공된다. 프리셋에서는 값이 1로 고정되어 있다. 화면에서는 Inspector의 "Training" 섹션에 있는 MCMC Quality 스위치를 통해 접근할 수 있다: 켜면 앱은 스텝당 2개의 View를 누적하고, 끄면 1개를 누적한다. 1과 2 외의 값은 편집된 프리셋 파일을 통해서만 지정할 수 있다.
T39testViewIndices
세부 정보
기본값: [] (= 비어 있음, 모든 View가 트레이닝에 사용됨) 범위: Set<Int>, Camera-Indices의 임의의 부분집합
기술적 설명
트레이닝에 사용되지 않고 PSNR/SSIM/LPIPS 평가를 위한 홀드아웃으로 남겨두는 Camera-Indices의 집합. 내부 측정 실행에서만 채워진다: 이 경우 인덱스 0부터 시작해 8번째 View마다 하나씩 (LLFF 표준이며, Mip-NeRF-360 및 3DGS 논문의 규칙과 동일). 출고 상태에서는 이 필드가 비어 있다 — 트레이닝은 모든 View를 사용하며, 화면에는 이를 위한 조작 요소가 없다. 주의: 인덱스를 이해하지 못한 상태에서 프리셋 파일에 이 필드를 수동으로 설정하면 측정이 무용지물이 된다(예를 들어 View가 N-50개밖에 없는데 모든 인덱스를 N 이상으로 설정하면 → 홀드아웃이 없음 → 평가 불가). 자체 프리셋 내보내기 시 testViewIndices는 함께 기록되지 않는데, 이는 이 값이 씬에 의존적이어서 그렇지 않으면 서로 다른 데이터셋 사이에 무의미한 값이 남기 때문이다.
T40refinementPruneInterval
세부 정보
기본값: 0 (= 비활성화) 범위: 0 또는 100 – 5 000
기술적 설명
정제 단계(T2 이후) 동안 N번째 이터레이션마다 추가적인 Prune 패스가 실행되어 sigmoid(opacity) < T41 refinementPruneOpacityThreshold인 Gaussians를 제거한다. 목적: Densification 중에는 정기적인 Density-Control 호출이 있지만, 그 이후에는 없다 — 그런데 Opacity가 계속 낮아지는 Gaussians는 버퍼에 남아 있게 된다. 실제로는 이 추가 Pruning이 오히려 해롭다: 두 번째 Densification 단계(T54)와 함께 사용하면 Gaussian 자료 전체를 완전히 비워버릴 수 있다. 모든 프리셋에서 0으로 설정되어 있으며 화면에서 조정할 수 없다; 그럼에도 편집된 프리셋 파일을 통해 값을 지정한다면 1 000이나 2 000이 합리적인 값이다.
T41refinementPruneOpacityThreshold
세부 정보
기본값: 0.0 (= "T14를 사용") 범위: 0 또는 0.001 – 0.1
기술적 설명
정제 단계 Pruning을 위한 별도의 Opacity 임계값. Densification 이후 대부분의 Gaussians는 훨씬 높은 Opacity에 도달해 있어서(> 0.001), 기본 T14 pruneOpacityThreshold는 너무 느슨할 것이다. T40이 활성화되어 있으면 이 필드가 자체 임계값을 결정한다. 0.0이면 T14가 계속 사용된다. T40 > 0일 때만 의미가 있다.
T42midTrainingCompactificationIterations
세부 정보
기본값: [] (= 비활성화) 범위: [Int], (densifyUntilIteration, maxIterations) 범위 내의 값
기술적 설명
정제 단계 중 명시적인 이터레이션 지점으로, 그 시점에 Compactification 패스가 실행된다(sigmoid(opacity) < 0.01인 Gaussians와 이상치 Scale Gaussians를 제거, T56 postTrainingCompactification과 동일한 로직). 목적: 긴 정제 단계에서는 Confetti/Floater 축적이 나타날 수 있고, 그 SH가 이후 View 특유의 아티팩트에 과적합될 수 있다. 활성화될 경우 전형적인 설정: 40K Classic의 경우 [10000, 20000, 30000]. 하지만: 임의로 선택한 정리 시점은 최종 결과를 일관되게 악화시킨다 — Gaussian 개수는 눈에 띄게 줄어들지만, 이미지 오차는 오히려 더 크게 증가한다. 따라서 자유롭게 선택 가능한 이터레이션 목록으로서 이 필드는 모든 프리셋에서 비어 있는 상태로 남는다. 효과 자체는 Inspector의 "Training" 섹션에 있는 Floater Cleanup 스위치를 통해 화면에서 얻을 수 있다: 클래식 실행에서 30 000 이터레이션 이상일 때 이 스위치는 트레이닝 중간에 두 번의 정리 패스를 배치한다. 자체 시점 지정은 편집된 프리셋 파일을 통해서만 가능하다.
T43frustumCullEnabled
세부 정보
기본값: false 범위: boolean
기술적 설명
트레이닝 후 모든 트레이닝 카메라 Frusta의 합집합 바깥에 있는 Gaussians는 모두 제거된다. 그런 Gaussians는 Loss 신호에 의해 제약된 적이 없으며 항상 Floater이다. 특히 Novel-View가 카메라 경로의 뒤쪽이나 옆쪽에 있는 씬에서 효과적이다(예: 선형 드론 비행의 뒷면) — 그곳의 Floater는 트레이닝 단계에서는 결코 보이지 않지만, 이후 3D 뷰어에서 이동할 때는 확실히 보인다. 드론 비행에서는 이것이 눈에 띄게 Floater를 줄여주므로 Opt-In으로 제공된다. 기본값은 false인데, 전체 Orbit Coverage를 갖는 Object-Captures에서는 Frustum 합집합이 씬 전체를 포괄해서 이 기능이 아무것도 제거하지 않기 때문이다 — Settings의 "Floater Reduction" 아래에서 제공된다. Outdoor 프리셋은 이를 활성화하지 않는데, Sky-Dome이 그곳에서 같은 문제를 더 잘 해결하기 때문이다.
T44frustumCullExpansion
세부 정보
기본값: 1.1 범위: 1.0 – 2.0
기술적 설명
T43 frustumCullEnabled를 위한 NDC-Margin. 1.0은 화면 가장자리에서 정확히 잘라내게 되는데, 이는 화면 가장자리의 흔들리는 Splats를 지나치게 잘라낼 수 있다. 1.1 = 정확한 카메라 Framing을 넘어선 10% Padding — 약간 어긋난 Novel-View에서 그래도 보일 수 있는 가장자리 픽셀에 약간의 여유를 준다. 1.2보다 큰 값은 Cull을 사실상 무력화하는데, 확장된 Frustum이 훨씬 더 많은 공간을 포괄하게 되기 때문이다.
스카이 돔 (T45–T48)
T45skyDomeEnabled
세부 정보
Default: false (초기화 값 + P9 Outdoor를 제외한 모든 Preset) Range: boolean
기술적 설명
트레이닝 시작 전에 구형 포인트 클라우드가 생성된다 (Fibonacci-sphere, T46 개의 Sample-Points), 씬 중심을 기준으로 T47 skyDomeRadiusMultiplier × scene_extent의 반경에 배치되며, 모든 트레이닝 카메라의 sky-마스킹된 픽셀에서 얻은 색상으로 초기화된다 (T20 skyMaskingEnabled 참고). 이 스카이 돔 Gaussians는 Gaussian-Buffer의 맨 앞에 삽입되며 트레이닝 중에는 "동결"된다 (Position/Scale/Rotation Gradient = 0, SH와 Opacity만 최적화 가능하게 유지). 효과: 먼 곳에 검은 "색종이 조각(Confetti)" 영역이 보이는 대신, 사용자는 새로운 시점(Novel-View)에서 진짜 하늘을 보게 된다. 드론 촬영이나 풍경 씬에서는 매우 잘 작동한다. Outdoor Preset(P9)에서는 기본적으로 켜져 있다. 실내 씬에서는 꺼 두는 것이 좋다 — 구가 공간 밖에 무의미하게 떠 있게 될 것이다.
T46skyDomeSampleCount
세부 정보
Default: 5 000 Range: 1 000 – 50 000 (일반적으로 2 000 – 10 000)
기술적 설명
스카이 돔 구체 위의 Fibonacci-Sphere Sample-Points 개수. 값이 높을수록 → 더 촘촘한 스카이 돔 (대해상도이거나 하늘이 많이 보이는 경우에 유리), 다만 메모리 사용량이 늘어난다. 5 000은 4K 렌더링에 적합한 최적값이다; 저해상도에서는 2 000–3 000이면 충분하다. 각 Sample-Point는 트레이닝 카메라의 시점 벡터와 코사인 거리에 따라 해당하는 sky-마스킹된 픽셀로 초기화된다 — 어떤 카메라에서도 보이지 않는 View-Cone에 있는 Sample-Point는 낮은 Opacity 초기값으로 뒤에 남지만, 트레이닝 중에는 변경되지 않는다 (동결 상태).
T47skyDomeRadiusMultiplier
세부 정보
Default: 30.0 (초기화 값 + 대부분의 Preset), 59.0 (P9 Outdoor) Range: 5.0 – 200.0
기술적 설명
씬 범위(= 카메라 위치들 간의 평균 거리) 대비 스카이 돔 구체의 반경. 30 = 구체의 지름이 카메라 클러스터의 30배임을 의미한다. 너무 작으면 (< 5) → 스카이 돔이 씬 자체와 간섭한다 (예: 스카이 돔 Splat이 전경에 위치하게 됨); 너무 크면 (> 100) → 스카이 돔 위치에서 float32 정밀도 손실이 발생하여 먼 곳에서 렌더링 결함이 나타난다. 넓은 야외 씬에는 59.0이 적합한 값이다 — 기본값인 30.0은 깊은 풍경에는 너무 작아서, 스카이 돔 픽셀이 이미지 가장자리에서 "벽"처럼 보이게 렌더링된다.
T48frozenGaussianCount
세부 정보
Default: 0 (= 동결된 Gaussians 없음) Range: 0 또는 1 – T46
기술적 설명
Buffer 맨 앞에 위치한 Gaussians의 개수로, 이들의 Position/Scale/Rotation Gradient는 옵티마이저에서 0으로 설정된다 — 트레이닝 전체 기간 동안 공간적으로 고정된 상태를 유지한다. Density-Control은 이들을 복제하거나 분할하거나 제거할 수 없다. 스카이 돔 삽입(T45 참고)에 사용된다: 스카이 돔이 켜져 있으면, 이 필드는 자동으로 T46 skyDomeSampleCount로 설정된다. 수동 설정도 가능하지만 (예: LiDAR 스캔에서 미리 배치된 포인트 클라우드를 동결시키기 위해), UI에서는 직접 접근할 수 없다. 중요: Buffer 내 처음 N개의 Gaussians가 항상 동결 대상이다 — 명시적인 인덱스가 아니라 Buffer 내의 순서가 결정 기준이다.
Adam + LR-Schedule (T49–T55)
T49adamResetIteration
세부 정보
기본값: 0 (= 비활성화) 범위: 0 또는 100 –
기술적 설명
Adam 옵티마이저의 모멘텀 누적기(m1, m2)를 0으로 리셋하는 이터레이션. 이후의 편향 보정(bias correction)은 iter 대신 (iter - adamResetIteration)으로 계산된다. Densification 종료 후 리셋을 하면 결과가 눈에 띄게 나빠진다. 이유는 Densification 동안 축적된 Adam 모멘텀이 전형적인 그래디언트 크기에 대한 정보를 담고 있어 Refinement 단계를 가속하기 때문이다. 이를 버리면 Refinement 초반 ~500 이터레이션의 수렴이 손해를 본다. 그래서 모든 Preset에서 0으로 고정되어 있으며 UI에서 조정할 수 없다.
T50positionLRScheduleEndIteration
세부 정보
기본값: 0 (초기값 = "maxIterations 사용"), 20 000 (.full — maxIter=35K임에도 Cosine이 20K에서 종료), 30 000 (.fullClassicPaper) 범위: 0 또는 1 000 –
기술적 설명
Position-LR의 Cosine-Annealing 곡선이 최솟값에 도달하는 이터레이션. 0이면 T1 maxIterations와 동일하다. 0보다 크면 스케줄은 이 값까지 진행되고, 이후에는 T4 positionLearningRateFinal 값으로 고정된다. 이를 통해 재차 Decay 없이 최소하지만 일정한 학습률로 위치를 천천히 다듬는 "확장된 Refinement 단계"가 가능해진다. .full이 이를 사용한다(스케줄은 20K에서 종료되지만 학습은 35K까지 진행); 그 주변 — 15K에서 25K 사이 — 값에서는 거의 차이가 없으며 20K가 최선의 절충점이다. T51과 함께 사용되어 확장 단계에서 Position이 아닌 다른 LR들도 함께 조정할 수 있다.
T51extendedPhaseLRDecay
세부 정보
기본값: 0.0 (= 비활성화, LR 고정) 범위: 0 또는 0.01 – 1.0
기술적 설명
T50에 도달하고 Position-LR이 이미 T4 값에 있는 "확장 단계"에서 Position이 아닌 LR들(Scale, Rotation, Opacity, SH)에 적용되는 최소 배율. 0.1이면 Scale/Rotation/Opacity/SH도 각각 1.0(= 표준 LR)에서 표준값의 0.1배까지 cosine 방식으로 decay된다. 0(기본값)이면 그대로 고정된다. 0까지 완전히 Decay해도 Decay를 아예 하지 않은 것과 결과가 같다 — Decay를 하면 동작이 더 "깔끔"해 보이지만 측정 가능한 개선은 없다. 그래서 모든 Preset에서 0으로 고정되어 있으며 UI에서 조정할 수 없다.
T52adaptiveDensifyThreshold
세부 정보
기본값: false 범위: boolean
기술적 설명
실험적 기능: true이면 앱은 각 Densification 단계마다 현재 그래디언트 분포의 p98을 계산하여 동적 임계값으로 사용한다(너무 벗어나지 않도록 T11에 설정된 값의 최소 0.5배로 clamp됨). 가설은 현재 씬 단계에 자동으로 맞춰지면 Density Control이 더 견고해질 것이라는 것이다 — 예를 들어 초반에는 더 엄격한 pruning, 이후에는 더 느슨하게, 또는 그 반대로. 하지만 실제로는 가우시안 개수가 극적으로 붕괴한다 — 대량 pruning이 발생하는데, 초반 이터레이션에서 p98이 극도로 높아서 이후에는 거의 아무것도 임계값을 넘지 못하기 때문이다. 고정 임계값은 이미 잘 보정되어 있어, 동적 조정은 이득보다 해가 크다. T77은 rolling median을 이용해 이 문제를 피하는 대체 Adaptive 로직을 제공한다.
T53mergeAfterDensification
세부 정보
기본값: false (초기값), true (.full, .classicBalanced, .fullClassicPaper) 범위: boolean
기술적 설명
Densification 단계가 끝날 때(T2 이터레이션) 서로 가깝고 Scale과 색상이 비슷한 가우시안들을 하나로 합치는 일회성 Merge Pass가 실행된다. 눈에 띄는 품질 저하 없이 가우시안 개수를 대개 5–15% 줄인다. 목적: 집중적인 Clone 이후에는 새로운 것을 전혀 기여하지 않는 거의 동일한 가우시안 클러스터가 생기는데 — 이 Merge는 옵티마이저의 용량을 다른 영역을 위해 확보해준다. Classic Quality Preset의 기본값이다. MCMC에서는 사용되지 않는데, MCMC는 Relocation 로직 덕분에 애초에 그런 클러스터가 생기지 않기 때문이다.
T54densifyPhase2FromIteration
세부 정보
기본값: 0 (= 비활성화) 범위: 0 또는 T2 – T1
기술적 설명
실험적 기능: Refinement 휴지기 이후 이 이터레이션에서 시작해 T55까지 진행되는 두 번째 Densification 단계를 허용한다. 가설은 Refinement 단계를 거친 뒤에는 그래디언트 누적기가 더 안정적인 크기를 가지므로 어느 영역에 추가 가우시안이 필요한지 더 정확히 알 수 있다는 것이다. 하지만 실제로는 두 번째 Densification 단계가 가우시안이 0개가 될 때까지 연쇄적으로 붕괴하며 — Refinement Pruning(T40)과 함께 버퍼를 완전히 비워버린다. 그래서 모든 Preset에서 0으로 고정되어 있으며 UI에서 조정할 수 없다.
T55densifyPhase2UntilIteration
세부 정보
기본값: 0 범위: 0 또는 T54 – T1 정의 위치:
기술적 설명
두 번째 Densification 단계의 종료 시점. T54 > 0일 때만 의미가 있다. 두 필드 모두 비활성화 상태이다.
후처리 + Apple AI (T56–T60)
T56postTrainingCompactification
세부 정보
기본값: true (모든 프로덕션 프리셋에서), false (.quickTest, .preview) 범위: boolean
기술적 설명
트레이닝 종료 후 sigmoid(opacity) < 0.01인 Gaussian은 강제로 제거된다 (이미지에 사실상 더 이상 기여하지 않기 때문). Gaussian 개수는 일반적으로 58 %, 내보내기 파일 크기는 55 % 줄어들며 눈에 띄는 품질 손실은 없다. 프로덕션 프리셋에서는 기본적으로 활성화되어 있다 — 최종 결과물은 가능한 한 컴팩트하게 전달되어야 하기 때문이다. .quickTest에서는 비활성화되어 있는데, 진단용 실행은 어차피 내보내기를 하지 않기 때문이다. T42 midTrainingCompactificationIterations와 달리 Compactification은 맨 마지막에만 실행된다 — Refinement는 그때까지 모든 Gaussian을 사용할 수 있다.
T57metalFXUpscaling
세부 정보
기본값: false 범위: boolean
기술적 설명
⚠ 2026-07-18부터 폐지되어 아무런 효과도 없다. 이 필드는 Inspector의 „Viewport Scaling" 피커 (Off/MetalFX/Lanczos)에 속해 있었다. 렌더러는 이 값을 읽은 적이 전혀 없다: 블릿(blit) 결정은 순전히 기하학적으로 이루어지며 (슈퍼샘플링 렌더링 시 ⇒ 안티에일리어싱을 위한 MPS-Lanczos 다운샘플, 그 외에는 bilinear), MetalFX 경로에 대한 호출 지점은 애당초 존재하지 않았다. 피커와 그것이 만들어내던 두 가지 잘못된 정보는 제거되었으며, 오버레이 라벨은 이제 „Scaling"이 아니라 „Sampling"이라 표시되고, 앱 어디에서도 MetalFX로 업스케일링하지 않는다. 필드 자체는 남아 있는데, 트레이닝 구성이 완전히 저장되기 때문이다 — 저장된 모든 씬, 모든 프리셋, 그리고 이미 내보낸 PLY의 설정 주석에도 이 필드가 들어 있다; 삭제하면 재작성 시 키가 조용히 빠지게 되어 이 교환 방식이 깨질 것이다. 같은 이유로 이 필드는 „Modified" 비교에서도 제외되어 있다: 오래된 씬은 true 값을 가질 수 있으며, 이를 화면을 통해 되돌릴 방법은 더 이상 존재하지 않는다. 아무도 이 값을 읽지 않는다 — 다시 연결하지 말 것.
T58mpsLanczosScaling
세부 정보
기본값: false 범위: boolean
기술적 설명
⚠ 2026-07-18부터 폐지되어 아무런 효과도 없다 — T57 metalFXUpscaling 참고. 그곳에 이 필드가 왜 계속 저장되어야 하는지도 설명되어 있다. 한 가지 그럴듯한 오해를 분명히 짚어두자면: 앱은 실제로 뷰포트에서 MPS-Lanczos를 사용하지만, 이는 오로지 기하학적으로만 제어된다 — 슈퍼샘플링으로 렌더링된 이미지는 안티에일리어싱을 위해 다운스케일된다. 이는 다운스케일이지 업스케일이 아니며, 이 필드가 그것을 유발한 적은 한 번도 없다.
T59livePreviewInterval
세부 정보
기본값: 50 (초기값; 프리셋은 이 필드를 설정하지 않음) 범위: 설정 피커에서 0(꺼짐), 50, 250 또는 1 000
기술적 설명
트레이닝 중 3D 뷰어가 현재 Gaussian으로 얼마나 자주 업데이트되는지를 나타낸다. 50 = 50회 반복마다 새로운 렌더링을 수행한다 — 트레이닝을 눈에 띄게 늦추지 않으면서 진행 상황을 관찰하기에 충분하다. 0 = 뷰어가 전혀 업데이트되지 않는다 (백그라운드 트레이닝, 최대 속도). 긴 MCMC 실행에서는 업데이트 오버헤드가 누적되므로 250이나 1 000이 유리하다. 특수 역할: 이 필드는 트레이닝 구성에 속하지만, 트레이닝 레시피의 일부가 아니라 앱 전역 설정(설정 → 트레이닝)이다. 그래서 „Modified" 비교에서 제외되며, 프리셋을 변경해도 유지되고, 2026-07-18부터는 씬을 열 때 파일 값으로 더 이상 덮어써지지 않는다 — 그 전에는 씬을 불러오면 사용자의 프레임 레이트가 씬 작성자의 값으로 조용히 대체되었고 („꺼짐" 포함), 이를 다시 되돌릴 두 번째 저장 장소가 없었다.
T60perceptualLossWeight
세부 정보
기본값: 0.0 (= 비활성화) 범위: 0 또는 0.001 – 0.5
기술적 설명
퍼셉추얼 손실 항(멀티스케일 블러 특징 매칭)의 가중치. L1+SSIM보다 더 높은 수준에서 구조적, 텍스처적 유사성을 포착한다 — 주로 „픽셀 완벽"보다 „현실적으로 보이는 것"이 더 중요한 경우에 쓰인다. 모든 프리셋에서 값은 0.0(꺼짐)이다. 화면에서는 Inspector의 „Training" 섹션에 있는 Perceptual Loss 슬라이더로 설정하며, 범위는 0부터 0,20까지 0,01 단위이고, 0일 때 앱에는 „Off"로 표시된다.
MCMC 밀도화 (T61–T73)
T61densificationStrategy
세부 정보
Default: .classic (Initializer + Classic-Presets), .mcmc (모든 MCMC-Presets + Scene-Class) Range: .classic 또는 .mcmc
기술적 설명
Classic-Densification (클론/스플릿/프룬, Kerbl et al.~2023)과 MCMC-Densification (Stochastic Gradient Langevin Dynamics, Relocation 포함, Kheradmand et al.~NeurIPS 2024) 사이를 선택한다. .classic일 때는 T11–T16이 평가되고, .mcmc일 때는 T62–T73이 평가된다. 전환 시 주의: Classic Defaults와 MCMC Defaults는 완전히 다르게 캘리브레이션되어 있다 — Expert View에서 피커만 전환하고 알맞은 프리셋을 로드하지 않으면 1.4.3 버그 스타일의 대량 소멸을 일으킬 위험이 있다 (460K → 5, 단 한 번의 이터레이션에서, MCMC-OpacityReg가 0.01로 설정되어 Classic-Opacities를 죽여버리기 때문). 그래서 MCMC-Init Defaults는 의도적으로 「순화」되어 있다 (모든 Reg 값이 0.0).
T62mcmcMaxGaussians
세부 정보
Default: 150 000 (Initializer + .fullMCMC + .mcmcBalanced), 100 000 (.mcmcPreview), 1 500 000 (.fullMCMCMip — Mip-Splatting 변형, 10배 예산), 1.19 M (.renderPreset), 1.25 M (.outdoorPreset), 670 K (.indoorPreset) Range: 0 (= 「버퍼 용량 사용」) 또는 10 000 – 5 000 000 Defined in:
기술적 설명
MCMC 전략에서 Gaussians 개수의 하드 상한값. 개수는 T70 mcmcGrowthRate (일반적으로 5%)만큼 매 Relocation-Step마다 이 상한까지 점진적으로 증가한다. 150K는 좋은 출발점이다 — 그보다 훨씬 높으면 스플랫 품질이 희석되고(너무 많은 작고 중복된 Gaussians), 훨씬 낮으면 씬이 밀도화 부족 상태로 남는다. 매우 큰 씬(예: 1 545장 사진 드론 촬영, SfM-init 158K)에서는 150K가 너무 낮다 — 그래서 1.4.5에서 T72 mcmcCapMultiplier + T73 mcmcAutoScaleByScene이 확장으로 추가되었다. Scene-Class 프리셋은 670K(Indoor)에서 1.25M(Outdoor) 사이의 씬별 값을 사용한다. 값이 0이면 엔진은 전체 버퍼 용량을 상한으로 사용한다.
T63mcmcNoiseScale
세부 정보
Default: 0.00005 (5e-5 = 논문 기본값) Range: 1e-6 – 1e-3
기술적 설명
매 MCMC 이터레이션마다 각 Gaussian의 위치에 더해지는 가우시안 노이즈에 대한 배율 (SGLD 로직). 높을수록 탐색이 많아지고(Gaussians가 더 이동하며 잠재적으로 더 나은 위치를 찾음), 낮을수록 활용이 많아진다(Gaussians가 이미 좋은 위치에 머무름). 5e-5가 적절한 값이다 — 훨씬 작으면 탐색이 부족하고, 훨씬 크면(1e-4) 과도해서 스플랫이 흩어져버린다. 학습 시간에 걸쳐 코사인 감쇠되어 T69 mcmcNoiseDecayEnd까지 이어진다 — 감쇠 구간이 끝나면 노이즈는 사실상 0이 되고 Gaussians가 수렴한다.
T64mcmcOpacityRegWeight
세부 정보
Default: 0.0 (= RadianceKit 기본값에서 비활성화, 논문: 0.01) Range: 0 또는 0.001 – 0.05
기술적 설명
MCMC 전용 Opacity에 대한 L1 페널티. 논문 기본값 0.01 (사용되지 않는 Gaussians를 0에 가깝게 눌러 Relocation에 사용 가능하게 만든다). RadianceKit에서는 이 정규화 없이도 결과가 눈에 띄게 더 좋다. 이유: T68 mcmcDeadOpacityThreshold로 정의된 프루닝 기준만으로 충분하다 — 추가 L1 페널티는 가치 있는 낮은 Opacity Gaussians까지 강제로 소멸시킨다. 그래서 기본값은 0이다. 주의: 1.4.3 베타 빌드에서는 Initializer 기본값이 실수로 0.01이었고, 이는 대량 소멸 버그를 일으켰다(T61 설명 참조); 1.4.4부터 0.0으로 수정되었다.
T65mcmcScaleRegWeight
세부 정보
Default: 0.0 (= 비활성화, 논문: 0.01) Range: 0 또는 0.001 – 0.05
기술적 설명
Scale 고유값에 대한 MCMC 전용 L1 페널티. 논문 기본값 0.01. 여기서도 정규화 없는 결과가 더 좋다, T64와 같은 이유에서다. 모든 RadianceKit MCMC 프리셋에서 비활성화되어 있다. T64와 같은 주의사항: 1.4.3 버그.
T66mcmcRelocationInterval
세부 정보
Default: 100 (Initializer + 모든 MCMC 프리셋, 논문 표준값), 155 (P9 Outdoor) Range: 50 – 500
기술적 설명
MCMC가 죽은 Gaussians(sigmoid(opacity) < T68 mcmcDeadOpacityThreshold)를 새 위치로 재배치하는 이터레이션 간격. 더 짧은 간격(약 50)은 너무 파괴적으로 작용해 Loss가 흔들리고; 훨씬 긴 간격(약 200)은 MCMC의 반응성을 떨어뜨린다. 100이 올바른 값이다. 야외 씬에서는 155로 다소 높은데 — 더 긴 간격이 Adam에게 새로 배치된 Gaussians를 다음 Reloc 이벤트가 압박을 가하기 전에 통합할 시간을 더 주기 때문이다.
T67mcmcWarmupIterations
세부 정보
Default: 500 Range: 100 – 5 000
기술적 설명
MCMC Relocation이 아직 일어나지 않는 초기 이터레이션의 개수. 이 워밍업이 끝난 후에야 Reloc 로직이 시작된다. 의미: 초기 이터레이션에서는 Opacity 값이 아직 안정되지 않았다 — 바로 Reloc으로 시작하면 Gaussians가 잘못된 위치에 배치되고 곧 다시 이동해야 하며, 이는 Adam-Momentum을 파괴한다. 논문 기본값 500. RadianceKit은 이 값이 견고하다고 입증되었기에 그대로 사용한다.
T68mcmcDeadOpacityThreshold
세부 정보
Default: 0.005 (Initializer, 논문 표준값), 0.01 (.fullMCMC 및 모든 MCMC 프리셋) Range: 0.001 – 0.05
기술적 설명
Gaussian이 「죽었다」고 간주되어 Relocation 후보가 되는 sigmoid(Opacity) 임계값. 0.01이 적절한 값이다 — 0.005는 거의 변화가 없고, 0.02는 더 나쁘다. 높을수록 더 공격적인 Reloc(더 많은 Gaussians가 이동됨), 낮을수록 더 신중하다. 0.01은 대략 「0.5% 시각적 가시성」에 해당한다. P10 Indoor는 0.0142를 사용한다.
T69mcmcNoiseDecayEnd
세부 정보
Default: 0 (Initializer = 「감쇠 없음」), 160 000 (.fullMCMC = 200K의 80%), 96 000 (.mcmcBalanced = 120K의 80%), 40 000 (.mcmcPreview) Range: 0 또는 1 000 –
기술적 설명
T63 mcmcNoiseScale 노이즈가 완전히 0으로 감쇠되는 이터레이션(이터레이션 0부터 여기까지 코사인 감쇠). maxIterations의 80%가 적절한 값이다 — 이는 MCMC에게 충분한 탐색 시간을 주면서도 마지막 20%는 노이즈 없이 수렴하도록 남겨둔다. 0 = 모든 이터레이션에 걸쳐 일정한 노이즈(드물게 의미 있으며, MCMC가 그러면 수렴할 수 없다).
T70mcmcGrowthRate
세부 정보
Default: 0.05 (논문 표준값 = 5%) Range: 0.01 – 0.2
기술적 설명
Relocation-Step마다 MCMC 인구 목표치의 성장률. 로직: 매 Reloc 이벤트마다 목표 인구 크기가 (1 + growthRate)만큼 증가하며, T62 mcmcMaxGaussians(또는 T72/T73으로 스케일된 변형)에 도달할 때까지 이어진다. 0.05가 적절한 값이다 — 값이 더 높으면 성장이 너무 빨라지고 (Adam-Momentum이 통합하기 전에 Gaussians가 삽입됨), 더 낮으면 결과적으로 밀도화가 부족한 씬이 된다.
T71mcmcSigmoidK
세부 정보
Default: 100.0 Range: 10.0 – 500.0 Defined in:
기술적 설명
MCMC-Noise-Attenuation을 위한 Sigmoid-Sharpness 파라미터. SGLD 단계에서 Gaussian별 노이즈가 이 값으로 감쇠된다 — 고-불투명 Gaussians(로짓이 양수인 경우)는 저-불투명 Gaussians보다 지수적으로 적은 노이즈를 받는다. K = 100은 날카로워서, 「풀-노이즈」에서 「노이즈-없음」으로의 전이가 Opacity 0.5 부근에서 매우 빠르게 일어난다는 뜻이다. K = 100이 적절한 값이다 — 더 작은 값(10–50)은 고-불투명 Gaussians까지 흔들리게 만들어(수렴된 Gaussians를 파괴함), 더 큰 값(> 500)은 전이를 인위적으로 딱딱하게 만들어 죽은 Gaussians가 전혀 움직이지 않게 된다.
T72mcmcCapMultiplier
세부 정보
Default: 3.0 (Initializer + .fullMCMC), 2.0 (.mcmcPreview), 2.5 (.mcmcBalanced), 2.98 (P8 Render), 5.32 (P9 Outdoor), 1.76 (P10 Indoor) Range: 0 (= 비활성화) 또는 1.0 – 10.0
기술적 설명
1.4.5 기능: 씬 적응형 상한 스케일링. T73 mcmcAutoScaleByScene이 true일 때, 유효 상한값은 버퍼 용량에 클램프된 계산 결과가 된다. 배경: 큰 씬(예: 1 545장 사진 드론 촬영 → SfM-init 158K)에서는 T62 = 150 000이 너무 낮다 — Density-Control이 아예 성장할 수 없게 된다. Multiplier 3.0을 사용하면 이 예시에서 상한이 474K로 스케일된다(158K × 3.0). Scene-Class 프리셋은 씬별 값을 사용한다: Outdoor는 높은 배율(5.32 → 156K 초기 포인트에서 상한 약 830K)의 이점을 얻고, Indoor는 1.76으로 충분하다(벽이 더 빨리 포화되기 때문). 상한의 완전한 계산 방식은 해당 메서드를 참조하라.
T73mcmcAutoScaleByScene
세부 정보
Default: true (Initializer + 모든 MCMC 프리셋) Range: boolean
기술적 설명
1.4.5 기능: 씬 인식 상한 로직의 마스터 스위치 (T72 참조). false일 경우 T62 mcmcMaxGaussians만이 상한으로 사용된다(1.4.4 동작으로 복귀). 기본값은 켜짐인데, 그렇지 않으면 1.4.3에서 있었던 큰 씬에서의 대량 소멸 문제가 재발할 수 있기 때문이다. 수동으로 비활성화하는 것은 명시적으로 고정 상한을 설정하려는 경우에만 — 예를 들어 최종 크기를 예측 가능하게 계획하고 싶은 150K 변형을 학습시키려는 경우에만 해당한다.
Mip-Splatting (T74–T76)
상태: Mip-Splatting은 실제로는 품질 향상을 가져오지 못했고, 일부 야외 씬에서는 오히려 품질을 해쳤습니다. 해당 필드들은 실험을 위한 opt-in 상태로 남아 있으며, 출시되는 모든 Preset에서 Mip-Splatting은 꺼져 있습니다.
T74useMipSplatting
세부 정보
Default: false (모든 Production Preset), true (.fullMCMCMip — 연구용 Sibling) Range: boolean
기술적 설명
Mip-Splatting(Yu et al., CVPR 2024)을 활성화합니다: per-Gaussian 주파수를 가장 조밀한 학습 카메라 샘플링 레이트의 나이퀴스트 한계로 제한하는 3D 스무딩 필터 + 2D 필터 + α 보정입니다. 이론적 목표는 학습 해상도가 아닌 다른 스케일(학습 해상도의 0.5배 또는 2배)로 렌더링할 때 발생하는 앨리어싱을 없애는 것입니다. Preprocess 및 Backward-Projection 셰이더에 구현되어 있으며 기능적으로는 정상 동작합니다. 하지만 실제로는 기대했던 품질 향상이 나타나지 않았습니다: 학습 해상도로 렌더링하면 사실상 아무것도 달라지지 않고, 야외 씬에서는 오히려 화질이 나빠집니다. 한 가지 설명은, Gaussian이 많아질수록 3D 스무딩이 MCMC Relocation과 상충한다는 것입니다. 이 필드는 자체적인 Multi-Scale 실험을 위해 남겨둡니다.
T75mipSmoothing3DScale
세부 정보
Default: 0.2 (논문 기본값) Range: 0.05 – 1.0
기술적 설명
3D 스무딩 스케일 매개변수입니다(Yu et al. §3.3, 논문 기본값 0.2). 값이 클수록 Gaussian당 월드 공간 스무딩이 커져(= 안티에일리어싱은 강해지지만 기본 스케일에서 blur도 늘어남), 값이 작을수록 더 선명하지만 앨리어싱에 취약해집니다. T74 useMipSplatting = true일 때만 참조됩니다. 논문 기본값 0.2에서도 이미 Mip-Splatting이 이득을 주지 못하기 때문에 더 이상 최적화하지 않았습니다.
T76mipFilter2DVariance
세부 정보
Default: 0.3 (= 기존 동작과 정확히 동일) Range: 0.1 – 1.0
기술적 설명
Σ_2D 대각선에 더해지는 2D Mip 필터 분산 값입니다(분산 자체이며 제곱하지 않음). 0.3은 Mip-Splatting 도입 이전에 커널에 고정되어 있던 값과 정확히 동일합니다. T74 useMipSplatting = false이면 커널은 이 값을 완전히 무시하고 하드코딩된 0.3을 사용하므로, 기존 동작이 절대 바뀌지 않습니다. 켜져 있으면 여기서 설정한 값이 사용됩니다. Mip 스윕 실험을 위해 필드 카탈로그에 남겨둡니다.
적응형 밀도 조정 (T77–T79)
T77adaptiveDensification
세부 정보
기본값: false 범위: boolean
기술적 설명
고정된 T11 densifyGradThreshold 대신 사용하는 롤링 미디언(Rolling-Median) 트래커. true로 설정하면 매 Densify-Step마다 현재 임계값이 median(최근 N개의 avgGrad 샘플) × T79 adaptiveDensifyMultiplier 값으로 덮어써진다. N = T78 adaptiveWindow. T52에서 Mass-Pruning을 유발하는 p98 변형보다 더 엄격하다: 정상 상태에서 median × 2는 대략 그래디언트 분포의 p70–p80 지점에 해당한다. 이 필드만 단독으로 켜서는 품질 향상이 없다; 커리큘럼(T80/T81 참고)과 함께 사용하면 향상이 있는데, 이 경우 품질 향상은 커리큘럼이, 안정성은 이 필드가 담당한다. 이를 위한 조작 요소는 없다: 이 필드는 모든 Preset에서 꺼져 있으며 편집된 Preset 파일을 통해서만 값을 지정할 수 있다.
T78adaptiveWindow
세부 정보
기본값: 1 000 범위: 100 – 10 000 정의 위치:
기술적 설명
Densification 이벤트 단위의 롤링 미디언 윈도우(반복 횟수 단위가 아님 — 각 T13 densifyInterval 스텝마다 샘플이 하나씩 생성된다). 기본값 1 000 — 이는 최근 100 000 학습 반복이 미디언 계산에 반영됨을 의미하며, 보통 이 시점까지의 전체 학습 이력에 해당한다. 초기 단계(T78 샘플 수에 도달하기 전)에는 트래커가 nil을 반환 → 고정 임계값 T11로 폴백한다. 다음 경우에만 관련이 있다.
T79adaptiveDensifyMultiplier
세부 정보
기본값: 2.0 범위: 1.0 – 4.0
기술적 설명
적응형 임계값을 위해 롤링 미디언에 곱하는 승수. 기본값 2.0은 대략 전형적인 그래디언트 분포의 p70–p80에 해당한다. 값이 낮을수록 = 더 공격적인 성장(더 많은 클론), 값이 높을수록 = 더 엄격함(더 적은 클론). 1.5–3.0 범위 내에서는 2.0이 최적값이다. 다음 경우에만 관련이 있다.
커리큘럼 (T80–T81)
T80curriculumResolutionRamp
세부 정보
기본값: false 범위: boolean
기술적 설명
트레이닝 해상도는 0.5×에서 시작해서 T50 positionLRScheduleEndIteration / 2 시점(또는 T50이 설정되지 않은 경우 T1 maxIterations / 2 시점)에 T22 trainingRenderScale으로 전환된다. 활성화되면 T23 resolutionWarmupScale을 덮어쓴다. 두 개의 적응형 보완책(T77 참고) 중, 이 커리큘럼이 실제 품질 향상을 담당한다 — 단계적인 해상도 상승은 앱이 낮은 해상도에서 거친 기하 구조를 먼저 찾은 다음, 세밀한 디테일 작업으로 넘어갈 시간을 벌어준다. 인터페이스에서는 조정할 수 없고 — 편집된 프리셋 파일을 통해서만 가능하며, 이 경우 T81과 함께 사용하는 것이 합리적이다.
T81curriculumSHProgression
세부 정보
기본값: false 범위: boolean
기술적 설명
T21 shDegreeUpgradeIterations를 [maxIter/4, maxIter/2, maxIter*3/4]로 덮어써서, SH 단계 상승을 초반에 몰아넣는 대신 트레이닝 시간 전체에 고르게 분산시킨다. 가설은 다음과 같다: 색상 디테일이 폭발적으로 늘어나기 전에 안정적인 기하 구조가 먼저 확립되면, 시야 방향에 의존하는 광택 효과가 더 정확하게 자리 잡는다는 것이다. T77과 함께 사용하면 일부 씬에서 향상이 나타나는데, 이 향상을 실질적으로 담당하는 것은 이 필드이며 T77 단독으로는 충분하지 않다. 인터페이스에서는 조정할 수 없고 — 편집된 프리셋 파일을 통해서만 가능하다.
정적 프리셋 (TP1–TP9)
여기서는 초기화 기본값과의 구조적 차이만 다룬다. 열한 개 UI 프리셋 P1–P11에 대한 전체 마케팅 설명은 7장에서 확인할 수 있다.
TP1.preview
세부 정보
RAM ≥ 10 GB 시스템용 진단/미리보기 프리셋. 초기화 기본값 대비 오버라이드:
maxIterations30 000 → 5 000densifyUntilIteration15 000 → 3 500 (maxIter의 70%)positionLearningRateFinal1.6e-6 → 1.6e-5 (10배 높음, 감쇠가 덜 공격적)shDCLearningRate,shRestLearningRate,opacityLearningRate,scaleLearningRate,rotationLearningRate각각 2배opacityResetInterval3 000 → 100 000 (사실상 비활성화 — 리셋이 짧은 학습을 망가뜨림)shDegreeUpgradeIterations[1K, 2K, 3K]→[1K, 2K](이렇게 짧은 실행에서는 Degree 3이 수렴하지 않음)trainingRenderScale1.0 → 0.5
TP2.full
세부 정보
프로덕션 품질의 클래식 방식. 오버라이드:
maxIterations30 000 → 35 000 (그 이상은 과적합 위험: Gaussian이 늘어나도 품질 향상 없음)densifyUntilIteration15 000 → 5 000 (검증된 값; 더 늦게 멈추면 오히려 나쁨)- 모든 학습률 2배
positionLearningRateFinal1.6e-6 → 1.6e-5 (논문 기본값보다 10배 높음)densifyGradThreshold2e-6 → 1.1e-6 (1.0배 해상도에 맞춰 보정됨)densifyInterval100 → 200pruneOpacityThreshold0.005 → 0.001opacityResetInterval3 000 → 100 000 (사실상 비활성화)shDegreeUpgradeIterations[1K, 2K, 3K]→[2K, 5K, 8K](승급 지연)opacityDecayFactor0.0 → 0.9995 (HTGS 방식, 뚜렷한 품질 향상)opacityDecayInterval50 (변경 없음)mergeAfterDensificationfalse → truepositionLRScheduleEndIteration0 → 20 000postTrainingCompactificationtrue (.full의 초기화 기본값에 이미 포함됨)
TP3.fullClassicPaper
세부 정보
TP2의 논문 충실 클래식 변형. TP2 대비 오버라이드:
maxIterations35 000 → 30 000 (논문 표준)densifyUntilIteration5 000 → 15 000 (논문: maxIter의 50%)positionLearningRateFinal1.6e-5 → 1.6e-6 (논문 기본값)opacityLearningRate,scaleLearningRate,rotationLearningRate논문 기본값(0.05, 0.005, 0.001)으로 복귀densifyGradThreshold1.1e-6 → 2e-7 (Bicycle 씬 기준 약 1~2M Gs에 맞춰 보정됨)densifyInterval200 → 100 (논문)pruneOpacityThreshold0.001 → 0.005 (논문 기본값)opacityResetInterval100 000 → 3 000 (논문 §5.2, 위험함 — RadianceKit 설정에서는 품질을 희생시킴)opacityDecayFactor0.9995 → 0.0 (논문에는 decay가 없음)positionLRScheduleEndIteration20 000 → 30 000 (cosine이 maxIter의 100%까지 진행)
TP4.fullMCMC
세부 정보
프로덕션 품질의 MCMC. 초기화 기본값 대비 오버라이드:
maxIterations30 000 → 200 000 (MCMC는 Classic보다 약 5배 많은 반복이 필요함)densifyUntilIteration15 000 → 160 000 (maxIter의 80%)positionLearningRateFinal1.6e-6 → 1.6e-5- LR 스케줄은 TP2와 동일 (모두 2배)
ssimWeight0.2 → 0.05 (MCMC는 더 강한 L1 신호가 필요함)shDegreeUpgradeIterations[1K, 2K, 3K]→[2K, 5K, 8K]densificationStrategy.classic→.mcmcmcmcMaxGaussians150 000 (초기화 기본값에 이미 있으며, 프리셋에서 확정됨)mcmcNoiseScale5e-5 (논문 값, 검증됨)mcmcDeadOpacityThreshold0.005 → 0.01mcmcNoiseDecayEnd0 → 160 000 (maxIter의 80%)mcmcCapMultiplier3.0 (초기화 기본값에 이미 있음)mcmcAutoScaleByScenetrue (초기화 기본값에 이미 있음)opacityResetInterval3 000 → 200 000 (사실상 비활성화, MCMC는 Reset 대신 Reloc을 사용함)
TP5.fullMCMCMip
세부 정보
원본 논문의 Gaussian 예산을 사용하는 TP4의 Mip-Splatting 변형. TP4 대비 오버라이드:
mcmcMaxGaussians150 000 → 1 500 000 (10배, 논문 규모)useMipSplattingfalse → true (Mip 활성화)
TP6.classicBalanced
세부 정보
중간 등급 Classic. TP2 대비 오버라이드:
maxIterations35 000 → 20 000 (30 000과 사실상 동일한 결과를 훨씬 짧은 대기 시간으로 제공)positionLRScheduleEndIteration20 000 → 0 (Cosine이 maxIter = 20K까지 진행, 연장된 단계 없음)
TP7.mcmcPreview
세부 정보
MCMC 진단. TP4 대비 오버라이드:
maxIterations200 000 → 60 000densifyUntilIteration160 000 → 48 000 (80%)mcmcMaxGaussians150 000 → 100 000mcmcNoiseDecayEnd160 000 → 40 000mcmcCapMultiplier3.0 → 2.0 (Preview는 더 보수적으로 스케일링됨)
TP8.mcmcBalanced
세부 정보
중간 등급 MCMC. TP4 대비 오버라이드:
maxIterations200 000 → 120 000densifyUntilIteration160 000 → 96 000 (80%)mcmcNoiseDecayEnd160 000 → 96 000 (80%)mcmcCapMultiplier3.0 → 2.5 (Preview 2.0과 Full 3.0의 중간)
TP9.quickTest
세부 정보
순수한 기능 테스트. 초기화 기본값 대비 오버라이드:
maxIterations30 000 → 1 000densifyUntilIteration15 000 → 500densifyGradThreshold2e-6 → 4e-6 (0.25배 해상도에 맞춰 보정됨)densifyInterval100 → 50opacityResetInterval3 000 → 100 000 (비활성화, 너무 짧기 때문)trainingRenderScale1.0 → 0.25
앱이 Gaussian 상한을 결정하는 방법
"MCMC가 Gaussian을 최대 몇 개까지 키울 수 있는가?"라는 질문에 대한 확정적인 답이다. 여기에는 세 가지 값이 들어간다: T62 mcmcMaxGaussians에 설정된 값, 씬의 SfM 초기 포인트 개수, 그리고 사전에 예약된 버퍼 용량이다. 앱은 다음 순서로 계산한다:
+ 출발값은 T62다. 값이 0이면 앱은 150 000을 설정한다 — 이 안전 하한선은 1.4.3에서 다룬 대량 소멸(Mass-Extinction) 사고를 방지한다. + T73 mcmcAutoScaleByScene이 켜져 있고 T72 mcmcCapMultiplier가 0보다 크면, 앱은 출발값을 "초기 포인트 × T72"와 비교하여 둘 중 더 큰 값을 사용한다. + 마지막으로 결과값을 버퍼 용량으로 제한한다.
예시: Bicycle (Mip-NeRF 360, 194개 사진 프레임) → SfM 초기 약 156K 포인트, T62 = 150 000, T72 = 5.32, Auto-scale 켜짐, 버퍼 용량 8M. 156K × 5.32는 830K이며, 이는 150 000보다 크고 8M보다는 작다 — 따라서 실제 적용되는 상한은 830K다. MCMC 재배치(Relocation)는 이 한계를 따른다.
MCMC에서 실제 적용되는 최대 스플랫 개수를 계산한다. 앱은 네가 설정한 "Max Gaussians" 값을 가져와, 씬이 처음에 몇 개의 포인트를 가지고 있는지 확인하고, "Auto-scale by scene"이 켜져 있으면 배율을 적용해 스케일링한다. 이렇게 하면 작은 씬과 거대한 씬에 똑같은 값을 강제하는 대신, 상한이 씬에 맞춰 조정된다. 너는 아무것도 할 필요가 없다 — 앱이 트레이닝 시작 시점에 알아서 계산한다.
어떤 필드를 언제 쓸까? (치트시트)
| 목표 | 조정할 필드 |
|---|---|
| 먼 곳의 디테일 향상 | T62 mcmcMaxGaussians 높게, T72 mcmcCapMultiplier 5 이상 |
| 전반적인 디테일 향상 (Classic) | T1 maxIterations 높게 (≤ 40K), T2 densifyUntilIteration T1의 14 % 이하 |
| 드론 촬영에서 플로터 줄이기 | T43 frustumCullEnabled 켜기, T20 skyMaskingEnabled 켜기, T45 skyDomeEnabled 켜기 |
| 야외 씬에서 더 멋진 하늘 | T45 skyDomeEnabled 켜기, T47 skyDomeRadiusMultiplier 30–60 |
| 더 작은 익스포트 파일 | 전략 .mcmc (T61), T56 postTrainingCompactification 켜기, T62 mcmcMaxGaussians ≤ 200K |
| 더 빠른 트레이닝 | T22 trainingRenderScale 0.5, T1 maxIterations 절반으로 — 하지만 둘 다 동시에는 안 됨! |
| 더 나은 하이라이트 | T21 shDegreeUpgradeIterations를 [2K, 5K, 8K]로 (early-front-load 없이), MCMC + 200K iter |
| 라이브 미리보기 더 자주 | T59 livePreviewInterval을 50으로 — 설정 → 트레이닝에서 제공하는 가장 촘촘한 값 |
| 그림자 경계를 더 부드럽게 | T17 ssimWeight를 약간 높게 (0.15–0.25), 하지만 0.3은 넘지 않게 |
| 실내 공간을 컴팩트하게 유지 | P10 실내 Preset (, T72 = 1.76) |
위험한 필드
아래 필드들은 잘못 설정할 경우 OOM(메모리 부족), 앱 크래시, Gaussians의 대량 소멸, 또는 쓸모없는 벤치마크 데이터를 초래할 수 있습니다. 주의해서 다뤄야 합니다:
T11 densifyGradThreshold— 값을 절반으로 줄이면 Gaussians가 2–4배까지 늘어날 수 있어 GPU 메모리를 금방 초과할 수 있습니다. 또한T22 trainingRenderScale과 맞아야 합니다 (1.0× → 1e-6, 0.5× → 2e-6, 0.25× → 4e-6).T72 mcmcCapMultiplier— SfM 초기 점이 20만 개를 넘는 대형 씬에서 배수(multiplier)가 5를 넘으면 계산된 캡(Resolved Cap)이 수백만 Gaussians에 달하게 됩니다. 36GB RAM Mac에서는 OOM이 발생할 수 있습니다. 야외용 기본값 5.32는 해당 참조 씬이 약 15만 6천 개의 초기 점을 가지고 있기 때문에만 작동합니다 → 83만 캡.T39 testViewIndices— Preset 파일에서 수동으로 설정하면 품질 측정 자체가 무의미해질 수 있습니다 (모든 인덱스가 N보다 크면 → 홀드아웃 없음). 리스트는 비워 두세요.T64 mcmcOpacityRegWeight및T65 mcmcScaleRegWeight— 1.4.3 베타에서 0.01로 설정되어 대량 소멸이 발생했습니다 (460K → 5 Gaussians가 단 한 번의 이터레이션 만에). 1.4.4부터 0.0으로 고정되었지만, 수동으로 값을 올리면 같은 문제가 재현될 수 있습니다.T15 opacityResetInterval— 100,000 이상(사실상 꺼짐)이 아니고 훈련이 10,000 이터레이션보다 짧으면, 리셋이 수렴을 망가뜨립니다. 그래서.preview는maxIterations = 5 000임에도 이 값을 100,000으로 설정해 두었습니다.T54/T55 densifyPhase2*— 두 번째 Densification 단계는 결국 Gaussians가 0개가 될 때까지 연쇄적으로 붕괴합니다. 두 값 모두 0으로 두세요.T74 useMipSplatting— 품질 향상 효과가 없으며, 일부 야외 씬에서는 오히려 이미지 품질을 떨어뜨릴 수 있습니다. 기본값은 꺼짐이며, 실험 목적으로만 선택적으로 켜세요.
이 목록에 있는 필드를 변경하려면, 미리 현재 Preset을 백업(JSON으로 내보내기)해 두고, 결과를 재현 가능하게 측정할 수 있는지 생각해 보세요 — 그렇지 않으면 나중에 개선된 것인지 악화된 것인지 알 수 없게 됩니다.