Rozdział 2 — Inspector (Expert View)

Pusty Inspector przed importem: Lewy pasek boczny pokazuje licznik Images 0 i wskazówkę „Drop images here / or tap + to import". Inspector po prawej jest w pełni funkcjonalny, ale ustawienia wstępne są tylko informacyjne (brak aktywnego treningu). Domyślne ustawienie „Preview" (5K iter.) jest oznaczone. Camera Alignment na Apple Photogrammetry, Densification Classic, SSIM Weight 0.20, Render Scale 50%. Stany puste w Training Metrics („Start training to see live metrics") i Loss History („Loss curve will appear during training").

Inspector po imporcie: Status nagłówka „60 images ready". Pasek obrazów listuje wszystkie 60 zaimportowanych klatek (frame_0001.jpg do frame_0945.jpg, każda 16. klatka z zestawu 960-Cam-Bouquet jako podzbiór do szybkich iteracji). Logika Auto-Render-Scale sprawdza rozdzielczość obrazu (1536×2048 = 3.1 MP) i odpowiednio dostosowuje Render Scale. Przycisk Play (zielony, dolny lewy) jest teraz aktywny i startuje trening z aktywnym ustawieniem wstępnym.

Inspector podczas treningu: Pasek tytułu pokazuje globalny postęp „RadianceKit — Training NN %". Widok renderuje działającą rekonstrukcję gaussianów w czasie rzeczywistym (aktualizowane co 50 iteracji — interwał Live-Preview ustawialny w Settings → General → Training → Live Preview). Pasek metryk pod widokiem: bieżący Loss, Learning Rate, liczba gaussianów i licznik iteracji (np. 1,600/5,000 przy ustawieniu Preview). Karta ustawienia „Preview" w Inspectorze nosi odznakę „Modified", gdy tylko jakiś parametr odbiega od domyślnej wartości wbudowanej. Pasek boczny „Log" zbiera zdarzenia etapów SfM i treningu.

