Guida utente

Capitolo 6 — Configurazione dell'addestramento

Preset di anteprima esportato come JSON e visualizzato in TextEdit — campi id/name/category/version/createdAt/description, trainingConfig con tutti i parametri rilevanti (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, sei toggle booleani)
Preset di anteprima esportato come JSON e visualizzato in TextEdit — campi id/name/category/version/createdAt/description, trainingConfig con tutti i parametri rilevanti (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, sei toggle booleani)

Un tipico export JSON di un preset. Campi di primo livello: id (UUID), name, (classic | mcmc | sceneClass | custom), (versione dello schema), (Timestamp), (testo libero). L'oggetto annidato contiene i parametri critici per la riproducibilità — durante l'importazione l'intero blocco viene letto nella configurazione di addestramento, e i valori predefiniti della versione dell'app riempiono i campi mancanti nel JSON (ad es. dopo un aggiornamento dell'app). Chi vuole trasferire un preset su un altro Mac deve semplicemente inviare questo file JSON.

La configurazione di addestramento è il cuore di ogni sessione di addestramento in RadianceKit. Raccoglie ogni parametro che influenza l'addestramento — dal numero massimo di iterazioni agli otto learning rate, fino ai campi speciali per MCMC, Mip-Splatting, il curriculum e la logica scene-aware per il cap dei Gaussiani. La modifichi nella sidebar, nella sezione Configurazione di addestramento (vista Expert), la salvi come preset o la trasmetti come export JSON a un altro Mac. Durante l'addestramento è esattamente questo oggetto che viene congelato e passato al backend GPU.

Questo capitolo è materiale di riferimento per utenti avanzati. Elenca gli 80 campi configurabili della configurazione di addestramento, i 9 preset inclusi e la risoluzione del cap dei Gaussiani in base alla scena. In caso di dubbio vale il valore impostato dal preset scelto — lo vedi nell'Inspector o nell'export JSON del preset.

Indice:

+ Iterazione (T1–T2) + Learning Rate (T3–T10) + Densification — Classic (T11–T16) + Loss (T17–T20) + Progressione del grado SH (T21) + Performance (T22–T24) + Diagnostica e preparazione della nuvola di punti (T26–T30) + Regolarizzazione (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) + Preset statici (TP1–TP9) + Come l'app determina il cap dei Gaussiani + Quale campo serve a cosa? (Cheat-Sheet) + Campi pericolosi

Iterazioni (T1–T2)

T1maxIterations

DETTAGLI

Predefinito: 30 000 (Initializer), 35 000 (.full), 200 000 (.fullMCMC) Intervallo: 1 000 – 500 000 (slider nell'interfaccia), nessun limite superiore rigido nella logica

TECNICO

Numero totale di iterazioni di training che il backend esegue. Un'iterazione indica un forward-render di una singola camera di training, un backward-pass su tutte le componenti di loss (L1 + SSIM + eventuali regolarizzazioni + Sky-Mask) e un passo dell'ottimizzatore Adam. Questo numero agisce direttamente sugli altri schedule: il learning rate della posizione segue una curva di cosine-annealing da 0 fino a T1 stesso oppure fino a T50 positionLRScheduleEndIteration; la densificazione si ferma a T2 densifyUntilIteration; il decadimento del rumore MCMC termina a T69 mcmcNoiseDecayEnd; gli aggiornamenti del grado SH avvengono ai tre marcatori definiti in T21. Con la densificazione classica l'intervallo collaudato è 20 000–35 000 iterazioni, con MCMC 60 000–200 000. Un drastico aumento oltre i valori memorizzati nei Preset raramente porta ulteriore qualità — il momentum di Adam satura, e senza una fine del decadimento del learning rate il loss ristagna. Al contrario, scendere sotto ~5 000 porta a geometrie non completamente convergenti (il controllo della densità ha troppo poco tempo per clonare/dividere).

T2densifyUntilIteration

DETTAGLI

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

TECNICO

Iterazione a partire dalla quale la densificazione si ferma. Fino a questo punto le Gaussians vengono clonate, divise e sfrondate secondo le regole parametrizzate in T11–T16 (Classic) o T67–T70 (MCMC); dopo, il numero di Gaussians resta costante e vengono ottimizzate solo posizioni, rotazioni, scale, opacità e coefficienti SH (fase di refinement). Nel paper originale di 3DGS il valore è al 50% di T1, nel Preset .full di RadianceKit solo al ~14% (5 000 su 35 000): dopo circa 5 000 iterazioni un'ulteriore densificazione peggiora piuttosto il risultato — più floater, più fabbisogno di memoria, nessun guadagno di qualità. MCMC invece lascia proseguire la relocation fino all'80% di T1, perché MCMC non produce floater dannosi. Se T2 viene scelto troppo piccolo (< 1 000), si generano troppe poche Gaussians; troppo grande con Classic (> 50% di T1) porta a overgrowth e outlier di saturazione RGB (vedi i risultati sull'overtraining in esterni).

Learning Rates (T3–T10)

T3positionLearningRate

DETTAGLI

Predefinito: 0.00016 Intervallo: 1e-7 – 1e-3 (consigliato)

TECNICO

Learning rate di Adam per la posizione XYZ di ogni Gaussian all'inizio del training (iterazione 0). Segue una curva di cosine annealing e scende nel corso del training fino a T4 positionLearningRateFinal. Il valore predefinito 0.00016 proviene dal paper originale 3DGS (Kerbl et al.~2023) e in RadianceKit non va scalato nemmeno aumentando la risoluzione dell'immagine — la posizione si muove nel sistema di coordinate del mondo, non nello spazio dei pixel. Un aumento significativo (> 0.0005) fa sì che le Gaussian saltino su lunghe distanze e la loss diventi instabile; valori molto più bassi (< 0.00005) fanno sì che nuvole di punti inizializzate male non trovino mai la loro posizione. Per la stragrande maggioranza delle scene il valore predefinito è quindi la scelta giusta. Nota bene: con .fullMCMC lasciamo questo valore deliberatamente al predefinito — MCMC richiede learning rate costanti per la sua logica di relocation, per cui modificarlo qui non porta a nulla.

T4positionLearningRateFinal

DETTAGLI

Predefinito: 0.0000016 (Initializer + paper), 0.000016 (.full, .fullMCMC — 10× più alto) Intervallo: 0 – T3 positionLearningRate

TECNICO

Valore finale della curva di cosine annealing della LR di posizione. Viene raggiunto o a T1 maxIterations oppure, se impostato, a T50 positionLRScheduleEndIteration. Il preset .full di RadianceKit usa 0.000016 — quindi 10× più alto rispetto al predefinito del paper, 0.0000016. Sia un valore finale nettamente più piccolo sia un valore iniziale nettamente più grande peggiorano il risultato in modo percepibile. Il valore finale elevato non è un trade-off, bensì una scelta consapevole: con un decay troppo forte le Gaussian perdono, durante la fase di refinement, la capacità di adattarsi ai candidati della densification appena aggiunti. La fase di schedule può essere accorciata (T50 < T1), così che T4 venga raggiunto già prima della fine del training e il resto del training proceda con una LR minima costante — configurazione tipica: T50 = 20 000, T1 = 35 000, refinement quindi a 0.000016 per 15 000 iterazioni.

T5shDCLearningRate

DETTAGLI

Predefinito: 0.0025 (Initializer + paper), 0.005 (.full e tutti i preset MCMC — 2×) Intervallo: 0.0001 – 0.05

TECNICO

Learning rate di Adam per la componente DC (grado 0, cioè l'albedo costante) del colore delle spherical harmonics. SH-DC corrisponde al tono di base indipendente dalla direzione di una Gaussian, per così dire il "colore base". RadianceKit raddoppia il predefinito del paper nei preset di qualità — questo accelera la convergenza del colore, cosa necessaria perché con un training breve (, 5 000 iterazioni) altrimenti l'SH-DC non riesce a stabilizzarsi. A differenza delle LR geometriche, SH-DC non ha decay; la learning rate rimane costante su tutte le iterazioni (o segue solo il decay opzionale dell'extended phase da T51). Valori ancora significativamente più alti (circa 0.01) peggiorano di nuovo il risultato e rendono i colori instabili.

T6shRestLearningRate

DETTAGLI

Predefinito: 0.000125 (Initializer + paper), 0.00025 (.full e MCMC — 2×) Intervallo: 0.000001 – 0.005

TECNICO

Learning rate di Adam per i coefficienti SH di ordine superiore (grado 1, 2, 3 — cioè le componenti di colore dipendenti dalla direzione di vista, che generano riflessi, specchiature e ombreggiature morbide). 20× più piccola di T5 per convenzione del paper, perché questi coefficienti crescono in modo quadratico nel numero (3 per il grado 1, 5 per il grado 2, 7 per il grado 3 → in totale 15 float per Gaussian) e senza una learning rate più piccola saturerebbero l'immagine. Viene sbloccata in due passaggi — fino alla prima soglia in T21 shDegreeUpgradeIterations è attivo solo il grado 0 (quindi solo T5), poi 1, in seguito 2, infine 3. Valori bassi qui sono particolarmente importanti su scene con molta illuminazione diffusa; con superfici molto lucide (vernice auto, acqua) non conviene modificare nulla — la rappresentazione SH in sé ha dei limiti.

T7opacityLearningRate

DETTAGLI

Predefinito: 0.05 (Initializer + paper), 0.1 (.full, MCMC — 2×) Intervallo: 0.001 – 1.0

TECNICO

Learning rate di Adam per l'opacità logit di ogni Gaussian. L'app memorizza l'opacità come valore float non limitato e lo trasforma con una sigmoide in [0, 1]; la LR agisce nello spazio logit. I preset di qualità raddoppiano il predefinito del paper a 0.1; questo rende il pruning più efficiente — le Gaussian morte scendono più rapidamente sotto la soglia T14 pruneOpacityThreshold. Quale valore funzioni meglio dipende, in questo caso, dalla configurazione di Adam; l'interazione tra i due non è banale. Valori bassi (< 0.01) fanno sì che le Gaussian "morte" restino in giro per sempre consumando memoria; valori troppo alti (> 0.5) possono portare a un'esplosione dell'opacità, per cui l'optimizer limita fissamente il valore logit a [-15, 3].

T8opacityLearningRateFinal

DETTAGLI

Predefinito: 0.0 (= "nessun decay") Intervallo: 0 oppure 0.001 – T7 opacityLearningRate

TECNICO

Valore finale opzionale del cosine decay per la LR di opacità. Se 0.0, il decay è disattivato e la LR di opacità resta costante durante tutto il training a T7. Un decay da 0.1 a 0.01 peggiora il risultato in modo evidente; per questo il predefinito è "disattivato". L'ipotesi dietro questo campo: nella fase di refinement una LR di opacità costante potrebbe portare a oscillazioni, per cui gli splat che hanno già raggiunto il giusto grado di trasparenza vengono nuovamente spostati da fluttuazioni casuali del gradiente. Empiricamente questo non si conferma — la logica di clamping logit lo previene comunque. Il campo resta disponibile per esperimenti futuri; anche run MCMC molto lunghi (> 500K iterazioni) potrebbero beneficiarne.

T9scaleLearningRate

DETTAGLI

Predefinito: 0.005 (Initializer + paper), 0.01 (.full, MCMC — 2×) Intervallo: 0.0001 – 0.1

TECNICO

Learning rate di Adam per le tre componenti di scala di ogni Gaussian nello spazio logaritmico (RadianceKit memorizza log(scale), affinché le scale restino positive). Il predefinito del paper, 0.005, in RadianceKit è raddoppiato a 0.01 per una migliore convergenza della scala con le configurazioni di learning rate calibrate. Se il valore resta al predefinito del paper insieme alle altre learning rate di qualità, si generano visibilmente troppo poche Gaussian — il controllo di densità non riesce a clonare, perché gli aggiornamenti di scala seguono troppo lentamente. La scala controlla l'estensione di ogni Gaussian — un apprendimento troppo veloce porta a Gaussian "ad ago" (splat estremamente lunghi e sottili, vedi T34 scaleRatioPruneThreshold), un apprendimento troppo lento fa sì che gli splat restino troppo compatti e il controllo di densità debba fare split troppo spesso.

T10rotationLearningRate

DETTAGLI

Predefinito: 0.001 (Initializer + paper), 0.002 (.full, MCMC — 2×) Intervallo: 0.0001 – 0.05

TECNICO

Learning rate di Adam per le quattro componenti quaternione di ogni Gaussian. Il quaternione viene rinormalizzato a ogni passo dell'optimizer dopo l'aggiornamento di Adam (norma L2 = 1) — altrimenti la matrice di covarianza degenererebbe. RadianceKit raddoppia il predefinito del paper nei preset di qualità, perché la rotazione ha, rispetto a scala / posizione, magnitudini di gradiente assolute più piccole (sulla sfera unitaria ogni passo resta breve) e senza il 2× la rotazione risulterebbe nettamente sotto-convergente nella finestra di 35 000 iterazioni. Nelle scene NeRF-Blender (Lego, Chair) la rotazione ha un effetto particolarmente marcato — gli spigoli degli oggetti si allineano correttamente solo dopo 5 000–10 000 iterazioni.

Densification — Classic (T11–T16)

T11densifyGradThreshold

DETTAGLI

Default: 0.000002 (Initializer, calibrato per risoluzione 0.5×), 0.0000011 (.full, calibrato per 1.0×), 0.000004 (.quickTest, calibrato per 0.25×), 2e-7 (.fullClassicPaper) Range: 1e-8 – 1e-3 (dipende dalla risoluzione)

TECNICO

Soglia per la norma L2 del gradiente di posizione proiettato nello spazio schermo, oltre la quale una Gaussian viene contrassegnata per clonazione o split. Il valore assoluto dipende direttamente dalla risoluzione di training — scala approssimativamente come 1/risoluzione² (più pixel = gradienti per pixel più piccoli). Per questo ogni livello di T22 trainingRenderScale richiede una soglia calibrata: 0.25× → 4e-6, 0.5× → 2e-6, 1.0× → 5e-8 … 1.1e-6 (.full). Il default del paper 0.0002 è normalizzato in NDC e non è direttamente confrontabile nella pipeline in spazio mondo di RadianceKit. Con il flag T52 adaptiveDensifyThreshold è possibile calcolare il valore a runtime a partire dal p98 della distribuzione attuale dei gradienti — su scene reali però il numero di Gaussian crolla drammaticamente (mass pruning); il flag rimane disattivato. T77–T79 offrono una logica adattiva alternativa tramite rolling median. Questo campo non è privo di rischi — dimezzare il valore genera 2–4× più Gaussian (pressione sulla memoria, rischio OOM); raddoppiarlo può sotto-densificare la scena.

T12densifyFromIteration

DETTAGLI

Default: 500 Range: 100 – 5 000

TECNICO

Prima iterazione a partire dalla quale la densification diventa attiva. Prima di allora avviene solo un apprendimento "puro" sulla nuvola di punti SfM iniziale, senza che vengano create nuove Gaussian. Il default 500 proviene dal paper 3DGS e dà all'inizializzazione il tempo di stabilizzarsi — se la densification partisse già dall'iterazione 0, i punti SfM posizionati male si clonerebbero più volte prima ancora di trovare la loro posizione corretta. Un avvio decisamente più tardivo (ad esempio 1 000) peggiora leggermente il risultato; mantieni il default.

T13densifyInterval

DETTAGLI

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

TECNICO

Quante iterazioni intercorrono tra due passi di densification. Nel default del paper 100 — ogni 100 iterazioni viene valutata la lista dei candidati alla densification, clonata/splittata, e contemporaneamente viene rimossa la lista dei candidati al pruning (sigmoid(opacity) < T14 pruneOpacityThreshold). Per .full si è dimostrato efficace il valore 200 — questo alleggerisce la GPU, perché vengono eseguiti meno passaggi di riorganizzazione, e dà a ogni Gaussian più tempo per assestarsi dopo un'operazione di clonazione. Intervalli più brevi portano nel setup Quality a un'eccessiva densification: si generano molte più Gaussian, senza che l'immagine migliori. Nel caso di MCMC lo stesso campo viene interpretato come intervallo di rilocazione; vedi T67 mcmcRelocationInterval per la logica specifica di MCMC.

T14pruneOpacityThreshold

DETTAGLI

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

TECNICO

Soglia di opacità sigmoide al di sotto della quale una Gaussian viene eliminata al successivo passo di densification. Agisce in combinazione con T7 opacityLearningRate e la logica di logit-clamp nell'optimizer. In .full il valore è 0.001 invece di 0.005 — gli splat che hanno un ruolo solo in punti di vista esotici vengono così mantenuti più a lungo e contribuiscono al dettaglio SH. Valori ancora più piccoli (circa 0.0001) non portano più alcun beneficio: si pota troppo poco e si spreca memoria. Importante: il density control deve SEMPRE eseguire il pruning, anche se la capacità del buffer è già piena a causa di altre misure — altrimenti le Gaussian morte si accumulano e il conteggio si blocca.

T15opacityResetInterval

DETTAGLI

Default: 3 000 (Initializer + Paper), 100 000 (.full = di fatto disattivato), 200 000 (.fullMCMC = disattivato) Range: 1 000 – 100 000+

TECNICO

Ogni quante iterazioni l'opacità di tutte le Gaussian viene reimpostata a un valore basso (~0.01) — una misura ripresa dal paper 3DGS, per rivalutare gli splat "congelati". Insieme al warmup di RadianceKit, al setup di training stocastico e ai learning rate raddoppiati, il reset dell'opacità costa un notevole calo di qualità, e il logit-clamp nell'optimizer copre comunque già questa funzione. Per questo in .full è praticamente disattivato (100 000 > 35 000 = mai attivato). In .fullClassicPaper (variante fedele al paper) viene invece deliberatamente reimpostato a 3 000 — lì l'obiettivo è raggiungere i budget di Gaussian del paper originale.

T16maxScreenSize

DETTAGLI

Default: 0.0 (= disattivato) Range: 0 (off) oppure > 0

TECNICO

Dimensione massima nello spazio schermo (in pixel proiettati) che una Gaussian può raggiungere prima di essere forzatamente splittata. Il valore è impostato a 0 — il density control di RadianceKit usa invece la soglia di scala nello spazio mondo derivata dalla stessa logica dei gradienti. Rimane nel catalogo dei campi perché futuri esperimenti con mip-splatting (T74–T76) o strategie di splatting specifiche per scena potrebbero trarne beneficio. L'attivazione (valore > 0, ad es. 20) costringerebbe gli splat diventati molto grandi sullo schermo a suddividersi — rilevante per grandi superfici murarie lisce, dove un singolo splat gigante offre troppo poco dettaglio.

Loss (T17–T20)

T17ssimWeight

DETTAGLI

Predefinito: 0.2 (Initializer + Paper + .full), 0.05 (tutti i preset MCMC) Intervallo: 0.0 – 1.0

TECNICO

Peso della componente D-SSIM nella funzione di loss combinata loss = (1 - λ) * L1 + λ * D-SSIM, dove λ = T17. Il valore predefinito 0.2 del paper 3DGS è la scelta giusta per la Densification classica — già 0.3 peggiora sensibilmente il risultato. Per MCMC il valore adatto è invece 0.05, perché MCMC, grazie alla sua esplorazione stocastica, necessita di una componente L1 più forte — pesi SSIM più alti diluirebbero le decisioni di relocation. SSIM è decisamente più costoso da calcolare rispetto a L1 (finestre locali 11×11 su tutta l'immagine); RadianceKit usa un'implementazione accelerata da MPS che resta sotto 1 ms per immagine 1080p. I preset Scene-Class usano valori specifici per scena tra 0.082 (.outdoorPreset) e 0.171 (.indoorPreset).

T18ssimWeightRefinement

DETTAGLI

Predefinito: 0.0 (= "nessun cambio, mantieni ssimWeight") Intervallo: 0 oppure 0 – 1.0

TECNICO

Valore SSIM opzionale per la fase di refinement dopo T2 densifyUntilIteration. Un aumento da 0.2 a 0.3 nella fase di refinement peggiora il risultato in entrambe le misure — sia L1 che SSIM; per questo il valore predefinito è 0.0. L'ipotesi dietro questo campo era che, dopo la Densification — quando non si generano più nuovi Gaussians — una componente SSIM più forte massimizzasse la nitidezza strutturale. Empiricamente errato: aumentare il peso SSIM significa indirettamente ridurre il peso L1, e L1 è il segnale decisamente più significativo nella fase finale di refinement. Il campo rimane disponibile per futuri esperimenti con loss percettiva (T60) o Edge-Loss (T19), dove una composizione di loss specifica per il refinement potrebbe avere senso.

T19edgeLossWeight

DETTAGLI

Predefinito: 0.0 (= disattivato) Intervallo: 0 oppure 0.001 – 1.0

TECNICO

Termine di loss sperimentale: peso di una loss L1 sul dominio del gradiente di Sobel, che confronta direttamente i bordi dell'immagine (Sobel del ground-truth vs Sobel del render) in aggiunta a L1+SSIM. Ipotesi: l'informazione sui bordi è un pilastro percettivo della qualità dell'immagine e un termine esplicito dovrebbe incoraggiare i Gaussians a colpire meglio i bordi. Nella pratica non porta alcun beneficio: un peso percepibile (0.1) peggiora il risultato, uno piccolo (0.01) non cambia nulla nella qualità, ma costa tempo di calcolo. Il passaggio Sobel costa un forward MPS aggiuntivo su ground-truth e render. Per questo disattivato in modo permanente. Possibile caso d'uso futuro: scene con bordi artificiali netti (architettura, mobili, rendering) potrebbero trarne beneficio — i preset Scene-Class però non usano questo termine per tale scopo, bensì scalano il peso SSIM.

T20skyMaskingEnabled

DETTAGLI

Predefinito: false (Initializer e tutti i preset) Intervallo: booleano

TECNICO

Attiva lo Sky Masking. In questo modo, in ogni immagine, tramite il framework Apple Vision viene mascherata la regione del cielo, e la loss in quest'area viene azzerata. Motivo: le scene esterne soffrono spesso del fatto che i pixel del cielo blu/grigio/bianco inducono l'app a posizionare Gaussians proprio lì — il che viene percepito come "floater". Senza la maschera del cielo, la loss in quest'area non sarebbe mai zero, perché il cielo nell'immagine varia leggermente e l'app tenta all'infinito di ricostruirlo con degli splat. La maschera Vision viene calcolata una volta per camera prima del training e mantenuta in RAM. Viene tipicamente attivata insieme a T45 skyDomeEnabled (logica UI nella vista Impostazioni). Per scene interne o rendering sintetici, lasciare disattivato — la maschera in quel caso riconoscerebbe erroneamente soffitti o pareti come "cielo".

SH-Degree-Progression (T21)

T21shDegreeUpgradeIterations

DETTAGLI

Predefinito: [1_000, 2_000, 3_000] (Initializer), [2_000, 5_000, 8_000] (.full, MCMC), [1_000, 2_000] (.preview — Grado 3 saltato) Intervallo: [Int], ogni valore in [0, maxIterations], monotonicamente crescente

TECNICO

Iterazioni in cui il grado SH attivo viene innalzato da 0→1, 1→2, 2→3. Prima della prima soglia sono attive solo le componenti DC (quindi T5 shDCLearningRate), dopo la prima soglia DC + i 3 coefficienti di grado 1, dopo la seconda soglia + 5 coefficienti di grado 2, dopo la terza soglia tutti i 15 coefficienti. Il fabbisogno di memoria per Gaussian cresce così a gradini — 4 Float → 16 Float → 36 Float → 64 Float. I Preset di qualità ritardano gli avanzamenti rispetto ai valori predefiniti dell'Initializer, perché la geometria deve prima stabilizzarsi, prima che i dettagli cromatici con la loro frequenza più alta si aggiungano. Le soglie precedenti [1K, 2K, 3K] producono in .full un risultato sensibilmente peggiore. .preview si ferma al grado 2, perché il grado 3 non converge in 5 000 iterazioni e consuma soltanto capacità dell'optimizer inutilmente. Il Curriculum (T80–T81) offre una logica alternativa che sovrascrive dinamicamente questo elenco.

Performance (T22–T24)

T22trainingRenderScale

DETTAGLI

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

TECNICO

Risoluzione di rendering durante il training rispetto alla risoluzione originale delle immagini di training. Con 0.5 ogni immagine viene ridotta al 50 % di larghezza × 50 % di altezza (quindi al 25 % dei pixel) e il rendering Gaussian avviene in questa risoluzione ridotta. Riduce sia il carico di memoria sia quello di calcolo in modo quadratico. Importante: T11 densifyGradThreshold deve essere adattato alla risoluzione scelta — le magnitudini del gradiente scalano con 1/risoluzione², perciò .quickTest (0.25×) ha una soglia molto più alta (4e-6) rispetto a .full (1.0×, 1.1e-6). RadianceKit avvisa in caso di immagini molto grandi e si adatta automaticamente — risoluzione target di 3 MP. Con immagini di input 4K estreme sarebbe sensato usare 0.5 o addirittura 0.25, altrimenti qualsiasi Mac finirebbe solo in CPU-Compaction.

T23resolutionWarmupScale

DETTAGLI

Default: 0.0 (= disattivato) Range: 0 oppure 0.1 –

TECNICO

Allena la fase di densification (Iter 0 fino a T2) a una risoluzione inferiore rispetto alla fase di refinement. Per .full questo è disattivato, perché con T22 = 1.0 e cosine annealing il guadagno di tempo risulta minimo e la qualità ne risente leggermente. Rimane nel catalogo dei campi perché potrebbe tornare utile con input 4K e training lunghi — il curriculum (T80) riprende una logica simile, ma lì è collegata alla LR-schedule. Se attivata e anche T80 curriculumResolutionRamp è true, vince il curriculum e sovrascrive questo valore.

T24tileSize

DETTAGLI

Default: 16 Range: 8, 16, 32

TECNICO

Dimensione delle tile di rasterizzazione in pixel. Il rendering Gaussian Splatting è basato su tile: l'immagine viene suddivisa in riquadri di 16×16 pixel, ogni tile raccoglie le Gaussians rilevanti per essa, le ordina per profondità e le fonde. 16 è lo standard usato praticamente da tutte le implementazioni 3DGS ed è hardcoded nei kernel Metal di RadianceKit; una modifica di questo valore richiederebbe la ricompilazione degli shader e allo stato attuale non è efficace. Rimane come campo nel caso una futura versione del motore supporti la tile-size in modo dinamico.

Diagnosi e preparazione delle nuvole di punti (T26–T30)

T26depthDistortionWeight

DETTAGLI

Default: 0.0 (= disattivato) Range: 0 oppure 0.0001 – 0.05

TECNICO

Sperimentale: peso di una loss di regolarizzazione per la depth distortion. Penalizza le Gaussians che, lungo un raggio di rendering, sono disposte in profondità in modo scalare ma appartengono concettualmente alla stessa superficie — ciò incoraggia distribuzioni di profondità concentrate e riduce i floater. In tutte le intensità testate il risultato peggiora invece di migliorare. Il vantaggio teorico — migliorare la coerenza multi-view — non si riflette nella loss L1, perché l'ipotesi presuppone implicitamente che la geometria SfM sia corretta e che le Gaussians debbano solo essere "impilate". In pratica, la nuvola di punti SfM è di solito la componente più debole, non l'impilamento. Rimane disponibile per dataset multi-view con pose particolarmente pulite (Synthetic, Mip-NeRF 360 con ground truth).

T27singleViewOverfit

DETTAGLI

Default: false Range: boolean

TECNICO

Flag di diagnosi: se true, in ogni iterazione di training viene usato obbligatoriamente l'indice camera 0 invece di uno scelto casualmente dal pool di camere. Senso: se il modello non riesce nemmeno a fare overfit su una singola view (cioè, se la loss sulla view 0 non tende a zero nemmeno dopo 10 000 iterazioni), c'è un bug fondamentale nel forward/backward pass. Questo interruttore è stato usato intensamente durante lo sviluppo degli shader Metal e dei kernel del rasterizzatore differenziabile. Oggi è disponibile solo come sanity-check, se qualcuno ha modificato qualcosa nel backend di training e vuole verificare. Nell'interfaccia non c'è un controllo per questo — il campo è disattivato in tutti i preset e resta tale.

T28maxCameras

DETTAGLI

Default: 0 (= "usa tutte le camere") Range: 0 oppure 1 – N

TECNICO

Limite di diagnosi: allena solo con le prime N camere, ignora tutte le altre. Il senso originario era testare l'ipotesi che troppe camere generino conflitti di gradiente (troppi segnali di loss contraddittori per la stessa Gaussian). Una limitazione artificiale non porta alcun vantaggio — più frame producono praticamente sempre più qualità. Nell'interfaccia non c'è alcun controllo per questo; il campo è impostato a 0 in tutti i preset, cioè "tutte le camere".

T29maxInitialPoints

DETTAGLI

Default: 0 (= "usa tutti i punti SfM") Range: 0 oppure 1 000 – 200 000+

TECNICO

Protezione: limita il numero di punti SfM iniziali con cui parte il training. Le ricostruzioni COLMAP dense possono produrre > 60 000 punti, il che con scale iniziali grandi porta a 200–300 Gaussians per sovrapposizione di pixel — ciò crea un "campo di nebbia" in cui il training non converge. Il subsampling a ~16 000 punti (logica hard-cap nel motore di training) riporta la densità iniziale al livello usato dal 3DGS di riferimento e riduce drasticamente la sovrapposizione. L'app lo imposta autonomamente in caso di ricostruzioni molto dense; non esiste un controllo per questo.

T30cameraClusterOutlierMultiplier

DETTAGLI

Default: 10.0 (tutti i preset — mai sovrascritto) Range: 1.0 – 100.0

TECNICO

Moltiplicatore per il filtro degli outlier del cluster di camere. Prima del training, il motore di training calcola il centroide di tutte le posizioni delle camere e la distanza massima di una camera dal centroide. I punti SfM la cui distanza dal centroide supera multiplier × maxCameraDistance vengono scartati come outlier. Il default 10× è scelto intenzionalmente in modo generoso. Un effetto collaterale sottile: SfM più stretto (camere più vicine tra loro) → soglia più piccola → più punti vengono scartati come outlier. SfM più ampio → soglia maggiore → meno punti scartati. Ne deriva un effetto sorprendente: una ricostruzione SfM più stretta e di per sé migliore può peggiorare il training, perché troppi punti iniziali vengono scartati. Il campo è impostato a 10 in tutti i preset ed è non modificabile nell'interfaccia. Valori sotto 5 sono in genere troppo restrittivi, oltre 20 sono inefficaci.

Regolarizzazione (T31–T37)

T31coarseToFineBlurRadius

DETTAGLI

Default: 0 (= disattivato) Intervallo: 0 oppure 1 – 10

TECNICO

Sperimentale: raggio di box-blur che viene applicato all'immagine ground-truth all'inizio della fase di Densification e ridotto linearmente a 0 entro la fine della Densification (T2). Ipotesi: un training coarse-to-fine — prima apprendere le strutture grossolane, poi i dettagli — dovrebbe fornire una geometria più stabile. In tutti i raggi testati il risultato peggiora. Il motivo del fallimento: la Densification decide in base ai gradienti nel dominio dell'immagine, e il blur riduce esattamente i segnali che sono importanti per "qui bisogna clonare". Rimane nel catalogo dei campi per test futuri con uno schema di density-control diverso.

T32scaleRegWeight

DETTAGLI

Default: 0.0 (= disattivato) Intervallo: 0 oppure 0.0001 – 0.05

TECNICO

Sperimentale: regolarizzazione L1 sulla scala nello spazio del mondo. Penalizza le Gaussians che diventano troppo grandi — previene "mega-splat" che coprono intere pareti con una sola Gaussian. Attivata, fa esplodere il numero di Gaussians nell'ordine dei milioni e il risultato peggiora di parecchie volte. Il motivo: la regolarizzazione della scala entra in conflitto con il density-control — scale più piccole significano che servono più Gaussians, quindi il density-control esegue split più spesso, il che a sua volta comporta più carico di gradiente. Disattivata, ma documentata per esperimenti con Mip-Splatting (T74): in questo contesto un limite inferiore per la scala potrebbe avere senso.

T33anisotropyRegWeight

DETTAGLI

Default: 0.0 (= disattivato) Intervallo: 0 oppure 0.0001 – 0.05

TECNICO

Sperimentale: penalità sul rapporto max(scale)/min(scale), pensata per prevenire Gaussians estremamente allungate a forma di "ago" che vengono percepite come floater. A tutte le intensità testate il risultato peggiora sensibilmente. Il motivo: la regolarizzazione costringe gli splat verso una forma "rotonda", il che su una superficie piatta (parete, tavolo, pavimento) è esattamente sbagliato — lì una Gaussian piatta e larga è più efficiente di una sferica. Disattivata. T34 scaleRatioPruneThreshold persegue lo stesso scopo in modo più mirato, ma anch'esso è disattivato di default.

T34scaleRatioPruneThreshold

DETTAGLI

Default: 0.0 (= disattivato) Intervallo: 0 oppure 5.0 – 100.0 (tipicamente 10.0 – 30.0)

TECNICO

Pruning sperimentale post-training che elimina ogni Gaussian il cui rapporto max(scale)/min(scale) supera la soglia lineare impostata qui. Mira a floater estremamente allungati a forma di "ago/disco" che la sola regolarizzazione non riesce a eliminare. Nel test il pruning ha rimosso i floater come sperato, ma allo stesso tempo anche splat piatti utili su pareti e pavimenti — l'immagine è diventata più bucherellata. Per questo è disattivato di default. Dalla versione 1.8 esiste per questo l'interruttore Remove Needle/Disc Floaters nella sezione Inspector "Training", sotto la riga "Runs automatically at the end of training". Attivato, agisce in modo volutamente conservativo (solo splat il cui asse più lungo supera all'incirca di 50 volte quello più corto) e ha effetto a partire dal prossimo run di training.

T35opacityRegWeight

DETTAGLI

Default: 0.0 (= disattivato) Intervallo: 0 oppure 0.0001 – 0.05

TECNICO

Sperimentale: penalità Binary-Cross-Entropy che spinge l'opacità verso 0 o 1 (quindi lontano da "semi-trasparente"). Ipotesi: una distribuzione di opacità più netta avrebbe migliorato la nitidezza dell'immagine. Insieme a T33 questa regolarizzazione costa qualità; entrambe sono disattivate. Attenzione: nella 1.4.3-Beta è comparso un bug che aveva modificato proprio questo campo nel valore di default (Initializer = 0.01), causando un'estinzione di massa del conteggio delle Gaussians (460 K → 5 in un'iterazione). Dalla 1.4.4 il default è fissato saldamente a 0.0.

T36opacityDecayFactor

DETTAGLI

Default: 0.0 (Initializer = disattivato), 0.9995 (.full, .classicBalanced — standard HTGS) Intervallo: 0 (off) oppure 0.95 – 1.0

TECNICO

Implementazione dello schema HTGS (Hierarchical Time-Gating, Eurographics 2025): ogni T37 opacityDecayInterval iterazioni, l'opacità sigmoide di ogni Gaussian viene moltiplicata per questo fattore. 0.9995 × 100 applicazioni dà circa il 95% di mantenimento per fase di Densification — una pressione al ribasso leggera ma costante su tutte le opacità, che fa scendere in modo affidabile le Gaussians che contribuiscono poco sotto la T14 pruneOpacityThreshold. Il risultato è nettamente migliore rispetto al non avere decay. Attivo solo durante la fase di Densification (fino a T2), dopodiché il training prosegue senza decay, così che le opacità stabilite nel refinement restino stabili. Non usato con MCMC (MCMC ha meccanismi propri tramite T67 mcmcRelocationInterval + T68 mcmcDeadOpacityThreshold).

T37opacityDecayInterval

DETTAGLI

Default: 50 Intervallo: 10 – 500

TECNICO

Intervallo di iterazioni in cui viene applicato T36 opacityDecayFactor. Default del paper HTGS 50, lasciato invariato in .full. Intervalli lunghi (>200) annullano in parte l'effetto, perché tra due applicazioni avvengono abbastanza aggiornamenti del gradiente da far risalire di nuovo l'opacità. Intervalli più brevi (<20) rendono il decay troppo aggressivo. Attivo solo nella fase di Densification.

Perfezionamento (T38–T44)

T38gradientAccumulationSteps

DETTAGLI

Default: 1 (= „una View per passo Adam") Range: 1 – 8

TECNICO

Numero di View i cui gradienti vengono accumulati prima che venga eseguito un aggiornamento Adam. Con > 1 l'app passa a un percorso separato di backward-project „unfused", che somma i gradienti in un buffer separato; l'applicazione finale viene scalata per 1/N per mantenere costante la magnitudine. Nel training classico il valore 2 non porta alcun guadagno di qualità, ma costa tempo, perché il percorso unfused è più costoso di quello fused. Con MCMC invece accum = 2 riduce sensibilmente il divario di qualità rispetto a Classic — per questo lì viene offerto come interruttore. Nei preset il valore è impostato a 1. Nell'interfaccia lo raggiungi tramite l'interruttore MCMC Quality nella sezione Inspector „Training": attivato, l'app accumula 2 View per passo, disattivato 1. Valori diversi da 1 e 2 sono impostabili solo tramite un preset modificato.

T39testViewIndices

DETTAGLI

Default: [] (= vuoto, tutte le View vengono usate per il training) Range: Set<Int>, qualsiasi sottoinsieme degli indici delle Camera

TECNICO

Insieme di indici delle Camera che NON vengono usati per il training, ma riservati come holdout per la valutazione PSNR/SSIM/LPIPS. Viene valorizzato solo nelle esecuzioni di misurazione interne: allora ogni ottava View, a partire dall'indice 0 (standard LLFF, identico alle convenzioni dei paper Mip-NeRF-360 e 3DGS). Nello stato di consegna il campo resta vuoto — il training usa tutte le View, e nell'interfaccia non c'è alcun elemento di controllo per questo. Attenzione: impostare manualmente questo campo in un file di preset senza comprendere gli indici rende inutilizzabile una misurazione (ad es. se tutti gli indici vengono impostati oltre N, mentre ci sono solo N-50 View → nessun holdout → nessuna valutazione). Nell'esportazione del proprio preset testViewIndices non viene salvato, perché dipende dalla scena e altrimenti lascerebbe tra diversi dataset valori privi di senso.

T40refinementPruneInterval

DETTAGLI

Default: 0 (= disattivato) Range: 0 oppure 100 – 5 000

TECNICO

Ogni N iterazioni durante la fase di perfezionamento (dopo T2) viene eseguito un passaggio di pruning aggiuntivo, che rimuove i Gaussian con sigmoid(opacity) < T41 refinementPruneOpacityThreshold. Senso: durante la Densification ci sono chiamate regolari di Density-Control, dopo non più — i Gaussian la cui opacity continua a diminuire, però, restano nel buffer. In pratica questo pruning aggiuntivo nuoce: insieme alla seconda fase di Densification (T54) può svuotare completamente la popolazione di Gaussian. È impostato a 0 in tutti i preset e non è modificabile nell'interfaccia; se lo si valorizza comunque tramite un file di preset modificato, 1 000 o 2 000 sono valori ragionevoli.

T41refinementPruneOpacityThreshold

DETTAGLI

Default: 0.0 (= „usa T14") Range: 0 oppure 0.001 – 0.1

TECNICO

Soglia di opacity separata per il pruning di perfezionamento. Dopo la Densification la maggior parte dei Gaussian ha raggiunto un'opacity nettamente più alta (> 0.001), per cui il T14 pruneOpacityThreshold standard sarebbe troppo permissivo. Se T40 è attivo, questo campo determina la propria soglia. Con 0.0 viene riutilizzato T14. Rilevante solo se T40 > 0.

T42midTrainingCompactificationIterations

DETTAGLI

Default: [] (= disattivato) Range: [Int], valori in (densifyUntilIteration, maxIterations)

TECNICO

Punti di iterazione espliciti durante la fase di perfezionamento, in cui viene eseguito un passaggio di Compactification (rimuove sigmoid(opacity) < 0.01 + Gaussian con scala anomala, la stessa logica di T56 postTrainingCompactification). Senso: fasi di perfezionamento lunghe possono mostrare un accumulo di coriandoli/floater, il cui SH poi si adatta eccessivamente ad artefatti specifici della view. Configurazione tipica se attivato: [10000, 20000, 30000] per 40K Classic. MA: marcatori di pulizia scelti liberamente peggiorano sistematicamente il risultato finale — il numero di Gaussian diminuisce sì in modo netto, ma l'errore d'immagine aumenta più fortemente. Come elenco di iterazioni liberamente scelto il campo resta perciò vuoto in tutti i preset. L'effetto stesso lo ottieni nell' interfaccia tramite l'interruttore Floater Cleanup nella sezione Inspector „Training": nelle esecuzioni classiche da 30 000 iterazioni in su, applica due passaggi di pulizia nel bel mezzo del training. Marcatori personalizzati possono essere impostati solo tramite un file di preset modificato.

T43frustumCullEnabled

DETTAGLI

Default: false Range: boolean

TECNICO

Dopo il training vengono rimossi tutti i Gaussian che si trovano al di fuori dell'unione di tutti i frusta delle telecamere di training. Tali Gaussian non sono mai stati vincolati dal segnale di loss e sono sempre floater. Particolarmente efficace per scene in cui la Novel-View si trova dietro o accanto al percorso della telecamera (ad es. il lato posteriore di un volo di drone lineare) — i floater lì non diventano mai visibili nella fase di training, ma lo sono decisamente durante lo spostamento successivo nel visualizzatore 3D. Nei voli di drone questo riduce visibilmente i floater, quindi è disponibile come opt-in. Default false, perché nelle acquisizioni di oggetti con copertura orbitale completa l'unione dei frusta comprende l'intera scena e la funzione non rimuove nulla — viene offerto in Impostazioni sotto „Floater Reduction". Il preset Outdoor non lo attiva, perché il Sky-Dome lì risolve meglio lo stesso problema.

T44frustumCullExpansion

DETTAGLI

Default: 1.1 Range: 1.0 – 2.0

TECNICO

Margine NDC per T43 frustumCullEnabled. 1.0 taglierebbe esattamente al bordo dell'immagine, il che accorcerebbe troppo gli splat instabili al bordo dell'immagine. 1.1 = 10 % di padding oltre l'esatta inquadratura della telecamera — offre un po' di tolleranza per i pixel di bordo che in una Novel-View leggermente spostata potrebbero comunque diventare visibili. Valori > 1.2 rendono il cull praticamente inefficace, perché il frustum esteso comprende molto più spazio.

Sky-Dome (T45–T48)

T45skyDomeEnabled

DETTAGLI

Default: false (Initializer + tutti i preset tranne P9 Outdoor) Range: boolean

TECNICO

Prima dell'inizio del training viene generata una nuvola di punti a forma sferica (Fibonacci-sphere con T46 sample-points), posizionata a un raggio di T47 skyDomeRadiusMultiplier × scene_extent attorno al centro della scena e inizializzata con i colori dei pixel mascherati come cielo di tutte le telecamere di training (vedi T20 skyMaskingEnabled). Questi Sky-Dome-Gaussian vengono inseriti all'inizio del Gaussian-Buffer e durante il training vengono "congelati" (i gradienti di posizione/scala/rotazione = 0, solo SH e Opacity restano ottimizzabili). Effetto: invece di zone nere a "coriandoli" in lontananza, l'utente vede nelle Novel-View un cielo vero. Su scene da drone e paesaggi funziona molto bene; nel preset Outdoor (P9) è attivo di default. Nelle scene di interni va lasciato spento — la sfera resterebbe appesa senza senso fuori dalla stanza.

T46skyDomeSampleCount

DETTAGLI

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

TECNICO

Numero di punti campione Fibonacci-Sphere sulla Sky-Dome-Sphere. Valori più alti → sky-dome più denso (meglio con grandi risoluzioni e molto cielo visibile), ma maggior fabbisogno di memoria. 5 000 è il punto ottimale per render a 4K; con risoluzioni più basse bastano 2 000–3 000. I punti vengono inizializzati in base alla distanza coseno rispetto a ogni vettore di vista delle telecamere di training con i corrispondenti pixel mascherati come cielo — i sample-point il cui view-cone non è visto da nessuna camera restano con un valore di opacità iniziale basso, ma non vengono modificati durante il training (congelati).

T47skyDomeRadiusMultiplier

DETTAGLI

Default: 30.0 (Initializer + maggior parte dei preset), 59.0 (P9 Outdoor) Range: 5.0 – 200.0

TECNICO

Raggio della Sky-Dome-Sphere relativo all'estensione della scena (= distanza media tra le posizioni delle telecamere). 30 = la sfera ha un diametro 30 volte quello della nuvola di telecamere. Troppo piccolo (< 5) → lo sky-dome interferisce con la scena stessa (ad es. uno splat dello sky-dome finisce in primo piano); troppo grande (> 100) → perdita di precisione float32 nelle posizioni dello sky-dome, il che causa glitch di rendering in lontananza. Per scene esterne ampie 59.0 è il valore adatto — il valore standard di 30.0 è troppo piccolo per paesaggi profondi, e allora i pixel dello sky-dome renderizzano visibilmente ai bordi dell'immagine come una "parete".

T48frozenGaussianCount

DETTAGLI

Default: 0 (= nessun Gaussian congelato) Range: 0 oppure 1 – T46

TECNICO

Numero di Gaussian all'inizio del buffer i cui gradienti di posizione/scala/rotazione nell'optimizer vengono azzerati — restano spazialmente rigidi per l'intero training. Il Density-Control non può clonarli, dividerli o eliminarli (prune). Usato per l'iniezione dello sky-dome (vedi T45): quando lo sky-dome è attivo, questo campo viene impostato automaticamente su T46 skyDomeSampleCount. È possibile impostarlo manualmente (ad es. per congelare una nuvola di punti pre-posizionata da una scansione LiDAR), ma non è direttamente accessibile dall'interfaccia. Importante: i primi N Gaussian nel buffer sono sempre quelli congelati — è l'ordine nel buffer a decidere, non un indice esplicito.

Adam + LR-Schedule (T49–T55)

T49adamResetIteration

DETTAGLI

Default: 0 (= disattivato) Range: 0 oppure 100 –

TECNICO

Iterazione alla quale gli accumulatori di momentum dell'ottimizzatore Adam (m1, m2) vengono azzerati. La correzione del bias in seguito viene calcolata con (iter - adamResetIteration) invece che con iter. Un reset dopo la fine della Densification peggiora nettamente il risultato. Motivo: il momentum di Adam, accumulato durante la Densification, contiene informazioni sulle magnitudini tipiche dei gradienti e accelera la fase di Refinement. Scartarlo costa alle prime ~500 iterazioni di Refinement una perdita di convergenza. Per questo motivo è impostato a 0 in tutti i Preset e non è modificabile nell'interfaccia.

T50positionLRScheduleEndIteration

DETTAGLI

Default: 0 (Initializer = "usa maxIterations"), 20 000 (.full — Cosine termina a 20K nonostante maxIter=35K), 30 000 (.fullClassicPaper) Range: 0 oppure 1 000 –

TECNICO

Iterazione alla quale la curva di Cosine-Annealing per il LR di posizione raggiunge il proprio minimo. Se 0, è identica a T1 maxIterations. Se > 0, la schedule prosegue fino a questo valore e rimane in seguito costante a T4 positionLearningRateFinal. Ciò consente una "extended refinement phase" con learning rate minimo ma costante — affina le posizioni lentamente senza un nuovo decay. .full fa proprio questo (fine della schedule a 20K, il training prosegue fino a 35K); nell'intorno — da 15K a 25K — cambia poco, 20K è il miglior compromesso. Viene utilizzato insieme a T51 per modificare anche gli LR diversi dalla posizione nella extended phase.

T51extendedPhaseLRDecay

DETTAGLI

Default: 0.0 (= disattivato, LR costanti) Range: 0 oppure 0.01 – 1.0

TECNICO

Moltiplicatore minimo per gli LR diversi dalla posizione (scala, rotazione, opacità, SH) nella "extended phase" — cioè: dopo il raggiungimento di T50 con l'LR di posizione già a T4. Se 0.1, scala/rotazione/opacità/SH vengono a loro volta sottoposti a cosine-decay da 1.0 (= il loro LR standard) a 0.1× del loro standard. Se 0.0 (Default), rimangono costanti. Un decay completo fino a zero produce lo stesso risultato di nessun decay — il comportamento appare più pulito con il decay, ma non è misurabilmente migliore. Per questo motivo è impostato a 0 in tutti i Preset e non è modificabile nell'interfaccia.

T52adaptiveDensifyThreshold

DETTAGLI

Default: false Range: boolean

TECNICO

Sperimentale: se true, l'app calcola in ogni passo di Densification il p98 della distribuzione attuale dei gradienti e lo usa come soglia dinamica (limitata ad almeno 0.5× del valore configurato in T11, per evitare valori troppo estremi). Ipotesi: l'adattamento automatico alla fase attuale della scena renderebbe il controllo della densità più robusto — ad es. pruning più severo all'inizio, più permissivo dopo, o viceversa. In pratica il numero di Gaussians crolla drasticamente — Mass-Pruning, perché il p98 nelle prime iterazioni è estremamente alto e in seguito quasi nulla supera più la soglia. La soglia fissa è già ben calibrata, l'adattamento dinamico nuoce più di quanto giovi. T77 offre una logica adattiva alternativa tramite rolling median, che evita il problema.

T53mergeAfterDensification

DETTAGLI

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

TECNICO

Alla fine della fase di Densification (iterazione T2) viene eseguito un passo di merge una tantum, che unisce Gaussians vicini tra loro con scala e colore simili. Riduce il numero di Gaussians tipicamente del 5–15 % senza perdita di qualità visibile. Motivo: dopo una clonazione intensiva si formano cluster di Gaussians praticamente identici, che non apportano nulla di nuovo — il merging libera capacità dell'ottimizzatore per altre aree. Standard nei Preset Classic-Quality. Non usato in MCMC, perché MCMC, grazie alla sua logica di Relocation, evita fin dall'inizio la formazione di tali cluster.

T54densifyPhase2FromIteration

DETTAGLI

Default: 0 (= disattivato) Range: 0 oppure T2T1

TECNICO

Sperimentale: consente una seconda fase di Densification, che inizia dopo la pausa di Refinement a questa iterazione e prosegue fino a T55. Ipotesi: dopo una fase di Refinement gli accumulatori dei gradienti hanno magnitudini più stabili e possono indicare con maggiore precisione quali aree necessitano ancora di Gaussians aggiuntivi. In pratica la seconda fase di Densification termina in una cascata fino a zero Gaussians — insieme al pruning di Refinement (T40) svuota completamente il buffer. Per questo è impostato a 0 in tutti i Preset e non è modificabile nell'interfaccia.

T55densifyPhase2UntilIteration

DETTAGLI

Default: 0 Range: 0 oppure T54T1 Defined in:

TECNICO

Fine della seconda fase di Densification. Rilevante solo se T54 > 0. Entrambi i campi insieme sono disattivati.

Post-elaborazione + Apple AI (T56–T60)

T56postTrainingCompactification

DETTAGLI

Default: true (in tutti i Preset di produzione), false (.quickTest, .preview) Range: boolean

TECNICO

Al termine del training vengono rimossi definitivamente i Gaussians con sigmoid(opacity) < 0.01 (che praticamente non contribuiscono più all'immagine). Riduce il numero di Gaussians tipicamente del 58 % e la dimensione del file di esportazione del 55 % senza perdita di qualità visibile. Attivo per default nei Preset di produzione — il risultato finale deve poter essere consegnato il più compatto possibile. Disattivato in .quickTest, perché un run diagnostico comunque non viene esportato. A differenza di T42 midTrainingCompactificationIterations, la compactification avviene solo alla fine — fino a quel momento il refinement può utilizzare tutti i Gaussians.

T57metalFXUpscaling

DETTAGLI

Default: false Range: boolean

TECNICO

⚠ Dismesso dal 2026-07-18 e senza alcun effetto. Il campo apparteneva al selettore „Viewport Scaling" (Off/MetalFX/Lanczos) nell'Inspector. Il renderer non lo ha mai letto: la decisione di blit è puramente geometrica (se renderizzato in supersampling ⇒ downsample MPS-Lanczos per l'antialiasing, altrimenti bilineare), e per il percorso MetalFX non esisteva alcun punto di chiamata. Il selettore e i due messaggi errati che alimentava sono stati rimossi; la didascalia dell'overlay ora si chiama „Sampling", non „Scaling", e da nessuna parte nell'app avviene un upscaling tramite MetalFX. Il campo stesso rimane, perché la configurazione di training viene salvata integralmente — è presente in ogni scena salvata, in ogni Preset e nel commento di impostazioni dei PLY già esportati; una sua rimozione farebbe cadere silenziosamente la chiave durante una nuova scrittura, rompendo questo scambio. Per lo stesso motivo il campo è escluso dal confronto „Modified": una scena vecchia può avere true, e non c'è più modo di reimpostarlo tramite l'interfaccia. Nessuno lo legge — non ricollegarlo.

T58mpsLanczosScaling

DETTAGLI

Default: false Range: boolean

TECNICO

⚠ Dismesso dal 2026-07-18 e senza alcun effetto — vedi T57 metalFXUpscaling, dove è spiegato anche perché il campo debba comunque continuare a essere salvato. Va esplicitamente segnalato un equivoco plausibile: l'app utilizza effettivamente MPS-Lanczos nel viewport, ma questo è controllato esclusivamente dalla geometria — un'immagine renderizzata in supersampling viene ridimensionata verso il basso per l'antialiasing. Si tratta di un downscaling, non di un upscaling, e questo campo non lo ha mai attivato.

T59livePreviewInterval

DETTAGLI

Default: 50 (Initializer; i Preset non impostano questo campo) Range: 0 (off), 50, 250 oppure 1 000 nel selettore delle impostazioni

TECNICO

Con quale frequenza, durante il training, il visualizzatore 3D viene aggiornato con i Gaussians attuali. 50 = un nuovo render ogni 50 iterazioni — sufficiente per osservare l'avanzamento senza rallentare sensibilmente il training. 0 = il visualizzatore non viene aggiornato affatto (training in background, massima velocità). Nei run MCMC lunghi conviene impostare 250 o 1 000, perché l'overhead di aggiornamento si accumula in modo significativo. Ruolo particolare: il campo appartiene alla configurazione di training, ma è un'impostazione a livello di app (Impostazioni → Training) e non fa parte della ricetta di training. Per questo è escluso dal confronto „Modified", viene mantenuto al cambio di Preset e dal 2026-07-18 non viene più ripreso dal file all'apertura di una scena — prima una scena caricata sostituiva silenziosamente il frame rate dell'utente con quello dell'autore della scena, „Off" incluso, e non esisteva un secondo punto da cui recuperarlo.

T60perceptualLossWeight

DETTAGLI

Default: 0.0 (= disattivato) Range: 0 oppure 0.001 – 0.5

TECNICO

Peso di un termine di loss percettivo (Multi-Scale-Blur-Feature-Matching). Rileva la somiglianza strutturale e testurale a un livello più alto rispetto a L1+SSIM — tipicamente utile dove „pixel-perfect" è meno importante di „ha un aspetto realistico". Il valore è 0.0 (off) in tutti i Preset. Nell'interfaccia lo imposti tramite il cursore Perceptual Loss nella sezione Inspector „Training", intervallo da 0 a 0,20 in passi di 0,01; a 0 l'app mostra „Off".

Densificazione MCMC (T61–T73)

T61densificationStrategy

DETTAGLI

Default: .classic (Initializer + Classic-Presets), .mcmc (tutti i preset MCMC + Scene-Class) Range: .classic oppure .mcmc

TECNICO

Sceglie tra la Densificazione Classica (Clone/Split/Prune, Kerbl et al.~2023) e la Densificazione MCMC (Stochastic Gradient Langevin Dynamics con Relocation, Kheradmand et al.~NeurIPS 2024). Con .classic vengono valutati T11–T16, con .mcmc i T62–T73. Attenzione al cambio: i default Classic e i default MCMC sono calibrati in modo completamente diverso — chi cambia il picker nell'Expert View senza caricare un preset adatto rischia un'estinzione di massa in stile bug 1.4.3 (460 K → 5 in un'iterazione, perché MCMC-OpacityReg a 0.01 uccide le opacità Classic). Per questo i default MCMC-Init sono volutamente "ammorbiditi" (tutti i valori di Reg a 0.0).

T62mcmcMaxGaussians

DETTAGLI

Default: 150 000 (Initializer + .fullMCMC + .mcmcBalanced), 100 000 (.mcmcPreview), 1 500 000 (.fullMCMCMip — variante Mip-Splatting con budget 10×), 1.19 M (.renderPreset), 1.25 M (.outdoorPreset), 670 K (.indoorPreset) Range: 0 (= "usa la capacità del buffer") oppure 10 000 – 5 000 000 Defined in:

TECNICO

Limite massimo rigido per il numero di Gaussians con strategia MCMC. Il numero cresce gradualmente di T70 mcmcGrowthRate (tipicamente 5 %) per ogni step di relocation fino a questo cap. 150 K è un buon valore di partenza — nettamente sopra la qualità degli splat si diluisce (troppi piccoli Gaussians ridondanti), nettamente sotto la scena rimane sotto-densificata. Per scene molto grandi (es. volo con drone da 1 545 foto con 158 K SfM-init) 150 K è troppo basso — da qui l'estensione 1.4.5 T72 mcmcCapMultiplier + T73 mcmcAutoScaleByScene. I preset Scene-Class usano valori specifici della scena tra 670 K (Indoor) e 1.25 M (Outdoor). Con valore 0 il motore usa la piena capacità del buffer come cap.

T63mcmcNoiseScale

DETTAGLI

Default: 0.00005 (5e-5 = default del paper) Range: 1e-6 – 1e-3

TECNICO

Moltiplicatore per il rumore gaussiano che viene aggiunto a ogni iterazione MCMC alla posizione di ogni Gaussian (logica SGLD). Più alto = più esplorazione (i Gaussians si spostano di più, potenzialmente trovando posizioni migliori), più basso = più sfruttamento (i Gaussians rimangono dove sono già buoni). 5e-5 è il valore giusto — nettamente più piccolo significa troppo poca esplorazione, nettamente più grande (1e-4) troppa, e allora gli splat si disgregano. Viene sottoposto a cosine-decay durante il tempo di training fino a T69 mcmcNoiseDecayEnd — alla fine dell'intervallo di decay il rumore è effettivamente 0 e i Gaussians convergono.

T64mcmcOpacityRegWeight

DETTAGLI

Default: 0.0 (= disattivato nei default RadianceKit, Paper: 0.01) Range: 0 oppure 0.001 – 0.05

TECNICO

Penalità L1 specifica di MCMC sull'opacità. Default del paper 0.01 (spinge verso zero i Gaussians inutilizzati, rendendoli disponibili per la relocation). In RadianceKit il risultato senza questa regolarizzazione è misurabilmente migliore. Motivo: il criterio di pruning definito con T68 mcmcDeadOpacityThreshold basta da solo — una penalità L1 aggiuntiva costringerebbe a morire anche Gaussians preziosi con opacità bassa. Da qui il default 0. Attenzione: nella build beta 1.4.3 il default dell'Initializer era erroneamente 0.01, il che ha causato il bug di estinzione di massa (vedi spiegazione T61); fissato a 0.0 dalla 1.4.4.

T65mcmcScaleRegWeight

DETTAGLI

Default: 0.0 (= disattivato, Paper: 0.01) Range: 0 oppure 0.001 – 0.05

TECNICO

Penalità L1 specifica di MCMC sugli autovalori di scala. Default del paper 0.01. Anche qui il risultato senza regolarizzazione è migliore, per lo stesso motivo di T64. Disabilitata in tutti i preset RadianceKit-MCMC. Attenzione come per T64: bug 1.4.3.

T66mcmcRelocationInterval

DETTAGLI

Default: 100 (Initializer + tutti i preset MCMC, standard del paper), 155 (P9 Outdoor) Range: 50 – 500

TECNICO

Intervallo di iterazioni in cui MCMC riloca i Gaussians morti (sigmoid(opacity) < T68 mcmcDeadOpacityThreshold) a nuove posizioni. Intervalli più brevi (circa 50) agiscono in modo troppo dirompente, la loss oscilla; intervalli decisamente più lunghi (circa 200) tolgono a MCMC la reattività. 100 è il valore giusto. Per scene esterne è leggermente più alto (155) — gli intervalli più lunghi danno ad Adam più tempo per integrare i Gaussians appena posizionati, prima che il prossimo evento di reloc li metta sotto pressione.

T67mcmcWarmupIterations

DETTAGLI

Default: 500 Range: 100 – 5 000

TECNICO

Numero di iterazioni iniziali in cui non avviene ancora alcuna relocation MCMC. Solo dopo questo warmup inizia la logica di reloc. Motivo: nelle prime iterazioni i valori di opacità non si sono ancora stabilizzati — iniziando subito con reloc, i Gaussians verrebbero posizionati nei posti sbagliati e dovrebbero essere subito spostati di nuovo, distruggendo il momentum di Adam. Default del paper 500. RadianceKit adotta questo valore perché si è dimostrato robusto.

T68mcmcDeadOpacityThreshold

DETTAGLI

Default: 0.005 (Initializer, standard del paper), 0.01 (.fullMCMC e tutti i preset MCMC) Range: 0.001 – 0.05

TECNICO

Soglia di sigmoid(Opacity) sotto la quale una Gaussian è considerata "morta" ed entra in gioco per la relocation. 0.01 è il valore giusto — 0.005 cambia poco, 0.02 è peggiore. Più alto = reloc più aggressiva (vengono spostati più Gaussians), più basso = più prudente. 0.01 corrisponde circa a "0.5 % di visibilità visiva". P10 Indoor usa 0.0142.

T69mcmcNoiseDecayEnd

DETTAGLI

Default: 0 (Initializer = "nessun decay"), 160 000 (.fullMCMC = 80 % di 200K), 96 000 (.mcmcBalanced = 80 % di 120K), 40 000 (.mcmcPreview) Range: 0 oppure 1 000 –

TECNICO

Iterazione in cui il rumore T63 mcmcNoiseScale viene attenuato completamente a zero (cosine-decay da iter 0 fino a qui). 80 % delle maxIterations è il valore adatto — questo dà a MCMC tempo sufficiente per l'esplorazione, ma lascia l'ultimo 20 % alla convergenza senza rumore. 0 = rumore costante su tutte le iterazioni (raramente sensato, MCMC allora non può convergere).

T70mcmcGrowthRate

DETTAGLI

Default: 0.05 (standard del paper = 5 %) Range: 0.01 – 0.2

TECNICO

Tasso di crescita del target di popolazione MCMC per step di relocation. La logica: a ogni evento di reloc la dimensione target della popolazione viene aumentata di (1 + growthRate), fino a raggiungere T62 mcmcMaxGaussians (o la variante scalata tramite T72/T73). 0.05 è il valore giusto — valori più alti portano a una crescita troppo rapida (i Gaussians vengono inseriti prima che il momentum di Adam possa integrarli), valori più bassi a scene sotto-densificate alla fine.

T71mcmcSigmoidK

DETTAGLI

Default: 100.0 Range: 10.0 – 500.0 Defined in:

TECNICO

Parametro di nitidezza sigmoide per l'attenuazione del rumore MCMC. Nello step SGLD il rumore per Gaussian viene attenuato — i Gaussians ad alta opacità (il cui logit è positivo) ricevono esponenzialmente meno rumore rispetto a quelli a bassa opacità. K = 100 è nitido, cioè la transizione da "rumore pieno" a "nessun rumore" avviene molto rapidamente attorno a opacità 0.5. K = 100 è il valore adatto — valori più piccoli (10–50) fanno tremolare anche i Gaussians ad alta opacità (distrugge i Gaussians convergiti), valori più grandi (> 500) rendono la transizione artificialmente dura e i Gaussians morti non vengono più spostati affatto.

T72mcmcCapMultiplier

DETTAGLI

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 (= disattivato) oppure 1.0 – 10.0

TECNICO

Funzione 1.4.5: scalatura del cap adattiva alla scena. Se T73 mcmcAutoScaleByScene è true, il cap effettivo viene calcolato come (limitato alla capacità del buffer). Contesto: per scene grandi (es. volo con drone da 1 545 foto → 158 K SfM-init) T62 = 150 000 è troppo basso — il controllo della densità non potrebbe affatto crescere. Con moltiplicatore 3.0 il cap in questo esempio viene scalato a 474 K (158 K × 3.0). I preset Scene-Class usano valori specifici della scena: Outdoor beneficia di un moltiplicatore alto (5.32 → ~830 K cap con 156 K punti iniziali), Indoor si accontenta di 1.76 (le pareti saturano più rapidamente). Per la risoluzione completa del cap vedi il metodo -.

T73mcmcAutoScaleByScene

DETTAGLI

Default: true (Initializer + tutti i preset MCMC) Range: boolean

TECNICO

Funzione 1.4.5: interruttore principale per la logica del cap consapevole della scena (vedi T72 +). Se false, viene usato esclusivamente T62 mcmcMaxGaussians come cap (torna al comportamento 1.4.4). Attivo di default, perché altrimenti i problemi di estinzione di massa per scene grandi della 1.4.3 ritornerebbero. Disattiva manualmente solo se vuoi impostare esplicitamente un cap rigido — ad esempio per addestrare una variante da 150 K la cui dimensione finale sia pianificabile.

Mip-Splatting (T74–T76)

Stato: Mip-Splatting non ha portato in pratica alcun miglioramento qualitativo e in alcune scene esterne ha addirittura peggiorato il risultato. I campi restano opt-in per esperimenti; in tutti i preset forniti Mip-Splatting è disattivato.

T74useMipSplatting

DETTAGLI

Default: false (tutti i preset di produzione), true (.fullMCMCMip — sibling di ricerca) Range: boolean

TECNICO

Attiva Mip-Splatting (Yu et al.~CVPR 2024): filtro di smoothing 3D + filtro 2D + compensazione α, che limita la frequenza per-Gaussian al limite di Nyquist della sampling rate della telecamera di training più densa. Obiettivo teorico: eliminazione dell'aliasing durante il rendering a scale off-training (0.5× o 2× della risoluzione di training). Attivato e funzionalmente corretto negli shader di preprocess e backward-projection. In pratica, però, il miglioramento qualitativo sperato non si è verificato: rendendo alla risoluzione di training praticamente non cambia nulla, e nelle scene esterne l'immagine peggiora addirittura. Una possibile spiegazione: lo smoothing 3D lavora contro la MCMC-relocation non appena entrano in gioco molte Gaussians. Il campo resta disponibile per propri esperimenti multi-scale.

T75mipSmoothing3DScale

DETTAGLI

Default: 0.2 (default del paper) Range: 0.05 – 1.0

TECNICO

Parametro di scala per lo smoothing 3D (Yu et al.~§3.3, default del paper 0.2). Più grande = più smoothing nello spazio del mondo per Gaussian (= più anti-aliasing, ma anche più blur alla scala di default), più piccolo = più nitido ma più soggetto ad aliasing. Viene consultato solo se T74 useMipSplatting = true. Non ulteriormente ottimizzato — già con il default del paper 0.2, Mip-Splatting non porta alcun beneficio.

T76mipFilter2DVariance

DETTAGLI

Default: 0.3 (= esattamente il comportamento precedente) Range: 0.1 – 1.0

TECNICO

Varianza del filtro Mip 2D, che viene aggiunta alla diagonale di Σ_2D (varianza diretta, non al quadrato). 0.3 è esattamente il valore che, prima di Mip-Splatting, era fisso nel kernel. Se T74 useMipSplatting = false, il kernel ignora completamente questo valore e scrive lo 0.3 hardcoded — così che il comportamento precedente non cambi garantitamente in nulla. Se invece è attivo, viene usato il valore impostato qui. Resta nel catalogo dei campi per gli sweep Mip.

Densificazione Adattiva (T77–T79)

T77adaptiveDensification

DETTAGLI

Default: false Range: boolean

TECNICO

Rolling-Median-Tracker come alternativa alla soglia fissa T11 densifyGradThreshold. Se true, in ogni Densify-Step la soglia attuale viene sovrascritta con median(letzte N avgGrad-Samples) × T79 adaptiveDensifyMultiplier (mediana degli ultimi N campioni avgGrad moltiplicata per T79 adaptiveDensifyMultiplier). N = T78 adaptiveWindow. Più rigoroso della variante p98 di T52, che lì innesca il mass-pruning: la mediana per 2, a regime, si colloca circa al p70–p80 della distribuzione dei gradienti. Attivato da solo il campo non porta alcun guadagno qualitativo; insieme al curriculum (vedi T80/T81) invece sì — lì è il curriculum a portare il guadagno, questo campo contribuisce piuttosto alla stabilità. Non esiste un controllo dedicato per questo: il campo è disattivato in tutti i preset e può essere impostato solo modificando un file di preset.

T78adaptiveWindow

DETTAGLI

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

TECNICO

Rolling-Median-Window in eventi di densificazione (NON iterazioni — ogni step T13 densifyInterval fornisce un campione). Default 1 000 — il che significa che contribuiscono alla mediana le ultime 100 000 iterazioni di training, quindi tipicamente l'intera storia di training fino a quel punto. Fase iniziale (prima di T78 campioni): il tracker restituisce nil → fallback sulla soglia fissa T11. Rilevante solo se.

T79adaptiveDensifyMultiplier

DETTAGLI

Default: 2.0 Range: 1.0 – 4.0

TECNICO

Moltiplicatore applicato alla mediana mobile per la soglia adattiva. Il default 2.0 corrisponde circa al p70–p80 della distribuzione tipica dei gradienti. Più basso = crescita più aggressiva (più cloni), più alto = più severo (meno cloni). Nell'intervallo 1.5–3.0, 2.0 è il valore migliore. Rilevante solo se.

Curriculum (T80–T81)

T80curriculumResolutionRamp

DETTAGLI

Predefinito: false Intervallo: booleano

TECNICO

La risoluzione di training parte da 0.5× e passa, a T50 positionLRScheduleEndIteration / 2 (oppure T1 maxIterations / 2, se T50 non è impostato), a T22 trainingRenderScale. Sovrascrive T23 resolutionWarmupScale, se attivato. Delle due aggiunte adattive (vedi T77), questo curriculum è quello che porta il vero guadagno di qualità — l'aumento graduale della risoluzione dà all'app il tempo di trovare la geometria grossolana alla risoluzione più bassa, prima di passare al lavoro di dettaglio fine. Non regolabile nell'interfaccia — solo tramite un file Preset modificato, e in tal caso è sensato attivarlo insieme a T81.

T81curriculumSHProgression

DETTAGLI

Predefinito: false Intervallo: booleano

TECNICO

Sovrascrive T21 shDegreeUpgradeIterations con [maxIter/4, maxIter/2, maxIter*3/4], distribuendo quindi gli avanzamenti SH uniformemente sul tempo di training invece di concentrarli all'inizio. Ipotesi: si stabilisce una geometria stabile prima dell'esplosione dei dettagli di colore, il che posiziona in modo più preciso gli effetti di lucentezza dipendenti dalla direzione di vista. Insieme a T77, ciò porta un guadagno in alcune scene; il guadagno è portato da questo campo, T77 da solo non basta. Non regolabile nell'interfaccia — solo tramite un file Preset modificato.

Preset statici (TP1–TP9)

Qui trovi solo le differenze strutturali rispetto al default dell'Initializer. La descrizione marketing completa degli undici preset UI P1–P11 la trovi nel capitolo 7.

TP1.preview

DETTAGLI

Preset diagnostico/di anteprima per sistemi ≥ 10 GB RAM. Override rispetto all'Initializer:

  • maxIterations 30 000 → 5 000
  • densifyUntilIteration 15 000 → 3 500 (70 % di maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× più alto, decay meno aggressivo)
  • shDCLearningRate, shRestLearningRate, opacityLearningRate, scaleLearningRate, rotationLearningRate ciascuno 2×
  • opacityResetInterval 3 000 → 100 000 (effettivamente disattivato — il reset distruggerebbe training così brevi)
  • shDegreeUpgradeIterations [1K, 2K, 3K][1K, 2K] (il degree 3 non converge in run così brevi)
  • trainingRenderScale 1.0 → 0.5

TP2.full

DETTAGLI

Classic da produzione, massima qualità. Override:

  • maxIterations 30 000 → 35 000 (oltre questo valore rischi overtraining: più Gaussians senza guadagno di qualità)
  • densifyUntilIteration 15 000 → 5 000 (valore collaudato; fermarsi più tardi peggiora il risultato)
  • Tutti gli LR 2×
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× più alto del default del paper)
  • densifyGradThreshold 2e-6 → 1.1e-6 (calibrato per risoluzione 1.0×)
  • densifyInterval 100 → 200
  • pruneOpacityThreshold 0.005 → 0.001
  • opacityResetInterval 3 000 → 100 000 (effettivamente disattivato)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K] (avanzamento ritardato)
  • opacityDecayFactor 0.0 → 0.9995 (schema HTGS, netto guadagno di qualità)
  • opacityDecayInterval 50 (invariato)
  • mergeAfterDensification false → true
  • positionLRScheduleEndIteration 0 → 20 000
  • postTrainingCompactification true (già default dell'Initializer per .full)

TP3.fullClassicPaper

DETTAGLI

Variante Classic fedele al paper di TP2. Override rispetto a TP2:

  • maxIterations 35 000 → 30 000 (standard del paper)
  • densifyUntilIteration 5 000 → 15 000 (paper: 50 % di maxIter)
  • positionLearningRateFinal 1.6e-5 → 1.6e-6 (default del paper)
  • opacityLearningRate, scaleLearningRate, rotationLearningRate tornano ai default del paper (0.05, 0.005, 0.001)
  • densifyGradThreshold 1.1e-6 → 2e-7 (calibrato per ~1–2 M Gs su Bicycle)
  • densifyInterval 200 → 100 (paper)
  • pruneOpacityThreshold 0.001 → 0.005 (default del paper)
  • opacityResetInterval 100 000 → 3 000 (paper §5.2, rischioso — nel setup di RadianceKit costa qualità)
  • opacityDecayFactor 0.9995 → 0.0 (il paper non prevede decay)
  • positionLRScheduleEndIteration 20 000 → 30 000 (il cosine copre il 100 % di maxIter)

TP4.fullMCMC

DETTAGLI

MCMC da produzione, massima qualità. Override rispetto all'Initializer:

  • maxIterations 30 000 → 200 000 (MCMC richiede circa 5× più iterazioni di Classic)
  • densifyUntilIteration 15 000 → 160 000 (80 % di maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5
  • Schedule degli LR come TP2 (tutti 2×)
  • ssimWeight 0.2 → 0.05 (MCMC richiede un segnale L1 più forte)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K]
  • densificationStrategy .classic.mcmc
  • mcmcMaxGaussians 150 000 (già nell'Initializer, confermato nel preset)
  • mcmcNoiseScale 5e-5 (valore del paper, collaudato)
  • mcmcDeadOpacityThreshold 0.005 → 0.01
  • mcmcNoiseDecayEnd 0 → 160 000 (80 % di maxIter)
  • mcmcCapMultiplier 3.0 (già nell'Initializer)
  • mcmcAutoScaleByScene true (già nell'Initializer)
  • opacityResetInterval 3 000 → 200 000 (effettivamente disattivato, MCMC usa Reloc invece del reset)

TP5.fullMCMCMip

DETTAGLI

Variante Mip-Splatting di TP4 con il budget di Gaussians del paper originale. Override rispetto a TP4:

  • mcmcMaxGaussians 150 000 → 1 500 000 (10×, ordine di grandezza del paper)
  • useMipSplatting false → true (Mip attivo)

TP6.classicBalanced

DETTAGLI

Classic di fascia media. Override rispetto a TP2:

  • maxIterations 35 000 → 20 000 (offre praticamente lo stesso risultato di 30 000, con un'attesa notevolmente più breve)
  • positionLRScheduleEndIteration 20 000 → 0 (il cosine copre maxIter = 20K, nessuna fase prolungata)

TP7.mcmcPreview

DETTAGLI

Diagnostica MCMC. Override rispetto a 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 (la preview scala in modo più cauto)

TP8.mcmcBalanced

DETTAGLI

MCMC di fascia media. Override rispetto a TP4:

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

TP9.quickTest

DETTAGLI

Puro test funzionale. Override rispetto all'Initializer:

  • maxIterations 30 000 → 1 000
  • densifyUntilIteration 15 000 → 500
  • densifyGradThreshold 2e-6 → 4e-6 (calibrato per risoluzione 0.25×)
  • densifyInterval 100 → 50
  • opacityResetInterval 3 000 → 100 000 (disattivato, perché troppo breve)
  • trainingRenderScale 1.0 → 0.25

Come l'app determina il limite massimo di Gaussians

La risposta definitiva alla domanda "fino a quante Gaussians può far crescere MCMC al massimo?". Tre grandezze entrano in gioco: il valore impostato in T62 mcmcMaxGaussians, il numero di punti di inizializzazione SfM della tua scena e la capacità di buffer riservata in anticipo. L'app calcola in questo ordine:

+ Il valore di partenza è T62. Se è impostato a 0, l'app applica 150 000 — questa soglia di sicurezza previene l'incidente da estinzione di massa descritto in 1.4.3. + Se T73 mcmcAutoScaleByScene è attivo e T72 mcmcCapMultiplier è maggiore di 0, l'app confronta il valore di partenza con "punti di init × T72" e prende il maggiore dei due valori. + Infine limita il risultato alla capacità del buffer.

Esempio: Bicycle (Mip-NeRF 360, 194 fotogrammi) → SfM-init ~156 K punti, T62 = 150 000, T72 = 5.32, auto-scale attivo, capacità buffer 8 M. 156 K × 5,32 dà 830 K, che è più di 150 000 e meno di 8 M — il limite effettivo è quindi 830 K. La MCMC-Relocation rispetta questo limite.

Calcola il numero massimo effettivo di splat in caso di MCMC. L'app prende la tua impostazione "Max Gaussians", osserva quanti punti ha inizialmente la tua scena e applica il moltiplicatore se "Auto-scale by scene" è attivo. Così il limite si adatta alla scena, invece di imporre lo stesso valore per una scena piccola e per una enorme. Non devi fare nulla — l'app calcola tutto questo da sola all'avvio del training.

Quale campo per cosa? (Cheat-Sheet)

ObiettivoCampi da regolare
Più dettaglio in lontananzaT62 mcmcMaxGaussians alto, T72 mcmcCapMultiplier 5+
Più dettaglio in generale (Classic)T1 maxIterations alto (≤ 40K), T2 densifyUntilIteration ≤ 14 % di T1
Ridurre i floater nei voli con droneT43 frustumCullEnabled attivo, T20 skyMaskingEnabled attivo, T45 skyDomeEnabled attivo
Cielo più bello nelle scene esterneT45 skyDomeEnabled attivo, T47 skyDomeRadiusMultiplier 30–60
File di esportazione più piccoloStrategia .mcmc (T61), T56 postTrainingCompactification attivo, T62 mcmcMaxGaussians ≤ 200K
Training più veloceT22 trainingRenderScale 0.5, T1 maxIterations dimezzare — ma non entrambi!
Riflessi miglioriT21 shDegreeUpgradeIterations con [2K, 5K, 8K] (nessun caricamento anticipato), MCMC + 200K iter
Anteprima live più frequenteT59 livePreviewInterval a 50 — il valore più denso offerto da Impostazioni → Training
Transizioni più morbide alle ombreT17 ssimWeight leggermente alto (0.15–0.25), ma non oltre 0.3
Mantenere compatti gli ambienti interniPreset P10 Indoor (, T72 = 1.76)

Campi pericolosi

Questi campi possono, in caso di configurazione errata, causare OOM, crash dell'app, un'estinzione di massa dei Gaussians o dati di benchmark inutilizzabili. Da trattare con cautela:

  • T11 densifyGradThreshold — un dimezzamento può generare 2–4× più Gaussians, il che può facilmente saturare la memoria GPU. Da tenere presente anche: deve corrispondere a T22 trainingRenderScale (1.0× → 1e-6, 0.5× → 2e-6, 0.25× → 4e-6).
  • T72 mcmcCapMultiplier — in scene grandi con > 200 K punti init SfM e un moltiplicatore > 5 si genera un Resolved-Cap di milioni di Gaussians. Su Mac con 36 GB di RAM è possibile un OOM. Il valore per esterni 5.32 funziona solo perché la relativa scena di riferimento ha circa 156 K punti init → cap 830 K.
  • T39 testViewIndices — impostarlo manualmente in un file di preset può rendere inutilizzabile una misurazione della qualità (tutti gli indici > N → nessun holdout). Lascia la lista vuota.
  • T64 mcmcOpacityRegWeight e T65 mcmcScaleRegWeight — Nella 1.4.3-Beta impostati a 0.01, il che ha causato un'estinzione di massa (460 K → 5 Gaussians in un'iterazione). Dalla 1.4.4 fissati a 0.0, ma un aumento manuale può riprodurre il problema.
  • T15 opacityResetInterval — se non impostato a 100 000+ (di fatto disattivato) e il training dura meno di 10 000 iterazioni, il reset distrugge la convergenza. Per questo .preview lo ha impostato a 100 000 nonostante maxIterations = 5 000.
  • T54/T55 densifyPhase2* — La seconda fase di densificazione termina in una cascata fino a zero Gaussians. Lascia entrambi a 0.
  • T74 useMipSplatting — non porta alcun guadagno di qualità e in alcune scene esterne può addirittura peggiorare la qualità dell'immagine. Disattivato di default, opt-in solo per esperimenti.

Se un campo si trova in questa lista e vuoi modificarlo, fai prima un backup del tuo preset attuale (esportazione come JSON) e valuta se puoi misurare il risultato in modo riproducibile — altrimenti in seguito non saprai se hai ottenuto un miglioramento o un peggioramento.