Benutzerhandbuch

Kapitel 6 — Trainings-Konfiguration

Preview-Preset als JSON exportiert + in TextEdit angezeigt — Felder id/name/category/version/createdAt/description, trainingConfig mit allen relevanten Parametern (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, sechs Bool-Toggles)
Preview-Preset als JSON exportiert + in TextEdit angezeigt — Felder id/name/category/version/createdAt/description, trainingConfig mit allen relevanten Parametern (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, sechs Bool-Toggles)

Ein typischer Preset-JSON-Export. Top-Level-Felder: id (UUID), name, (classic | mcmc | sceneClass | custom), (Schema-Version), (Timestamp), (Free-Text). Verschachteltes -Objekt enthält die für Reproduzierbarkeit kritischen Parameter — beim Import wird der gesamte Block in die Trainings-Konfiguration eingelesen, und Standardwerte aus der App-Version füllen die Felder, die in der JSON fehlen (z. B. nach App-Update). Wer ein Preset an einen anderen Mac übergibt, schickt einfach diese JSON-Datei rüber.

Die Trainings-Konfiguration ist das Herzstück jedes Trainingslaufs in RadianceKit. Sie versammelt jeden Parameter, der das Training beeinflusst — von der maximalen Iterationszahl über die acht Lernraten bis hin zu den Spezialfeldern für MCMC, Mip-Splatting, das Curriculum und die scene-aware Cap-Logik. Du bearbeitest sie in der Sidebar im Bereich Trainings-Konfigurations-Sektion (Expert View), speicherst sie als Preset oder reichst sie als JSON-Export an einen anderen Mac weiter. Beim Training wird genau dieses Objekt eingefroren und ans GPU-Backend gegeben.

Dieses Kapitel ist Referenz-Material für Power-User. Es listet die 80 einstellbaren Felder der Trainings-Konfiguration, die 9 mitgelieferten Presets und die szenenabhängige Auflösung des Gaussian-Caps. Im Zweifel gilt der Wert, den das gewählte Preset setzt — du siehst ihn im Inspector oder im JSON-Export des Presets.

Inhaltsverzeichnis:

+ Iteration (T1–T2) + Learning Rates (T3–T10) + Densification — Classic (T11–T16) + Loss (T17–T20) + SH-Degree-Progression (T21) + Performance (T22–T24) + Diagnose und Punktwolken-Vorbereitung (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) + Statische Presets (TP1–TP9) + Wie die App den Gaussian-Cap bestimmt + Welches Feld wofür? (Cheat-Sheet) + Gefährliche Felder

Iteration (T1–T2)

T1maxIterations

DETAILS

Default: 30 000 (Initializer), 35 000 (.full), 200 000 (.fullMCMC) Range: 1 000 – 500 000 (UI-Slider), keine harte obere Grenze in der Logik

TECHNISCH

Gesamtzahl der Trainings-Iterationen, die das Backend durchläuft. Eine Iteration bezeichnet ein Forward-Render einer einzelnen Trainingskamera, einen Backward-Pass über alle Loss-Komponenten (L1 + SSIM + optionale Regularisierungen + Sky-Mask) und einen Adam-Optimizer-Schritt. Diese Zahl wirkt direkt auf die anderen Schedules: Position-Lernrate folgt einer Cosine-Annealing-Kurve von 0 bis entweder T1 selbst oder bis T50 positionLRScheduleEndIteration; Densification stoppt bei T2 densifyUntilIteration; MCMC-Noise-Decay endet bei T69 mcmcNoiseDecayEnd; SH-Degree-Upgrades passieren an den drei in T21 definierten Marken. Bei klassischer Densification liegt der bewährte Bereich bei 20 000–35 000 Iterationen, bei MCMC bei 60 000–200 000. Eine drastische Erhöhung über die in Preset hinterlegten Werte hinaus bringt selten zusätzliche Qualität — Adam-Momentum sättigt, und ohne LR-Decay-Ende stagniert der Loss. Umgekehrt führt Unterschreitung von ~5 000 zu unvollständig konvergierten Geometrien (Density-Control hat zu wenig Zeit zum Klonen/Splitten).

T2densifyUntilIteration

DETAILS

Default: 15 000 (Initializer), 5 000 (.full), 160 000 (.fullMCMC) Range: 0 – T1 maxIterations

TECHNISCH

Iteration, ab der die Densification aufhört. Bis hierhin werden Gaussians über die in T11–T16 (Classic) oder T67–T70 (MCMC) parametrisierten Regeln geklont, gesplittet und geprunt; danach bleibt die Gaussian-Anzahl konstant und nur noch Positionen, Rotationen, Skalen, Opazitäten und SH-Koeffizienten werden optimiert (Refinement-Phase). Im 3DGS-Originalpaper liegt der Wert bei 50 % von T1, in RadianceKits .full-Preset bei nur ~14 % (5 000 von 35 000): Nach etwa 5 000 Iterationen verschlechtert weitere Densifizierung das Resultat eher — mehr Floaters, mehr Speicherbedarf, kein Qualitätsgewinn. MCMC dagegen lässt die Relocation bis 80 % von T1 laufen, weil MCMC keine schädlichen Floaters produziert. Wird T2 zu klein gewählt (< 1 000), entstehen zu wenige Gaussians; zu groß bei Classic (> 50 % von T1) führt zu Overgrowth und RGB-Saturation-Outliers (siehe Outdoor-Overtraining-Findings).

Learning Rates (T3–T10)

T3positionLearningRate

DETAILS

Default: 0.00016 Range: 1e-7 – 1e-3 (empfohlen)

TECHNISCH

Adam-Lernrate für die XYZ-Position jeder Gaussian zu Beginn des Trainings (Iteration 0). Folgt einer Cosine-Annealing-Kurve und sinkt im Laufe des Trainings auf T4 positionLearningRateFinal. Der Default 0.00016 stammt aus dem 3DGS-Originalpaper (Kerbl et al.~2023) und ist in RadianceKit auch bei Erhöhung der Bildauflösung nicht zu skalieren — die Position bewegt sich im Welt-Koordinatensystem, nicht im Pixelraum. Eine deutliche Erhöhung (> 0.0005) bewirkt, dass Gaussians über lange Distanzen springen und der Loss instabil wird; Werte deutlich darunter (< 0.00005) führen dazu, dass falsch initialisierte Punktwolken nie ihren Platz finden. Für die allermeisten Szenen ist der Standardwert damit die richtige Wahl. Beachte: bei .fullMCMC lassen wir diesen Wert bewusst beim Default — MCMC braucht konstante Lernraten für seine Relocation-Logik, daher bringt das Tunen hier nichts.

T4positionLearningRateFinal

DETAILS

Default: 0.0000016 (Initializer + Paper), 0.000016 (.full, .fullMCMC — 10× höher) Range: 0 – T3 positionLearningRate

TECHNISCH

Endwert der Position-LR-Cosine-Annealing-Kurve. Erreicht wird er entweder bei T1 maxIterations oder, falls gesetzt, bei T50 positionLRScheduleEndIteration. Der RadianceKit-.full-Preset verwendet 0.000016 — also 10× höher als der Paper-Default 0.0000016. Sowohl ein deutlich kleinerer Endwert als auch ein deutlich größerer Startwert verschlechtern das Ergebnis spürbar. Der hohe Final-Wert ist nicht Trade-off, sondern bewusste Wahl: bei zu starkem Decay verlieren die Gaussians während der Refinement-Phase ihre Fähigkeit, sich auf neu hinzugekommene Densification-Kandidaten einzustellen. Die Schedule-Phase lässt sich verkürzen (T50 < T1), sodass T4 bereits vor Trainingsende erreicht wird und der Rest des Trainings bei konstanter Mini-LR läuft — typische Konfiguration: T50 = 20 000, T1 = 35 000, Refinement also bei 0.000016 für 15 000 Iterationen.

T5shDCLearningRate

DETAILS

Default: 0.0025 (Initializer + Paper), 0.005 (.full und alle MCMC-Presets — 2×) Range: 0.0001 – 0.05

TECHNISCH

Adam-Lernrate für den DC-Anteil (degree 0, also konstantes Albedo) der spherical-harmonic-Farbe. SH-DC entspricht dem direktionsunabhängigen Grundton einer Gaussian, gewissermaßen die „Basisfarbe". RadianceKit verdoppelt den Paper-Default in den Quality-Presets — das beschleunigt die Farb-Konvergenz, was nötig ist, weil bei kurzem Training (, 5 000 Iterationen) die SH-DC sonst nicht in Form kommt. Anders als die geometrischen LRs hat SH-DC keinen Decay; die Lernrate bleibt über alle Iterationen konstant (oder folgt nur dem optionalen extended-phase-Decay aus T51). Noch deutlich höhere Werte (etwa 0.01) verschlechtern das Ergebnis wieder und lassen die Farben instabil werden.

T6shRestLearningRate

DETAILS

Default: 0.000125 (Initializer + Paper), 0.00025 (.full und MCMC — 2×) Range: 0.000001 – 0.005

TECHNISCH

Adam-Lernrate für die SH-Koeffizienten höherer Ordnung (Degree 1, 2, 3 — also die view-direction-abhängigen Farbanteile, die für Glanzlichter, Spiegelungen und sanfte Schattierung sorgen). 20× kleiner als T5 per Paper-Konvention, weil diese Koeffizienten quadratisch in Anzahl wachsen (3 für Degree 1, 5 für Degree 2, 7 für Degree 3 → insgesamt 15 Floats pro Gaussian) und ohne kleinere Lernrate das Bild übersättigen würden. Wird in zwei Schritten freigeschaltet — bis zur ersten Marke in T21 shDegreeUpgradeIterations ist nur Degree 0 aktiv (also nur T5), danach 1, später 2, schließlich 3. Niedrige Werte hier sind besonders wichtig auf Szenen mit viel diffuser Beleuchtung; bei sehr glänzenden Oberflächen (Auto-Lack, Wasser) lohnt sich kein Drehen — die SH-Repräsentation an sich ist begrenzt.

T7opacityLearningRate

DETAILS

Default: 0.05 (Initializer + Paper), 0.1 (.full, MCMC — 2×) Range: 0.001 – 1.0

TECHNISCH

Adam-Lernrate für die logit-Opazität jeder Gaussian. Die App speichert Opazität als unbeschränkten Float-Wert und transformiert ihn mit Sigmoid in [0, 1]; die LR wirkt im Logit-Space. Die Quality-Presets verdoppeln den Paper-Default auf 0.1; das macht das Pruning effizienter — tote Gaussians fallen schneller unter den T14 pruneOpacityThreshold ab. Welcher Wert am besten trägt, hängt dabei von der Adam-Konfiguration ab; die Wechselwirkung der beiden ist nicht trivial. Niedrige Werte (< 0.01) führen dazu, dass „dead" Gaussians ewig herumliegen und Speicher verbrauchen; zu hohe Werte (> 0.5) können zu Opacity-Explosion führen, daher begrenzt der Optimizer den Logit-Wert fest auf [-15, 3].

T8opacityLearningRateFinal

DETAILS