Inspector po treningu: Pasek tytułu pokazuje finalną liczbę gaussianów (tutaj 2 991 — bardzo zwarte, ponieważ syntetyczna scena bukietu z Blendera na jasnym tle ma prostą geometrię). Widok pokazuje gotową chmurę punktów — orbitalna nawigacja przeciągnięciem aktywna (obraca wokół środka sceny). Sekcja Training Metrics jest teraz wypełniona wartościami finalnymi, wykres Loss History pokazuje przebieg wszystkich 5 000 iteracji. Sekcja eksportu poniżej jest teraz aktywna (wszystkie przyciski formatów włączone).
Inspector to prawy pasek boczny w Expert Mode (⌘2). Skupia wszystkie parametry istotne dla treningu w pięciu zwijalnych sekcjach: Presets, Konfiguracja treningu, Enhancements, Metryki i wykres straty. Każdą sekcję można zwinąć kliknięciem na nagłówku, kolejność zmienić przeciągnięciem (InspectorView.swift:81-97). Domyślnie wszystkie sekcje są widoczne, stan aplikacji zapisuje preferencje zwinięcia i kolejności między uruchomieniami.
Szereg kontrolek z Inspectora pojawia się w niemal identycznej formie również w ustawieniach (rozdział 3) — typowo backend SfM, Sky-Masking i podobne wartości domyślne. Rozdział jest celowy: ustawienia dostarczają globalny szablon aplikacji dla nowotworzonych projektów, Inspector nadpisuje te wartości dla bieżącego otwartego projektu. Kto raz zna logikę obsługi jednej strony, może drugą używać na ślepo.
Lewa kolumna w Expert Mode — Project Navigator — nie należy do Inspectora, ale jest jego bezpośrednim sąsiadem. Tam można wybierać zaimportowane obrazy kliknięciem, oglądać spacją w Quick-Look i usuwać przyciskiem minus lub klawiszem Delete (z Cmd-Z do cofania). Inspector podąża za bieżącą selekcją paska bocznego z kontekstowymi informacjami szczegółowymi, pięć głównych sekcji pozostaje jednak zawsze widoczne.
Sekcja Presets (I1–I11)
Sekcja Presets to najszybsza droga do zastosowania przetestowanej konfiguracji. Wbudowane ustawienia (Classic, MCMC, Scene-Class) dostarczają powtarzalne punkty startowe z 560+ udokumentowanych eksperymentów; własne ustawienia można zapisywać, eksportować, importować i udostępniać. Lista jest pogrupowana według kategorii (Classic, MCMC, SceneClass, Custom), a więcej niż jedna kategoria może być rozwinięta jednocześnie. Przez mechanizm menu kontekstowego (prawy klik na wierszu) dostępne są eksport, duplikowanie i — przy własnych ustawieniach — usuwanie.
I1Przycisk Save...
GDZIE
Inspector → sekcja Presets → przycisk Save... (pasek akcji na dole).
TECHNICZNIE
Otwiera popover z polem tekstowym i przyciskami Save/Cancel. Bieżący stan TrainingConfig jest persistowany jako nowe ustawienie zdefiniowane przez użytkownika (kodowane JSON, zapisywane na poziomie aplikacji). Proces zapisu kopiuje wszystkie 81 parametrów treningu plus bieżącą strategię densyfikacji. Ustawienie automatycznie ląduje w kategorii Custom, niezależnie od tego, z którego wbudowanego ustawienia zostało wyprowadzone. Puste nazwy i wejścia tylko z białymi znakami są odrzucane. Istniejące już nazwy nie są odrzucane — każde ustawienie ma własny wewnętrzny ID, podwójne nazwy są technicznie dozwolone, ale praktycznie mylące.
I2Pole tekstowe Preset Name
GDZIE
Popover Save → pole tekstowe „Preset Name".
TECHNICZNIE
Proste pole tekstowe z zaokrągloną ramką, szerokie. Wartość jest przejmowana jako nazwa ustawienia przy kliknięciu na przycisk Save. Brak ograniczenia długości w UI, ale zapisana nazwa musi być kodowalna JSON i przedstawialna w listach UI — emoji i znaki diakrytyczne działają. Zawartość jest automatycznie resetowana do pustego stringa przy otwarciu popovera. Przycisk Save pozostaje dezaktywowany, dopóki pole jest puste po przycięciu. Brak Auto-Suggest i brak preset domyślnych z nazwą aktualnie aktywnego ustawienia.
I3Przycisk Cancel (Save-Dialog)
GDZIE
Popover Save → przycisk Cancel (po lewej).
TECHNICZNIE
Zamyka popover bez zapisywania. Odrzuca zawartość pola tekstowego — przy następnym otwarciu jest znów resetowany do pustego przez logikę przycisku Save... (I1). Standardowy styl przycisku, brak dialogów potwierdzenia, brak skrótów. Bieżący TrainingConfig pozostaje niezmieniony, ponieważ ścieżka Save w ogóle nie została wykonana.
I4Przycisk Save (Save-Dialog)
GDZIE
Popover Save → przycisk Save (po prawej, prominentny styl).
TECHNICZNIE
Wyzwala właściwe persistowanie. Waliduje jeszcze raz niepustą nazwę (defensywne sprawdzenie) i wtedy zapisuje bieżący TrainingConfig jako JSON do pamięci aplikacji. Następnie zamyka popover. Wyróżniony niebieskim, wyszarzony dopóki pole tekstowe jest puste. Jeśli zapis się nie uda (np. ponieważ pamięć aplikacji jest pełna — bardzo nieprawdopodobne), obecnie nie ma widocznego dialogu błędu; ustawienie po prostu nie pojawiłoby się przy następnym starcie aplikacji.
I5Przycisk Export...
GDZIE
Inspector → sekcja Presets → pasek akcji → przycisk Export...
TECHNICZNIE
Eksportuje aktualnie wybrane ustawienie jako plik .radiancepreset (wewnętrznie JSON). Dezaktywowany, gdy nie ma wybranego ustawienia. Przy kliknięciu aplikacja otwiera dialog Save z predefiniowaną nazwą pliku (nazwa ustawienia + rozszerzenie .radiancepreset). Zapisany format zawiera kompletny TrainingConfig plus metadane (nazwa, kategoria, ID, flaga Built-in). Podwójne kliknięcie w Finderze otwiera aplikację — ale nie automatycznie import; użytkownik musi użyć przycisku Import (I6).
I6Przycisk Import...
GDZIE
Inspector → sekcja Presets → pasek akcji → przycisk Import...
TECHNICZNIE
Otwiera dialog pliku dopuszczający tylko pliki .radiancepreset (wybór wielu dezaktywowany). Przy wybraniu plik JSON jest ładowany, walidowany i wstawiany do kategorii Custom — z nowym wewnętrznym ID, by nie powstały kolizje z wbudowanymi. Import automatycznie ustawia kategorię na Custom, nawet jeśli wyeksportowane ustawienie pierwotnie było np. wbudowane. Uszkodzone lub niezgodne ze starszą wersją schematu pliki są po cichu odrzucane, bez dialogu błędu (log konsoli daje jednak informację).
I7Wiersz ustawienia (aktywacja kliknięciem)
GDZIE
Inspector → sekcja Presets → każdy wiersz ustawienia w każdej kategorii.
TECHNICZNIE
Kliknięcie na wiersz ustawienia zastępuje wszystkie pola TrainingConfig wartościami z ustawienia, zapamiętuje ID aktywnego ustawienia i resetuje status Modified. Aktywne ptaszki przed wierszem pojawiają się tylko, gdy ustawienie jest wybrane I niezmodyfikowane. Gdy tylko wartość w TrainingConfig zostanie zmieniona (suwak, stepper, przełącznik w innych sekcjach Inspectora), za nazwą pojawia się pomarańczowa odznaka „Modified". Wbudowane ustawienia nie mogą być nadpisywane — przy modyfikacji trzeba przez przycisk Save (I1) założyć własną kopię.
I8Menu kontekstowe „Export..."
GDZIE
Prawy klik na każdy wiersz ustawienia → pierwsza pozycja „Export...".
TECHNICZNIE
Identyczna funkcjonalność jak I5 (przycisk Export...), ale wygodniej dostępna — bez konieczności wcześniejszego zaznaczenia ustawienia. Eksportuje bezpośrednio ustawienie klikniętego wiersza. Działa dla wszystkich kategorii ustawień równo (wbudowane lub Custom), bez ograniczenia. Eksport zawiera flagę Built-in i oryginalną kategorię, ale przy reimporcie kategoria jest mapowana na Custom, jak opisano w I6.
I9Menu kontekstowe „Duplicate"
GDZIE
Prawy klik na każdy wiersz ustawienia → druga pozycja „Duplicate".
TECHNICZNIE
Klonuje ustawienie do kategorii Custom. Tworzy nowy wewnętrzny ID, dokleja „ Copy" do nazwy i zapisuje kopię. Działa także dla wbudowanych ustawień — klon jest wtedy edytowalny. Oryginał pozostaje nietknięty. TrainingConfig jest kopiowany wartość po wartości (JSON roundtrip), tak by nie istniały referencyjne powiązania między oryginałem a kopią.
I10Menu kontekstowe „Delete"
GDZIE
Prawy klik na własne wiersze ustawień → ostatnia pozycja „Delete" (czerwony, destrukcyjny).
TECHNICZNIE
Widoczna tylko dla ustawień Custom. Wbudowanych nie można usuwać. Pozycja jest oznaczona jako destrukcyjna, pojawia się w menu kontekstowym na czerwono i jest oddzielona dzielnikiem, aby nie klikać jej przypadkowo. Nie ma żadnego dialogu potwierdzenia — jedno kliknięcie usuwa ustawienie natychmiast. Usunięte ustawienie nie jest do odzyskania (Cmd-Z tu nie działa — Undo istnieje w bieżącym buildzie tylko dla listy obrazów, nie dla operacji na ustawieniach). Jeśli usunięte ustawienie było właśnie aktywne, bieżący TrainingConfig pozostaje niezmieniony, tylko aktywny wybór ustawienia jest wyzerowany.
I11Nagłówek kategorii (zwijanie/rozwijanie)
GDZIE
Inspector → sekcja Presets → każdy nagłówek kategorii (Classic, MCMC, SceneClass, Custom).
TECHNICZNIE
Status zwinięcia na kategorię z różnymi domyślnymi: Classic startuje rozwinięte, MCMC, SceneClass i Custom startują zwinięte. Status nie jest persistowany — przy restarcie aplikacji wszystkie kategorie są znów w stanie domyślnym. Strzałka chevron rotuje z animacją. Liczba po prawej w nagłówku pokazuje liczbę ustawień w tej kategorii. Obszar trafienia kliknięcia obejmuje cały obszar nagłówka.
Sekcja Konfiguracja treningu (I12–I22)

