Podręcznik

Rozdział 6 — Konfiguracja treningu

Podgląd presetu wyeksportowany jako JSON i wyświetlony w TextEdit — pola id/name/category/version/createdAt/description, trainingConfig ze wszystkimi istotnymi parametrami (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, sześć przełączników Bool)
Podgląd presetu wyeksportowany jako JSON i wyświetlony w TextEdit — pola id/name/category/version/createdAt/description, trainingConfig ze wszystkimi istotnymi parametrami (maxIterations 5000, densifyUntilIteration 3500, ssimWeight 0.20, renderScale 0.50, strategy classic, cameraAlignment applePhotogrammetry, densifyGradThreshold 2.0e-06, opacityResetInterval 3000, minOpacity 0.005, sześć przełączników Bool)

Typowy eksport presetu do JSON. Pola najwyższego poziomu: id (UUID), name, (classic | mcmc | sceneClass | custom), (wersja schematu), (znacznik czasu), (dowolny tekst). Zagnieżdżony -obiekt zawiera parametry krytyczne dla powtarzalności — podczas importu cały blok jest wczytywany do konfiguracji treningu, a wartości domyślne z wersji aplikacji wypełniają pola, których brakuje w JSON (np. po aktualizacji aplikacji). Kto przekazuje preset na inny Mac, po prostu wysyła ten plik JSON.

Konfiguracja treningu jest sercem każdego przebiegu treningu w RadianceKit. Gromadzi każdy parametr, który wpływa na trening — od maksymalnej liczby iteracji, przez osiem współczynników uczenia, aż po pola specjalne dla MCMC, Mip-Splatting, Curriculum i logiki scene-aware Cap. Edytujesz ją w panelu bocznym, w sekcji konfiguracji treningu (widok Expert View), zapisujesz jako Preset lub przekazujesz jako eksport JSON na inny Mac. Podczas treningu dokładnie ten obiekt zostaje zamrożony i przekazany do backendu GPU.

Ten rozdział jest materiałem referencyjnym dla zaawansowanych użytkowników. Zawiera listę 80 konfigurowalnych pól konfiguracji treningu, 9 dołączonych presetów oraz zależne od sceny rozwiązanie Gaussian-Cap. W razie wątpliwości obowiązuje wartość ustawiona przez wybrany Preset — widzisz ją w Inspectorze lub w eksporcie JSON presetu.

Spis treści:

+ Iteracja (T1–T2) + Współczynniki uczenia (T3–T10) + Densification — Classic (T11–T16) + Loss (T17–T20) + SH-Degree-Progression (T21) + Wydajność (T22–T24) + Diagnostyka i przygotowanie chmury punktów (T26–T30) + Regularyzacja (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) + Adaptacyjna Densification (T77–T79) + Curriculum (T80–T81) + Statyczne Presety (TP1–TP9) + Jak aplikacja określa Gaussian-Cap + Które pole do czego? (Cheat-Sheet) + Niebezpieczne pola

Iteracja (T1–T2)

T1maxIterations

SZCZEGÓŁY

Domyślnie: 30 000 (Initializer), 35 000 (.full), 200 000 (.fullMCMC) Zakres: 1 000 – 500 000 (suwak UI), brak twardej górnej granicy w logice

TECHNICZNIE

Całkowita liczba iteracji treningowych, przez które przechodzi backend. Iteracja oznacza jedno renderowanie w przód (forward) pojedynczej kamery treningowej, jeden przebieg wsteczny (backward) przez wszystkie składowe funkcji straty (L1 + SSIM + opcjonalne regularyzacje + maska nieba) oraz jeden krok optymalizatora Adam. Ta liczba wpływa bezpośrednio na inne harmonogramy: tempo uczenia pozycji podąża za krzywą cosine-annealing od 0 do wartości T1 samej lub do T50 positionLRScheduleEndIteration; densyfikacja zatrzymuje się przy T2 densifyUntilIteration; zanik szumu MCMC (noise decay) kończy się przy T69 mcmcNoiseDecayEnd; podniesienia stopnia SH następują w trzech punktach zdefiniowanych w T21. Przy klasycznej densyfikacji sprawdzony zakres to 20 000–35 000 iteracji, przy MCMC 60 000–200 000. Drastyczne zwiększenie ponad wartości zapisane w presetach rzadko przynosi dodatkową jakość — moment Adama się nasyca, a bez zakończenia zaniku tempa uczenia (LR-decay) strata stagnuje. Odwrotnie, zejście poniżej ~5 000 prowadzi do niecałkowicie zbieżnych geometrii (kontrola gęstości ma zbyt mało czasu na klonowanie/dzielenie).

T2densifyUntilIteration

SZCZEGÓŁY

Domyślnie: 15 000 (Initializer), 5 000 (.full), 160 000 (.fullMCMC) Zakres: 0 – T1 maxIterations

TECHNICZNIE

Iteracja, po której densyfikacja się zatrzymuje. Do tego momentu Gaussiany są klonowane, dzielone i przycinane (pruning) według reguł parametryzowanych w T11–T16 (Classic) lub T67–T70 (MCMC); potem liczba Gaussianów pozostaje stała i optymalizowane są już tylko pozycje, rotacje, skale, nieprzezroczystości i współczynniki SH (faza dopracowywania — refinement). W oryginalnej pracy 3DGS wartość ta wynosi 50% wartości T1, w presecie .full RadianceKit tylko ~14% (5 000 z 35 000): po około 5 000 iteracjach dalsza densyfikacja raczej pogarsza wynik — więcej „floaterów", większe zapotrzebowanie na pamięć, brak zysku jakościowego. MCMC natomiast pozwala relokacji trwać do 80% wartości T1, ponieważ MCMC nie produkuje szkodliwych floaterów. Zbyt małe T2 (< 1 000) skutkuje zbyt małą liczbą Gaussianów; zbyt duże przy Classic (> 50% T1) prowadzi do nadmiernego rozrostu (overgrowth) i wartości odstających w nasyceniu RGB (patrz ustalenia dot. przetrenowania scen plenerowych).

Learning Rates (T3–T10)

T3positionLearningRate

SZCZEGÓŁY

Domyślnie: 0.00016 Zakres: 1e-7 – 1e-3 (zalecane)

TECHNICZNIE

Współczynnik uczenia Adam dla pozycji XYZ każdej Gaussian na początku treningu (iteracja 0). Podąża za krzywą cosine-annealing i spada w trakcie treningu do T4 positionLearningRateFinal. Domyślna wartość 0.00016 pochodzi z oryginalnej pracy 3DGS (Kerbl et al.~2023) i w RadianceKit nie należy jej skalować nawet przy zwiększeniu rozdzielczości obrazu — pozycja porusza się w świecie-współrzędnych, nie w przestrzeni pikseli. Wyraźne zwiększenie (> 0.0005) powoduje, że Gaussians przeskakują na duże odległości i loss staje się niestabilny; wartości znacznie niższe (< 0.00005) prowadzą do tego, że błędnie zainicjowane chmury punktów nigdy nie znajdują swojego miejsca. Dla zdecydowanej większości scen wartość domyślna jest więc właściwym wyborem. Uwaga: przy .fullMCMC celowo pozostawiamy tę wartość na domyślnej — MCMC potrzebuje stałych współczynników uczenia dla swojej logiki relokacji, więc tuning tutaj nic nie daje.

T4positionLearningRateFinal

SZCZEGÓŁY

Domyślnie: 0.0000016 (Initializer + praca), 0.000016 (.full, .fullMCMC — 10× wyższe) Zakres: 0 – T3 positionLearningRate

TECHNICZNIE

Wartość końcowa krzywej cosine-annealing LR pozycji. Osiągana jest albo przy T1 maxIterations, albo, jeśli ustawiono, przy T50 positionLRScheduleEndIteration. Preset .full RadianceKit używa 0.000016 — czyli 10× wyższej niż domyślna wartość z pracy 0.0000016. Zarówno wyraźnie mniejsza wartość końcowa, jak i wyraźnie większa wartość początkowa pogarszają wynik zauważalnie. Wysoka wartość końcowa nie jest kompromisem, lecz świadomym wyborem: przy zbyt silnym decay Gaussians tracą podczas fazy refinement zdolność do dostosowywania się do nowo dodanych kandydatów densyfikacji. Fazę harmonogramu można skrócić (T50 < T1), tak że T4 zostaje osiągnięte jeszcze przed końcem treningu, a reszta treningu przebiega przy stałym mini-LR — typowa konfiguracja: T50 = 20 000, T1 = 35 000, refinement więc przy 0.000016 przez 15 000 iteracji.

T5shDCLearningRate

SZCZEGÓŁY

Domyślnie: 0.0025 (Initializer + praca), 0.005 (.full i wszystkie presety MCMC — 2×) Zakres: 0.0001 – 0.05

TECHNICZNIE

Współczynnik uczenia Adam dla części DC (degree 0, czyli stałego albedo) koloru sferycznych harmonicznych. SH-DC odpowiada niezależnemu od kierunku podstawowemu tonowi Gaussian, poniekąd „kolorowi bazowemu". RadianceKit podwaja domyślną wartość z pracy w presetach jakości — to przyspiesza konwergencję koloru, co jest konieczne, ponieważ przy krótkim treningu (< 5 000 iteracji) SH-DC inaczej nie osiągnąłby właściwej formy. W przeciwieństwie do geometrycznych LR, SH-DC nie ma decay; współczynnik uczenia pozostaje stały przez wszystkie iteracje (lub podąża jedynie za opcjonalnym decay fazy rozszerzonej z T51). Jeszcze wyraźnie wyższe wartości (ok. 0.01) ponownie pogarszają wynik i sprawiają, że kolory stają się niestabilne.

T6shRestLearningRate

SZCZEGÓŁY

Domyślnie: 0.000125 (Initializer + praca), 0.00025 (.full i MCMC — 2×) Zakres: 0.000001 – 0.005

TECHNICZNIE

Współczynnik uczenia Adam dla współczynników SH wyższego rzędu (Degree 1, 2, 3 — czyli zależnych od kierunku patrzenia składowych koloru, które odpowiadają za odblaski, odbicia i łagodne cieniowanie). 20× mniejszy niż T5 zgodnie z konwencją pracy, ponieważ liczba tych współczynników rośnie kwadratowo (3 dla Degree 1, 5 dla Degree 2, 7 dla Degree 3 → łącznie 15 wartości float na każdą Gaussian) i bez mniejszego współczynnika uczenia przesyciłyby obraz. Odblokowywane w dwóch krokach — do pierwszej progowej wartości w T21 shDegreeUpgradeIterations aktywny jest tylko Degree 0 (czyli tylko T5), potem 1, później 2, wreszcie 3. Niskie wartości są tu szczególnie ważne w scenach z dużą ilością rozproszonego oświetlenia; przy bardzo błyszczących powierzchniach (lakier samochodowy, woda) nie opłaca się przy tym kręcić — sama reprezentacja SH jest ograniczona.

T7opacityLearningRate

SZCZEGÓŁY

Domyślnie: 0.05 (Initializer + praca), 0.1 (.full, MCMC — 2×) Zakres: 0.001 – 1.0

TECHNICZNIE

Współczynnik uczenia Adam dla logitowej nieprzezroczystości każdej Gaussian. Aplikacja przechowuje nieprzezroczystość jako nieograniczoną wartość float i transformuje ją sigmoidem do [0, 1]; LR działa w przestrzeni logit. Presety jakości podwajają domyślną wartość z pracy do 0.1; to sprawia, że pruning jest bardziej efektywny — martwe Gaussians szybciej spadają poniżej T14 pruneOpacityThreshold. To, która wartość działa najlepiej, zależy przy tym od konfiguracji Adam; wzajemne oddziaływanie tych dwóch nie jest trywialne. Niskie wartości (< 0.01) prowadzą do tego, że „martwe" Gaussians wiecznie zalegają i zużywają pamięć; zbyt wysokie wartości (> 0.5) mogą prowadzić do eksplozji opacity, dlatego optymalizator ogranicza wartość logit na sztywno do [-15, 3].