Default: 0.0 (= „kein Decay") Range: 0 oder 0.001 – T7 opacityLearningRate

TECHNISCH

Optionaler Cosine-Decay-Endwert für die Opacity-LR. Wenn 0.0, ist Decay deaktiviert und die Opacity-LR bleibt über das gesamte Training konstant bei T7. Ein Decay von 0.1 auf 0.01 verschlechtert das Ergebnis deutlich; deshalb steht der Default auf „aus". Die Hypothese hinter dem Feld: in der Refinement-Phase könnte konstante Opacity-LR zu Oszillation führen, sodass Splats, die schon das richtige Maß an Transparenz erreicht haben, durch zufällige Gradient-Schwankungen wieder verschoben werden. Empirisch bestätigt sich das nicht — die Logit-Clamping-Logik fängt das ohnehin ab. Das Feld bleibt verfügbar für zukünftige Experimente; auch sehr lange MCMC-Läufe (> 500K Iterationen) könnten davon profitieren.

T9scaleLearningRate

DETAILS

Default: 0.005 (Initializer + Paper), 0.01 (.full, MCMC — 2×) Range: 0.0001 – 0.1

TECHNISCH

Adam-Lernrate für die drei Skalen-Komponenten jeder Gaussian im log-Space (RadianceKit speichert log(scale), damit Skalen positiv bleiben). Der Paper-Default 0.005, in RadianceKit verdoppelt auf 0.01 für bessere Scale-Konvergenz bei den abgestimmten Lernraten-Konfigurationen. Bleibt der Wert im Verbund mit den übrigen Quality-Lernraten beim Paper-Default, entstehen sichtbar zu wenige Gaussians — Density-Control kann nicht klonen, weil die Skalen-Updates zu langsam nachziehen. Skala kontrolliert die Ausdehnung jeder Gaussian — zu schnelles Lernen führt zu „needle"-Gaussians (extrem lange dünne Splats, siehe T34 scaleRatioPruneThreshold), zu langsames Lernen lässt Splats zu kompakt bleiben und Density-Control muss zu oft splitten.

T10rotationLearningRate

DETAILS

Default: 0.001 (Initializer + Paper), 0.002 (.full, MCMC — 2×) Range: 0.0001 – 0.05

TECHNISCH

Adam-Lernrate für die vier Quaternion-Komponenten jeder Gaussian. Die Quaternion wird in jedem Optimizer-Schritt nach der Adam-Update wieder normalisiert (L2-Norm = 1) — andernfalls würde die Kovarianzmatrix entartet. RadianceKit verdoppelt den Paper-Default in den Quality-Presets, weil Rotation gegenüber Skala / Position kleinere absolute Gradient-Magnituden hat (auf der Einheitssphäre bleibt jeder Schritt kurz) und ohne 2× wäre die Rotation im 35 000-Iterations-Window deutlich unter-konvergiert. Auf NeRF-Blender-Szenen (Lego, Chair) wirkt sich Rotation besonders aus — die Kanten der Objekte richten sich erst nach 5 000–10 000 Iterationen richtig aus.

Densification — Classic (T11–T16)

T11densifyGradThreshold

DETAILS

Default: 0.000002 (Initializer, kalibriert für 0.5× Auflösung), 0.0000011 (.full, kalibriert für 1.0×), 0.000004 (.quickTest, kalibriert für 0.25×), 2e-7 (.fullClassicPaper) Range: 1e-8 – 1e-3 (auflösungsabhängig)

TECHNISCH

Schwellwert für die L2-Norm des bildschirmraum-projizierten Positions-Gradienten, oberhalb dessen eine Gaussian für Klonen oder Splitten markiert wird. Der absolute Wert hängt direkt von der Trainingsauflösung ab — er skaliert ungefähr wie 1/Auflösung² (mehr Pixel = kleinere Per-Pixel-Gradienten). Daher braucht jede T22 trainingRenderScale-Stufe einen kalibrierten Schwellwert: 0.25× → 4e-6, 0.5× → 2e-6, 1.0× → 5e-8 … 1.1e-6 (.full). Der Paper-Default 0.0002 ist NDC-normalisiert und in RadianceKits Welt-Raum-Pipeline nicht direkt vergleichbar. Mit dem T52 adaptiveDensifyThreshold-Flag lässt sich der Wert zur Laufzeit aus dem p98 der aktuellen Gradient-Verteilung berechnen — auf realen Szenen bricht die Gaussian-Anzahl dabei allerdings dramatisch ein (Mass-Pruning); das Flag bleibt aus. T77–T79 liefern eine alternative Adaptive-Logik via rolling median. Gefahrlos ist dieses Feld nicht — Halbierung erzeugt 2–4× mehr Gaussians (Speicher-Druck, OOM-Risiko); Verdopplung kann die Szene unter-densifizieren.

T12densifyFromIteration

DETAILS

Default: 500 Range: 100 – 5 000

TECHNISCH

Erste Iteration, ab der Densification aktiv wird. Vorher passiert nur „nacktes" Lernen auf der initialen SfM-Punktwolke, ohne dass neue Gaussians erzeugt werden. Der Default 500 stammt aus dem 3DGS-Paper und gibt der Initialisierung Zeit, sich zu stabilisieren — wenn schon ab Iteration 0 densifiziert wird, klonen sich falsch positionierte SfM-Punkte vielfach, bevor sie überhaupt ihren richtigen Platz finden. Ein deutlich späterer Start (etwa 1 000) verschlechtert das Ergebnis leicht; bleib beim Default.

T13densifyInterval

DETAILS

Default: 100 (Initializer, MCMC), 200 (.full) Range: 50 – 1 000

TECHNISCH

Wie viele Iterationen zwischen zwei Densification-Schritten liegen. Im Paper-Default 100 — alle 100 Iterationen wird die Liste der densify-Kandidaten ausgewertet, geklont/gesplittet und gleichzeitig die Liste der prune-Kandidaten (sigmoid(opacity) < T14 pruneOpacityThreshold) entfernt. Für .full hat sich 200 bewährt — das entlastet die GPU, weil weniger Reorganisations-Passes laufen, und gibt jeder Gaussian mehr Zeit, sich nach einer Klone-Aktion einzupendeln. Kürzere Intervalle führen im Quality-Setup zu Überdensifizierung: es entstehen deutlich mehr Gaussians, ohne dass das Bild besser wird. Bei MCMC wird dasselbe Feld als Relocation-Interval interpretiert; siehe T67 mcmcRelocationInterval für die MCMC-spezifische Logik.

T14pruneOpacityThreshold

DETAILS

Default: 0.005 (Initializer, Paper, MCMC), 0.001 (.full) Range: 0.0001 – 0.1

TECHNISCH

Sigmoid-Opazitäts-Schwelle, unter der eine Gaussian beim nächsten Densification-Step gelöscht wird. Wirkt zusammen mit T7 opacityLearningRate und der Logit-Clamp-Logik im Optimizer. In .full liegt der Wert bei 0.001 statt 0.005 — Splats, die nur unter exotischen Blickwinkeln eine Rolle spielen, bleiben dadurch länger erhalten und tragen zum SH-Detail bei. Noch kleinere Werte (etwa 0.0001) bringen nichts mehr: es wird zu wenig gepruntet und Speicher verschwendet. Wichtig: Density-Control muss IMMER prunen, auch wenn die Buffer-Kapazität durch andere Maßnahmen schon voll ist — sonst akkumulieren tote Gaussians und der Count friert ein.

T15opacityResetInterval

DETAILS

Default: 3 000 (Initializer + Paper), 100 000 (.full = effektiv deaktiviert), 200 000 (.fullMCMC = deaktiviert) Range: 1 000 – 100 000+

TECHNISCH

Alle wie viele Iterationen wird die Opazität aller Gaussians auf einen niedrigen Wert (~0.01) zurückgesetzt — eine Maßnahme aus dem 3DGS-Paper, um „eingefrorene" Splats neu zu beurteilen. Zusammen mit RadianceKits Warmup, dem stochastischen Trainings-Setup und den verdoppelten Lernraten kostet der Opacity-Reset spürbar Qualität, und der Logit-Clamp im Optimizer deckt seine Funktion ohnehin schon ab. Daher in .full praktisch deaktiviert (100 000 > 35 000 = nie ausgelöst). Bei .fullClassicPaper (paper-treue Variante) ist er bewusst wieder auf 3 000 gesetzt — dort geht es darum, die Gaussian-Budgets des Originalpapers zu erreichen.

T16maxScreenSize

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 (off) oder > 0

TECHNISCH

Maximale Bildschirmraum-Größe (in projizierten Pixeln), die eine Gaussian erreichen darf, bevor sie zwangsweise gesplittet wird. Der Wert ist auf 0 gesetzt — RadianceKits Density-Control verwendet stattdessen den Welt-Raum-Skala-Schwellwert aus derselben Gradienten-Logik. Bleibt im Feldkatalog enthalten, weil künftige Experimente mit Mip-Splatting (T74–T76) oder szenenspezifischen Splatting-Strategien davon profitieren könnten. Aktivierung (Wert > 0, z.B. 20) würde sehr groß gewordene Splats im Bildschirm zwingen, sich aufzuteilen — relevant bei großen, glatten Wandflächen, wo ein einzelnes Riesensplat zu wenig Detail bietet.

Loss (T17–T20)

T17ssimWeight

DETAILS

Default: 0.2 (Initializer + Paper + .full), 0.05 (alle MCMC-Presets) Range: 0.0 – 1.0

TECHNISCH

Gewicht des D-SSIM-Anteils in der kombinierten Loss-Funktion loss = (1 - λ) * L1 + λ * D-SSIM, wobei λ = T17. Der 3DGS-Paper-Default 0.2 ist für Classic-Densification die richtige Wahl — schon 0.3 verschlechtert das Ergebnis deutlich. Für MCMC liegt der passende Wert dagegen bei 0.05, weil MCMC durch seine stochastische Exploration einen stärkeren L1-Signal-Anteil braucht — höhere SSIM-Gewichte würden die Relocation-Entscheidungen verwässern. SSIM ist deutlich teurer zu rechnen als L1 (lokale 11×11-Fenster über das ganze Bild); RadianceKit nutzt eine MPS-beschleunigte Implementierung, die unter 1 ms pro 1080p-Bild bleibt. Die Scene-Class-Presets nutzen szenenspezifische Werte zwischen 0.082 (.outdoorPreset) und 0.171 (.indoorPreset).

T18ssimWeightRefinement

DETAILS

Default: 0.0 (= „kein Wechsel, behalte ssimWeight") Range: 0 oder 0 – 1.0

TECHNISCH

Optionaler SSIM-Wert für die Refinement-Phase nach T2 densifyUntilIteration. Ein Anheben von 0.2 auf 0.3 in der Refinement-Phase verschlechtert das Ergebnis in beiden Maßen — L1 wie SSIM; deshalb steht der Default auf 0.0. Die Hypothese hinter dem Feld war, dass nach der Densification — wenn keine neuen Gaussians mehr entstehen — ein stärkerer SSIM-Anteil die strukturelle Schärfe maximieren würde. Empirisch falsch: SSIM-Gewicht zu erhöhen heißt indirekt L1-Gewicht zu senken, und L1 ist das deutlich aussagekräftigere Signal in der Final-Refinement-Phase. Das Feld bleibt verfügbar für künftige Experimente mit perceptueller Loss (T60) oder Edge-Loss (T19), wo eine Refinement-spezifische Loss-Komposition sinnvoll sein könnte.

T19edgeLossWeight

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 0.001 – 1.0

TECHNISCH

Experimenteller Loss-Term: Gewicht eines Sobel-Gradient-Domain-L1-Loss, der die Bildkanten direkt vergleicht (Ground-Truth-Sobel vs Render-Sobel) zusätzlich zu L1+SSIM. Hypothese: Kanten-Information ist ein perceptueller Eckpfeiler von Bildqualität und ein expliziter Term sollte Gaussians ermutigen, Kanten besser zu treffen. In der Praxis bringt er nichts: ein spürbares Gewicht (0.1) verschlechtert das Ergebnis, ein kleines (0.01) ändert an der Qualität nichts, kostet aber Rechenzeit. Der Sobel-Pass kostet einen zusätzlichen MPS-Forward auf Ground-Truth und Render. Daher dauerhaft deaktiviert. Künftiger Use-Case: Szenen mit harten künstlichen Kanten (Architektur, Möbel, Renderings) könnten profitieren — Die Scene-Class-Presets nutzen dafür aber nicht diesen Term, sondern skalieren das SSIM-Gewicht.

T20skyMaskingEnabled

DETAILS

Default: false (Initializer und alle Presets) Range: boolean

TECHNISCH

Schaltet Sky Masking ein. Dabei wird in jedem Bild mit Hilfe des Apple-Vision-Frameworks die Sky-Region ausmaskiert, und der Loss in diesem Bereich auf null gesetzt. Sinn: Outdoor-Szenen leiden oft daran, dass blaue/graue/weiße Sky-Pixel die App dazu bringen, Gaussians genau dort zu plazieren — was als „floater" wahrgenommen wird. Ohne Sky-Mask wäre der Loss in diesem Bereich nie null, weil der Himmel im Bild leicht variiert und die App ewig versucht, das mit Splats nachzubauen. Die Vision-Maske wird einmal pro Kamera vor dem Training berechnet und im RAM gehalten. Wird typischerweise zusammen mit T45 skyDomeEnabled aktiviert (UI-Logik in der Settings-View). Bei Innen-Szenen oder synthetischen Renderings deaktiviert lassen — die Maske würde dort fälschlicherweise Decken oder Wände als „Sky" erkennen.

SH-Degree-Progression (T21)

T21shDegreeUpgradeIterations

DETAILS

Default: [1_000, 2_000, 3_000] (Initializer), [2_000, 5_000, 8_000] (.full, MCMC), [1_000, 2_000] (.preview — Degree 3 übersprungen) Range: [Int], jeder Wert in [0, maxIterations], monoton steigend

TECHNISCH

Iterationen, an denen der aktive SH-Degree von 0→1, 1→2, 2→3 hochgeschaltet wird. Vor der ersten Marke sind nur die DC-Komponenten aktiv (also T5 shDCLearningRate), nach der ersten Marke die DC + 3 Degree-1-Koeffizienten, nach der zweiten Marke + 5 Degree-2-Koeffizienten, nach der dritten Marke alle 15 Koeffizienten. Der Speicherbedarf pro Gaussian wächst dabei in Stufen — 4 Floats → 16 Floats → 36 Floats → 64 Floats. Die Quality-Presets verzögern die Aufstufungen gegenüber den Initializer-Defaults, weil die Geometrie zuerst stabilisieren soll, bevor die Farbdetails mit ihrer höheren Frequenz draufkommen. Die früheren Marken [1K, 2K, 3K] liefern in .full ein spürbar schlechteres Ergebnis. .preview kappt bei Degree 2, weil Degree 3 in 5 000 Iterationen nicht konvergiert und nur Optimizer-Kapazität verbraucht. Das Curriculum (T80–T81) bietet eine alternative Logik, die diese Liste dynamisch überschreibt.

Performance (T22–T24)

T22trainingRenderScale

DETAILS

Default: 1.0 (Initializer, .full, MCMC, Scene-Class), 0.5 (.preview), 0.25 (.quickTest) Range: 0.05 – 2.0 (typisch 0.25, 0.5, 1.0)

TECHNISCH

Render-Auflösung beim Training relativ zur Originalauflösung der Trainingsbilder. Bei 0.5 wird jedes Bild auf 50 % Breite × 50 % Höhe heruntergerechnet (also 25 % der Pixel) und das Gaussian-Rendering erfolgt in dieser kleineren Auflösung. Reduziert sowohl Speicher- als auch Rechenaufwand quadratisch. Wichtig: T11 densifyGradThreshold muss zur gewählten Auflösung passen — die Gradient-Magnituden skalieren mit 1/Auflösung², daher hat .quickTest (0.25×) einen viel höheren Threshold (4e-6) als .full (1.0×, 1.1e-6). RadianceKit warnt bei sehr großen Bildern und passt automatisch an — 3-MP-Ziel-Auflösung. Bei extremen 4K-Eingangsbildern wäre 0.5 oder sogar 0.25 sinnvoll, sonst läuft jeder Mac auch nur in CPU-Compaction.

T23resolutionWarmupScale

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 0.1 –

TECHNISCH

Trainiere die Densification-Phase (Iter 0 bis T2) in einer niedrigeren Auflösung als die Refinement-Phase. Für .full ist das ausgeschaltet, weil bei T22 = 1.0 und Cosine-Annealing der Zeitgewinn gering ausfällt und die Qualität leicht leidet. Bleibt im Feldkatalog, weil sie bei 4K-Eingaben und langen Trainingsläufen wieder sinnvoll werden könnte — das Curriculum (T80) greift eine ähnliche Logik auf, dort ist sie aber an die LR-Schedule gekoppelt. Wenn aktiviert und T80 curriculumResolutionRamp ebenfalls true, gewinnt das Curriculum und überschreibt diesen Wert.

T24tileSize

DETAILS

Default: 16 Range: 8, 16, 32

TECHNISCH

Größe der Rasterisierungs-Tiles in Pixeln. Das Gaussian-Splatting-Rendering ist tile-basiert: das Bild wird in 16×16-Pixel-Kacheln zerlegt, jede Kachel sammelt die für sie relevanten Gaussians, sortiert sie nach Tiefe und blendet sie ein. 16 ist der von praktisch allen 3DGS-Implementierungen verwendete Standard und in den RadianceKit-Metal-Kernels hartkodiert; eine Änderung dieses Werts würde Re-Compilation der Shader bedingen und ist im aktuellen Stand nicht effektiv. Bleibt als Feld, falls eine künftige Engine-Version Tile-Size dynamisch unterstützt.

Diagnose und Punktwolken-Vorbereitung (T26–T30)

T26depthDistortionWeight

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 0.0001 – 0.05

TECHNISCH

Experimentell: Gewicht eines Depth-Distortion-Regularisierungs-Loss. Bestraft Gaussians, die entlang eines Render-Strahls zwar tief gestaffelt sind, aber konzeptuell zur selben Oberfläche gehören — das encouraged konzentrierte Tiefenverteilungen und reduziert Floaters. In allen erprobten Stärken wird das Ergebnis schlechter statt besser. Der theoretische Vorteil — Multi-View-Konsistenz verbessern — schlägt sich nicht im L1-Loss nieder, weil die Hypothese implizit annimmt, dass die SfM-Geometrie korrekt ist und die Gaussians nur „gestapelt" werden müssen. In der Praxis ist die SfM-Punktwolke meist die schwächste Komponente, nicht die Stapelung. Bleibt verfügbar für Multi-View-Datensätze mit besonders sauberen Posen (Synthetic, Mip-NeRF 360 mit Ground Truth).

T27singleViewOverfit

DETAILS

Default: false Range: boolean

TECHNISCH

Diagnose-Flag: wenn true, wird in jeder Trainingsiteration zwingend Kamera-Index 0 verwendet statt einer zufällig aus dem Camera-Pool. Sinn: Wenn das Modell nicht mal eine einzige View überfitten kann (sprich, der Loss auf View 0 auch nach 10 000 Iterationen nicht gegen Null geht), ist im Forward/Backward-Pass ein fundamentaler Bug. Dieser Schalter wurde während der Entwicklung der Metal-Shader und der Differentiable-Rasterizer-Kernels intensiv genutzt. Heute nur noch als Sanity-Check verfügbar, wenn jemand am Trainings-Backend etwas geändert hat und gegenprüfen will. In der Oberfläche gibt es dafür keinen Schalter — das Feld ist in allen Presets aus und bleibt es.

T28maxCameras

DETAILS

Default: 0 (= „alle Kameras verwenden") Range: 0 oder 1 – N

TECHNISCH

Diagnose-Limit: trainiere nur mit den ersten N Kameras, ignoriere alle weiteren. Sinn ursprünglich: Hypothese testen, dass zu viele Kameras Gradient-Konflikte erzeugen (zu viele widersprüchliche Loss-Signale für dieselbe Gaussian). Eine künstliche Begrenzung bringt keinen Vorteil — mehr Frames bringen praktisch immer mehr Qualität. In der Oberfläche gibt es dafür kein Bedienelement; das Feld steht in allen Presets auf 0, also „alle Kameras".

T29maxInitialPoints

DETAILS

Default: 0 (= „alle SfM-Punkte verwenden") Range: 0 oder 1 000 – 200 000+

TECHNISCH

Sicherung: limitiert die Anzahl der initialen SfM-Punkte, mit denen das Training startet. Dichte COLMAP-Rekonstruktionen können > 60 000 Punkte produzieren, was bei großen Initial-Skalen zu 200–300 Gaussians pro Pixel-Überlapp führt — das macht ein „Nebelfeld" aus, in dem das Training nicht konvergiert. Subsampling auf ~16 000 Punkte (Hard-cap-Logik in der Trainings-Engine) bringt die Initial-Dichte auf das Niveau, das das Referenz-3DGS verwendet, und reduziert Overlap dramatisch. Die App setzt das bei sehr dichten Rekonstruktionen selbst; ein Bedienelement dafür gibt es nicht.

T30cameraClusterOutlierMultiplier

DETAILS

Default: 10.0 (alle Presets — niemals überschrieben) Range: 1.0 – 100.0

TECHNISCH

Multiplikator für den Camera-Cluster-Outlier-Filter. Vor dem Training berechnet die Trainings-Engine das Centroid aller Kamera-Positionen und die maximale Distanz einer Kamera vom Centroid. SfM-Punkte, deren Distanz vom Centroid multiplier × maxCameraDistance überschreitet, werden als Outlier verworfen. Der Default 10× ist bewusst großzügig gewählt. Ein subtiler Nebeneffekt: Tighter SfM (Kameras enger zusammen) → kleinerer → kleinerer Schwellwert → mehr Punkte werden als Outlier verworfen. Looser SfM → größerer Schwellwert → weniger Punkte verworfen. Daraus folgt ein überraschender Effekt: eine engere und an sich bessere SfM-Rekonstruktion kann das Training verschlechtern, weil zu viele Initialpunkte verworfen werden. Das Feld steht in allen Presets auf 10 und ist in der Oberfläche nicht verstellbar. Werte unter 5 sind in der Regel zu restriktiv, über 20 wirkungslos.

Regularisierung (T31–T37)

T31coarseToFineBlurRadius

DETAILS

Default: 0 (= deaktiviert) Range: 0 oder 1 – 10

TECHNISCH

Experimentell: Box-Blur-Radius, der zu Beginn der Densification-Phase auf das Ground-Truth-Bild angewendet und linear bis zum Ende der Densification (T2) auf 0 reduziert wird. Hypothese: Coarse-to-Fine-Training — erst grobe Strukturen lernen, dann Details — sollte stabilere Geometrie liefern. In allen erprobten Radien wird das Ergebnis schlechter. Der Grund für das Fehlschlagen: die Densification entscheidet basierend auf bilddomänen-Gradienten, und Bluren reduziert genau die Signale, die für „hier muss klone werden" wichtig sind. Bleibt im Feld-Katalog für künftige Tests mit anderem Density-Control-Schema.

T32scaleRegWeight

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 0.0001 – 0.05

TECHNISCH

Experimentell: L1-Regularisierung auf welt-räumliche Skala. Bestraft Gaussians, die zu groß werden — verhindert „Mega-Splatts", die ganze Wandflächen mit einer Gaussian abdecken. Eingeschaltet explodiert die Gaussian-Anzahl in die Millionen und das Ergebnis wird um ein Vielfaches schlechter. Der Grund: Skala-Regularisierung kommt mit Density-Control in Konflikt — kleinere Skalen heißen, mehr Gaussians werden gebraucht, also splittet Density-Control häufiger, was wiederum mehr Gradient-Aufwand bedeutet. Disabled, aber dokumentiert für Mip-Splatting-Experimente (T74): in diesem Kontext könnte eine Skalen-Untergrenze sinnvoll sein.

T33anisotropyRegWeight

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 0.0001 – 0.05

TECHNISCH

Experimentell: Penalty auf das max(scale)/min(scale)-Verhältnis, soll extrem langgezogene „Needle"-Gaussians verhindern, die als floater wahrgenommen werden. In allen erprobten Stärken wird das Ergebnis deutlich schlechter. Der Grund: Regularisierung zwingt Splats in Richtung „runde" Form, was auf einer flachen Oberfläche (Wand, Tisch, Boden) genau falsch ist — dort ist eine flache, breite Gaussian effizienter als eine kugelförmige. Disabled. T34 scaleRatioPruneThreshold verfolgt denselben Zweck gezielter, ist aber ebenfalls standardmäßig aus.

T34scaleRatioPruneThreshold

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 5.0 – 100.0 (typisch 10.0 – 30.0)

TECHNISCH

Experimentelles post-Training-Pruning, das jede Gaussian löscht, deren max(scale)/min(scale)-Verhältnis den hier gesetzten linearen Schwellwert überschreitet. Zielt auf extrem langgezogene „Needle/Disc"-Floaters ab, die durch Regularisierung allein nicht eliminiert werden können. Im Test entfernte das Pruning Floaters wie erhofft, aber gleichzeitig auch sinnvolle flache Splats auf Wänden und Böden — das Bild wurde löchriger. Daher per Default aus. Seit Version 1.8 gibt es dafür den Schalter Remove Needle/Disc Floaters im Inspector-Abschnitt „Training", unter der Zwischenzeile „Runs automatically at the end of training". Eingeschaltet arbeitet er bewusst konservativ (nur Splats, deren längste Achse rund 50× die kürzeste übertrifft) und wirkt ab dem nächsten Trainingslauf.

T35opacityRegWeight

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 0.0001 – 0.05

TECHNISCH

Experimentell: Binary-Cross-Entropy-Penalty, der Opazität gegen 0 oder 1 zieht (also weg von „halb-transparent"). Hypothese: scharfere Opazitätsverteilung würde Bildklarheit verbessern. Zusammen mit T33 kostet die Regularisierung Qualität; beide sind deaktiviert. Achtung: in 1.4.3-Beta tauchte ein Bug auf, der genau dieses Feld in einer Default-Wert-Veränderung (Initializer = 0.01) hatte, was zu Mass-Extinction des Gaussian-Counts (460 K → 5 in einer Iteration) führte. Seit 1.4.4 fest auf 0.0 als Default verankert.

T36opacityDecayFactor

DETAILS

Default: 0.0 (Initializer = deaktiviert), 0.9995 (.full, .classicBalanced — HTGS-Standard) Range: 0 (off) oder 0.95 – 1.0

TECHNISCH

Implementation des HTGS-Schemas (Hierarchical Time-Gating, Eurographics 2025): alle T37 opacityDecayInterval Iterationen wird die sigmoid-Opazität jeder Gaussian mit diesem Faktor multipliziert. 0.9995 × 100 Anwendungen ergibt ~95 %-Verbleib pro Densification-Phase — ein leichter aber stetiger Abwärts-Druck auf alle Opacities, der schwach beigetragende Gaussians verlässlich gegen den T14 pruneOpacityThreshold sinken lässt. Das Resultat ist ein deutlich besseres Ergebnis als ohne Decay. Nur während Densification-Phase aktiv (bis T2), danach läuft das Training ohne Decay weiter, damit die im Refinement etablierten Opacities stabil bleiben. Bei MCMC nicht verwendet (MCMC hat eigene Mechanismen via T67 mcmcRelocationInterval + T68 mcmcDeadOpacityThreshold).

T37opacityDecayInterval

DETAILS

Default: 50 Range: 10 – 500

TECHNISCH

Iterations-Intervall, in dem T36 opacityDecayFactor angewendet wird. HTGS-Paper-Default 50, in .full belassen. Lange Intervalle (>200) heben den Effekt teilweise auf, weil zwischen zwei Anwendungen genug Gradient-Updates passieren, dass Opacity wieder steigt. Kürzere Intervalle (<20) machen Decay zu aggressiv. Nur in Densification-Phase aktiv.

Refinement (T38–T44)

T38gradientAccumulationSteps

DETAILS

Default: 1 (= „eine View pro Adam-Schritt") Range: 1 – 8

TECHNISCH

Anzahl der Views, deren Gradienten akkumuliert werden, bevor ein Adam-Update ausgeführt wird. Bei > 1 läuft die App auf einem separaten, „unfused" Backward-Project-Pfad, der die Gradienten in einem separaten Buffer summiert; die finale Anwendung skaliert mit 1/N, um die Magnitude konstant zu halten. Bei klassischem Training bringt der Wert 2 keinen Qualitätsgewinn, kostet aber Zeit, weil der unfused-Pfad teurer ist als der fused. Bei MCMC dagegen verkleinert accum = 2 den Qualitätsabstand zu Classic spürbar — deshalb wird er dort als Schalter angeboten. In den Presets steht der Wert auf 1. In der Oberfläche erreichst du ihn über den Schalter MCMC Quality im Inspector-Abschnitt „Training": eingeschaltet akkumuliert die App 2 Views pro Schritt, ausgeschaltet 1. Andere Werte als 1 und 2 sind nur über ein bearbeitetes Preset zu belegen.

T39testViewIndices

DETAILS

Default: [] (= leer, alle Views werden zum Training verwendet) Range: Set<Int>, beliebige Untermenge der Camera-Indices

TECHNISCH

Set von Camera-Indices, die NICHT zum Training verwendet, sondern als Holdout für PSNR/SSIM/LPIPS-Auswertung gespart werden. Wird nur in den internen Messläufen belegt: dann jede achte View, beginnend bei Index 0 (LLFF-Standard, identisch mit den Mip-NeRF-360- und 3DGS-Paper-Konventionen). Im Auslieferungszustand bleibt das Feld leer — das Training nutzt alle Views, und es gibt in der Oberfläche kein Bedienelement dafür. Vorsicht: das manuelle Setzen dieses Feldes in einer Preset-Datei ohne Verständnis der Indizes macht eine Messung unbrauchbar (z.B. wenn alle Indices über N gesetzt werden, während es nur N-50 Views gibt → keine Holdouts → keine Auswertung). Beim eigenen Preset-Export wird testViewIndices nicht mitgeschrieben, weil es szenenabhängig ist und sonst zwischen verschiedenen Datensätzen sinnlose Werte hinterlassen würde.

T40refinementPruneInterval

DETAILS

Default: 0 (= deaktiviert) Range: 0 oder 100 – 5 000

TECHNISCH

Alle N Iterationen während der Refinement-Phase (nach T2) wird ein zusätzlicher Prune-Pass laufen gelassen, der Gaussians mit sigmoid(opacity) < T41 refinementPruneOpacityThreshold entfernt. Sinn: während Densification gibt es regelmäßige Density-Control-Calls, danach nicht mehr — Gaussians, deren Opacity weiter sinkt, bleiben aber im Buffer. In der Praxis schadet dieses zusätzliche Pruning: zusammen mit der zweiten Densification-Phase (T54) kann es den Gaussian-Bestand vollständig leerräumen. Steht in allen Presets auf 0 und ist in der Oberfläche nicht verstellbar; falls man es über eine bearbeitete Preset-Datei trotzdem belegt, sind 1 000 oder 2 000 sinnvolle Werte.

T41refinementPruneOpacityThreshold

DETAILS

Default: 0.0 (= „verwende T14") Range: 0 oder 0.001 – 0.1

TECHNISCH

Separater Opacity-Schwellwert für Refinement-Pruning. Nach Densification haben die meisten Gaussians eine deutlich höhere Opacity erreicht (> 0.001), sodass der Standard-T14 pruneOpacityThreshold zu lasch wäre. Wenn T40 aktiv, bestimmt dieses Feld den eigenen Schwellwert. Bei 0.0 wird T14 weiterverwendet. Nur relevant wenn T40 > 0.

T42midTrainingCompactificationIterations

DETAILS

Default: [] (= deaktiviert) Range: [Int], Werte in (densifyUntilIteration, maxIterations)

TECHNISCH

Explizite Iteration-Punkte während der Refinement-Phase, an denen ein Compactification-Pass läuft (entfernt sigmoid(opacity) < 0.01 + Outlier-Scale-Gaussians, dieselbe Logik wie T56 postTrainingCompactification). Sinn: lange Refinement-Phasen können Confetti-/Floater-Akkumulation zeigen, deren SH dann auf view-spezifische Artefakte überfitten. Typische Konfiguration falls aktiviert: [10000, 20000, 30000] für 40K Classic. ABER: frei gewählte Aufräum-Marken verschlechtern das Endergebnis durchweg — die Gaussian-Anzahl sinkt zwar deutlich, der Bildfehler steigt aber stärker. Als frei wählbare Iterationsliste bleibt das Feld deshalb in allen Presets leer. Den Effekt selbst erreichst du in der Oberfläche über den Schalter Floater Cleanup im Inspector-Abschnitt „Training": bei klassischen Läufen ab 30 000 Iterationen legt er zwei Aufräum-Durchgänge mitten ins Training. Eigene Marken lassen sich nur über eine bearbeitete Preset-Datei setzen.

T43frustumCullEnabled

DETAILS

Default: false Range: boolean

TECHNISCH

Nach dem Training werden alle Gaussians entfernt, die außerhalb der Vereinigung aller Trainings-Kamera-Frusta liegen. Solche Gaussians wurden nie vom Loss-Signal eingeschränkt und sind immer Floater. Besonders effektiv für Szenen, in denen die Novel-View hinter oder neben dem Kamerapfad liegt (z.B. Rückseite eines linearen Drohnenflugs) — die Floater dort werden in der Trainingsphase nie sichtbar, beim späteren Bewegen im 3D-Viewer aber sehr wohl. Auf Drohnenflügen bringt das sichtbar weniger Floater, daher als Opt-In verfügbar. Default false, weil bei Object-Captures mit voller Orbit-Coverage die Frustum-Union die ganze Szene umfasst und das Feature nichts entfernt — wird in Settings unter „Floater Reduction" angeboten. Das Outdoor-Preset aktiviert es nicht, weil der Sky-Dome dort dasselbe Problem besser löst.

T44frustumCullExpansion

DETAILS

Default: 1.1 Range: 1.0 – 2.0

TECHNISCH

NDC-Margin für T43 frustumCullEnabled. 1.0 würde exakt am Bildrand schneiden, was wackelige Splatts am Bildrand zu sehr kürzen würde. 1.1 = 10 % Padding über die exakte Kamera-Framing hinaus — gibt etwas Toleranz für Randpixel, die in einer leicht versetzten Novel-View doch sichtbar werden könnten. Werte > 1.2 machen den Cull praktisch unwirksam, weil das erweiterte Frustum sehr viel mehr Raum umfasst.

Sky-Dome (T45–T48)

T45skyDomeEnabled

DETAILS

Default: false (Initializer + alle Presets außer P9 Outdoor) Range: boolean

TECHNISCH

Vor Training-Start wird eine kugelförmige Punktwolke generiert (Fibonacci-sphere mit T46 Sample-Points), in einem Radius von T47 skyDomeRadiusMultiplier × scene_extent um den Szenen-Mittelpunkt platziert und mit den Farben aus den sky-maskierten Pixeln aller Trainings-Kameras (siehe T20 skyMaskingEnabled) initialisiert. Diese Sky-Dome-Gaussians werden am Anfang des Gaussian-Buffers eingefügt und während Training „eingefroren" (Position/Skala/Rotation-Gradienten = 0, nur SH und Opacity bleiben optimierbar). Effekt: statt schwarzer „Confetti"-Bereiche in der Ferne sieht der User in Novel-Views einen echten Himmel. Auf Drohnen- und Landschaftsszenen funktioniert das sehr gut; im Outdoor-Preset (P9) ist es standardmäßig an. Bei Innen-Szenen aus lassen — die Sphere würde sinnlos außerhalb des Raums hängen.

T46skyDomeSampleCount

DETAILS

Default: 5 000 Range: 1 000 – 50 000 (typisch 2 000 – 10 000)

TECHNISCH

Anzahl der Fibonacci-Sphere-Sample-Punkte auf der Sky-Dome-Sphere. Höhere Werte → dichteres Sky-Dome (besser bei großen Auflösungen und viel sichtbarem Himmel), aber mehr Speicherbedarf. 5 000 ist sweet spot für 4K-Renderings; bei niedrigeren Auflösungen reicht 2 000–3 000. Die Punkte werden nach Cosine-Distance zu jedem Trainings-Kamera-View-Vektor mit den entsprechenden sky-maskierten Pixeln initialisiert — Sample-Points, deren View-Cone keine Kamera sieht, bleiben mit niedrigem Opazitäts-Initialwert hinten, werden aber im Training nicht verändert (eingefroren).

T47skyDomeRadiusMultiplier

DETAILS

Default: 30.0 (Initializer + meisten Presets), 59.0 (P9 Outdoor) Range: 5.0 – 200.0

TECHNISCH

Radius der Sky-Dome-Sphere relativ zur Szenen-Ausdehnung (= mittlere Distanz zwischen Kamera-Positionen). 30 = die Kugel hat den 30-fachen Durchmesser der Kamera-Wolke. Zu klein (< 5) → Sky-Dome interferiert mit der Szene selbst (z.B. ein Sky-Dome-Splatt landet im Vordergrund); zu groß (> 100) → float32-Präzisionsverlust an den Sky-Dome-Positionen, was Render-Glitches in der Ferne auslöst. Für weite Außenszenen ist 59.0 der passende Wert — die Standard-30.0 ist für tiefe Landschaften zu klein, dann rendern die Sky-Dome-Pixel an den Bildrändern sichtbar als „Wand".

T48frozenGaussianCount

DETAILS

Default: 0 (= keine eingefrorenen Gaussians) Range: 0 oder 1 – T46

TECHNISCH

Anzahl der Gaussians am Anfang des Buffers, deren Position/Skala/Rotation-Gradienten im Optimizer auf null gesetzt werden — sie bleiben über das gesamte Training räumlich starr. Density-Control darf sie nicht klonen, splitten oder prunen. Genutzt für Sky-Dome-Injection (siehe T45): wenn Sky-Dome an ist, wird dieses Feld automatisch auf T46 skyDomeSampleCount gesetzt. Manuelles Setzen ist möglich (z.B. um eine vor-platzierte Punktwolke aus einem LiDAR-Scan einzufrieren), aber im UI nicht direkt zugänglich. Wichtig: die ersten N Gaussians im Buffer sind immer die frozen — die Reihenfolge im Buffer entscheidet, nicht ein expliziter Index.

Adam + LR-Schedule (T49–T55)

T49adamResetIteration

DETAILS

Default: 0 (= deaktiviert) Range: 0 oder 100 –

TECHNISCH

Iteration, an der die Adam-Optimizer-Momentum-Akkumulatoren (m1, m2) auf null zurückgesetzt werden. Bias-Korrektur danach läuft mit (iter - adamResetIteration) statt mit iter. Ein Reset nach dem Densification-Ende verschlechtert das Ergebnis deutlich. Grund: das Adam-Momentum, das sich während Densification aufgebaut hat, trägt Information über die typischen Gradient-Magnituden bei und beschleunigt die Refinement-Phase. Es wegzuwerfen kostet die ersten ~500 Iterationen Refinement an Konvergenz. Steht deshalb in allen Presets auf 0 und ist in der Oberfläche nicht verstellbar.

T50positionLRScheduleEndIteration

DETAILS

Default: 0 (Initializer = „verwende maxIterations"), 20 000 (.full — Cosine endet bei 20K trotz maxIter=35K), 30 000 (.fullClassicPaper) Range: 0 oder 1 000 –

TECHNISCH

Iteration, an der die Cosine-Annealing-Kurve für Position-LR ihr Minimum erreicht. Wenn 0, ist das identisch mit T1 maxIterations. Wenn > 0, läuft die Schedule bis zu diesem Wert und bleibt danach bei T4 positionLearningRateFinal konstant. Das erlaubt eine „extended refinement phase" mit minimaler aber konstanter Lernrate — verfeinert Positionen langsam ohne erneuten Decay. .full macht das (Schedule-Ende bei 20K, Training läuft bis 35K); in der Nachbarschaft — 15K bis 25K — ändert sich kaum etwas, 20K ist der beste Kompromiss. Wird in Verbindung mit T51 weiterverwendet, um auch die Nicht-Position-LRs in der extended phase zu modifizieren.

T51extendedPhaseLRDecay

DETAILS

Default: 0.0 (= deaktiviert, konstante LRs) Range: 0 oder 0.01 – 1.0

TECHNISCH

Minimaler Multiplikator für die Nicht-Position-LRs (Skala, Rotation, Opacity, SH) in der „extended phase" — sprich: nachdem T50 erreicht ist und Position-LR bereits bei T4 ist. Wenn 0.1, werden Skala/Rotation/Opacity/SH ihrerseits cosine-decayed von 1.0 (= ihr Standard-LR) auf 0.1× ihres Standards. Wenn 0.0 (Default), bleiben sie konstant. Voller Decay bis null liefert dasselbe Ergebnis wie gar kein Decay — das Verhalten wirkt mit Decay sauberer, ist aber nicht messbar besser. Steht deshalb in allen Presets auf 0 und ist in der Oberfläche nicht verstellbar.

T52adaptiveDensifyThreshold

DETAILS

Default: false Range: boolean

TECHNISCH

Experimentell: wenn true, berechnet die App in jedem Densification-Schritt das p98 der aktuellen Gradient-Verteilung und nutzt es als dynamischen Schwellwert (geclamped auf mindestens 0.5× des konfigurierten Werts aus T11, damit es nicht zu sehr ausreißt). Hypothese: Automatische Anpassung an aktuelle Szenen-Phase würde Density-Control robuster machen — z.B. zu Anfang strenger pruning, später lasser, oder umgekehrt. In der Praxis bricht die Gaussian-Anzahl dramatisch ein — Mass-Pruning, weil das p98 in den ersten Iterationen extrem hoch ist und danach fast nichts mehr den Schwellwert überschreitet. Der fixe Threshold ist bereits gut kalibriert, dynamische Anpassung schadet mehr als sie nutzt. T77 bietet eine alternative Adaptive-Logik via rolling median, die das Problem umgeht.

T53mergeAfterDensification

DETAILS

Default: false (Initializer), true (.full, .classicBalanced, .fullClassicPaper) Range: boolean

TECHNISCH

Am Ende der Densification-Phase (Iter T2) wird ein einmaliger Merge-Pass durchgeführt, der nahe beieinanderliegende Gaussians mit ähnlicher Skala und Farbe zusammenfasst. Reduziert die Gaussian-Anzahl um typisch 5–15 % ohne sichtbaren Qualitätsverlust. Sinn: nach intensivem Klonen entstehen Cluster von quasi-identischen Gaussians, die nichts Neues beitragen — das Merging gibt Optimizer-Kapazität für andere Bereiche frei. Standard in Classic-Quality-Presets. Bei MCMC nicht verwendet, weil MCMC durch seine Relocation-Logik solche Cluster gar nicht erst entstehen lässt.

T54densifyPhase2FromIteration

DETAILS

Default: 0 (= deaktiviert) Range: 0 oder T2T1

TECHNISCH

Experimentell: ermöglicht eine zweite Densification-Phase, die nach der Refinement-Pause bei dieser Iteration startet und bis T55 läuft. Hypothese: nach einer Refinement-Phase haben die Gradient-Akkumulatoren stabilere Magnitudes und können präziser sagen, welche Bereiche noch zusätzliche Gaussians brauchen. In der Praxis endet die zweite Densification-Phase in einer Kaskade bis auf null Gaussians — zusammen mit dem Refinement-Pruning (T40) räumt sie den Buffer leer. Steht deshalb in allen Presets auf 0 und ist in der Oberfläche nicht verstellbar.

T55densifyPhase2UntilIteration

DETAILS

Default: 0 Range: 0 oder T54T1 Defined in:

TECHNISCH

Ende der zweiten Densification-Phase. Nur relevant wenn T54 > 0. Beide Felder zusammen disabled.

Post-Processing + Apple AI (T56–T60)

T56postTrainingCompactification

DETAILS

Default: true (in allen Production-Presets), false (.quickTest, .preview) Range: boolean

TECHNISCH

Nach Trainingsende werden Gaussians mit sigmoid(opacity) < 0.01 hart entfernt (sie tragen praktisch nicht mehr zum Bild bei). Reduziert Gaussian-Count um typisch 58 % und Export-Dateigröße um 55 % ohne sichtbaren Qualitätsverlust. Standardmäßig in Production-Presets aktiv — das Endresultat soll möglichst kompakt ausgeliefert werden können. In .quickTest aus, weil ein Diagnose-Lauf sowieso nicht exportiert wird. Anders als T42 midTrainingCompactificationIterations findet die Compactification erst am Ende statt — Refinement kann bis dahin alle Gaussians benutzen.

T57metalFXUpscaling

DETAILS

Default: false Range: boolean

TECHNISCH

⚠ Seit 2026-07-18 stillgelegt und ohne jede Wirkung. Das Feld gehörte zum Picker „Viewport Scaling" (Off/MetalFX/Lanczos) im Inspector. Der Renderer hat es nie gelesen: die Blit-Entscheidung ist rein geometrisch (supersampled gerendert ⇒ MPS-Lanczos-Downsample zur Kantenglättung, sonst bilinear), und für den MetalFX-Pfad gab es überhaupt keine Aufrufstelle. Picker und die beiden Falschmeldungen, die er fütterte, sind entfernt; die Overlay-Beschriftung heißt jetzt „Sampling", nicht „Scaling", und nirgends in der App wird per MetalFX hochskaliert. Das Feld selbst bleibt bestehen, weil die Trainings-Konfiguration vollständig gespeichert wird — es steckt in jeder gespeicherten Szene, in jedem Preset und im Einstellungs-Kommentar bereits exportierter PLYs; ein Löschen würde den Key beim Neu-Schreiben still fallen lassen und diesen Austausch brechen. Aus demselben Grund ist das Feld vom „Modified"-Vergleich ausgenommen: eine alte Szene kann true tragen, und es gibt keinen Weg mehr, das über die Oberfläche zurückzusetzen. Nichts liest es — nicht wieder verdrahten.

T58mpsLanczosScaling

DETAILS

Default: false Range: boolean

TECHNISCH

⚠ Seit 2026-07-18 stillgelegt und ohne jede Wirkung — siehe T57 metalFXUpscaling, dort steht auch, warum das Feld trotzdem mitgespeichert bleiben muss. Ein naheliegender Trugschluss sei ausdrücklich benannt: die App benutzt sehr wohl MPS-Lanczos im Viewport, aber gesteuert wird das allein von der Geometrie — ein supersampled gerendertes Bild wird zur Kantenglättung heruntergerechnet. Das ist ein Herunter-, kein Hochskalieren, und dieses Feld hat es nie ausgelöst.

T59livePreviewInterval

DETAILS

Default: 50 (Initializer; Presets setzen das Feld nicht) Range: 0 (aus), 50, 250 oder 1 000 im Einstellungen-Picker

TECHNISCH

Wie oft während des Trainings der 3D-Viewer mit den aktuellen Gaussians aktualisiert wird. 50 = alle 50 Iterationen ein neues Render — gut genug, um den Fortschritt zu beobachten, ohne das Training spürbar zu verlangsamen. 0 = der Viewer wird gar nicht aktualisiert (Hintergrund-Training, maximales Tempo). Bei langen MCMC-Läufen lohnen 250 oder 1 000, weil der Update-Overhead in Summe zu Buche schlägt. Sonderrolle: das Feld gehört zwar zur Trainings-Konfiguration, ist aber eine app-weite Einstellung (Einstellungen → Training) und kein Teil des Trainings-Rezepts. Es ist deshalb aus dem „Modified"-Vergleich ausgenommen, bleibt beim Preset-Wechsel erhalten und wird seit 2026-07-18 beim Öffnen einer Szene nicht mehr aus der Datei übernommen — vorher hat eine geladene Szene die Bildrate des Nutzers still durch die des Szenen-Autors ersetzt, „Aus" eingeschlossen, und es gab keine zweite Stelle, aus der sie sich hätte zurückholen lassen.

T60perceptualLossWeight

DETAILS

Default: 0.0 (= deaktiviert) Range: 0 oder 0.001 – 0.5

TECHNISCH

Gewicht eines perceptuellen Loss-Terms (Multi-Scale-Blur-Feature-Matching). Erfasst strukturelle und texturelle Ähnlichkeit auf einer höheren Ebene als L1+SSIM — typisch dort, wo „pixel-perfect" weniger wichtig ist als „sieht realistisch aus". Der Wert liegt in allen Presets bei 0.0 (aus). In der Oberfläche stellst du ihn über den Regler Perceptual Loss im Inspector-Abschnitt „Training" ein, Bereich 0 bis 0,20 in Schritten von 0,01; bei 0 zeigt die App „Off" an.

MCMC-Densification (T61–T73)

T61densificationStrategy

DETAILS

Default: .classic (Initializer + Classic-Presets), .mcmc (alle MCMC-Presets + Scene-Class) Range: .classic oder .mcmc

TECHNISCH

Wählt zwischen Classic-Densification (Klon/Split/Prune, Kerbl et al.~2023) und MCMC-Densification (Stochastic Gradient Langevin Dynamics mit Relocation, Kheradmand et al.~NeurIPS 2024). Bei .classic werden T11–T16 ausgewertet, bei .mcmc die T62–T73. Achtung beim Wechsel: Classic Defaults und MCMC Defaults sind völlig anders kalibriert — wer den Picker im Expert View flippt, ohne ein passendes Preset zu laden, riskiert 1.4.3-Bug-Style Mass-Extinction (460 K → 5 in einer Iteration, weil MCMC-OpacityReg auf 0.01 die Classic-Opacities killt). Daher die MCMC-Init Defaults absichtlich „weichgespült" (alle Reg-Werte 0.0).

T62mcmcMaxGaussians

DETAILS

Default: 150 000 (Initializer + .fullMCMC + .mcmcBalanced), 100 000 (.mcmcPreview), 1 500 000 (.fullMCMCMip — Mip-Splatting-Variante mit 10× Budget), 1.19 M (.renderPreset), 1.25 M (.outdoorPreset), 670 K (.indoorPreset) Range: 0 (= „verwende Buffer-Kapazität") oder 10 000 – 5 000 000 Defined in:

TECHNISCH

Harte Obergrenze für die Anzahl der Gaussians bei MCMC-Strategie. Die Anzahl wächst graduell um T70 mcmcGrowthRate (typisch 5 %) pro Relocation-Step bis zu diesem Cap. 150 K ist ein guter Ausgangswert — deutlich darüber verdünnt sich die Splat-Qualität (zu viele kleine, redundante Gaussians), deutlich darunter bleibt die Szene unter-densifiziert. Bei sehr großen Szenen (z.B. 1 545-Foto-Drohnenflug mit 158 K SfM-init) ist 150 K zu niedrig — daher die 1.4.5-Erweiterung T72 mcmcCapMultiplier + T73 mcmcAutoScaleByScene. Die Scene-Class-Presets nutzen szenenspezifische Werte zwischen 670 K (Indoor) und 1.25 M (Outdoor). Bei Wert 0 verwendet die Engine die volle Buffer-Kapazität als Cap.

T63mcmcNoiseScale

DETAILS

Default: 0.00005 (5e-5 = Paper-Default) Range: 1e-6 – 1e-3

TECHNISCH

Multiplikator für das Gauss'sche Rauschen, das in jeder MCMC-Iteration zur Position jeder Gaussian addiert wird (SGLD-Logik). Höher = mehr Exploration (Gaussians wandern mehr, finden potenziell bessere Plätze), niedriger = mehr Exploitation (Gaussians bleiben da, wo sie schon gut sind). 5e-5 ist der passende Wert — deutlich kleiner heißt zu wenig Exploration, deutlich größer (1e-4) zu viel, dann zerlaufen die Splats. Wird über die Trainingszeit cosine-decayed bis T69 mcmcNoiseDecayEnd — am Ende des Decay-Bereichs ist Noise effektiv 0 und die Gaussians konvergieren.

T64mcmcOpacityRegWeight

DETAILS

Default: 0.0 (= deaktiviert in den RadianceKit Defaults, Paper: 0.01) Range: 0 oder 0.001 – 0.05

TECHNISCH

MCMC-spezifische L1-Penalty auf Opacity. Paper-Default 0.01 (drückt unbenutzte Gaussians gegen Null, macht sie für Relocation verfügbar). In RadianceKit ist das Ergebnis ohne diese Regularisierung messbar besser. Grund: Das mit T68 mcmcDeadOpacityThreshold definierte Pruning-Kriterium reicht alleine — eine zusätzliche L1-Penalty zwingt auch wertvolle, niedrig-Opacity-Gaussians zum Sterben. Daher Default 0. Achtung: in 1.4.3-Beta-Build war der Initializer-Default fälschlich 0.01, was im Mass-Extinction-Bug resultierte (siehe T61-Erläuterung); seit 1.4.4 auf 0.0 fixiert.

T65mcmcScaleRegWeight

DETAILS

Default: 0.0 (= deaktiviert, Paper: 0.01) Range: 0 oder 0.001 – 0.05

TECHNISCH

MCMC-spezifische L1-Penalty auf die Skala-Eigenwerte. Paper-Default 0.01. Auch hier ist das Ergebnis ohne Regularisierung besser, aus demselben Grund wie bei T64. Disabled in allen RadianceKit-MCMC-Presets. Achtung wie bei T64: 1.4.3-Bug.

T66mcmcRelocationInterval

DETAILS

Default: 100 (Initializer + alle MCMC-Presets, Paper-Standard), 155 (P9 Outdoor) Range: 50 – 500

TECHNISCH

Iterations-Intervall, in dem MCMC tote Gaussians (sigmoid(opacity) < T68 mcmcDeadOpacityThreshold) zu neuen Positionen relociert. Kürzere Intervalle (etwa 50) wirken zu disruptiv, der Loss schwankt; deutlich längere (etwa 200) nehmen MCMC die Reaktionsfähigkeit. 100 ist der richtige Wert. Für Außenszenen liegt er mit 155 etwas höher — die längeren Intervalle geben Adam mehr Zeit, neu plazierte Gaussians zu integrieren, bevor das nächste Reloc-Event sie unter Druck setzt.

T67mcmcWarmupIterations

DETAILS

Default: 500 Range: 100 – 5 000

TECHNISCH

Anzahl der Initial-Iterationen, in denen noch keine MCMC-Relocation passiert. Erst nach diesem Warmup beginnt die Reloc-Logik. Sinn: in den ersten Iterationen sind die Opacity-Werte noch nicht eingeschwungen — würde direkt mit Reloc gestartet, würden Gaussians an den falschen Stellen plaziert und müssten gleich wieder bewegt werden, was Adam-Momentum zerstört. Paper-Default 500. RadianceKit übernimmt diesen Wert, weil er sich als robust erwiesen hat.

T68mcmcDeadOpacityThreshold

DETAILS

Default: 0.005 (Initializer, Paper-Standard), 0.01 (.fullMCMC und alle MCMC-Presets) Range: 0.001 – 0.05

TECHNISCH

sigmoid(Opacity)-Schwellwert, unter dem eine Gaussian als „tot" gilt und für Relocation in Frage kommt. 0.01 ist der passende Wert — 0.005 ändert kaum etwas, 0.02 ist schlechter. Höher = aggressiveres Reloc (mehr Gaussians werden bewegt), niedriger = vorsichtiger. 0.01 entspricht ungefähr „0.5 % visuelle Sichtbarkeit". P10 Indoor verwendet 0.0142.

T69mcmcNoiseDecayEnd

DETAILS

Default: 0 (Initializer = „kein Decay"), 160 000 (.fullMCMC = 80 % von 200K), 96 000 (.mcmcBalanced = 80 % von 120K), 40 000 (.mcmcPreview) Range: 0 oder 1 000 –

TECHNISCH

Iteration, an der das T63 mcmcNoiseScale-Rauschen vollständig auf null gedämpft wird (Cosine-Decay von Iter 0 bis hier). 80 % der maxIterations ist der passende Wert — das gibt MCMC genug Exploration-Zeit, lässt aber die letzten 20 % zur Konvergenz ohne Rauschen. 0 = konstantes Rauschen über alle Iterationen (selten sinnvoll, MCMC kann dann nicht konvergieren).

T70mcmcGrowthRate

DETAILS

Default: 0.05 (Paper-Standard = 5 %) Range: 0.01 – 0.2

TECHNISCH

Wachstumsrate des MCMC-Populations-Targets pro Relocation-Step. Die Logik: bei jedem Reloc-Event wird das Ziel-Populations-Größe um (1 + growthRate) erhöht, bis T62 mcmcMaxGaussians (oder die per T72/T73 skalierte Variante) erreicht ist. 0.05 ist der passende Wert — höhere Werte führen zu zu schnellem Wachstum (Gaussians werden eingefügt, bevor das Adam-Momentum sie integrieren kann), niedrigere zu unter-densifizierten Szenen am Ende.

T71mcmcSigmoidK

DETAILS

Default: 100.0 Range: 10.0 – 500.0 Defined in:

TECHNISCH

Sigmoid-Sharpness-Parameter für die MCMC-Noise-Attenuation. Im SGLD-Schritt wird das pro-Gaussian-Rauschen durch gedämpft — hoch-opake Gaussians (deren Logit positiv ist) bekommen exponentiell weniger Rauschen als niedrig-opake. K = 100 ist scharf, sprich der Übergang von „voll-Noise" zu „kein-Noise" passiert sehr schnell um Opacity 0.5. K = 100 ist der passende Wert — kleinere Werte (10–50) lassen auch hoch-opake Gaussians mit-Wackeln (zerstört konvergierte Gaussians), größere (> 500) machen den Übergang künstlich hart und tote Gaussians werden gar nicht mehr bewegt.

T72mcmcCapMultiplier

DETAILS

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 (= deaktiviert) oder 1.0 – 10.0

TECHNISCH

1.4.5-Feature: szenen-adaptive Cap-Skalierung. Wenn T73 mcmcAutoScaleByScene true ist, wird der effektive Cap als berechnet (geclamped an Buffer-Kapazität). Hintergrund: bei großen Szenen (z.B. 1 545-Foto-Drohnenflug → 158 K SfM-init) ist T62 = 150 000 zu niedrig — Density-Control würde gar nicht wachsen können. Mit Multiplier 3.0 wird der Cap bei diesem Beispiel auf 474 K skaliert (158 K × 3.0). Die Scene-Class-Presets nutzen szenenspezifische Werte: Outdoor profitiert von einem hohen Multiplikator (5.32 → ~830 K Cap bei 156 K Init-Punkten), Indoor begnügt sich mit 1.76 (Wände sättigen schneller). Komplette Auflösung des Caps siehe -Methode.

T73mcmcAutoScaleByScene

DETAILS

Default: true (Initializer + alle MCMC-Presets) Range: boolean

TECHNISCH

1.4.5-Feature: Master-Switch für die scene-aware Cap-Logik (siehe T72 +). Wenn false, wird ausschließlich T62 mcmcMaxGaussians als Cap verwendet (zurück zu 1.4.4-Verhalten). Standardmäßig an, weil die Mass-Extinction-Probleme bei großen Szenen aus 1.4.3 sonst wiederkehren. Manuell deaktivieren nur, wenn du explizit ein hartes Cap setzen willst — z.B. um eine 150 K-Variante zu trainieren, deren Endgröße planbar ist.

Mip-Splatting (T74–T76)

Status: Mip-Splatting hat in der Praxis keinen Qualitätsgewinn gebracht und auf manchen Außenszenen sogar geschadet. Die Felder bleiben opt-in für Experimente; in allen ausgelieferten Presets ist Mip-Splatting aus.

T74useMipSplatting

DETAILS

Default: false (alle Production-Presets), true (.fullMCMCMip — Forschungs-Sibling) Range: boolean

TECHNISCH

Aktiviert Mip-Splatting (Yu et al.~CVPR 2024): 3D-Smoothing-Filter + 2D-Filter + α-Kompensation, der die per-Gaussian-Frequenz auf die Nyquist-Grenze der dichtesten Trainingskamera-Sampling-Rate begrenzt. Theoretisches Ziel: Eliminierung von Aliasing bei Rendering in off-training-Skalen (0.5× oder 2× der Trainingsauflösung). In den Preprocess- und Backward-Projection-Shadern aktiviert und funktional korrekt. In der Praxis blieb der erhoffte Qualitätsgewinn aber aus: beim Rendern in der Trainingsauflösung ändert sich praktisch nichts, und auf Außenszenen wird das Bild sogar schlechter. Eine Erklärung dafür: die 3D-Glättung arbeitet gegen die MCMC-Relocation, sobald viele Gaussians im Spiel sind. Das Feld bleibt für eigene Multi-Scale-Versuche verfügbar.

T75mipSmoothing3DScale

DETAILS

Default: 0.2 (Paper-Default) Range: 0.05 – 1.0

TECHNISCH

3D-Smoothing-Skala-Parameter (Yu et al.~§3.3, Paper-Default 0.2). Größer = mehr Welt-Raum-Glättung pro Gaussian (= mehr Anti-Aliasing, aber auch mehr blur in der Default-Skala), kleiner = schärfer aber anfälliger für Aliasing. Wird nur konsultiert, wenn T74 useMipSplatting = true. Nicht weiter optimiert — schon mit dem Paper-Default 0.2 bringt Mip-Splatting keinen Gewinn.

T76mipFilter2DVariance

DETAILS

Default: 0.3 (= exakt das bisherige Verhalten) Range: 0.1 – 1.0

TECHNISCH

2D-Mip-Filter-Varianz, die zur Σ_2D-Diagonale addiert wird (Varianz direkt, nicht quadriert). 0.3 ist exakt der Wert, der vor Mip-Splatting fest im Kernel stand. Wenn T74 useMipSplatting = false, ignoriert der Kernel diesen Wert komplett und schreibt das hartkodierte 0.3 — sodass sich am bisherigen Verhalten garantiert nichts ändert. Wenn, wird der hier gesetzte Wert verwendet. Bleibt im Feld-Katalog für Mip-Sweeps.

Adaptive Densification (T77–T79)

T77adaptiveDensification

DETAILS

Default: false Range: boolean

TECHNISCH

Rolling-Median-Tracker als Alternative zum fixen T11 densifyGradThreshold. Wenn true, wird in jedem Densify-Step der aktuelle Schwellwert mit median(letzte N avgGrad-Samples) × T79 adaptiveDensifyMultiplier überschrieben. N = T78 adaptiveWindow. Strikter als die p98-Variante aus T52, die dort das Mass-Pruning auslöst: Median mal 2 sitzt im eingeschwungenen Zustand etwa beim p70–p80 der Gradient-Verteilung. Alleine eingeschaltet bringt das Feld keinen Qualitätsgewinn; zusammen mit dem Curriculum (siehe T80/T81) schon — dort trägt das Curriculum den Gewinn, dieses Feld eher die Stabilität. Ein Bedienelement gibt es dafür nicht: das Feld ist in allen Presets aus und lässt sich nur über eine bearbeitete Preset-Datei belegen.

T78adaptiveWindow

DETAILS

Default: 1 000 Range: 100 – 10 000 Defined in:

TECHNISCH

Rolling-Median-Window in Densification-Events (NICHT Iterationen — jeder T13 densifyInterval-Step liefert ein Sample). Default 1 000 — bei heißt das die letzten 100 000 Trainings-Iterationen tragen zum Median bei, also typisch die gesamte Trainingshistorie bis hierhin. Frühe Phase (vor T78 Samples): Tracker returns nil → Fallback auf fixen Threshold T11. Nur relevant wenn.

T79adaptiveDensifyMultiplier

DETAILS

Default: 2.0 Range: 1.0 – 4.0

TECHNISCH

Multiplikator auf den Rolling-Median für den adaptiven Schwellwert. Default 2.0 entspricht ungefähr p70–p80 der typischen Gradient-Verteilung. Niedriger = aggressiveres Wachstum (mehr Klone), höher = strenger (weniger Klone). Im Bereich 1.5–3.0 ist 2.0 der beste Wert. Nur relevant wenn.

Curriculum (T80–T81)

T80curriculumResolutionRamp

DETAILS

Default: false Range: boolean

TECHNISCH

Die Trainings-Auflösung startet bei 0.5× und wechselt bei T50 positionLRScheduleEndIteration / 2 (oder T1 maxIterations / 2, falls T50 nicht gesetzt) auf T22 trainingRenderScale. Überschreibt T23 resolutionWarmupScale, wenn aktiviert. Von den beiden adaptiven Zugaben (siehe T77) trägt dieses Curriculum den eigentlichen Qualitätsgewinn — die schrittweise Auflösungserhöhung gibt der App Zeit, grobe Geometrie auf der niedrigeren Auflösung zu finden, bevor sie zur feinen Detailarbeit übergeht. In der Oberfläche nicht verstellbar — nur über eine bearbeitete Preset-Datei, und dann sinnvollerweise zusammen mit T81.

T81curriculumSHProgression

DETAILS

Default: false Range: boolean

TECHNISCH

Überschreibt T21 shDegreeUpgradeIterations mit [maxIter/4, maxIter/2, maxIter*3/4], verteilt also die SH-Aufstufungen gleichmäßig über die Trainingszeit statt sie front-zu-loaden. Hypothese: stabile Geometrie wird vor Color-Detail-Explosion etabliert, was die View-Direction-abhängigen Glanz-Effekte präziser positioniert. Zusammen mit T77 bringt das auf manchen Szenen einen Gewinn; getragen wird er von diesem Feld, T77 alleine reicht nicht. In der Oberfläche nicht verstellbar — nur über eine bearbeitete Preset-Datei.

Statische Presets (TP1–TP9)

Hier nur die strukturellen Unterschiede zum Initializer-Default. Die volle Marketing-Beschreibung der elf UI-Presets P1–P11 findest du in Kapitel 7.

TP1.preview

DETAILS

Diagnose-/Vorschau-Preset für Systeme ≥ 10 GB RAM. Overrides gegenüber Initializer:

  • maxIterations 30 000 → 5 000
  • densifyUntilIteration 15 000 → 3 500 (70 % von maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× höher, weniger aggressiver Decay)
  • shDCLearningRate, shRestLearningRate, opacityLearningRate, scaleLearningRate, rotationLearningRate jeweils 2×
  • opacityResetInterval 3 000 → 100 000 (effektiv aus — der Reset zerstört kurze Trainings)
  • shDegreeUpgradeIterations [1K, 2K, 3K][1K, 2K] (Degree 3 konvergiert in so kurzen Läufen nicht)
  • trainingRenderScale 1.0 → 0.5

TP2.full

DETAILS

Production-Quality Classic. Overrides:

  • maxIterations 30 000 → 35 000 (darüber droht Overtraining: mehr Gaussians ohne Qualitätsgewinn)
  • densifyUntilIteration 15 000 → 5 000 (bewährter Wert; später zu stoppen ist schlechter)
  • Alle LRs 2×
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× höher als der Paper-Default)
  • densifyGradThreshold 2e-6 → 1.1e-6 (kalibriert für 1.0× Auflösung)
  • densifyInterval 100 → 200
  • pruneOpacityThreshold 0.005 → 0.001
  • opacityResetInterval 3 000 → 100 000 (effektiv deaktiviert)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K] (verzögerte Aufstufung)
  • opacityDecayFactor 0.0 → 0.9995 (HTGS-Schema, deutlicher Qualitätsgewinn)
  • opacityDecayInterval 50 (unverändert)
  • mergeAfterDensification false → true
  • positionLRScheduleEndIteration 0 → 20 000
  • postTrainingCompactification true (schon Initializer-Default für .full)

TP3.fullClassicPaper

DETAILS

Paper-treue Classic-Variante von TP2. Overrides gegenüber TP2:

  • maxIterations 35 000 → 30 000 (Paper-Standard)
  • densifyUntilIteration 5 000 → 15 000 (Paper: 50 % von maxIter)
  • positionLearningRateFinal 1.6e-5 → 1.6e-6 (Paper-Default)
  • opacityLearningRate, scaleLearningRate, rotationLearningRate zurück auf Paper-Defaults (0.05, 0.005, 0.001)
  • densifyGradThreshold 1.1e-6 → 2e-7 (kalibriert für ~1–2 M Gs auf Bicycle)
  • densifyInterval 200 → 100 (Paper)
  • pruneOpacityThreshold 0.001 → 0.005 (Paper-Default)
  • opacityResetInterval 100 000 → 3 000 (Paper §5.2, riskant — kostet in RadianceKits Setup Qualität)
  • opacityDecayFactor 0.9995 → 0.0 (Paper hat keinen Decay)
  • positionLRScheduleEndIteration 20 000 → 30 000 (cosine läuft auf 100 % von maxIter)

TP4.fullMCMC

DETAILS

Production-Quality MCMC. Overrides gegenüber Initializer:

  • maxIterations 30 000 → 200 000 (MCMC braucht rund 5× mehr Iterationen als Classic)
  • densifyUntilIteration 15 000 → 160 000 (80 % von maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5
  • LR-Schedule wie TP2 (alle 2×)
  • ssimWeight 0.2 → 0.05 (MCMC braucht ein stärkeres L1-Signal)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K]
  • densificationStrategy .classic.mcmc
  • mcmcMaxGaussians 150 000 (im Initializer schon, im Preset bestätigt)
  • mcmcNoiseScale 5e-5 (Paper-Wert, bewährt)
  • mcmcDeadOpacityThreshold 0.005 → 0.01
  • mcmcNoiseDecayEnd 0 → 160 000 (80 % von maxIter)
  • mcmcCapMultiplier 3.0 (im Initializer schon)
  • mcmcAutoScaleByScene true (im Initializer schon)
  • opacityResetInterval 3 000 → 200 000 (effektiv aus, MCMC nutzt Reloc statt Reset)

TP5.fullMCMCMip

DETAILS

Mip-Splatting-Variante von TP4 mit dem Gaussian-Budget des Originalpapers. Overrides gegenüber TP4:

  • mcmcMaxGaussians 150 000 → 1 500 000 (10×, Paper-Magnitude)
  • useMipSplatting false → true (Mip-on)

TP6.classicBalanced

DETAILS

Mid-Tier Classic. Overrides gegenüber TP2:

  • maxIterations 35 000 → 20 000 (liefert praktisch dasselbe wie 30 000, bei spürbar kürzerer Wartezeit)
  • positionLRScheduleEndIteration 20 000 → 0 (Cosine läuft auf maxIter = 20K, keine verlängerte Phase)

TP7.mcmcPreview

DETAILS

MCMC-Diagnose. Overrides gegenüber TP4:

  • maxIterations 200 000 → 60 000
  • densifyUntilIteration 160 000 → 48 000 (80 %)
  • mcmcMaxGaussians 150 000 → 100 000
  • mcmcNoiseDecayEnd 160 000 → 40 000
  • mcmcCapMultiplier 3.0 → 2.0 (Preview skaliert zurückhaltender)

TP8.mcmcBalanced

DETAILS

Mid-Tier MCMC. Overrides gegenüber TP4:

  • maxIterations 200 000 → 120 000
  • densifyUntilIteration 160 000 → 96 000 (80 %)
  • mcmcNoiseDecayEnd 160 000 → 96 000 (80 %)
  • mcmcCapMultiplier 3.0 → 2.5 (zwischen Preview 2.0 und Full 3.0)

TP9.quickTest

DETAILS

Reiner Funktionstest. Overrides gegenüber Initializer:

  • maxIterations 30 000 → 1 000
  • densifyUntilIteration 15 000 → 500
  • densifyGradThreshold 2e-6 → 4e-6 (kalibriert für 0.25× Auflösung)
  • densifyInterval 100 → 50
  • opacityResetInterval 3 000 → 100 000 (aus, da viel zu kurz)
  • trainingRenderScale 1.0 → 0.25

Wie die App den Gaussian-Cap bestimmt

Die verbindliche Antwort auf die Frage „wie viele Gaussians darf MCMC maximal wachsen lassen?". Drei Größen gehen ein: der eingestellte Wert aus T62 mcmcMaxGaussians, die Anzahl der SfM-Init-Punkte deiner Szene und die vorab reservierte Buffer-Kapazität. Die App rechnet in dieser Reihenfolge:

+ Ausgangswert ist T62. Steht er auf 0, setzt die App 150 000 ein — dieser Sicherheitsboden verhindert den Mass-Extinction-Vorfall aus 1.4.3. + Ist T73 mcmcAutoScaleByScene eingeschaltet und T72 mcmcCapMultiplier größer als 0, vergleicht die App den Ausgangswert mit „Init-Punkte × T72" und nimmt den größeren der beiden Werte. + Zuletzt begrenzt sie das Ergebnis auf die Buffer-Kapazität.

Beispiel: Bicycle (Mip-NeRF 360, 194 Foto-Frames) → SfM-init ~156 K Punkte, T62 = 150 000, T72 = 5.32, Auto-scale an, Buffer-Kapazität 8 M. 156 K × 5,32 ergibt 830 K, das ist mehr als die 150 000 und weniger als die 8 M — der effektive Cap ist also 830 K. An diese Grenze hält sich die MCMC-Relocation.

Berechnet die wirkliche maximale Splat-Anzahl bei MCMC. Die App nimmt deine Einstellung „Max Gaussians", schaut sich an, wie viele Punkte deine Szene anfangs hat, und skaliert mit dem Multiplikator, falls „Auto-scale by scene" eingeschaltet ist. So passt sich der Cap an die Szene an, statt für eine kleine und eine riesige Szene den gleichen Wert zu erzwingen. Du musst dafür nichts tun — die App rechnet das beim Start des Trainings selbst aus.

Welches Feld wofür? (Cheat-Sheet)

ZielFelder zum Drehen
Mehr Detail in der FerneT62 mcmcMaxGaussians hoch, T72 mcmcCapMultiplier 5+
Mehr Detail allgemein (Classic)T1 maxIterations hoch (≤ 40K), T2 densifyUntilIteration ≤ 14 % von T1
Floater in Drohnenflügen reduzierenT43 frustumCullEnabled an, T20 skyMaskingEnabled an, T45 skyDomeEnabled an
Schöner Himmel in Außen-SzenenT45 skyDomeEnabled an, T47 skyDomeRadiusMultiplier 30–60
Kleinere Export-DateiStrategie .mcmc (T61), T56 postTrainingCompactification an, T62 mcmcMaxGaussians ≤ 200K
Schnelleres TrainingT22 trainingRenderScale 0.5, T1 maxIterations halbieren — aber nicht beides!
Bessere GlanzlichterT21 shDegreeUpgradeIterations mit [2K, 5K, 8K] (kein early-front-load), MCMC + 200K iter
Live-Vorschau häufigerT59 livePreviewInterval auf 50 — der dichteste Wert, den Einstellungen → Training anbietet
Sanftere Übergänge an SchattenT17 ssimWeight etwas hoch (0.15–0.25), aber nicht über 0.3
Innenräume kompakt haltenP10 Indoor-Preset (, T72 = 1.76)

Gefährliche Felder

Diese Felder können bei Falsch-Konfiguration zu OOM, App-Crash, Mass-Extinction der Gaussians oder unbrauchbaren Benchmark-Daten führen. Mit Vorsicht zu behandeln:

- T11 densifyGradThreshold — eine Halbierung kann 2–4× so viele Gaussians erzeugen, was schnell den GPU-Speicher sprengt. Auch zu beachten: muss zur T22 trainingRenderScale passen (1.0× → 1e-6, 0.5× → 2e-6, 0.25× → 4e-6). - T72 mcmcCapMultiplier — bei großen Szenen mit > 200 K SfM-init-Punkten und Multiplier > 5 entsteht ein Resolved-Cap von Millionen Gaussians. Auf 36-GB-RAM-Macs OOM möglich. Der Outdoor-Wert 5.32 funktioniert nur, weil die zugehörige Referenzszene rund 156 K Init-Punkte hat → 830 K Cap. - T39 testViewIndices — manuelles Setzen in einer Preset-Datei kann eine Qualitätsmessung unbrauchbar machen (alle Indices > N → keine Holdouts). Lass die Liste leer. - T64 mcmcOpacityRegWeight und T65 mcmcScaleRegWeight — In 1.4.3-Beta auf 0.01 gesetzt, was zu Mass-Extinction führte (460 K → 5 Gaussians in einer Iteration). Seit 1.4.4 auf 0.0 fixiert, aber manuelles Erhöhen kann das Problem reproduzieren. - T15 opacityResetInterval — wenn nicht 100 000+ (effektiv aus) und das Training kürzer als 10 000 Iterationen ist, zerstört der Reset die Konvergenz. .preview hat es deshalb auf 100 000 trotz maxIterations = 5 000. - T54/T55 densifyPhase2* — Die zweite Densification-Phase endet in einer Kaskade bis auf null Gaussians. Lass beide auf 0. - T74 useMipSplatting — bringt keinen Qualitätsgewinn und kann auf manchen Außenszenen die Bildqualität sogar verschlechtern. Default off, opt-in nur für Experimente.

Wenn ein Feld auf dieser Liste steht und du es ändern willst, mache vorher eine Sicherung deines aktuellen Presets (Export als JSON) und überlege, ob du das Resultat reproduzierbar messen kannst — sonst weißt du hinterher nicht, ob du eine Verbesserung oder Verschlechterung herbeigeführt hast.