Tu lądują centralne dźwignie: który backend SfM ma liczyć, jak działa densyfikacja, ile iteracji, jak duża waga SSIM. Przy strategii MCMC pojawiają się dwa dodatkowe przełączniki („MCMC Quality" i „Auto-scale by scene"), ukryte w trybie Classic. Przy backendzie Native SfM dochodzi pole FOV-Override, używane tylko dla klatek wideo bez ogniskowej EXIF.
I12Selektor Camera Alignment
GDZIE
Inspector → Konfiguracja treningu → Camera Alignment (selektor segmentowy u góry).
TECHNICZNIE
Selektor segmentowy z dwiema opcjami: Apple Photogrammetry i Native (Beta). Wybór określa używany backend SfM przy następnej rekonstrukcji kamer. Wpływa jednocześnie na to, które inne elementy Inspectora są widoczne: Native pokazuje dodatkowo FOV-Override (I13), potrzebny tylko przy klatkach wideo bez EXIF. Wskazówka: dla bardzo dużych ujęć plenerowych możesz wczytać wynik zewnętrznego narzędzia (Metashape lub COLMAP) przez import workspace — zobacz rozdział 1 (M5) i rozdział 9 (Q3, Q6).
I13Pole FOV Override (Native SfM)
GDZIE
Inspector → Konfiguracja treningu → FOV Override (widoczne tylko przy Camera Alignment = Native).
TECHNICZNIE
Numeryczne pole tekstowe (zakres 0-170°), domyślnie 0 = automatyczne ustalenie z EXIF lub heurystyki. Ręczne wpisanie jest potrzebne, gdy obrazy wejściowe zostały wyekstrahowane z wideo bez metadanych ogniskowej. Typowe wartości: iPhone Wide ≈ 73°, DJI Mavic Wide-Crop ≈ 70°, dron z sensorem pełnoklatkowym ≈ 84°. Wartość jest ograniczana do [0, 170] — wartości poza są bezpośrednio cofane. Wpływa tylko na natywny potok SfM (Q4/Q5); Apple Photogrammetry kompletnie ignoruje tę wartość.
I15Selektor Densification
GDZIE
Inspector → Konfiguracja treningu → Densification (selektor segmentowy, zawsze widoczny).
TECHNICZNIE
Przełącza między dwiema strategiami densyfikacji: Classic (oryginalna procedura 3DGS z Clone/Split/Prune i progiem gradientu) i MCMC (Stochastic Gradient Langevin Dynamics z relokacją, NeurIPS 2024). Przy zmianie z Classic na MCMC aplikacja automatycznie ustawia specyficzne dla MCMC pola na sprawdzone wartości domyślne (Reg-Weights = 0, MCMC-Cap-Multiplier 3.0, harmonogram Sample/Noise). Bez tej automatycznej inicjalizacji sesje ze starymi ustawieniami cierpiały na błąd 1.4.4-MCMC-Collapse (460K→5 gaussianów, kill watchdoga). Wybór selektora dodatkowo określa, które elementy Inspectora są widoczne — przy MCMC pojawiają się I16/I17. Szczegółowe działanie pól w rozdziale 6, T11–T16 (Classic) i T61–T73 (MCMC).
I16Przełącznik MCMC Quality
GDZIE
Inspector → Konfiguracja treningu → MCMC Quality (tylko przy Densification = MCMC).
TECHNICZNIE
Przełącza Gradient-Accumulation na 2 kroki (aktywne) lub 1 krok (nieaktywne). Akumuluje gradienty z dwóch następujących po sobie widoków kamery, zanim wykonany zostanie krok optimizera. Empirycznie (Session 33, V544a) redukuje to finalny błąd L1 o ok. 6% (0.0246 z Quality vs 0.0261 bez, przy uśrednieniu 3 prób na Horse-Full-MCMC). Cena: podwojony czas treningu. Przy bardzo długich treningach (200K iteracji) prowadzi to do dodatkowych 10+ minut oczekiwania — więc opłaca się tylko, gdy ostatnie parę procent jakości naprawdę jest potrzebne. Wpływa tylko na trening, nie na format eksportu czy prezentację widoku.
I17Przełącznik Auto-scale by scene
GDZIE
Inspector → Konfiguracja treningu → Auto-scale by scene (tylko przy MCMC).
TECHNICZNIE
Gdy aktywny, skaluje efektywną górną granicę Max-Gaussians ze SfM-Init-Point-Count × MCMC-Cap-Multiplier (domyślnie 3.0). Przykład: SfM dostarcza 250K punktów początkowych, podstawowy cap = 150K, multiplier 3.0 → efektywna górna granica = max(150K, 750K) = 750K. Gdy dezaktywowany, ściśle obowiązuje tylko podstawowy. Wprowadzone dla v1.4.5, ponieważ duże ujęcia plenerowe z ponad 1000 klatkami i odpowiednio wysoką gęstością punktów SfM przy sztywnym domyślnym 150K-Cap zagłodziły densyfikację — nadmiarowe punkty zostały, nowe nie mogły powstać. Domyślnie OFF w ustawieniach Custom, ON w wbudowanych MCMC. Wpływa tylko na czas treningu, nie na eksport.
I18Stepper Max Iterations
GDZIE
Inspector → Konfiguracja treningu → GroupBox → Max Iterations.
TECHNICZNIE
Stepper z zakresem 1 000–100 000, krok 1 000. Określa łączną liczbę iteracji optimizera. Liniowo skorelowane z czasem treningu (połowa = ok. 50% czasu). Empiryczne sweet spoty: 20K (Classic Balanced, L1≈0.028), 40K (Classic Quality, L1≈0.023), 200K (MCMC Full, L1≈0.0246). Powyżej 40K przy Classic średnio daje zaledwie poprawę — Diminishing Returns. Przy zmianie, jeśli funkcja Link (I19) jest aktywna, Densify Until jest proporcjonalnie podciągany (domyślny stosunek: 0.5, tj. Densify-Until = Max/2).
I19Przycisk Link/Unlink (Densify ↔ Iterations)
GDZIE
Inspector → Konfiguracja treningu → GroupBox → mały przycisk Link między Max Iterations a Densify Until.
TECHNICZNIE
Przycisk przełączający, który zamraża stosunek Densify Until do Max Iterations. Przy aktywnym (ikona Link wyróżniona) przy każdej zmianie Max Iterations Densify Until jest proporcjonalnie podciągany. Przy Unlink (ikona Link-Plus) wartości pozostają niezależne. Domyślnie linked, ponieważ odzwierciedla to typową korelację — gdy ciągniesz trening na podwójne iteracje, zwykle chcesz też densyfikację proporcjonalnie dłużej. Stosunek jest obliczany przy ustawieniu przycisku Link z bieżącej wartości; typowy stosunek to 0.5 (Densify-Until = połowa liczby iteracji).
I20Stepper Densify Until
GDZIE
Inspector → Konfiguracja treningu → GroupBox → Densify Until.
TECHNICZNIE
Stepper z zakresem 500–50 000, krok 500. Określa indeks iteracji, od którego nie dochodzą nowe gaussiany przez Clone/Split (Classic) lub relokację (MCMC). Po osiągnięciu udoskonalane są tylko pozycja i kolor. Wyższe wartości = więcej gaussianów = większy plik, dłuższy czas na iterację (+30-60% GPU-Time na krok). Typowe wartości: 15K (dla 30K Max-Iter), 20K (dla 40K), 100K (dla 200K MCMC). Przy aktywnym Link (I19) automatycznie skalowane razem. Inaczej wpływa przy Classic vs MCMC: Classic zatrzymuje całkowicie wzrost, MCMC zatrzymuje logikę relokacji, ale adaptacja Sample/Noise działa dalej.
I21Suwak SSIM Weight
GDZIE
Inspector → Konfiguracja treningu → GroupBox → SSIM Weight.
TECHNICZNIE
Suwak 0.0–1.0 w krokach 0.05, wyświetlanie jako „0.20". Miesza L1-Loss (0.0) i SSIM-Loss (1.0). L1 napina jasność na piksel, SSIM podobieństwo strukturalne (krawędzie, lokalne statystyki). Domyślnie 0.2 to wartość z oryginalnego artykułu 3DGS (Kerbl 2023) i reverse-engineered jako solidny kompromis w licznych sesjach. Wyższe wartości (0.5+) preferują zachowanie detalu, mogą jednak ignorować lokalne błędy jasności. Niższe wartości (< 0.1) prowadzą do utraty detalu na ostrych krawędziach. Obliczanie SSIM działa w shaderze z oknem Gaussa 11×11. Wydajność: przy 0.0 (tylko L1) trening jest ok. 8-12% szybszy, ponieważ obliczanie SSIM w shaderze jest pomijane.
I22Suwak Render Scale
GDZIE
Inspector → Konfiguracja treningu → GroupBox → Render Scale.
TECHNICZNIE
Suwak 0.25–1.0 w krokach 0.25, wyświetlanie jako „100%". Skaluje rozdzielczość renderingu treningu względem wielkości obrazu źródłowego. Największa dźwignia na wydajność: 50% redukuje czas GPU o ok. 75% (ponieważ 4× mniej pikseli), 25% o ok. 94%. Próg gradientu jest automatycznie skalowany razem. Pod suwakiem pojawia się wyświetlacz rozdzielczości na żywo w MP (np. „2304×1296 (3.0 MP)"). Jeśli bieżąca wartość odbiega od rekomendowanej, w pomarańczowym tekście wyświetla się „— recommended: 50%". Rekomendacja celuje w ~3 MP efektywnej rozdzielczości — najbardziej efektywnie przetwarzalny zakres przez GPU Apple Silicon. Obrazy źródłowe 4K dostają np. automatycznie rekomendację 25%, obrazy FullHD 100%. Zmiana wyzwala dodatkowo realokację bufora.
Sekcja Enhancements (I26–I29)