T8opacityLearningRateFinal

SZCZEGÓŁY

Domyślnie: 0.0 (= „brak decay") Zakres: 0 lub 0.001 – T7 opacityLearningRate

TECHNICZNIE

Opcjonalna wartość końcowa cosine-decay dla LR opacity. Przy 0.0 decay jest wyłączony, a LR opacity pozostaje przez cały trening na stałym poziomie T7. Decay z 0.1 do 0.01 pogarsza wynik wyraźnie; dlatego wartość domyślna to „wyłączone". Hipoteza stojąca za tym polem: w fazie refinement stały LR opacity mógłby prowadzić do oscylacji, tak że splaty, które osiągnęły już właściwy poziom przezroczystości, byłyby ponownie przesuwane przez losowe wahania gradientu. Empirycznie się to nie potwierdza — logika clampingu logit i tak to przechwytuje. Pole pozostaje dostępne dla przyszłych eksperymentów; również bardzo długie przebiegi MCMC (> 500K iteracji) mogłyby na tym skorzystać.

T9scaleLearningRate

SZCZEGÓŁY

Domyślnie: 0.005 (Initializer + praca), 0.01 (.full, MCMC — 2×) Zakres: 0.0001 – 0.1

TECHNICZNIE

Współczynnik uczenia Adam dla trzech składowych skali każdej Gaussian w przestrzeni logarytmicznej (RadianceKit przechowuje log(scale), żeby skale pozostawały dodatnie). Domyślna wartość z pracy 0.005, w RadianceKit podwojona do 0.01 dla lepszej konwergencji skali przy dostrojonych konfiguracjach współczynników uczenia. Jeśli wartość pozostanie w zestawieniu z pozostałymi LR jakości przy domyślnej wartości z pracy, powstaje zauważalnie zbyt mało Gaussians — kontrola gęstości nie może klonować, bo aktualizacje skali nadążają zbyt wolno. Skala kontroluje rozciągnięcie każdej Gaussian — zbyt szybkie uczenie prowadzi do „igiełkowatych" Gaussians (ekstremalnie długich, cienkich splatów, patrz T34 scaleRatioPruneThreshold), zbyt wolne uczenie sprawia, że splaty pozostają zbyt kompaktowe i kontrola gęstości musi zbyt często dzielić.

T10rotationLearningRate

SZCZEGÓŁY

Domyślnie: 0.001 (Initializer + praca), 0.002 (.full, MCMC — 2×) Zakres: 0.0001 – 0.05

TECHNICZNIE

Współczynnik uczenia Adam dla czterech składowych kwaternionu każdej Gaussian. Kwaternion jest w każdym kroku optymalizatora po aktualizacji Adam ponownie normalizowany (norma L2 = 1) — inaczej macierz kowariancji zdegenerowałaby się. RadianceKit podwaja domyślną wartość z pracy w presetach jakości, ponieważ rotacja w porównaniu do skali / pozycji ma mniejsze bezwzględne wielkości gradientu (na sferze jednostkowej każdy krok pozostaje krótki), a bez 2× rotacja byłaby w oknie 35 000 iteracji wyraźnie niedokonwergowana. W scenach NeRF-Blender (Lego, Chair) rotacja ma szczególny wpływ — krawędzie obiektów prawidłowo się ustawiają dopiero po 5 000–10 000 iteracjach.

Densification — Klasyczna (T11–T16)

T11densifyGradThreshold

SZCZEGÓŁY

Domyślnie: 0.000002 (Initializer, kalibrowane dla rozdzielczości 0.5×), 0.0000011 (.full, kalibrowane dla 1.0×), 0.000004 (.quickTest, kalibrowane dla 0.25×), 2e-7 (.fullClassicPaper) Zakres: 1e-8 – 1e-3 (zależny od rozdzielczości)

TECHNICZNIE

Próg dla normy L2 gradientu pozycji zrzutowanego w przestrzeni ekranu, powyżej którego dana Gaussian jest oznaczana do klonowania lub podziału. Wartość bezwzględna zależy bezpośrednio od rozdzielczości treningu — skaluje się w przybliżeniu jak 1/rozdzielczość² (więcej pikseli = mniejsze gradienty na piksel). Dlatego każdy poziom T22 trainingRenderScale wymaga skalibrowanego progu: 0.25× → 4e-6, 0.5× → 2e-6, 1.0× → 5e-8 … 1.1e-6 (.full). Domyślna wartość z paperu, 0.0002, jest znormalizowana w NDC i w świato-przestrzennym pipeline RadianceKit nie jest bezpośrednio porównywalna. Za pomocą flagi T52 adaptiveDensifyThreshold można wyliczyć wartość w czasie działania na podstawie p98 aktualnego rozkładu gradientów — na rzeczywistych scenach liczba Gaussianów przy tym jednak drastycznie spada (masowe przycinanie); flaga pozostaje wyłączona. T77–T79 dostarczają alternatywną logikę adaptacyjną opartą na medianie kroczącej. To pole nie jest bezpieczne — zmniejszenie o połowę powoduje 2–4× więcej Gaussianów (presja na pamięć, ryzyko OOM); podwojenie może doprowadzić do niedostatecznej densyfikacji sceny.

T12densifyFromIteration

SZCZEGÓŁY

Domyślnie: 500 Zakres: 100 – 5 000

TECHNICZNIE

Pierwsza iteracja, od której aktywuje się densyfikacja. Wcześniej zachodzi jedynie „gołe" uczenie na początkowej chmurze punktów SfM, bez tworzenia nowych Gaussianów. Domyślna wartość 500 pochodzi z paperu 3DGS i daje inicjalizacji czas na ustabilizowanie się — jeśli densyfikacja zaczęłaby się już od iteracji 0, błędnie ustawione punkty SfM klonowałyby się wielokrotnie, zanim w ogóle znajdą właściwe miejsce. Wyraźnie późniejszy start (np. 1 000) nieco pogarsza wynik; pozostań przy wartości domyślnej.

T13densifyInterval

SZCZEGÓŁY

Domyślnie: 100 (Initializer, MCMC), 200 (.full) Zakres: 50 – 1 000

TECHNICZNIE

Ile iteracji dzieli dwa kolejne kroki densyfikacji. W domyślnej wartości z paperu, 100 — co 100 iteracji oceniana jest lista kandydatów do densyfikacji, następuje klonowanie/podział, a jednocześnie usuwana jest lista kandydatów do przycięcia (sigmoid(opacity) < T14 pruneOpacityThreshold). Dla .full sprawdziła się wartość 200 — to odciąża GPU, bo przebiega mniej przebiegów reorganizacji, i daje każdemu Gaussianowi więcej czasu na ustabilizowanie się po akcji klonowania. Krótsze interwały prowadzą w konfiguracji Quality do nadmiernej densyfikacji: powstaje wyraźnie więcej Gaussianów, bez poprawy obrazu. Przy MCMC to samo pole jest interpretowane jako interwał relokacji; patrz T67 mcmcRelocationInterval dla logiki specyficznej dla MCMC.

T14pruneOpacityThreshold

SZCZEGÓŁY

Domyślnie: 0.005 (Initializer, Paper, MCMC), 0.001 (.full) Zakres: 0.0001 – 0.1

TECHNICZNIE

Próg krycia sigmoidalnego, poniżej którego Gaussian zostaje usunięty przy następnym kroku densyfikacji. Działa w powiązaniu z T7 opacityLearningRate i logiką ograniczenia logit w optymalizatorze. W .full wartość wynosi 0.001 zamiast 0.005 — splaty, które odgrywają rolę tylko przy egzotycznych kątach widzenia, dzięki temu dłużej się utrzymują i przyczyniają się do szczegółów SH. Jeszcze mniejsze wartości (np. 0.0001) nic już nie dają: przycina się zbyt mało i marnuje pamięć. Ważne: kontrola gęstości MUSI ZAWSZE przycinać, nawet jeśli pojemność bufora jest przez inne mechanizmy już wypełniona — inaczej martwe Gaussiany się akumulują a liczba zamraża się.

T15opacityResetInterval

SZCZEGÓŁY

Domyślnie: 3 000 (Initializer + Paper), 100 000 (.full = efektywnie wyłączone), 200 000 (.fullMCMC = wyłączone) Zakres: 1 000 – 100 000+

TECHNICZNIE

Co ile iteracji krycie wszystkich Gaussianów jest resetowane do niskiej wartości (~0.01) — środek zaczerpnięty z paperu 3DGS, mający na celu ponowną ocenę „zamrożonych" splatów. W połączeniu z rozgrzewką RadianceKit, stochastyczną konfiguracją treningu i podwojonymi wskaźnikami uczenia, reset krycia wyraźnie kosztuje jakość, a ograniczenie logit w optymalizatorze i tak już pokrywa jego funkcję. Dlatego w .full jest praktycznie wyłączony (100 000 > 35 000 = nigdy nie zostaje wyzwolony). W .fullClassicPaper (wariant wierny paperowi) jest celowo ustawiony z powrotem na 3 000 — tam chodzi o osiągnięcie budżetów Gaussianów z oryginalnego paperu.

T16maxScreenSize

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 (wył.) lub > 0

TECHNICZNIE

Maksymalny rozmiar w przestrzeni ekranu (w zrzutowanych pikselach), jaki może osiągnąć Gaussian, zanim zostanie wymuszony jego podział. Wartość jest ustawiona na 0 — kontrola gęstości RadianceKit używa zamiast tego progu skali w przestrzeni świata z tej samej logiki gradientowej. Pozostaje w katalogu pól, ponieważ przyszłe eksperymenty z Mip-Splatting (T74–T76) lub strategiami splattingu specyficznymi dla sceny mogłyby na tym skorzystać. Aktywacja (wartość > 0, np. 20) wymusiłaby na bardzo dużych splatach na ekranie podział — istotne przy dużych, gładkich powierzchniach ścian, gdzie pojedynczy ogromny splat oferuje zbyt mało szczegółów.

Loss (T17–T20)

T17ssimWeight

SZCZEGÓŁY

Domyślnie: 0.2 (Initializer + Paper + .full), 0.05 (wszystkie presety MCMC) Zakres: 0.0 – 1.0

TECHNICZNIE

Waga składnika D-SSIM w połączonej funkcji straty loss = (1 - λ) * L1 + λ * D-SSIM, gdzie λ = T17. Domyślna wartość 0.2 z 3DGS-Paper jest właściwym wyborem dla Classic-Densification — już 0.3 wyraźnie pogarsza wynik. Dla MCMC odpowiednia wartość wynosi natomiast 0.05, ponieważ MCMC dzięki swojej stochastycznej eksploracji potrzebuje silniejszego udziału sygnału L1 — wyższe wagi SSIM rozmyłyby decyzje relokacji. SSIM jest znacznie droższy obliczeniowo niż L1 (lokalne okna 11×11 na całym obrazie); RadianceKit korzysta z implementacji przyspieszonej przez MPS, która pozostaje poniżej 1 ms na obraz 1080p. Presety Scene-Class używają wartości specyficznych dla sceny między 0.082 (.outdoorPreset) a 0.171 (.indoorPreset).

T18ssimWeightRefinement

SZCZEGÓŁY

Domyślnie: 0.0 (= „brak zmiany, zachowaj ssimWeight") Zakres: 0 lub 0 – 1.0

TECHNICZNIE

Opcjonalna wartość SSIM dla fazy dopracowania po T2 densifyUntilIteration. Podniesienie z 0.2 do 0.3 w fazie dopracowania pogarsza wynik w obu miarach — zarówno L1, jak i SSIM; dlatego wartość domyślna wynosi 0.0. Hipoteza stojąca za tym polem zakładała, że po zakończeniu densyfikacji — gdy nie powstają już nowe Gaussians — silniejszy udział SSIM zmaksymalizowałby ostrość strukturalną. Empirycznie okazało się to błędne: zwiększenie wagi SSIM oznacza pośrednio obniżenie wagi L1, a L1 jest znacznie bardziej znaczącym sygnałem w finalnej fazie dopracowania. Pole pozostaje dostępne na potrzeby przyszłych eksperymentów z perceptualną stratą (T60) lub stratą krawędziową (T19), gdzie kompozycja straty specyficzna dla fazy dopracowania mogłaby mieć sens.

T19edgeLossWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 0.001 – 1.0

TECHNICZNIE

Eksperymentalny składnik straty: waga strat L1 w dziedzinie gradientu Sobela, która bezpośrednio porównuje krawędzie obrazu (Sobel obrazu wzorcowego vs Sobel renderu) jako dodatek do L1+SSIM. Hipoteza: informacja o krawędziach jest filarem percepcyjnej jakości obrazu, a jawny składnik powinien zachęcać Gaussians do lepszego trafiania w krawędzie. W praktyce nic to nie daje: zauważalna waga (0.1) pogarsza wynik, a mała (0.01) nie zmienia jakości, kosztuje jednak czas obliczeń. Przebieg Sobela kosztuje dodatkowy przebieg forward MPS na obrazie wzorcowym i renderze. Dlatego trwale wyłączony. Przyszłe zastosowanie: sceny z twardymi sztucznymi krawędziami (architektura, meble, rendery) mogłyby skorzystać — Jednak presety Scene-Class nie używają do tego tego składnika, tylko skalują wagę SSIM.

T20skyMaskingEnabled

SZCZEGÓŁY

Domyślnie: false (Initializer i wszystkie presety) Zakres: boolean

TECHNICZNIE

Włącza maskowanie nieba (Sky Masking). Przy tym w każdym obrazie za pomocą frameworka Apple Vision maskowany jest obszar nieba, a strata w tym obszarze jest ustawiana na zero. Sens: sceny plenerowe często cierpią na to, że niebieskie/szare/białe piksele nieba skłaniają aplikację do umieszczania Gaussians właśnie tam — co jest odbierane jako „floater" (unoszący się artefakt). Bez maski nieba strata w tym obszarze nigdy nie byłaby zerowa, ponieważ niebo na obrazie lekko się zmienia, a aplikacja bez końca próbuje to odtworzyć za pomocą splatów. Maska Vision jest obliczana raz na kamerę przed treningiem i przechowywana w pamięci RAM. Zwykle jest aktywowana razem z T45 skyDomeEnabled (logika UI w widoku ustawień). W scenach wnętrzarskich lub renderingach syntetycznych pozostaw wyłączone — maska błędnie rozpoznawałaby tam sufity lub ściany jako „niebo".

SH-Degree-Progression (T21)

T21shDegreeUpgradeIterations

SZCZEGÓŁY

Domyślnie: [1_000, 2_000, 3_000] (Initializer), [2_000, 5_000, 8_000] (.full, MCMC), [1_000, 2_000] (.preview — Degree 3 pominięty) Zakres: [Int], każda wartość w [0, maxIterations], rosnąco monotonicznie

TECHNICZNIE

Iteracje, przy których aktywny SH-Degree jest podnoszony z 0→1, 1→2, 2→3. Przed pierwszym progiem aktywne są tylko komponenty DC (czyli T5 shDCLearningRate), po pierwszym progu DC + 3 współczynniki Degree-1, po drugim progu + 5 współczynników Degree-2, po trzecim progu wszystkie 15 współczynników. Zapotrzebowanie na pamięć na Gaussian rośnie przy tym stopniowo — 4 Floaty → 16 Floatów → 36 Floatów → 64 Floaty. Presety jakości opóźniają podniesienia stopnia względem domyślnych wartości Initializera, ponieważ geometria ma się najpierw ustabilizować, zanim dojdą szczegóły koloru z ich wyższą częstotliwością. Wcześniejsze progi [1K, 2K, 3K] dają w .full zauważalnie gorszy wynik. .preview ogranicza się do Degree 2, ponieważ Degree 3 nie zdąży zbiec w 5 000 iteracjach i tylko zużywa pojemność optymalizatora. Curriculum (T80–T81) oferuje alternatywną logikę, która dynamicznie nadpisuje tę listę.

Wydajność (T22–T24)

T22trainingRenderScale

SZCZEGÓŁY

Domyślnie: 1.0 (Initializer, .full, MCMC, Scene-Class), 0.5 (.preview), 0.25 (.quickTest) Zakres: 0.05 – 2.0 (typowo 0.25, 0.5, 1.0)

TECHNICZNIE

Rozdzielczość renderowania podczas treningu w odniesieniu do oryginalnej rozdzielczości obrazów treningowych. Przy 0.5 każdy obraz zostaje przeskalowany w dół do 50 % szerokości × 50 % wysokości (czyli 25 % pikseli), a renderowanie Gaussian odbywa się w tej mniejszej rozdzielczości. Redukuje zarówno zużycie pamięci, jak i obciążenie obliczeniowe w sposób kwadratowy. Ważne: T11 densifyGradThreshold musi pasować do wybranej rozdzielczości — wartości gradientu skalują się z 1/rozdzielczość², dlatego .quickTest (0.25×) ma znacznie wyższy próg (4e-6) niż .full (1.0×, 1.1e-6). RadianceKit ostrzega przy bardzo dużych obrazach i dostosowuje się automatycznie — docelowa rozdzielczość 3 MP. Przy skrajnych obrazach wejściowych 4K sensowne byłoby 0.5 lub nawet 0.25, inaczej każdy Mac wpadnie tylko w kompaktowanie na CPU.

T23resolutionWarmupScale

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 0.1 –

TECHNICZNIE

Trenuj fazę densyfikacji (iteracje od 0 do T2) w niższej rozdzielczości niż faza dopracowywania (refinement). Dla .full jest to wyłączone, ponieważ przy T22 = 1.0 i cosine annealing zysk czasowy jest niewielki, a jakość nieco cierpi. Pozostaje w katalogu pól, ponieważ przy wejściach 4K i długich sesjach treningowych mogłaby ponownie okazać się przydatna — curriculum (T80) wykorzystuje podobną logikę, ale jest tam sprzężone z harmonogramem LR. Jeśli aktywne i T80 curriculumResolutionRamp również true, wygrywa curriculum i nadpisuje tę wartość.

T24tileSize

SZCZEGÓŁY

Domyślnie: 16 Zakres: 8, 16, 32

TECHNICZNIE

Rozmiar kafelków rasteryzacji w pikselach. Renderowanie Gaussian Splatting jest oparte na kafelkach: obraz jest dzielony na kafelki 16×16 pikseli, każdy kafelek zbiera odpowiednie dla niego Gaussiany, sortuje je według głębi i miesza. 16 to standard używany praktycznie przez wszystkie implementacje 3DGS, zakodowany na stałe w kernelach Metal RadianceKit; zmiana tej wartości wymagałaby ponownej kompilacji shaderów i w obecnym stanie nie jest efektywna. Pozostaje jako pole na wypadek, gdyby przyszła wersja silnika obsługiwała dynamiczny rozmiar kafelków.

Diagnostyka i przygotowanie chmury punktów (T26–T30)

T26depthDistortionWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 0.0001 – 0.05

TECHNICZNIE

Eksperymentalne: waga funkcji straty regularyzującej depth distortion. Karze Gaussians, które są rozmieszczone głęboko wzdłuż promienia renderowania, choć koncepcyjnie należą do tej samej powierzchni — to zachęca do skoncentrowanych rozkładów głębi i redukuje Floaters. Przy wszystkich testowanych wartościach wynik pogarsza się zamiast się poprawiać. Teoretyczna korzyść — poprawa spójności multi-view — nie przekłada się na L1-Loss, ponieważ hipoteza zakłada implicite, że geometria SfM jest poprawna i Gaussians trzeba jedynie „ułożyć w stos". W praktyce chmura punktów SfM jest zazwyczaj najsłabszym elementem, nie sposób ich rozmieszczenia. Pozostaje dostępne dla zbiorów danych multi-view z wyjątkowo czystymi pozami (Synthetic, Mip-NeRF 360 z Ground Truth).

T27singleViewOverfit

SZCZEGÓŁY

Domyślnie: false Zakres: boolean

TECHNICZNIE

Flaga diagnostyczna: jeśli true, w każdej iteracji treningu wymuszane jest użycie kamery o indeksie 0 zamiast losowej z puli kamer. Sens: jeśli model nie potrafi przeuczyć się (overfit) nawet na jednym widoku (czyli strata dla widoku 0 nie zbliża się do zera nawet po 10 000 iteracjach), to w przebiegu forward/backward jest fundamentalny błąd. Ten przełącznik był intensywnie wykorzystywany podczas rozwoju shaderów Metal i jąder Differentiable Rasterizer. Dziś dostępny już tylko jako sanity-check, gdy ktoś zmienił coś w backendzie treningowym i chce to zweryfikować. W interfejsie nie ma dla niego przełącznika — to pole jest wyłączone we wszystkich Preset i takie pozostaje.

T28maxCameras

SZCZEGÓŁY

Domyślnie: 0 (= „użyj wszystkich kamer") Zakres: 0 lub 1 – N

TECHNICZNIE

Limit diagnostyczny: trenuj tylko z pierwszymi N kamerami, ignoruj wszystkie pozostałe. Pierwotny sens: przetestować hipotezę, że zbyt wiele kamer generuje konflikty gradientów (zbyt wiele sprzecznych sygnałów straty dla tej samej Gaussian). Sztuczne ograniczenie nie przynosi żadnej korzyści — więcej klatek niemal zawsze oznacza więcej jakości. W interfejsie nie ma dla tego żadnego elementu sterującego; to pole we wszystkich Presets ma wartość 0, czyli „wszystkie kamery".

T29maxInitialPoints

SZCZEGÓŁY

Domyślnie: 0 (= „użyj wszystkich punktów SfM") Zakres: 0 lub 1 000 – 200 000+

TECHNICZNIE

Zabezpieczenie: ogranicza liczbę początkowych punktów SfM, z którymi rozpoczyna się trening. Gęste rekonstrukcje COLMAP mogą wygenerować > 60 000 punktów, co przy dużych skalach początkowych prowadzi do 200–300 Gaussians na nakładający się piksel — tworzy to „pole mgły", w którym trening nie zbiega. Subsampling do ~16 000 punktów (logika hard-cap w silniku treningowym) sprowadza gęstość początkową do poziomu, jaki stosuje referencyjne 3DGS, i drastycznie redukuje nakładanie się. Aplikacja ustawia to sama przy bardzo gęstych rekonstrukcjach; nie ma dla tego elementu sterującego.

T30cameraClusterOutlierMultiplier

SZCZEGÓŁY

Domyślnie: 10.0 (wszystkie Presets — nigdy nie nadpisywane) Zakres: 1.0 – 100.0

TECHNICZNIE

Mnożnik dla filtra outlierów camera-cluster. Przed treningiem silnik treningowy oblicza centroid wszystkich pozycji kamer oraz maksymalną odległość kamery od centroidu. Punkty SfM, których odległość od centroidu przekracza multiplier × maxCameraDistance, są odrzucane jako outliery. Domyślna wartość 10× jest celowo przyjęta jako hojna. Subtelny efekt uboczny: ciaśniejsze SfM (kamery bliżej siebie) → mniejszy maxCameraDistance → mniejszy próg → więcej punktów zostaje odrzuconych jako outliery. Luźniejsze SfM → większy próg → mniej punktów odrzuconych. Wynika z tego zaskakujący efekt: ciaśniejsza i sama w sobie lepsza rekonstrukcja SfM może pogorszyć trening, ponieważ odrzucanych jest zbyt wiele punktów początkowych. Pole we wszystkich Presets ma wartość 10 i nie jest regulowalne w interfejsie. Wartości poniżej 5 są zazwyczaj zbyt restrykcyjne, powyżej 20 są bezskuteczne.

Regularyzacja (T31–T37)

T31coarseToFineBlurRadius

SZCZEGÓŁY

Domyślnie: 0 (= wyłączone) Zakres: 0 lub 1 – 10

TECHNICZNIE

Eksperymentalne: promień Box-Blur, który jest stosowany na początku fazy densyfikacji do obrazu ground-truth i liniowo redukowany do 0 aż do końca densyfikacji (T2). Hipoteza: trening coarse-to-fine — najpierw nauka grubych struktur, potem detali — powinien dawać stabilniejszą geometrię. We wszystkich testowanych promieniach wynik jest gorszy. Powód niepowodzenia: densyfikacja podejmuje decyzje na podstawie gradientów w domenie obrazu, a rozmycie zmniejsza dokładnie te sygnały, które są ważne dla „tu trzeba sklonować". Pozostaje w katalogu polowym dla przyszłych testów z innym schematem kontroli gęstości.

T32scaleRegWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 0.0001 – 0.05

TECHNICZNIE

Eksperymentalne: regularyzacja L1 na skalę w przestrzeni świata. Karze Gaussiany, które stają się zbyt duże — zapobiega „mega-splatom", które pokrywają całe powierzchnie ścian jedną Gaussianą. Po włączeniu liczba Gaussianów eksploduje do milionów, a wynik jest wielokrotnie gorszy. Powód: regularyzacja skali wchodzi w konflikt z kontrolą gęstości — mniejsze skale oznaczają, że potrzeba więcej Gaussianów, więc kontrola gęstości dzieli częściej, co z kolei oznacza więcej nakładu obliczeniowego na gradienty. Wyłączone, ale udokumentowane dla eksperymentów z Mip-Splatting (T74): w tym kontekście dolna granica skali mogłaby mieć sens.

T33anisotropyRegWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 0.0001 – 0.05

TECHNICZNIE

Eksperymentalne: kara za stosunek max(scale)/min(scale), ma zapobiegać skrajnie wydłużonym Gaussianom typu „needle", które są postrzegane jako floater. We wszystkich testowanych siłach wynik jest wyraźnie gorszy. Powód: regularyzacja wymusza na splatach kształt zbliżony do „okrągłego", co na płaskiej powierzchni (ściana, stół, podłoga) jest dokładnie odwrotnością tego, co trzeba — tam płaska, szeroka Gaussiana jest efektywniejsza niż kulista. Wyłączone. T34 scaleRatioPruneThreshold realizuje ten sam cel bardziej ukierunkowanie, ale też jest domyślnie wyłączony.

T34scaleRatioPruneThreshold

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 5.0 – 100.0 (typowo 10.0 – 30.0)

TECHNICZNIE

Eksperymentalne przycinanie po treningu, które usuwa każdą Gaussianę, której stosunek max(scale)/min(scale) przekracza tu ustawiony liniowy próg. Celuje w skrajnie wydłużone floatery typu „needle/disc", których sama regularyzacja nie potrafi wyeliminować. W teście przycinanie usunęło floatery zgodnie z oczekiwaniami, ale jednocześnie także sensowne płaskie splaty na ścianach i podłogach — obraz stał się bardziej dziurawy. Dlatego domyślnie wyłączone. Od wersji 1.8 istnieje do tego przełącznik Remove Needle/Disc Floaters w sekcji Inspektora „Training", pod linią pomocniczą „Runs automatically at the end of training". Po włączeniu działa świadomie konserwatywnie (tylko splaty, których najdłuższa oś przewyższa najkrótszą około 50×) i działa od następnego przebiegu treningu.

T35opacityRegWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 0.0001 – 0.05

TECHNICZNIE

Eksperymentalne: kara Binary-Cross-Entropy, która ciągnie krycie w stronę 0 lub 1 (a więc z dala od „półprzezroczystości"). Hipoteza: ostrzejszy rozkład krycia poprawiłby klarowność obrazu. Razem z T33 regularyzacja kosztuje jakość; oba są wyłączone. Uwaga: w wersji 1.4.3-Beta pojawił się błąd, który dotyczył dokładnie tego pola przy zmianie wartości domyślnej (inicjalizator = 0.01), co doprowadziło do masowego wymierania liczby Gaussianów (460 tys. → 5 w jednej iteracji). Od wersji 1.4.4 wartość domyślna jest na stałe zakotwiczona na 0.0.

T36opacityDecayFactor

SZCZEGÓŁY

Domyślnie: 0.0 (inicjalizator = wyłączone), 0.9995 (.full, .classicBalanced — standard HTGS) Zakres: 0 (wyłączone) lub 0.95 – 1.0

TECHNICZNIE

Implementacja schematu HTGS (Hierarchical Time-Gating, Eurographics 2025): co T37 opacityDecayInterval iteracji sigmoidalne krycie każdej Gaussiany jest mnożone przez ten współczynnik. 0.9995 × 100 zastosowań daje ok. 95% pozostałości na fazę densyfikacji — lekki, ale stały nacisk w dół na wszystkie wartości krycia, który niezawodnie sprowadza słabo przyczyniające się Gaussiany poniżej T14 pruneOpacityThreshold. Rezultatem jest wyraźnie lepszy wynik niż bez decay. Aktywne tylko podczas fazy densyfikacji (do T2), potem trening kontynuuje bez decay, aby wartości krycia ustalone podczas dopracowywania pozostały stabilne. Nieużywane w MCMC (MCMC ma własne mechanizmy poprzez T67 mcmcRelocationInterval + T68 mcmcDeadOpacityThreshold).

T37opacityDecayInterval

SZCZEGÓŁY

Domyślnie: 50 Zakres: 10 – 500

TECHNICZNIE

Interwał iteracji, w którym stosowany jest T36 opacityDecayFactor. Domyślna wartość z artykułu HTGS to 50, w .full pozostawiona. Długie interwały (>200) częściowo znoszą efekt, ponieważ między dwoma zastosowaniami zachodzi wystarczająco dużo aktualizacji gradientów, by krycie znów wzrosło. Krótsze interwały (<20) czynią decay zbyt agresywnym. Aktywne tylko w fazie densyfikacji.

Refinement (T38–T44)

T38gradientAccumulationSteps

SZCZEGÓŁY

Default: 1 (= „jeden Widok pojedynczo dla kroku Adam") Range: 1 – 8

TECHNICZNIE

Liczba Views, których gradienty są akumulowane, zanim zostanie wykonana aktualizacja Adam. Przy > 1 aplikacja działa na osobnej, „unfused" ścieżce backward-project, która sumuje gradienty w osobnym buforze; finalne zastosowanie skaluje wartość przez 1/N, aby utrzymać stałą magnitudę. Przy klasycznym treningu wartość 2 nie przynosi zysku jakościowego, ale kosztuje czas, ponieważ ścieżka unfused jest droższa niż fused. Przy MCMC natomiast accum = 2 wyraźnie zmniejsza różnicę jakości względem Classic — dlatego jest tam oferowany jako przełącznik. W presetach wartość wynosi 1. W interfejsie dostępny jest przez przełącznik MCMC Quality w sekcji Inspectora „Training": włączony akumuluje 2 Views na krok, wyłączony 1. Inne wartości niż 1 i 2 można ustawić tylko przez edytowany plik presetu.

T39testViewIndices

SZCZEGÓŁY

Default: [] (= puste, wszystkie Views są używane do treningu) Range: Set<Int>, dowolny podzbiór indeksów kamer

TECHNICZNIE

Zbiór indeksów kamer, które NIE są używane do treningu, tylko zapisywane jako holdout do oceny PSNR/SSIM/LPIPS. Wypełniany tylko w wewnętrznych przebiegach pomiarowych: wtedy co ósmy View, zaczynając od indeksu 0 (standard LLFF, identyczny z konwencjami z prac Mip-NeRF-360 i 3DGS). W stanie dostarczonym pole pozostaje puste — trening wykorzystuje wszystkie Views i nie ma w interfejsie żadnego elementu sterującego dla tego. Uwaga: ręczne ustawienie tego pola w pliku presetu bez zrozumienia indeksów czyni pomiar bezużytecznym (np. gdy wszystkie indeksy zostaną ustawione powyżej N, podczas gdy jest tylko N-50 Views → brak holdoutów → brak oceny). Przy eksporcie własnego presetu testViewIndices nie jest zapisywane, ponieważ zależy od sceny i w przeciwnym razie pozostawiałoby bezsensowne wartości między różnymi zbiorami danych.

T40refinementPruneInterval

SZCZEGÓŁY

Default: 0 (= wyłączone) Range: 0 lub 100 – 5 000

TECHNICZNIE

Co N iteracji podczas fazy Refinement (po T2) uruchamiany jest dodatkowy przebieg prune, który usuwa Gaussians z sigmoid(opacity) < T41 refinementPruneOpacityThreshold. Sens: podczas Densification odbywają się regularne wywołania Density-Control, potem już nie — Gaussians, których opacity nadal spada, pozostają jednak w buforze. W praktyce to dodatkowe przycinanie szkodzi: w połączeniu z drugą fazą Densification (T54) może całkowicie opróżnić populację Gaussians. We wszystkich presetach ustawione jest na 0 i w interfejsie nie da się go zmienić; jeśli mimo to ustawisz je przez edytowany plik presetu, sensowne wartości to 1 000 lub 2 000.

T41refinementPruneOpacityThreshold

SZCZEGÓŁY

Default: 0.0 (= „użyj T14") Range: 0 lub 0.001 – 0.1

TECHNICZNIE

Osobny próg opacity dla przycinania w Refinement. Po Densification większość Gaussians osiągnęła wyraźnie wyższą opacity (> 0.001), więc domyślny T14 pruneOpacityThreshold byłby zbyt łagodny. Gdy T40 jest aktywne, to pole określa własny próg. Przy 0.0 nadal używane jest T14. Istotne tylko gdy T40 > 0.

T42midTrainingCompactificationIterations

SZCZEGÓŁY

Default: [] (= wyłączone) Range: [Int], wartości w (densifyUntilIteration, maxIterations)

TECHNICZNIE

Jawne punkty iteracji podczas fazy Refinement, w których uruchamiany jest przebieg Compactification (usuwa sigmoid(opacity) < 0.01 + Gaussians ze skalą-odstającą, ta sama logika co T56 postTrainingCompactification). Sens: długie fazy Refinement mogą wykazywać akumulację confetti/floaterów, których SH następnie przetrenowuje się na artefakty specyficzne dla widoku. Typowa konfiguracja gdy aktywne: [10000, 20000, 30000] dla 40K Classic. ALE: dowolnie wybrane znaczniki sprzątania konsekwentnie pogarszają wynik końcowy — liczba Gaussians wprawdzie znacząco spada, ale błąd obrazu rośnie mocniej. Jako dowolnie ustalana lista iteracji pole pozostaje więc puste we wszystkich presetach. Sam efekt osiągasz w interfejsie przez przełącznik Floater Cleanup w sekcji Inspectora „Training": przy klasycznych przebiegach od 30 000 iteracji ustawia on dwa przebiegi sprzątania w środku treningu. Własne znaczniki można ustawić tylko przez edytowany plik presetu.

T43frustumCullEnabled

SZCZEGÓŁY

Default: false Range: boolean

TECHNICZNIE

Po treningu usuwane są wszystkie Gaussians, które znajdują się poza sumą wszystkich frusta kamer treningowych. Takie Gaussians nigdy nie były ograniczane przez sygnał loss i zawsze są floaterami. Szczególnie skuteczne w scenach, gdzie Novel-View znajduje się za lub obok ścieżki kamery (np. tylna strona liniowego lotu drona) — floatery tam znajdujące się nigdy nie stają się widoczne podczas fazy treningowej, ale bardzo dobrze widoczne przy późniejszym poruszaniu się w przeglądarce 3D. Przy lotach dronem daje to widocznie mniej floaterów, dlatego jest dostępne jako opcja opt-in. Domyślnie false, ponieważ przy przechwytywaniach obiektów z pełnym pokryciem orbitalnym suma frusta obejmuje całą scenę i funkcja niczego nie usuwa — jest oferowana w Settings pod „Floater Reduction". Preset Outdoor jej nie włącza, ponieważ kopuła nieba (sky-dome) rozwiązuje tam ten problem lepiej.

T44frustumCullExpansion

SZCZEGÓŁY

Default: 1.1 Range: 1.0 – 2.0

TECHNICZNIE

Margines NDC dla T43 frustumCullEnabled. 1.0 przycinałoby dokładnie na krawędzi obrazu, co zbyt mocno skracałoby chwiejne splaty na krawędzi obrazu. 1.1 = 10% dodatkowego marginesu ponad dokładny framing kamery — daje pewną tolerancję dla pikseli brzegowych, które mogłyby jednak stać się widoczne w lekko przesuniętym Novel-View. Wartości > 1.2 czynią cull praktycznie nieskutecznym, ponieważ rozszerzone frustum obejmuje dużo więcej przestrzeni.

Sky-Dome (T45–T48)

T45skyDomeEnabled

SZCZEGÓŁY

Domyślnie: false (Inicjalizator + wszystkie Presety oprócz P9 Outdoor) Zakres: boolean

TECHNICZNIE

Przed rozpoczęciem treningu generowana jest kulista chmura punktów (Fibonacci-sphere z T46 punktami próbkowania), umieszczana w promieniu T47 skyDomeRadiusMultiplier × scene_extent wokół środka sceny i inicjalizowana kolorami z pikseli zamaskowanych jako niebo ze wszystkich kamer treningowych (patrz T20 skyMaskingEnabled). Te sky-dome-Gaussians są wstawiane na początku bufora Gaussianów i podczas treningu „zamrożone" (gradienty pozycji/skali/rotacji = 0, tylko SH i nieprzezroczystość pozostają optymalizowalne). Efekt: zamiast czarnych obszarów „confetti" w oddali, użytkownik w widokach novel-view widzi prawdziwe niebo. Na scenach z dronów i krajobrazach działa to bardzo dobrze; w Presecie Outdoor (P9) jest domyślnie włączone. Przy scenach wnętrzowych zostaw wyłączone — sfera bezsensownie wisiałaby poza pomieszczeniem.

T46skyDomeSampleCount

SZCZEGÓŁY

Domyślnie: 5 000 Zakres: 1 000 – 50 000 (typowo 2 000 – 10 000)

TECHNICZNIE

Liczba punktów próbkowania Fibonacci-Sphere na sferze sky-dome. Wyższe wartości → gęstsza kopuła nieba (lepsza przy dużych rozdzielczościach i dużym widocznym niebie), ale większe zapotrzebowanie na pamięć. 5 000 to sweet spot dla renderowań 4K; przy niższych rozdzielczościach wystarcza 2 000–3 000. Punkty są inicjalizowane według cosine-distance do każdego wektora widoku kamery treningowej z odpowiednimi pikselami zamaskowanymi jako niebo — punkty próbkowania, których stożka widzenia nie widzi żadna kamera, pozostają z niską początkową wartością nieprzezroczystości z tyłu, ale nie są zmieniane podczas treningu (zamrożone).

T47skyDomeRadiusMultiplier

SZCZEGÓŁY

Domyślnie: 30.0 (Inicjalizator + większość Presetów), 59.0 (P9 Outdoor) Zakres: 5.0 – 200.0

TECHNICZNIE

Promień sfery sky-dome względem rozciągłości sceny (= średnia odległość między pozycjami kamer). 30 = kula ma 30-krotną średnicę chmury kamer. Zbyt mały (< 5) → sky-dome interferuje ze sceną samą w sobie (np. splat sky-dome ląduje na pierwszym planie); zbyt duży (> 100) → utrata precyzji float32 na pozycjach sky-dome, co powoduje glitche renderowania w oddali. Dla rozległych scen zewnętrznych właściwą wartością jest 59.0 — domyślne 30.0 jest zbyt małe dla głębokich krajobrazów, wtedy piksele sky-dome renderują się widocznie na krawędziach obrazu jako „ściana".

T48frozenGaussianCount

SZCZEGÓŁY

Domyślnie: 0 (= brak zamrożonych Gaussianów) Zakres: 0 lub 1 – T46

TECHNICZNIE

Liczba Gaussianów na początku bufora, których gradienty pozycji/skali/rotacji w optymalizatorze są ustawiane na zero — pozostają przestrzennie sztywne przez cały trening. Density-control nie może ich klonować, dzielić ani przycinać. Używane do wstrzykiwania sky-dome (patrz T45): gdy sky-dome jest włączone, to pole zostaje automatycznie ustawione na T46 skyDomeSampleCount. Ręczne ustawienie jest możliwe (np. aby zamrozić wcześniej umieszczoną chmurę punktów ze skanu LiDAR), ale nie jest bezpośrednio dostępne w UI. Ważne: pierwsze N Gaussianów w buforze zawsze są tymi zamrożonymi — o tym decyduje kolejność w buforze, a nie jawny indeks.

Adam + harmonogram LR (T49–T55)

T49adamResetIteration

SZCZEGÓŁY

Domyślnie: 0 (= wyłączone) Zakres: 0 lub 100 –

TECHNICZNIE

Iteracja, przy której akumulatory momentum optymalizatora Adam (m1, m2) są zerowane. Korekta obciążenia (bias correction) działa potem z (iter - adamResetIteration) zamiast z iter. Reset po zakończeniu Densification wyraźnie pogarsza wynik. Powód: momentum Adama, które zbudowało się podczas Densification, niesie informację o typowych wielkościach gradientu i przyspiesza fazę Refinement. Odrzucenie go kosztuje pierwsze ~500 iteracji Refinement pod względem zbieżności. Dlatego we wszystkich Presetach ustawione jest na 0 i nie da się tego zmienić w interfejsie.

T50positionLRScheduleEndIteration

SZCZEGÓŁY

Domyślnie: 0 (Initializer = „użyj maxIterations"), 20 000 (.full — Cosine kończy się na 20K mimo maxIter=35K), 30 000 (.fullClassicPaper) Zakres: 0 lub 1 000 –

TECHNICZNIE

Iteracja, przy której krzywa cosine annealing dla LR pozycji osiąga swoje minimum. Jeśli 0, jest to identyczne z T1 maxIterations. Jeśli > 0, harmonogram działa aż do tej wartości i potem pozostaje na stałym poziomie T4 positionLearningRateFinal. Pozwala to na „rozszerzoną fazę refinement" z minimalną, lecz stałą szybkością uczenia — pozycje są dopracowywane powoli, bez ponownego zaniku (decay). .full tak robi (koniec harmonogramu na 20K, trening trwa do 35K); w sąsiedztwie — od 15K do 25K — niemal nic się nie zmienia, 20K jest najlepszym kompromisem. Jest dalej wykorzystywane w połączeniu z T51, aby modyfikować także LR-y inne niż pozycja w rozszerzonej fazie.

T51extendedPhaseLRDecay

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone, stałe LR-y) Zakres: 0 lub 0.01 – 1.0

TECHNICZNIE

Minimalny mnożnik dla LR-ów innych niż pozycja (skala, rotacja, opacity, SH) w „rozszerzonej fazie" — czyli po osiągnięciu T50, gdy LR pozycji jest już na poziomie T4. Jeśli 0.1, skala/rotacja/opacity/SH są ze swojej strony poddawane cosine decay z 1.0 (= ich standardowy LR) do 0.1× ich standardu. Jeśli 0.0 (domyślnie), pozostają stałe. Pełny decay aż do zera daje ten sam wynik co brak decay w ogóle — z decay zachowanie wygląda „czyściej", ale nie da się zmierzyć poprawy. Dlatego we wszystkich Presetach ustawione jest na 0 i nie da się tego zmienić w interfejsie.

T52adaptiveDensifyThreshold

SZCZEGÓŁY

Domyślnie: false Zakres: boolean

TECHNICZNIE

Eksperymentalne: jeśli true, aplikacja oblicza w każdym kroku Densification p98 aktualnego rozkładu gradientów i wykorzystuje je jako dynamiczny próg (ograniczony do co najmniej 0,5× skonfigurowanej wartości z T11, aby zbytnio nie odstawał). Hipoteza: automatyczne dostosowanie do aktualnej fazy sceny miałoby uczynić kontrolę gęstości bardziej odporną — np. na początku surowsze przycinanie, później luźniejsze, lub odwrotnie. W praktyce liczba Gaussianów drastycznie się zapada — masowe przycinanie, ponieważ p98 w pierwszych iteracjach jest ekstremalnie wysokie, a potem niemal nic już nie przekracza progu. Stały próg jest już dobrze skalibrowany, dynamiczne dostosowanie szkodzi bardziej, niż pomaga. T77 oferuje alternatywną logikę adaptacyjną przez rolling median, która omija ten problem.

T53mergeAfterDensification

SZCZEGÓŁY

Domyślnie: false (Initializer), true (.full, .classicBalanced, .fullClassicPaper) Zakres: boolean

TECHNICZNIE

Na końcu fazy Densification (iteracja T2) wykonywany jest jednorazowy przebieg łączenia (merge), który znajdujące się blisko siebie Gaussiany o podobnej skali i kolorze łączy ze sobą. Redukuje liczbę Gaussianów zazwyczaj o 5–15 % bez widocznej utraty jakości. Sens: po intensywnym klonowaniu powstają skupiska niemal identycznych Gaussianów, które nie wnoszą nic nowego — merging zwalnia pojemność optymalizatora dla innych obszarów. Standard w klasycznych Presetach jakości. Przy MCMC nie stosowane, ponieważ MCMC dzięki swojej logice relokacji w ogóle nie dopuszcza do powstania takich skupisk.

T54densifyPhase2FromIteration

SZCZEGÓŁY

Domyślnie: 0 (= wyłączone) Zakres: 0 lub T2T1

TECHNICZNIE

Eksperymentalne: umożliwia drugą fazę Densification, która po pauzie refinement zaczyna się przy tej iteracji i trwa do T55. Hipoteza: po fazie refinement akumulatory gradientu mają stabilniejsze wielkości i mogą dokładniej wskazać, które obszary wciąż potrzebują dodatkowych Gaussianów. W praktyce druga faza Densification kończy się kaskadą aż do zera Gaussianów — razem z przycinaniem refinement (T40) całkowicie opróżnia bufor. Dlatego we wszystkich Presetach ustawione jest na 0 i nie da się tego zmienić w interfejsie.

T55densifyPhase2UntilIteration

SZCZEGÓŁY

Domyślnie: 0 Zakres: 0 lub T54T1 Zdefiniowane w:

TECHNICZNIE

Koniec drugiej fazy Densification. Istotne tylko gdy T54 > 0. Oba pola razem są wyłączone.

Postprodukcja + Apple AI (T56–T60)

T56postTrainingCompactification

SZCZEGÓŁY

Domyślnie: true (we wszystkich presetach produkcyjnych), false (.quickTest, .preview) Zakres: boolean

TECHNICZNIE

Po zakończeniu treningu Gaussiany z sigmoid(opacity) < 0.01 są twardo usuwane (praktycznie nie wnoszą już nic do obrazu). Redukuje liczbę Gaussianów typowo o 58 % i rozmiar pliku eksportu o 55 % bez widocznej utraty jakości. Domyślnie aktywne w presetach produkcyjnych — końcowy rezultat powinien być dostarczany możliwie kompaktowo. W .quickTest wyłączone, ponieważ przebieg diagnostyczny i tak nie jest eksportowany. W przeciwieństwie do T42 midTrainingCompactificationIterations kompaktyfikacja odbywa się dopiero na końcu — do tego momentu refinement może korzystać ze wszystkich Gaussianów.

T57metalFXUpscaling

SZCZEGÓŁY

Domyślnie: false Zakres: boolean

TECHNICZNIE

⚠ Od 2026-07-18 wyłączone i bez żadnego efektu. Pole należało do pickera „Viewport Scaling" (Off/MetalFX/Lanczos) w Inspectorze. Renderer nigdy go nie odczytywał: decyzja o blicie jest czysto geometryczna (przy renderowaniu z supersamplingiem ⇒ downsampling MPS-Lanczos w celu wygładzenia krawędzi, w przeciwnym razie bilinearnie), a dla ścieżki MetalFX w ogóle nie było miejsca wywołania. Picker i oba fałszywe komunikaty, które karmił, zostały usunięte; etykieta nakładki nazywa się teraz „Sampling", a nie „Scaling", i nigdzie w aplikacji nie skaluje się w górę za pomocą MetalFX. Samo pole pozostaje, ponieważ konfiguracja treningu jest zapisywana w całości — tkwi ono w każdej zapisanej scenie, w każdym presecie i w komentarzu ustawień już wyeksportowanych plików PLY; usunięcie spowodowałoby ciche pominięcie klucza przy ponownym zapisie i zepsucie tej wymiany danych. Z tego samego powodu pole jest wykluczone z porównania „Modified": stara scena może nosić true, i nie ma już żadnego sposobu, by zresetować to przez interfejs. Nikt tego nie odczytuje — nie podłączaj tego z powrotem.

T58mpsLanczosScaling

SZCZEGÓŁY

Domyślnie: false Zakres: boolean

TECHNICZNIE

⚠ Od 2026-07-18 wyłączone i bez żadnego efektu — zobacz T57 metalFXUpscaling, tam też wyjaśniono, dlaczego to pole mimo wszystko musi pozostać zapisywane. Warto wyraźnie wskazać oczywiste mylne wrażenie: aplikacja faktycznie używa MPS-Lanczos w viewporcie, ale steruje tym wyłącznie geometria — obraz renderowany z supersamplingiem jest downsamplowany w celu wygładzenia krawędzi. To jest skalowanie w dół, a nie w górę, i to pole nigdy go nie wywoływało.

T59livePreviewInterval

SZCZEGÓŁY

Domyślnie: 50 (inicjalizator; presety nie ustawiają tego pola) Zakres: 0 (wył.), 50, 250 lub 1 000 w pickerze ustawień

TECHNICZNIE

Jak często podczas treningu podgląd 3D jest aktualizowany aktualnymi Gaussianami. 50 = nowy render co 50 iteracji — wystarczająco dobrze, by obserwować postęp, nie spowalniając treningu w odczuwalny sposób. 0 = viewport w ogóle nie jest aktualizowany (trening w tle, maksymalne tempo). Przy długich przebiegach MCMC opłaca się 250 lub 1 000, ponieważ narzut aktualizacji sumuje się do zauważalnej wartości. Rola szczególna: pole to należy wprawdzie do konfiguracji treningu, ale jest ustawieniem ogólnoaplikacyjnym (Ustawienia → Trening) a nie częścią receptury treningowej. Dlatego jest wykluczone z porównania „Modified", zachowuje się przy zmianie presetu i od 2026-07-18 nie jest już przejmowane z pliku przy otwieraniu sceny — wcześniej wczytana scena po cichu zastępowała częstotliwość odświeżania użytkownika tą autora sceny, wliczając „Wył.", i nie było żadnego drugiego miejsca, z którego dałoby się ją odzyskać.

T60perceptualLossWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone) Zakres: 0 lub 0.001 – 0.5

TECHNICZNIE

Waga percepcyjnego składnika funkcji straty (dopasowywanie cech metodą multi-scale-blur). Uchwytuje podobieństwo strukturalne i teksturalne na wyższym poziomie niż L1+SSIM — typowo tam, gdzie „piksel w piksel" jest mniej istotne niż „wygląda realistycznie". Wartość we wszystkich presetach wynosi 0.0 (wył.). W interfejsie ustawiasz to suwakiem Perceptual Loss w sekcji Inspectora „Training", zakres od 0 do 0,20 z krokiem 0,01; przy 0 aplikacja wyświetla „Off".

Densyfikacja MCMC (T61–T73)

T61densificationStrategy

SZCZEGÓŁY

Domyślnie: .classic (Initializer + presety Classic), .mcmc (wszystkie presety MCMC + Scene-Class) Zakres: .classic lub .mcmc

TECHNICZNIE

Wybiera między Classic-Densification (klonowanie/podział/przycinanie, Kerbl et al.~2023) a MCMC-Densification (Stochastic Gradient Langevin Dynamics z relokacją, Kheradmand et al.~NeurIPS 2024). Przy .classic stosowane są T11–T16, przy .mcmc T62–T73. Uwaga przy zmianie: wartości domyślne Classic i MCMC są kalibrowane zupełnie inaczej — kto przełączy pole wyboru w widoku eksperckim bez załadowania odpowiedniego presetu, ryzykuje masową ekstynkcję w stylu buga z 1.4.3 (460 K → 5 w jednej iteracji, ponieważ MCMC-OpacityReg na poziomie 0.01 zabija Classic-Opacities). Dlatego wartości domyślne inicjalizacji MCMC są celowo „złagodzone" (wszystkie wartości Reg wynoszą 0.0).

T62mcmcMaxGaussians

SZCZEGÓŁY

Domyślnie: 150 000 (Initializer + .fullMCMC + .mcmcBalanced), 100 000 (.mcmcPreview), 1 500 000 (.fullMCMCMip — wariant Mip-Splatting z 10× budżetem), 1.19 M (.renderPreset), 1.25 M (.outdoorPreset), 670 K (.indoorPreset) Zakres: 0 (= „użyj pojemności bufora") lub 10 000 – 5 000 000 Zdefiniowano w:

TECHNICZNIE

Twarda górna granica liczby Gaussianów przy strategii MCMC. Liczba rośnie stopniowo o T70 mcmcGrowthRate (typowo 5 %) na krok relokacji, aż do osiągnięcia tego limitu. 150 K to dobra wartość wyjściowa — znacznie powyżej jakość splatów się rozrzedza (zbyt wiele małych, zbędnych Gaussianów), znacznie poniżej scena pozostaje niedostatecznie zdensyfikowana. Przy bardzo dużych scenach (np. lot dronem z 1 545 zdjęciami i 158 K SfM-init) 150 K jest za mało — stąd rozszerzenie z 1.4.5, T72 mcmcCapMultiplier + T73 mcmcAutoScaleByScene. Presety Scene-Class używają wartości specyficznych dla sceny, między 670 K (Indoor) a 1.25 M (Outdoor). Przy wartości 0 silnik używa pełnej pojemności bufora jako limitu.

T63mcmcNoiseScale

SZCZEGÓŁY

Domyślnie: 0.00005 (5e-5 = wartość domyślna z artykułu) Zakres: 1e-6 – 1e-3

TECHNICZNIE

Mnożnik szumu Gaussa, który jest dodawany do pozycji każdego Gaussiana w każdej iteracji MCMC (logika SGLD). Wyższy = więcej eksploracji (Gaussiany bardziej się przemieszczają, potencjalnie znajdują lepsze miejsca), niższy = więcej eksploatacji (Gaussiany pozostają tam, gdzie już są dobre). 5e-5 to odpowiednia wartość — wyraźnie mniejsza oznacza za mało eksploracji, wyraźnie większa (1e-4) za dużo, wtedy splaty się rozmywają. Jest stopniowo redukowany przez czas treningu (cosine-decay) aż do T69 mcmcNoiseDecayEnd — pod koniec zakresu decay szum jest efektywnie równy 0 i Gaussiany się stabilizują.

T64mcmcOpacityRegWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone w domyślnych ustawieniach RadianceKit, artykuł: 0.01) Zakres: 0 lub 0.001 – 0.05

TECHNICZNIE

Specyficzna dla MCMC kara L1 na opacity. Domyślna wartość z artykułu 0.01 (dociska nieużywane Gaussiany do zera, czyniąc je dostępnymi do relokacji). W RadianceKit wynik bez tej regularyzacji jest wymiernie lepszy. Powód: kryterium przycinania zdefiniowane przez T68 mcmcDeadOpacityThreshold wystarcza samo w sobie — dodatkowa kara L1 zmusza do „śmierci" także wartościowe Gaussiany o niskiej opacity. Stąd wartość domyślna 0. Uwaga: w wersji beta 1.4.3 wartość domyślna w inicjalizatorze była błędnie ustawiona na 0.01, co skutkowało bugiem masowej ekstynkcji (patrz wyjaśnienie do T61); od 1.4.4 poprawiona na 0.0.

T65mcmcScaleRegWeight

SZCZEGÓŁY

Domyślnie: 0.0 (= wyłączone, artykuł: 0.01) Zakres: 0 lub 0.001 – 0.05

TECHNICZNIE

Specyficzna dla MCMC kara L1 na wartości własne skali. Domyślna wartość z artykułu 0.01. Także tutaj wynik bez regularyzacji jest lepszy, z tego samego powodu co przy T64. Wyłączone we wszystkich presetach MCMC RadianceKit. Uwaga jak przy T64: bug z 1.4.3.

T66mcmcRelocationInterval

SZCZEGÓŁY

Domyślnie: 100 (Initializer + wszystkie presety MCMC, standard z artykułu), 155 (P9 Outdoor) Zakres: 50 – 500

TECHNICZNIE

Interwał iteracji, w którym MCMC relokuje martwe Gaussiany (sigmoid(opacity) < T68 mcmcDeadOpacityThreshold) do nowych pozycji. Krótsze interwały (np. 50) działają zbyt destrukcyjnie, funkcja strat waha się; wyraźnie dłuższe (np. 200) odbierają MCMC zdolność reakcji. 100 to właściwa wartość. Dla scen zewnętrznych jest ona nieco wyższa (155) — dłuższe interwały dają Adamowi więcej czasu na zintegrowanie nowo umieszczonych Gaussianów, zanim kolejne zdarzenie relokacji ponownie je obciąży.

T67mcmcWarmupIterations

SZCZEGÓŁY

Domyślnie: 500 Zakres: 100 – 5 000

TECHNICZNIE

Liczba iteracji początkowych, w których jeszcze nie zachodzi relokacja MCMC. Dopiero po tym rozgrzewaniu zaczyna się logika relokacji. Sens: w pierwszych iteracjach wartości opacity nie są jeszcze ustabilizowane — gdyby relokacja zaczynała się od razu, Gaussiany byłyby umieszczane w złych miejscach i musiałyby zaraz być ponownie przesunięte, co niszczy Adam-momentum. Domyślna wartość z artykułu to 500. RadianceKit przejmuje tę wartość, ponieważ okazała się solidna.

T68mcmcDeadOpacityThreshold

SZCZEGÓŁY

Domyślnie: 0.005 (Initializer, standard z artykułu), 0.01 (.fullMCMC i wszystkie presety MCMC) Zakres: 0.001 – 0.05

TECHNICZNIE

Próg sigmoid(Opacity), poniżej którego Gaussian uznawany jest za „martwy" i kwalifikuje się do relokacji. 0.01 to odpowiednia wartość — 0.005 zmienia niewiele, 0.02 jest gorsze. Wyższa wartość = bardziej agresywna relokacja (więcej Gaussianów jest przesuwanych), niższa = ostrożniejsza. 0.01 odpowiada w przybliżeniu „0.5% widoczności wizualnej". P10 Indoor używa 0.0142.

T69mcmcNoiseDecayEnd

SZCZEGÓŁY

Domyślnie: 0 (Initializer = „brak decay"), 160 000 (.fullMCMC = 80 % z 200K), 96 000 (.mcmcBalanced = 80 % z 120K), 40 000 (.mcmcPreview) Zakres: 0 lub 1 000 –

TECHNICZNIE

Iteracja, przy której szum T63 mcmcNoiseScale jest w pełni tłumiony do zera (cosine-decay od iteracji 0 do tego punktu). 80 % maxIterations to odpowiednia wartość — daje to MCMC wystarczająco czasu na eksplorację, ale pozostawia ostatnie 20 % na konwergencję bez szumu. 0 = stały szum przez wszystkie iteracje (rzadko sensowne, MCMC nie może wtedy zbiegać).

T70mcmcGrowthRate

SZCZEGÓŁY

Domyślnie: 0.05 (standard z artykułu = 5 %) Zakres: 0.01 – 0.2

TECHNICZNIE

Tempo wzrostu docelowej populacji MCMC na krok relokacji. Logika: przy każdym zdarzeniu relokacji docelowy rozmiar populacji zwiększany jest o (1 + growthRate), aż do osiągnięcia T62 mcmcMaxGaussians (lub wariantu przeskalowanego przez T72/T73). 0.05 to odpowiednia wartość — wyższe wartości prowadzą do zbyt szybkiego wzrostu (Gaussiany są wstawiane, zanim Adam-momentum zdąży je zintegrować), niższe do niedostatecznie zdensyfikowanych scen na końcu.

T71mcmcSigmoidK

SZCZEGÓŁY

Domyślnie: 100.0 Zakres: 10.0 – 500.0 Zdefiniowano w:

TECHNICZNIE

Parametr ostrości sigmoidy dla tłumienia szumu MCMC. W kroku SGLD szum dla poszczególnych Gaussianów jest tłumiony — wysoko-opakowe Gaussiany (których logit jest dodatni) otrzymują wykładniczo mniej szumu niż nisko-opakowe. K = 100 jest ostre, tzn. przejście od „pełnego szumu" do „braku szumu" następuje bardzo szybko w okolicach opacity 0.5. K = 100 to odpowiednia wartość — mniejsze wartości (10–50) pozwalają także wysoko-opakowym Gaussianom „drżeć" (niszczy to skonwergowane Gaussiany), większe (> 500) czynią przejście sztucznie twardym, a martwe Gaussiany w ogóle przestają się przesuwać.

T72mcmcCapMultiplier

SZCZEGÓŁY

Domyślnie: 3.0 (Initializer + .fullMCMC), 2.0 (.mcmcPreview), 2.5 (.mcmcBalanced), 2.98 (P8 Render), 5.32 (P9 Outdoor), 1.76 (P10 Indoor) Zakres: 0 (= wyłączone) lub 1.0 – 10.0

TECHNICZNIE

Funkcja z 1.4.5: adaptacyjne do sceny skalowanie limitu. Jeśli T73 mcmcAutoScaleByScene jest true, efektywny limit jest obliczany (przycięty do pojemności bufora). Tło: przy dużych scenach (np. lot dronem z 1 545 zdjęciami → 158 K SfM-init) T62 = 150 000 jest za niskie — kontrola gęstości w ogóle nie mogłaby rosnąć. Przy mnożniku 3.0 limit w tym przykładzie zostaje przeskalowany do 474 K (158 K × 3.0). Presety Scene-Class używają wartości specyficznych dla sceny: Outdoor korzysta z wysokiego mnożnika (5.32 → ~830 K limitu przy 156 K punktów początkowych), Indoor zadowala się 1.76 (ściany szybciej się nasycają). Pełne rozwiązanie limitu patrz metoda .

T73mcmcAutoScaleByScene

SZCZEGÓŁY

Domyślnie: true (Initializer + wszystkie presety MCMC) Zakres: boolean

TECHNICZNIE

Funkcja z 1.4.5: główny przełącznik dla logiki limitu uwzględniającej scenę (patrz T72 +). Jeśli false, jako limit używane jest wyłącznie T62 mcmcMaxGaussians (powrót do zachowania z 1.4.4). Domyślnie włączone, ponieważ w przeciwnym razie problemy z masową ekstynkcją przy dużych scenach z 1.4.3 by wracały. Wyłączaj ręcznie tylko wtedy, gdy chcesz wyraźnie ustawić twardy limit — np. by wytrenować wariant 150 K, którego rozmiar końcowy ma być przewidywalny.

Mip-Splatting (T74–T76)

Status: Mip-Splatting nie przyniósł w praktyce zysku jakościowego, a w niektórych scenach plenerowych wręcz zaszkodził. Pola pozostają opt-in do eksperymentów; we wszystkich dostarczanych presetach Mip-Splatting jest wyłączony.

T74useMipSplatting

SZCZEGÓŁY

Default: false (wszystkie presety produkcyjne), true (.fullMCMCMip — badawczy sibling) Range: boolean

TECHNICZNIE

Aktywuje Mip-Splatting (Yu et al.~CVPR 2024): filtr wygładzający 3D + filtr 2D + kompensacja α, który ogranicza częstotliwość per-Gaussian do granicy Nyquista najgęstszej częstości próbkowania kamer treningowych. Teoretyczny cel: eliminacja aliasingu przy renderowaniu w skalach poza treningową (0.5× lub 2× rozdzielczości treningowej). W shaderach preprocess i backward-projection jest aktywny i działa poprawnie. W praktyce jednak oczekiwany zysk jakościowy się nie pojawił: przy renderowaniu w rozdzielczości treningowej praktycznie nic się nie zmienia, a w scenach plenerowych obraz nawet się pogarsza. Jedno z wyjaśnień: wygładzanie 3D działa przeciwko relokacji MCMC, gdy w grze jest wiele Gaussianów. Pole pozostaje dostępne do własnych eksperymentów multi-scale.

T75mipSmoothing3DScale

SZCZEGÓŁY

Default: 0.2 (wartość domyślna z pracy naukowej) Range: 0.05 – 1.0

TECHNICZNIE

Parametr skali wygładzania 3D (Yu et al.~§3.3, domyślna wartość z pracy naukowej 0.2). Większa wartość = więcej wygładzania w przestrzeni świata na Gaussian (= więcej anti-aliasingu, ale też więcej rozmycia przy domyślnej skali), mniejsza = ostrzej, ale bardziej podatnie na aliasing. Jest brana pod uwagę tylko, gdy T74 useMipSplatting = true. Nie optymalizowana dalej — już przy domyślnej wartości z pracy naukowej 0.2 Mip-Splatting nie przynosi zysku.

T76mipFilter2DVariance

SZCZEGÓŁY

Default: 0.3 (= dokładnie dotychczasowe zachowanie) Range: 0.1 – 1.0

TECHNICZNIE

Wariancja filtra Mip 2D, dodawana do przekątnej Σ_2D (wariancja bezpośrednio, bez podnoszenia do kwadratu). 0.3 to dokładnie wartość, która przed Mip-Splatting była na stałe wpisana w kernelu. Gdy T74 useMipSplatting = false, kernel całkowicie ignoruje tę wartość i zapisuje zakodowane na stałe 0.3 — dzięki czemu dotychczasowe zachowanie z gwarancją się nie zmienia. Gdy jest włączony, używana jest wartość ustawiona tutaj. Pozostaje w katalogu pól do sweepów Mip.

Adaptive Densification (T77–T79)

T77adaptiveDensification

SZCZEGÓŁY

Domyślnie: false Zakres: boolean

TECHNICZNIE

Rolling-Median-Tracker jako alternatywa dla stałego T11 densifyGradThreshold. Jeśli true, w każdym kroku Densify aktualny próg jest nadpisywany wartością median(ostatnie N próbek avgGrad) × T79 adaptiveDensifyMultiplier. N = T78 adaptiveWindow. Bardziej rygorystyczne niż wariant p98 z T52, który uruchamia tam Mass-Pruning: mediana razy 2 w stanie ustalonym mieści się mniej więcej w p70–p80 rozkładu gradientów. Samo w sobie, włączone osobno, pole to nie przynosi zysku jakościowego; w połączeniu z curriculum (patrz T80/T81) już tak — tam to curriculum niesie zysk, a to pole raczej stabilność. Nie ma dla niego elementu sterującego: pole jest wyłączone we wszystkich presetach i można je ustawić tylko poprzez edytowany plik presetu.

T78adaptiveWindow

SZCZEGÓŁY

Domyślnie: 1 000 Zakres: 100 – 10 000 Zdefiniowane w:

TECHNICZNIE

Rolling-Median-Window w zdarzeniach Densification (NIE iteracjach — każdy krok T13 densifyInterval dostarcza jedną próbkę). Domyślnie 1 000 — oznacza to, że ostatnie 100 000 iteracji treningu wpływa na medianę, czyli zazwyczaj cała historia treningu do tego momentu. Wczesna faza (przed osiągnięciem T78 próbek): tracker zwraca nil → powrót do stałego progu T11. Istotne tylko gdy.

T79adaptiveDensifyMultiplier

SZCZEGÓŁY

Domyślnie: 2.0 Zakres: 1.0 – 4.0

TECHNICZNIE

Mnożnik dla rolling median wyznaczający próg adaptacyjny. Domyślne 2.0 odpowiada mniej więcej p70–p80 typowego rozkładu gradientów. Niższa wartość = bardziej agresywny wzrost (więcej klonów), wyższa = bardziej rygorystycznie (mniej klonów). W zakresie 1.5–3.0 wartość 2.0 jest najlepsza. Istotne tylko gdy.

Curriculum (T80–T81)

T80curriculumResolutionRamp

SZCZEGÓŁY

Domyślnie: false Zakres: boolean

TECHNICZNIE

Rozdzielczość treningowa zaczyna się od 0.5× i przełącza się przy T50 positionLRScheduleEndIteration / 2 (lub T1 maxIterations / 2, jeśli T50 nie jest ustawione) na T22 trainingRenderScale. Nadpisuje T23 resolutionWarmupScale, jeśli aktywne. Z dwóch adaptacyjnych dodatków (patrz T77) to właśnie ten program treningowy przynosi rzeczywisty zysk jakości — stopniowe zwiększanie rozdzielczości daje aplikacji czas na znalezienie zgrubnej geometrii w niższej rozdzielczości, zanim przejdzie do dopracowywania drobnych detali. Nie da się tego zmienić w interfejsie — tylko poprzez edytowany plik presetu, i wtedy sensownie razem z T81.

T81curriculumSHProgression

SZCZEGÓŁY

Domyślnie: false Zakres: boolean

TECHNICZNIE

Nadpisuje T21 shDegreeUpgradeIterations wartościami [maxIter/4, maxIter/2, maxIter*3/4], rozkładając więc podwyższenia stopnia SH równomiernie na cały czas treningu zamiast ładować je na początek. Hipoteza: stabilna geometria zostaje ustalona przed eksplozją szczegółów koloru, co precyzyjniej pozycjonuje efekty połysku zależne od kierunku patrzenia. W połączeniu z T77 przynosi to zysk w niektórych scenach; niesie go to pole, samo T77 nie wystarczy. Nie da się tego zmienić w interfejsie — tylko poprzez edytowany plik presetu.

Statyczne presety (TP1–TP9)

Tutaj tylko strukturalne różnice względem domyślnych wartości Initializera. Pełny opis marketingowy jedenastu presetów UI P1–P11 znajdziesz w rozdziale 7.

TP1.preview

SZCZEGÓŁY

Preset diagnostyczny/podglądowy dla systemów ≥ 10 GB RAM. Zmiany względem Initializera:

  • maxIterations 30 000 → 5 000
  • densifyUntilIteration 15 000 → 3 500 (70 % maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× wyższe, mniej agresywny zanik)
  • shDCLearningRate, shRestLearningRate, opacityLearningRate, scaleLearningRate, rotationLearningRate każdorazowo 2×
  • opacityResetInterval 3 000 → 100 000 (efektywnie wyłączone — reset niszczyłby krótkie treningi)
  • shDegreeUpgradeIterations [1K, 2K, 3K][1K, 2K] (stopień 3 nie zdąży się zbiec w tak krótkim przebiegu)
  • trainingRenderScale 1.0 → 0.5

TP2.full

SZCZEGÓŁY

Klasyczny preset produkcyjny najwyższej jakości. Zmiany:

  • maxIterations 30 000 → 35 000 (powyżej grozi przetrenowanie: więcej Gaussianów bez zysku jakościowego)
  • densifyUntilIteration 15 000 → 5 000 (sprawdzona wartość; późniejsze zatrzymanie daje gorsze wyniki)
  • Wszystkie LR ×2
  • positionLearningRateFinal 1.6e-6 → 1.6e-5 (10× wyższe niż domyślna wartość z papieru)
  • densifyGradThreshold 2e-6 → 1.1e-6 (skalibrowane dla rozdzielczości 1.0×)
  • densifyInterval 100 → 200
  • pruneOpacityThreshold 0.005 → 0.001
  • opacityResetInterval 3 000 → 100 000 (efektywnie wyłączone)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K] (opóźnione podwyższanie stopnia)
  • opacityDecayFactor 0.0 → 0.9995 (schemat HTGS, wyraźny zysk jakościowy)
  • opacityDecayInterval 50 (bez zmian)
  • mergeAfterDensification false → true
  • positionLRScheduleEndIteration 0 → 20 000
  • postTrainingCompactification true (już domyślnie w Initializerze dla .full)

TP3.fullClassicPaper

SZCZEGÓŁY

Wariant TP2 wierny oryginalnemu papierowi, klasyczny. Zmiany względem TP2:

  • maxIterations 35 000 → 30 000 (standard z papieru)
  • densifyUntilIteration 5 000 → 15 000 (papier: 50 % maxIter)
  • positionLearningRateFinal 1.6e-5 → 1.6e-6 (wartość domyślna z papieru)
  • opacityLearningRate, scaleLearningRate, rotationLearningRate z powrotem na wartości domyślne z papieru (0.05, 0.005, 0.001)
  • densifyGradThreshold 1.1e-6 → 2e-7 (skalibrowane dla ~1–2 M Gs na scenie Bicycle)
  • densifyInterval 200 → 100 (papier)
  • pruneOpacityThreshold 0.001 → 0.005 (wartość domyślna z papieru)
  • opacityResetInterval 100 000 → 3 000 (papier §5.2, ryzykowne — w konfiguracji RadianceKit kosztuje to jakość)
  • opacityDecayFactor 0.9995 → 0.0 (papier nie stosuje zaniku)
  • positionLRScheduleEndIteration 20 000 → 30 000 (cosine przebiega przez 100 % maxIter)

TP4.fullMCMC

SZCZEGÓŁY

Produkcyjny preset MCMC najwyższej jakości. Zmiany względem Initializera:

  • maxIterations 30 000 → 200 000 (MCMC potrzebuje około 5× więcej iteracji niż Classic)
  • densifyUntilIteration 15 000 → 160 000 (80 % maxIter)
  • positionLearningRateFinal 1.6e-6 → 1.6e-5
  • Harmonogram LR jak w TP2 (wszystkie ×2)
  • ssimWeight 0.2 → 0.05 (MCMC potrzebuje silniejszego sygnału L1)
  • shDegreeUpgradeIterations [1K, 2K, 3K][2K, 5K, 8K]
  • densificationStrategy .classic.mcmc
  • mcmcMaxGaussians 150 000 (już w Initializerze, potwierdzone w presecie)
  • mcmcNoiseScale 5e-5 (wartość z papieru, sprawdzona)
  • mcmcDeadOpacityThreshold 0.005 → 0.01
  • mcmcNoiseDecayEnd 0 → 160 000 (80 % maxIter)
  • mcmcCapMultiplier 3.0 (już w Initializerze)
  • mcmcAutoScaleByScene true (już w Initializerze)
  • opacityResetInterval 3 000 → 200 000 (efektywnie wyłączone, MCMC używa Reloc zamiast resetu)

TP5.fullMCMCMip

SZCZEGÓŁY

Wariant TP4 z Mip-Splatting i budżetem Gaussianów z oryginalnego papieru. Zmiany względem TP4:

  • mcmcMaxGaussians 150 000 → 1 500 000 (10×, rząd wielkości z papieru)
  • useMipSplatting false → true (Mip włączony)

TP6.classicBalanced

SZCZEGÓŁY

Klasyczny preset średniej klasy. Zmiany względem TP2:

  • maxIterations 35 000 → 20 000 (daje praktycznie taki sam efekt jak 30 000, przy zauważalnie krótszym czasie oczekiwania)
  • positionLRScheduleEndIteration 20 000 → 0 (cosine przebiega do maxIter = 20K, bez wydłużonej fazy)

TP7.mcmcPreview

SZCZEGÓŁY

Diagnostyka MCMC. Zmiany względem 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 (podgląd skaluje bardziej powściągliwie)

TP8.mcmcBalanced

SZCZEGÓŁY

MCMC średniej klasy. Zmiany względem TP4:

  • maxIterations 200 000 → 120 000
  • densifyUntilIteration 160 000 → 96 000 (80 %)
  • mcmcNoiseDecayEnd 160 000 → 96 000 (80 %)
  • mcmcCapMultiplier 3.0 → 2.5 (pomiędzy 2.0 z Preview a 3.0 z Full)

TP9.quickTest

SZCZEGÓŁY

Czysty test funkcjonalny. Zmiany względem Initializera:

  • maxIterations 30 000 → 1 000
  • densifyUntilIteration 15 000 → 500
  • densifyGradThreshold 2e-6 → 4e-6 (skalibrowane dla rozdzielczości 0.25×)
  • densifyInterval 100 → 50
  • opacityResetInterval 3 000 → 100 000 (wyłączone, bo czas trwania jest zbyt krótki)
  • trainingRenderScale 1.0 → 0.25

Jak aplikacja wyznacza limit Gaussianów

Wiążąca odpowiedź na pytanie „ile Gaussianów maksymalnie może wygenerować MCMC?". Wchodzą tu w grę trzy wielkości: ustawiona wartość z T62 mcmcMaxGaussians, liczba punktów startowych SfM twojej sceny oraz wcześniej zarezerwowana pojemność bufora. Aplikacja liczy w następującej kolejności:

+ Wartością wyjściową jest T62. Jeśli wynosi 0, aplikacja wstawia 150 000 — to bezpieczne minimum zapobiega incydentowi masowego wymierania z 1.4.3. + Jeśli T73 mcmcAutoScaleByScene jest włączone i T72 mcmcCapMultiplier większy niż 0, aplikacja porównuje wartość wyjściową z „punkty startowe × T72" i przyjmuje większą z tych dwóch wartości. + Na koniec ogranicza wynik do pojemności bufora.

Przykład: Bicycle (Mip-NeRF 360, 194 klatki zdjęciowe) → inicjalizacja SfM ~156 tys. punktów, T62 = 150 000, T72 = 5.32, auto-skalowanie włączone, pojemność bufora 8 mln. 156 tys. × 5,32 daje 830 tys., czyli więcej niż 150 000 i mniej niż 8 mln — efektywny limit wynosi więc 830 tys. Tej granicy trzyma się relokacja MCMC.

Oblicza rzeczywistą maksymalną liczbę splatów przy MCMC. Aplikacja bierze twoje ustawienie „Max Gaussians", sprawdza, ile punktów ma twoja scena na początku, i skaluje to mnożnikiem, jeśli włączone jest „Auto-scale by scene". Dzięki temu limit dostosowuje się do sceny, zamiast wymuszać tę samą wartość dla małej i ogromnej sceny. Nie musisz nic robić — aplikacja sama to wylicza na starcie treningu.

Które pole do czego? (ściąga)

CelPola do regulacji
Więcej szczegółów w oddaliT62 mcmcMaxGaussians w górę, T72 mcmcCapMultiplier 5+
Więcej szczegółów ogólnie (Classic)T1 maxIterations w górę (≤ 40K), T2 densifyUntilIteration ≤ 14 % wartości T1
Redukcja unoszących się artefaktów w nagraniach z dronaT43 frustumCullEnabled wł., T20 skyMaskingEnabled wł., T45 skyDomeEnabled wł.
Ładne niebo w scenach plenerowychT45 skyDomeEnabled wł., T47 skyDomeRadiusMultiplier 30–60
Mniejszy plik eksportustrategia .mcmc (T61), T56 postTrainingCompactification wł., T62 mcmcMaxGaussians ≤ 200K
Szybszy treningT22 trainingRenderScale 0.5, T1 maxIterations o połowę mniej — ale nie oba naraz!
Lepsze rozbłyski światłaT21 shDegreeUpgradeIterations z [2K, 5K, 8K] (bez wczesnego przeciążenia), MCMC + 200K iteracji
Częstszy podgląd na żywoT59 livePreviewInterval na 50 — najgęstsza wartość oferowana przez Ustawienia → Trening
Łagodniejsze przejścia przy cieniachT17 ssimWeight nieco wyższe (0.15–0.25), ale nie ponad 0.3
Utrzymanie kompaktowości wnętrzPreset P10 Wnętrza (, T72 = 1.76)

Niebezpieczne pola

Te pola mogą przy błędnej konfiguracji prowadzić do OOM, awarii aplikacji, masowego wymierania Gaussians lub bezużytecznych danych benchmarkowych. Do traktowania z ostrożnością:

- T11 densifyGradThreshold — zmniejszenie o połowę może wygenerować 2–4× tyle Gaussians, co szybko wysadza pamięć GPU. Trzeba też uważać: musi pasować do T22 trainingRenderScale (1.0× → 1e-6, 0.5× → 2e-6, 0.25× → 4e-6). - T72 mcmcCapMultiplier — przy dużych scenach z > 200 K punktów inicjalizacyjnych SfM i mnożnikiem > 5 powstaje rozwiązany limit (Resolved-Cap) rzędu milionów Gaussians. Na Makach z 36 GB RAM możliwy jest OOM. Wartość 5.32 dla scen plenerowych działa tylko dlatego, że powiązana scena referencyjna ma około 156 K punktów inicjalizacyjnych → limit 830 K. - T39 testViewIndices — ręczne ustawienie w pliku Preset może uczynić pomiar jakości bezużytecznym (wszystkie indeksy > N → brak danych wstrzymanych/holdouts). Zostaw listę pustą. - T64 mcmcOpacityRegWeight i T65 mcmcScaleRegWeight — W wersji 1.4.3-beta ustawione na 0.01, co prowadziło do masowego wymierania (460 K → 5 Gaussians w jednej iteracji). Od wersji 1.4.4 na stałe ustawione na 0.0, ale ręczne zwiększenie może odtworzyć ten problem. - T15 opacityResetInterval — jeśli nie wynosi 100 000+ (czyli efektywnie wyłączone), a trening trwa krócej niż 10 000 iteracji, reset niszczy zbieżność. Dlatego .preview ma ustawione 100 000 mimo maxIterations = 5 000. - T54/T55 densifyPhase2* — Druga faza densyfikacji kończy się kaskadą aż do zera Gaussians. Zostaw oba na 0. - T74 useMipSplatting — nie daje przyrostu jakości, a w niektórych scenach plenerowych może wręcz pogorszyć jakość obrazu. Domyślnie wyłączone, opt-in tylko do eksperymentów.

Jeśli jakieś pole znajduje się na tej liście, a chcesz je zmienić, zrób najpierw kopię zapasową swojego aktualnego Presetu (eksport jako JSON) i zastanów się, czy będziesz w stanie odtwarzalnie zmierzyć wynik — w przeciwnym razie później nie będziesz wiedzieć, czy doprowadziłeś do poprawy, czy pogorszenia.