Sekcja Enhancements grupuje cztery funkcje poprawiające jakość obrazu bez zmieniania samej rdzeniowej pętli treningu. Pierwsze trzy (I26-I28) to etapy Post-Training lub Viewport: Compactification sprząta po końcu treningu, MetalFX i MPS Lanczos to czyste renderery widoku, które nie wpływają na działający trening. Perceptual Loss (I29) mimo przynależności do sekcji jest składnikiem treningu — jest aktywowane podczas treningu jako dodatkowy człon loss, stąd oddzielenie od przełączników widoku przez dzielnik.
I26Przełącznik Post-Training Compactification
GDZIE
Inspector → Enhancements → Post-Training Compactification.
TECHNICZNIE
Aktywuje post-processing V443: po zakończeniu iteracji treningu gaussiany z opacity poniżej 0.01 (1% widoczności) są usuwane. Empirycznie redukuje to rozmiar pliku o ~55-58% przy zerowej widocznej utracie jakości — ponieważ te gaussiany wizualnie i tak nie wnoszą. Compactification działa jako GPU-Compact-Pass i trwa zależnie od liczby gaussianów ułamki sekund do kilku sekund. Nie wpływa na wydajność treningu. Gdy ten przełącznik jest wyłączony, eksportowane są również niewidoczne gaussiany — istotne tylko, gdy chcesz użyć formatu do dalszego etapu treningu (Continue Training), inaczej marnotrawstwo pamięci.
I27Przełącznik MetalFX Spatial Upscaling
GDZIE
Inspector → Enhancements → MetalFX Spatial Upscaling.
TECHNICZNIE
Aktywuje Apple MetalFX Spatial Upscaler w rendererze widoku. Gdy rozdzielczość treningu (przez I22 Render Scale) jest niższa niż wielkość widoku, MetalFX skaluje wyrenderowaną klatkę ML-bazowo do wielkości wyświetlania. Daje najostrzejsze wyniki ze wszystkich opcji skalowania, ponieważ model ML-Upscalera jest zoptymalizowany na ostre krawędzie. Potok renderera jest przy przełączaniu na żywo rekonfigurowany — widoczne natychmiast, bez restartu. Ma pierwszeństwo przed MPS Lanczos (I28): jeśli obydwa aktywne, wygrywa MetalFX. Narzut wydajności w widoku ok. 1-2ms na klatkę na GPU M3. Wpływa tylko na widok na żywo, nie na renderowane eksporty (Orbit-Video, zrzuty ekranu) — te są renderowane w pełnej rozdzielczości źródła.
I28Przełącznik MPS Lanczos Scaling
GDZIE
Inspector → Enhancements → MPS Lanczos Scaling.
TECHNICZNIE
Aktywuje Apple Metal Performance Shaders z resamplingiem Lanczos jako upscaler widoku. Lanczos to klasyczne resamplowanie z filtrem 8-Tap-Sinc — ostrzejsze niż Bilinear, klasyczny algorytm bez ML. Potok renderera jest przy przełączaniu rekonfigurowany na żywo. Ignorowany, gdy MetalFX (I27) jest również aktywne. Minimalny narzut (<0.5ms na klatkę), ale jakość leży poniżej MetalFX. Zastosowanie: fallback dla scen, w których MetalFX produkuje artefakty (np. silne struktury liniowe, które ML-Upscaler okazjonalnie „wygładza"). Działa jak I27 tylko w widoku na żywo, nie w eksportach.
I29Suwak Perceptual Loss
GDZIE
Inspector → Enhancements → Perceptual Loss.
TECHNICZNIE
Suwak 0.0–0.2 w krokach 0.01, wyświetlanie przy 0.0 jako „Off", inaczej jako „0.05" itd. Aktywuje dodatkowy człon loss, porównujący multi-skalowany Gaussian-Blur renderingu z obrazem ground-truth (3 skale rozmycia). Wychwytuje strukturalne różnice, których L1+SSIM samo nie widzi. Implementacja V460. Empirycznie wartość 0.05-0.1 poprawia ocenę L1 w sesjach o kilka procent, kosztuje jednak ~5% czasu treningu (dodatkowy forward-pass przez jądra rozmycia). Powyżej 0.15 trening staje się niestabilny i L1 znowu się pogarsza (człon loss dominuje optymalizację). Działa podczas treningu, nie w post-processingu — mimo pozycji w sekcji „Enhancements" to nie jest więc czysta wartość dodatkowa post-factum.
Sekcja Metryki (I30–I38)

Podczas działania treningu sekcja metryk pokazuje dziewięć wartości na żywo z pętli treningu. Przed startem treningu sekcja jest pusta („Start training to see live metrics"). Wszystkie wartości są aktualizowane co ~30 iteracji (częstotliwość aktualizacji strumienia). Sekcja jest read-only — żaden element nie jest klikalny ani zmienialny. Do głębszej analizy weź logi JSONL treningu z ~/Documents/RadianceKit/Logs/ (skrypt python3 scripts/analyze_logs.py best 5).
I30Iteration
GDZIE
Inspector → Metryki → Iteration. Read-only.
TECHNICZNIE
Wyświetlanie w formacie „4523 / 40000" — bieżąca iteracja przez łączną planowaną. Liczy synchronicznie z pętlą treningu, która pushuje wartości co ~30 iter. Druga liczba odpowiada wartości Max-Iterations w momencie startu; nie zmienia się więcej, nawet gdy użytkownik przekręci stepper — działający przebieg używa własnej kopii migawki. Gdy aplikacja przez menu Training dosypuje iteracji (Continue Training +5K/+10K/+20K), mianownik się zwiększa.
I31Loss
GDZIE
Inspector → Metryki → Loss. Read-only.
TECHNICZNIE
Wartość float z sześcioma miejscami po przecinku (np. „0.024385"). Mierzy kombinowany Loss L1+SSIM (mix kontrolowany przez I21 SSIM Weight) plus opcjonalnie Perceptual Loss (I29) i inne regularizery. Skala nie jest absolutna, lecz zależna od sceny — wymaga dla większości porównań tego samego zestawu danych. Typowe wartości końcowe przy dobrych konfiguracjach: - Classic Quality 40K iter: 0.022–0.025 (Horse, Truck, Garden) - MCMC Full 200K iter: 0.024–0.028 - Outdoor Dron 30K: 0.030–0.060 (gorsze z powodu geometrii) - Indoor Apartments: 0.018–0.025
Wartości powyżej 0.10 po 5K iteracjach wskazują na problemy SfM (złe pozy kamer) — przerwij i policz SfM od nowa.
I32Learning Rate
GDZIE
Inspector → Metryki → Learning Rate. Read-only.
TECHNICZNIE
Wyświetlanie w notacji naukowej (np. „1.60e-04"). Bieżący współczynnik uczenia dla parametrów pozycji (3DGS ma sześć niezależnych LR dla pozycji, SH-DC, SH-Rest, opacity, skali, rotacji — wyświetlany jest tu LR pozycji jako wartość reprezentatywna). Domyślna wartość początkowa 1.6e-4, opadająca przez Exponential-Decay do ~1.6e-6 na końcu treningu. Spadek można dostosować przez pole LR-Schedule w konfiguracji treningu (pole T w rozdz. 6). Gdy LR pozostaje niezwykle wysokie (np. 1e-3 lub więcej po 10K iteracji), może to wskazywać na błędnie załadowaną konfigurację.
I33SH Degree
GDZIE
Inspector → Metryki → SH Degree. Read-only.
TECHNICZNIE
Liczba całkowita 0-3. Stopień Spherical Harmonics dla reprezentacji koloru. Zaczyna od 0 (tylko komponenta DC, tj. niezależny od kierunku kolor na gaussiana — czyli tylko stała RGB) i rośnie progresywnie podczas treningu do 3. Standardowy harmonogram podnosi stopień przy 1000/2000/3000 iteracjach o po 1. SH-3 odpowiada 48 współczynnikom koloru na gaussiana (3 kanały RGB × 16 funkcji bazowych SH). Wyższy stopień SH = więcej zależnego od kierunku odbicia (błyszczące powierzchnie pod różnymi kątami widzenia wyglądają poprawnie różnie), ale też więcej pamięci i wolniejszy trening.
I34Gaussians
GDZIE
Inspector → Metryki → Gaussians. Read-only.
TECHNICZNIE
Bieżąca liczba gaussianów w modelu, sformatowana z separatorem Locale (np. „524.318"). Wzrost: - Classic: startuje od punktów początkowych SfM (typowo 50K-300K), rośnie przez Clone/Split aż krótko przed Densify Until, potem statyczne do końca treningu (modulo Pruning) - MCMC: punkty Sample są dodawane do MCMC-Cap, potem tylko relokacja
Zdrowe wartości końcowe: - Classic Quality: 400K-700K (Horse 524K, Garden 800K) - MCMC Full: dokładnie na cap (domyślnie 150K, z Auto-Scale Multiplier × SfM-Count zależnie od sceny 500K-1.5M)
Przy MCMC liczba spada do < 60% cap → anomalia (wskaźnik kolapsu, wskazuje na zbyt agresywne regularizery).
I35GPU Memory
GDZIE
Inspector → Metryki → GPU Memory. Read-only.
TECHNICZNIE
Oszacowanie zużycia pamięci bufora gaussianów jako liczba gaussianów × 616 bajtów (sformatowane w stylu Memory). 616 bajtów to empiryczny rozmiar w pełni wyposażonego gaussiana (pozycja, skala, rotacja, opacity, współczynniki SH stopień 3, akumulator gradientu). Wyświetlanie nie obejmuje narzutu renderera (bufor kafelków, bufor sortowania, bufor backward) — realne zapotrzebowanie na pamięć GPU leży typowo 2-3× powyżej tej wartości. Przy 500K gaussianów: wyświetlane ~290 MB, realnie ~700 MB. Przy 1.5M gaussianów: wyświetlane ~880 MB, realnie ~2.5 GB. Na M3 Max z 64+ GB Unified Memory niekrytyczne, na M3 Pro z 18 GB już limit.
I36Speed
GDZIE
Inspector → Metryki → Speed. Read-only.
TECHNICZNIE
Iteracje na sekundę z jednym miejscem po przecinku („24.3 it/s"). Obliczone przez trener jako średnia krocząca z ostatnich ~100 iteracji. Typowe wartości: - Quick Preset (1K iter): 80-120 it/s (krótko, brak steady-state) - Classic 20K @ 1.0 Render Scale (scena Truck, M3 Max): 25-35 it/s - Classic 20K @ 0.5 Render Scale: 80-120 it/s - MCMC 200K @ 0.5 Render Scale: 25-50 it/s (wolniejsze z powodu relokacji) - Przy 1M+ gaussianów i pełnej rozdzielczości: < 10 it/s
Spadająca prędkość w trakcie treningu jest normalna — więcej gaussianów = więcej compute na iterację. Nagłe spadki (np. z 30 → 5 it/s) wskazują na GPU-Thermal-Throttling lub konkurujące aplikacje.
I37Elapsed
GDZIE
Inspector → Metryki → Elapsed. Read-only.
TECHNICZNIE
Już upłynęły czas jako „4:23" (m:ss) lub „1:23:45" (h:mm:ss). Przełączenie formatu od 1 godziny. Mierzy tylko czysty czas treningu, nie poprzedzające fazy (obliczenia SfM, import obrazów). Przy Pause/Resume zegar idzie dalej — jest więc wall-clock, nie czas CPU.
I38ETA
GDZIE
Inspector → Metryki → ETA. Read-only.
TECHNICZNIE
Szacowany czas pozostały jako „17:42" lub „1:12:35". Obliczenie: (Max Iterations − bieżąca iteracja) / iteracje na sekundę. Pokazuje „–", gdy prędkość jest właśnie zero (zupełnie na początku lub przy pauzie). Oszacowanie nie jest dostosowywane do typowego spowolnienia pod koniec treningu — zwłaszcza przy MCMC i Classic z dużymi wartościami Densify-Until trening ma tendencję stawać się wolniejszym, ponieważ coraz więcej gaussianów wchodzi do obrazu. Realnie pozostaje typowo 10-20% powyżej początkowego ETA.
Sekcja wykresu straty (I39–I41)

Sekcja wykresu straty wizualizuje przebieg treningu w czasie. Składa się z dwóch wykresów: wykresu krzywej Loss (duży, u góry, niebieski) i wykresu liczby gaussianów (mniejszy, na dole, pomarańczowy). Oba są budowane na żywo podczas treningu i persistują do następnego startu treningu. Przed pierwszym treningiem obszar jest pusty („Loss curve will appear during training"). Wykresy są czystymi rysunkami SwiftUI-Path (brak frameworku Swift-Charts), aby również przy 100K+ punktach renderowały się płynnie.
I39Current Loss (wyświetlanie)
GDZIE
Inspector → wykres straty → lewy obszar etykiety „Current: 0.0287". Read-only.
TECHNICZNIE
Wartość float ostatniego punktu próbki Loss, sformatowana z czterema miejscami po przecinku. Identyczna z I31 (Loss w sekcji Metrics), tylko sformatowana tu bardziej zwarto. Źródłem jest historia Loss — lista, która otrzymuje wpis na ~30 iteracji. Tylko wartości skończone są wpisywane na listę — NaN/Infinity (bardzo rzadkie, w przypadku błędu eksplozji gradientu) są filtrowane.
I40Min Loss (wyświetlanie)
GDZIE
Inspector → wykres straty → prawy obszar etykiety „Min: 0.0245" (zielony). Read-only.
TECHNICZNIE
Minimum wszystkich kiedykolwiek widzianych wartości Loss bieżącego przebiegu treningu. Rekomputowane na żywo z historii Loss — brak osobnej persistencji. Wyświetlane zielonym tekstem, ponieważ „Min" = „Best so far". Przerywana zielona linia na dolnej krawędzi wykresu wizualnie zaznacza tę pozycję Y. Przy sesjach Continue-Training śledzenie minimum startuje od nowa — stara historia jest w UI zastępowana nową (nie doczepiana). Gdy bieżący trening idzie gorzej niż poprzedni, wyświetlanie Min może więc być większe niż poprzedni wynik końcowy.
I41Wykres Gaussian Count
GDZIE
Inspector → wykres straty → drugi wykres pod spodem (pomarańczowy). Read-only.
TECHNICZNIE
Wykres liniowy liczby gaussianów w iteracjach treningu. Źródło: historia Gaussian-Count (lista par (Iter, Count), wypełniana przez trener co ~30 iter). Skala Y dynamiczna między minimum a maksimum historii. Przy strategii Classic krzywa wygląda zwykle tak: stale rośnie do Densify Until, potem płasko (z małymi wahaniami pruningu). Przy MCMC: stromy wzrost do cap, potem horyzontalna linia (relokacja utrzymuje liczbę stałą). Gdy krzywa opada mimo aktywnego treningu, densyfikacja zbyt agresywnie pruninguje — wskazówka na błędne domyślne lub znany błąd MCMC-Collapse (temat v1.4.4-Hotfix).
Jak czytać krzywą Loss?
Wykres Loss jest najważniejszym narzędziem diagnostycznym w Inspectorze — żaden inny wskaźnik nie pokazuje tak bezpośrednio, czy trening posuwa się użytecznie do przodu, czy zawisł. Typowa zdrowa forma to szybki spadek w pierwszych 1000-3000 iteracji (z ~0.15 na ~0.05), po którym następuje powolny, równomierny spadek do końca treningu (na 0.020-0.030). Logarytmicznie krzywa wygląda przy tym jak gładka przekątna.
Co oznacza plateau przy Loss? Gdy krzywa pozostaje płaska przez kilka tysięcy iteracji, są dwie możliwe lektury: (a) trening jest „zbieżny" — Loss nie może już znacząco spadać, ponieważ model jest tak dobry, jak może być z danymi danych i ustawieniami. Jest to pożądane; to „gotowe". (b) trening „wisi" — Loss mógłby właściwie jeszcze spadać, ale optymalizacja stagnuje (minimum lokalne, współczynnik uczenia za mały, densyfikacja wyłączona). Rozróżnić: gdy wartość Loss leży w typowym dobrym zakresie (0.020-0.030 przy Indoor/Object, 0.040-0.060 przy plenerze) i krzywa od 5K iteracji jest płaska, jest zbieżne. Gdy wartość jest wyraźnie wyższa niż przy porównywalnych scenach (np. 0.08), zawisła.
Uwaga plateau gaussianów ≠ plateau Loss. Plateau w liczbie gaussianów nie oznacza „trening jest gotowy". Oznacza tylko, że densyfikacja przestała dodawać nowe punkty — albo dlatego, że osiągnięto (Classic), albo dlatego, że cap MCMC jest pełny. Trening działa potem dalej i udoskonala już tylko istniejące punkty. Właściwy sygnał „gotowe" czytasz na krzywej Loss i wskaźniku iteracji (I30), nie tutaj.
Reguła kciuka do przerwania: gdy krzywa Loss po 5000+ iteracjach leży powyżej 0.08 i prawie już nie spada, z wysokim prawdopodobieństwem rekonstrukcja SfM jest skrzywiona. Przerwij trening, w rozdziale 9 sprawdź, czy wybrany backend SfM pasuje do sceny, ew. przełącz na COLMAP/Native, potem startuj na nowo. Lepiej zainwestować 10 minut w lepsze SfM niż 2 godziny treningu ze złym wyrównaniem kamer.
Kiedy sięgnąć po Inspector?
Szybka referencja: która sekcja + które kontrolki dla którego typowego use-case?
| Typowe zadanie | Sekcja | ID kontrolek |
|---|---|---|
| Wczytać predefiniowany setup | Presets | I7 (klik na wiersz) |
| Zapisać własny setup | Presets | I1 → I2 → I4 |
| Udostępnić setup kolegom | Presets | I5 (Export) lub I6 (Import) |
| Zmienić backend SfM (np. ponieważ Apple-PG zbyt niestabilne) | Konfiguracja treningu | I12 (zobacz rozdz. 9) |
| Przetwarzać klatki wideo bez ogniskowej EXIF | Konfiguracja treningu | I13 (FOV Override) |
| Wydajność COLMAP: GLOMAP zamiast klasycznego | Konfiguracja treningu | I14 |
| Z Classic na MCMC przełączyć | Konfiguracja treningu | I15 |
| Trening dłużej działać | Konfiguracja treningu | I18 (Max Iter) + I20 (Densify Until) — sprzężone przez I19 |
| Czas GPU zmniejszyć o połowę | Konfiguracja treningu | I22 (Render Scale na 50%) |
| Jakość treningu +6% (MCMC) | Konfiguracja treningu | I16 (MCMC Quality) |
| Scena plenerowa z wieloma punktami SfM | Konfiguracja treningu | I17 (Auto-scale by scene) |
| Skonfigurować/zmienić ścieżkę COLMAP | Konfiguracja treningu | I23 / I24 / I25 |
| Zmniejszyć pliki eksportu | Enhancements | I26 (zawsze zostawić włączone) |
| Widok ostrzejszy bez dodatkowego czasu treningu | Enhancements | I27 (MetalFX) |
| MetalFX zbyt wygładza → alternatywa | Enhancements | I28 (MPS Lanczos) |
| Ostatnia kropla detalu przy drobnych strukturach | Enhancements | I29 (Perceptual Loss 0.05-0.1) |
| Nadzorować trening | Metryki | I30 (postęp), I36 (tempo), I38 (pozostały czas) |
| Wcześnie ocenić jakość | Metryki | I31 (Loss < 0.05 po 5K = dobre) |
| Podejrzenie problemu SfM | Metryki + wykres Loss | I31 + I39 (Loss > 0.08 po 5K → SfM od nowa) |
| Convergence vs Stuck rozróżnić | wykres straty | I39 + I40 (czytanie plateau Loss) |
| Rozpoznać problem densyfikacji | wykres straty | I41 (krzywa gaussianów spada → błąd) |