Hoofdstuk 4 — Hulpvensters
Naast het hoofdvenster (3D-viewport plus Inspector) beheert RadianceKit zeven verdere vensters, die alle via het Help-menu worden geopend. De lijst is van boven naar onder: User Guide (⌘?), Keyboard Shortcuts (⌘/), Open Training Logs… (opent geen app-venster, maar de Finder; daarom hier niet verder behandeld), Manage Storage…, Pareto Dashboard… (⇧⌘D), Holdout Analysis… (⇧⌘H), BayesOpt Console… (⇧⌘B). Drie daarvan — Dashboard, Holdout, BayesOpt — zijn zelfstandige analyse-tools. Ze hebben elk een eigen view-model-stack, lezen of schrijven JSON-bestanden op schijf, en er bestaat voor elk een CLI-argument waarmee je het venster meteen bij de app-start op een bepaald bestand kunt laten wijzen (–dashboard-dir, –holdout-file, –bayesopt-autorun).
De vier eenvoudige vensters (User Guide, Keyboard Shortcuts, Manage Storage, plus de submenu-items Open Training Logs / Open Exports Folder) krijgen per bedieningselement een korte vermelding. De drie analysevensters zijn uitvoeriger gedocumenteerd — elk met een inleiding die uitlegt wat je in het venster ziet, wanneer je het moet openen en hoe je het weergegeven beeld interpreteert.
Aan het einde van het hoofdstuk staat een kruisverwijzings-sectie naar de Inspector van het hoofdvenster: wat je in de live-loss-chart en in de Gaussian-count-weergave tijdens een lopende training zinvol kunt aflezen.
User Guide (W1–W4)

Wat het is: Een ingebouwd hulpvenster dat de bij de app meegeleverde guide_<taal>.md rendert. De taal wordt uit de instellingen (tab General → Language) of, als daar „System" staat, uit de macOS-taalvoorkeuren afgeleid. Layout is klassiek: links zijbalk met alle koppen, rechts de fließtekst.
Wanneer je een snelle herinnering aan een afzonderlijk punt nodig hebt — dus als trefwoord-vervanging. De uitvoerige referentie is deze handleiding; het ingebouwde hulpvenster is eerder wat een –help op de commandoregel zou zijn. Het wordt bij elke app-release meegeactualiseerd, maar inhoudelijk oppervlakkiger gehouden.
W1NavigationSplitView (zijbalk + detail)
WAAR
Help → User Guide (⌘?)..
TECHNISCH
Tweekoloms-layout met smalle zijbalk (minstens 180 pt breed) voor de inhoudsboom en een scrollbaar detailgebied voor de eigenlijke Markdown-inhoud. Het venster heeft een minimumgrootte van 700 × 500 pt. Bij het eerste openen laadt het venster de passende guide_<lang>.md uit de app-bundle (fallback guide_en.md), parset hem in blok-records (koppen H1–H4, paragrafen, lijsten, tabellen, scheidslijnen) en extraheert apart de koppenstructuur voor de zijbalk. Inline-formatting (bold, italic, code-span) wordt via de ingebouwde Markdown-engine gerenderd. De taal wordt uit de app-instellingen gelezen, met het speciale geval Chinees (zh-Hans) en Braziliaans Portugees (pt-BR), die als volle locale-tags behouden worden, omdat zich deze varianten van zh resp. pt onderscheiden.
W2List (kop-zijbalk)
WAAR
Linker kolom in het User-Guide-venster..
TECHNISCH
Lijst over alle H2- en H3-koppen van het actuele Markdown-document. H2-items verschijnen zonder inspringing met medium schriftgewicht, H3-items met 16 pt inspringing links en gereduceerde foreground-stijl. H4 en dieper worden genegeerd, omdat de diepte de zijbalk anders onoverzichtelijk maakt. Anker-ID's worden uit de koptekst per slugificatie gegenereerd (lowercase + spaties naar streepjes + filtering op letters/numbers/dashes — hetzelfde algoritme dat GitHub voor zijn Markdown-ankers gebruikt, zodat ook externe URL's naar de docs potentieel naar hetzelfde anker zouden landen). De lijst gebruikt de native macOS-stijl.
W3Button (kop → ankersprong)
WAAR
Per zijbalkregel een knop..
TECHNISCH
Elk zijbalk-item is een knop die het actuele anker zet, optisch echter zoals een lijstregel oogt. Een observervariabele triggert dan de scroll-sprong naar het bijbehorende anker met een zachte animatie over 0,3 s. Na de sprong wordt de ankerwaarde gereset, zodat de volgende klik op hetzelfde anker opnieuw vuurt (anders zou de observer niet opnieuw uitlossen, omdat de waarde niet is veranderd).
W4ScrollView (detail-inhoud)
WAAR
Rechter kolom..
TECHNISCH
Scrollbaar, verticaal stapelend inhoudsgebied met lazy rendering, omdat langere guides gemakkelijk meer dan 200 Markdown-blokken kunnen hebben — een niet-lazy variant zou ze alle tegelijk instantiëren. Elk blok krijgt een eigen ID, ofwel het kop-anker (voor springbare H1–H3) of een index-placeholder. Maximumbreedte is 720 pt, padding 32 horizontaal / 24 verticaal, zodat lange regels een goed leesbare layout behouden. Tabellen worden cel-voor-cel met horizontale stacks en scheidslijnen gerenderd; inline- code door de ingebouwde Markdown-engine. Echte codeblokken worden momenteel als paragraaf behandeld — een bekende beperking van het hulpvenster.
Keyboard Shortcuts (W5–W6)

Statische referentielijst in vijf secties. Navigation: Mouse Drag (Orbit/Fly), Shift+Drag/Right-Drag (Pan), Scroll (Zoom), WASD (Fly-Through-beweging), Q/E (Up/Down), F (Toggle Orbit/Fly), Double-click (Re-center), Cmd+Scroll (FoV-Adjust). Views: R (Reset Camera), T (Auto-Rotation), P (Camera Playback), B (Background-Cycle), 0–9 (spring naar Training-Cam 1=10%/5=50%/0=last), Left/Right Arrow (Prev/Next Cam). Capture: S (Screenshot to Desktop), V (Turntable-Video), C (Copy Camera Info). Editor: Tab (Edit-modus), Click/Drag (Paint-Select), Option+Click (Deselect), X / Delete (selectie verwijderen), Cmd-Z (laatste verwijdering ongedaan), [ / ] (penseelgrootte kleiner/groter), Esc (selectie opheffen). Training: Start, Pause/Resume, Cancel, Continue +5K/+10K/+20K via de menu-shortcuts in M9–M14.
Wat het is: Een simpel statisch overzicht van alle toetscombinaties — Navigation, Views, Capture, Editor, Training. Inhoud is hardgecodeerd in, geen Markdown-loading.
Wanneer je naar de snelste manier zoekt iets in het viewport te doen. WASD-fly-through, R voor camera-reset, B voor background-cycling — alle staan hier.
W5ScrollView (inhoudsgebied)
WAAR
Help → Keyboard Shortcuts (⌘/)..
TECHNISCH
Een eenvoudig scroll-gebied met een verticale lijst erin. Padding 20 rondom, geen zijbalk-navigatieboom (de lijst is kort genoeg). Inhoud is in vijf secties gegroepeerd (Navigation, Views, Capture, Editor, Training). Per toetscombinatie een regel met vertaalbare tekst in beide kolommen. Linker kolom (toetscode) gefixeerd op 180 pt breedte, zodat de beschrijvingen rechts verticaal aligned blijven. Geen interactie behalve scrollen — klikken op een regel lost niets uit, de toetscombinaties zijn echte toetsenbord-modifiers in het menu en op het viewport.
W6VStack (shortcut-secties)
WAAR
Binnen de ScrollView..
TECHNISCH
Linksgebonden gestapelde secties met 16 pt afstand. Binnen de vijf secties elk heading + regelreeks. Headings gebruiken een secundaire subheadline-stijl — bewust geen title-format, omdat de secties niet navigeerbaar hoeven te zijn. Inhoud is bewust vlak (geen disclosure, geen search, geen filter), zodat de component op elke macOS-versie ongewijzigd loopt en het bestand leesbaar blijft.
Manage Storage (W7–W12)

Tabelweergave van alle door RadianceKit beheerde bestanden. Header telt 693 items, 16,74 GB totale grootte. Toolbar boven: „Show in Finder" + „Refresh". Elke regel: PLY-icoon, bestandsnaam (bijv. training_20260527T211321Z.ply), exportdatum, grootte (varieert 7 KB tot 218 MB), loep-icoon (reveal) en prullenbak-icoon (move to trash). Bestanden zijn op datum gesorteerd, nieuwste boven. In deze demo-opname domineren PLY-exports, omdat veel met –benchmark is gewerkt.
Wat het is: Een disk-usage-overzicht voor alles wat RadianceKit onder ~/Documents/RadianceKit/ neerlegt — logs, exports, scenes, capture-bundles (van de iOS-companion), imports (staging-kopieën van de invoerbeelden). Per item een grootte in bytes en twee knoppen: „in de Finder tonen" en „naar de prullenbak verplaatsen". Is GEEN automatisch opruimen — de app verwijdert zelf niets; jij beslist per item.
Wanneer de schijf vol raakt. Vooral de logs verzamelen zich (één JSONL per trainingspoging, plus de _qualityMetrics.json); de exports natuurlijk ook (PLY 100% rauwe data, één per export). Ook nuttig na een crash, wanneer de imports-staging-map nog oude kopieën van de invoerbeelden heeft rondslingeren (zie „disk-pressure incident" in dev_v549f-needle-reduction.md).
W7Knop „Show in Finder"
WAAR
Header rechtsboven in het Storage-Browser-venster..
TECHNISCH
Opent de gehele RadianceKit-directory (~/Documents/RadianceKit/) in de Finder, zodat je de mappenstructuur direct kunt zien en ook met de Finder zelf kunt manipuleren. De actie opent een nieuw Finder-venster en wisselt niet naar de app-sandbox-container — ~/Documents/RadianceKit/ is de regulier voor apps toegankelijke Documents-domain, geen sandboxed-container-pad.
W8Knop „Refresh"
WAAR
Header, naast de Finder-knop..
TECHNISCH
Triggert een achtergrond-scan, die op een gebruiker-geïnitieerde asynchrone task loopt, zodat het scannen van grote mappenbomen de UI niet blokkeert. Het eigenlijke walken gaat elke bekende submap (Logs, Exports, Scenes, Captures, Imports) door en genereert per direct child een storage-entry. Per entry wordt de recursieve grootte bepaald — bij voorkeur het werkelijke schijfverbruik (inclusief APFS-hardlinks-sharing) met fallback op de logische bestandsgrootte.
W9List (storage-items)
WAAR
Hoofdinhoud onder de header..
TECHNISCH
Lijst met per regel deze layout: categorie- specifieke SF-symbol-icoon (document voor logs, upload-pijl voor exports, kubus voor scenes, tray voor imports), naam + ondertitel (kind-label + geformatteerde wijzigingsdatum), bytes-counter rechts (rechtsgebonden, monospaced), reveal-knop (loep-symbool), trash-knop (prullenbak). Sortering: primair op kind (Scenes eerst, dan Exports, Logs, Captures, Imports, Other), secundair op wijzigingsdatum aflopend (nieuwste boven). Wanneer de scan nog loopt, toont de plek in plaats daarvan een „Scanning…"-voortgang. Wanneer niets gevonden, een lege-staat-weergave met tray-icoon.
W10Row-knop „Reveal in Finder"
WAAR
Per regel, loep-symbool rechts..
TECHNISCH
Opent de Finder en selecteert het specifieke item (bestand of map). Verschil met W7: W7 opent de root-directory; W10 markeert precies deze ene entry. Praktische workflow: identificeer een grote entry, klik op de loep, kopieer hem dan bijvoorbeeld naar een extern volume.
W11Row-knop „Move to Trash"
WAAR
Per regel, prullenbaksymbool rechts naast de loep..
TECHNISCH
Triggert de bevestigingsdialoogbox (W12). Pas na bevestiging loopt de macOS-standaardoperatie „naar de prullenbak verplaatsen" (dus omkeerbaar, geen directe verwijdering). Na succesvolle trash wordt de entry uit de lijst verwijderd en de totale-bytes-counter geactualiseerd. Bij fouten wordt een modale foutdialoog ingeblend.
W12ConfirmationDialog (verwijder-bevestiging)
WAAR
Wordt door W11 getriggerd, weergegeven als macOS-sheet..
TECHNISCH
Standaard bevestigingsdialoog met dynamische titel „Delete <name>?" en een message-regel die expliciet erop wijst dat de entry in de prullenbak landt en daaruit herstelbaar is (totdat de prullenbak wordt geleegd). Twee knoppen: „Move to Trash" als destructieve actie (rood weergegeven) en „Cancel" met automatische Esc-binding. De dialoog is non-modaal in die zin dat hij alleen dit venster blokkeert, niet de hele app — dat is macOS-standaard voor omkeerbare verwijderingen.
Pareto Dashboard (W13–W22)

Lege toestand (na het eerste openen) — empty state met call-to-action „Open Reports Folder…". De datapunten verschijnen zodra trainingsreports zijn geladen, zie volgende shot.

Header-toolbar toont „129 reports of 129" (alle reports in de gekozen map succesvol geparset — 21 extra bestanden konden vanwege ouder formaat niet worden geparset, zie hint-lijst rechts). Assen: X-as-keuze op Gaussians, Y-as-keuze op PSNR (dB). Scatter-plot: groene punten = Classic-strategy, blauwe punten = MCMC. De gestreepte Pareto-front-lijn loopt langs de best bereikte PSNR-waarden en plateaut rond PSNR≈30 dB vanaf ca. 500K Gaussians. Filter-chips rechts: 7 scenes (bicycle, bonsai, family, flowers, kitchen, stump, truck), 2 strategies (classic, mcmc), 3 Mip-Splatting-opties (All, On, Off). Momenteel zijn alle filters open, vandaar het dichte punten-cluster.
Wat het is: Een multi-run-vergelijkingstool. Heb je in het verleden meerdere scènes of dezelfde scène met verschillende voorinstellingen getraind — elk van die trainingsruns produceert (als je –benchmark hebt meegegeven of via de benchmark-functie hebt aangeroepen) een JSON-report-bestand dat onder meer finale PSNR, SSIM, LPIPS, Gaussian-count en wallclock-tijd bevat. Het dashboard leest een gehele map van zulke reports tegelijk in en plot ze als 2D-scatter met selecteerbare assen. Aanvullend wordt de Pareto-front (de verzameling niet-gedomineerde punten) als gestreepte lijn ingetekend.
Nadat je minstens drie of vier trainingsreports hebt aangelegd. Met minder punten is de frontier-lijn niet veelzeggend. Typische use-case: je hebt geprobeerd een outdoor-scène te reconstrueren, en hebt opeenvolgend P3 Balanced (Classic), P4 Quality (Classic), P7 MCMC Quality en P9 Outdoor (tuned) doorlopen — nu wil je weten welke configuratie de beste PSNR per seconde trainingstijd levert of welke de minste Gaussians nodig heeft voor gegeven PSNR.
Beide assen zijn vrij kiesbaar (X-as:,, psnr, ssim, lpips, …; Y-as net zo). De Pareto-front-logica in ParetoFront2D.indices weet voor elke metriek of „kleiner = beter" (bijv. LPIPS, Loss, Time) of „groter = beter" (PSNR, SSIM) — de lijn loopt dus afhankelijk van as-keuze van linksonder naar rechtsboven of van linksboven naar rechtsonder, altijd langs de beste bereikte combinatie. Een punt is Pareto-optimaal als GEEN ander punt in BEIDE dimensies minstens even goed is (dus geen ander domineert hem). Pareto-optimale punten liggen op de lijn, andere punten rechts/erboven (afhankelijk van as-oriëntatie) ervan. Punten OP de lijn zijn de echte kandidaten voor „beste voorinstelling"; punten VER van de lijn zijn verspilde trainingstijd.
Je kunt de selectie beperken tot een bepaalde scène (mocht je bijv. alleen outdoor-runs willen vergelijken), tot een bepaalde strategie (Classic of MCMC), of tot Mip-Splatting aan/uit (relevant na fase Q1.5, waarin Mip als opt-in advanced flag blijft).
Je hebt drie reports voor „truck"-scène onder ~/Documents/RadianceKit/Reports/: Run A (P4 Quality, 40K iter, 524K Gs, 105 s, PSNR 23,4), Run B (P7 MCMC, 200K iter, 150K Gs, 693 s, PSNR 24,6), Run C (P9 Outdoor, 100K iter, 1,25M Gs, 312 s, PSNR 25,8). Zet X-as op trainingTime, Y-as op PSNR. Run B ligt rechtsboven, Run C nog verder rechtsboven, Run A linksonder. De Pareto-front verbindt A en C — beide niet-gedomineerd. Run B is „lost" (C is beter in Time EN PSNR). Inzicht: voor „truck" loont de MCMC-standaard niet; ofwel snel+ok (A) ofwel lang+zeer goed (C). Configuratie uit C als eigen voorinstelling opslaan (Inspector → I1 Save Preset).
Volgende actie: Beste configuratie als voorinstelling opslaan. Concreet: bekijk de Pareto-punten (hover toont PSNR/SSIM/LPIPS/Gs/Time in de tooltip), beslis welke je qua time-vs-quality-trade-off het beste past, open het bijbehorende report (bestandsnaam bevat run-timestamp), kopieer diens trainingsconfiguratie in een nieuwe run of bewaar hem na de volgende trainingssessie als voorinstelling via de Inspector.
W13Knop „Open Reports Folder…"
WAAR
Toolbar linksboven..
TECHNISCH
Opent een map-selectiedialoog met de oproep „Select a folder containing benchmark .json reports". Na bevestiging loopt een achtergrondtask die alle .json-bestanden in de map sequentieel parset. Foutieve reports (kapot JSON, verkeerd schema) worden verzameld en onder in de zijbalk getoond als „N file failed to parse" — geen crash. Wanneer een tweede klik plaatsvindt terwijl een eerste load nog loopt, wordt de vorige task afgebroken, zodat niet twee resultaten tegelijk in de state schrijven.
Ook via CLI: –dashboard-dir /pad/naar/reports laadt de map meteen bij de app-start.
W14Picker „X-Axis"
WAAR
Boven het chart, links..
TECHNISCH
Menu-picker met alle beschikbare metriek-assen van de dashboard-module (PSNR, SSIM, LPIPS, Gaussian-count, trainingstijd enzovoort). Standaard is Gaussian-count. Bij wisseling wordt het gehoverde punt teruggezet, omdat een tot dan toe gehighlighte positie in het oude assen-coördinatensysteem na aswisseling geen zin meer heeft. Picker is op inhoudsbreedte begrenst, zodat hij niet over de hele breedte trekt.
W15Picker „Y-Axis"
WAAR
Boven het chart, naast X-Axis..
TECHNISCH
Identiek aan W14, alleen dat de standaard PSNR is. De as-keuze wordt onafhankelijk opgeslagen, dus kan de gebruiker ook onzin-combinaties kiezen (X=PSNR, Y=PSNR — zou alle punten op een diagonaal werpen). Zulke combinaties worden echter niet afgevangen; bewuste beslissing, omdat een vergelijking „SSIM vs PSNR" zeker interessant is om te zien hoe consistent de metrieken zich gedragen.
W16Toggle „Show Pareto Front"
WAAR
Rechts naast de assen-pickers..
TECHNISCH
Standaard macOS-toggle. Wanneer actief, wordt in het Pareto-chart aanvullend op de punten-wolk een lijn met de berekende 2D-Pareto-front getekend. Stijl: gestreept (streefpatroon 4–4), grijs halfdoorzichtig, lijndikte 1,5 pt. De Pareto-berekening loopt op de hoofdthread — bij het typische aantal reports (≤ ~50) is dat probleemloos snel. Als de toggle uit is, wordt de lijn weggelaten, zodat alleen de naakte punten staan.
W17Chips „Scene"-filter
WAAR
Rechter zijbalk in het dashboard-venster..
TECHNISCH
Filter-chips voor elke in de geladen reports voorkomende scène. Eigen flow-layout dat chips in meerdere regels automatisch herschikt zodra de breedte is uitgeput. Actieve chips krijgen de accentachtergrond, inactieve een neutrale standaard-material-achtergrond. Meervoudige selectie is mogelijk (set-semantiek); wanneer geen chip geselecteerd is, gelden alle scènes als „doorgelaten" — d.w.z. de set-logica is „lege selectie = alles", niet „lege selectie = niets".
W18Chips „Strategy"-filter
WAAR
Onder scene-filter in de zijbalk..
TECHNISCH
Net als W17, maar voor trainingsstrategieën — typisch de twee waarden „classic" en „mcmc", afgeleid uit het strategy-veld van de benchmark-report-JSON's. Behulpzaam wanneer je reports van beide strategieën hebt gemengd en alleen één soort wilt zien (bijv. „alleen MCMC-runs tonen, omdat ik Classic al heb uitgesloten").
W19Chips „Mip-Splatting"-filter
WAAR
Onder strategy-filter in de zijbalk..
TECHNISCH
Driewaardige filter (in plaats van set zoals W17/W18): „All" / „On" / „Off". Achtergrond: Mip-Splatting werd in fase Q1.5 als experimentele multi-schaal-verbetering geëvalueerd en het finale verdict was „geen leuke win doorlopend; behouden als opt-in flag". Wanneer je Mip-on/off-vergelijkingen maakt, wil je vaak zeer scherp scheiden kunnen. Vandaar het toegewijde ternaire filter met de toestanden „alles doorlaten", „alleen Mip aan", „alleen Mip uit". De zijbalk-sectie wordt alleen ingeblend wanneer er minstens één Mip-report EN minstens één niet-Mip-report in de dataset zit (anders heeft het filteren geen zin).
W20ChipButton (filter-toggle, all/on/off)
WAAR
Helper-component, wordt in W17/W18/W19 gebruikt..
TECHNISCH
Minimalistische knop-wrapper. Inhoud: label- tekst met caption-schriftgrootte en padding 10 horizontaal / 5 verticaal. Achtergrond conditioneel: bij actief → app-accentkleur met witte tekst; anders neutrale standaard-material-achtergrond met zwarte tekst. Vorm is een capsule (pilachtig). Plain-button-stijl, zodat het capsule- material niet door een systeem-border wordt overlapt.
W21Chart (Pareto-scatter)
WAAR
Middengebied van het dashboard..
TECHNISCH
Swift-Charts-diagram met twee lagen: 1. een punt per report — positie uit de gekozen X- en Y-metrieken, kleur op strategy, symbool op Mip-status. Symboolgrootte normaal 80, gehighlighted 200 (wanneer de ID overeenkomt met het momenteel gehoverde report). 2. een lijn voor de Pareto-front, alleen wanneer de toggle aan is.
Chart-overlay: een transparant rechthoek registreert muisbeweging; per frame wordt de euclidisch dichtstbijzijnde puntpositie in het plot-frame bepaald en het gehoverde report geactualiseerd, mits de afstand onder 24 px ligt (anders teruggezet). Zo krijg je de tooltip zonder klikken — hoveren volstaat.
W22Tooltip (hover-detail)
WAAR
Onder het chart, ingeblend bij hover..
TECHNISCH
Horizontale stack: scènenaam (headline), strategy-tag (caption), scheidslijn, dan PSNR/SSIM/LPIPS/Gs/Time-metrics elk in een kleine verticale groep (label + monospaced waarde). Mocht Mip geactiveerd zijn, aanvullend een „Mip"-capsule-tag in accentkleur. Achtergrond halfdoorzichtige blur, afgerond rechthoek met 8 pt radius. Wordt alleen ingeblend wanneer de muis daadwerkelijk over een punt is. Verdwijnt automatisch bij verlaten.
Holdout Analysis (W23–W29)

Lege toestand met empty-state en call-to-action „Open transforms.json…". Accepteert NeRF-Studio- en Instant-NGP-formaat.
Lege toestand (na het eerste openen) — de camera-markers verschijnen zodra een transforms.json is geladen, zie volgende shot.

Header toont geladen bestand (transforms_train.json) en cam-count („100 cameras"). Linker zijbalk: strategy-picker met twee opties — Angular (longitudinal) actief (richt folds op lengte-/breedte-sectoren op de sfeer uit, zodat elke test-fold geometrisch dicht is) vs Linear (round-robin) (volgorde-gebaseerd, alle k-de frames als testset). k-folds-slider staat op 5, test-fold-picker op fold 1. Export-knop genereert een fold-assignment.json voor Nerfstudio/Instant-NGP. Middenpaneel: 3D-globe-projectie van alle 100 camera's — groene punten = train, rode punten = actuele test-fold (Fold 1 met 20 camera's). Rechter zijbalk (Angular Correlation): per fold 20 cams + Mean Nearest Angle (Fold 1: 7,9°, Fold 2: 7,8°, Fold 3: 7,7°, Fold 4: 7,0°, Fold 5: 6,3°) — kleinere waarde betekent dat de camera's binnen deze fold dicht bij elkaar liggen, dus de holdout-split ruimtelijk coherent is.
Wat het is: Een 3D-visualizer voor je camera-opstelling met cross-validation-logica. Je laadt een transforms.json (het standaardformaat van Nerfstudio / Instant-NGP voor cameraposes), de app leest alle camera's, projecteert hun kijkrichtingen op een eenheidsbol en toont ze als kleine bol-markers op een virtuele globe. Vervolgens deelt hij de camera's in k folds op (volgens gekozen strategie: angular of linear), markeert het trainingsaandeel groen en het testaandeel (holdout) rood, en berekent per fold een angular-correlation-score die je zegt hoe ver de test-fold in de kijkhoek-ruimte van de trainingsfold ligt.
Wanneer je holdout-evaluatie wilt doen — dus: hoe goed generaliseert je model op niet-geziene kijkhoeken? Standaard in de training is „every-8th view als holdout" (Mip-NeRF360-conventie), maar dat is een zeer lineaire opdeling. Wanneer je beelden bijvoorbeeld tijdelijk geclusterd zijn (eerst één kant van het object, dan de andere), dan is „every-8th" niet representatief — een willekeurige sequentiepositie landt in de test, maar al haar buren zijn in het trainen, dat is te eenvoudig. Met „angular" stratificeer je in plaats daarvan over de kijkhoek-ruimte: elke fold bevat camera's uit alle gebieden van de orbit, zodat de test werkelijk generalisatiegaten test.
Angular vs Linear: - Angular (standaard): deelt de camera's op longitudinale hoek (φ-coördinaat om de Y-as) op in k gelijke sectoren. Fold 0 zijn camera's met φ ∈ [0°, 360/k°), fold 1 de volgende, enzovoort. Voordeel: elke fold dekt een deeluitsnede van de orbit; de test-fold is ruimtelijk compact maar breed over de wereld-dataset verdeeld. Goed voor klassieke orbit-opnames. - Linear (round-robin): fold-index = (image_index modulo k). Dat is de simpele „every-k-de"-opdeling. Werkt wanneer de beeldvolgorde GEEN ruimtelijke bias heeft (bijv. willekeurig gesorteerde drone-opnames). Werkt slecht wanneer de beelden tijdelijk clusteren.
In de 3D-globe zie je direct: groene punten (training) en rode punten (test). Wanneer de rode punten alle in één hoek clusteren, is de holdout slecht (geen goede generalisatietest). Wanneer ze gelijkmatig tussen de groene liggen, is hij goed. De angular-correlation-score per fold (rechter zijbalk, in graden) zegt aanvullend: kleinere waarde = de test is dicht bij de training (elke test-camera heeft een nabije trainingscamera, lichte test); grotere waarde = de test ligt ver van de training (hardere generalisatie).
Je hebt je truck-scène met 251 beelden opgenomen, exporteert via menu-item M33 (Export SfM transforms.json) een nerfstudio-file. Open het holdout-venster (⇧⌘H), laad de JSON via „Open transforms.json…", bekijk de globe. k=5 (standaard) geeft je 5 folds. Klik op „Fold 3" — zie of de rode markers redelijk gelijkmatig zijn. Zo ja: „Export fold-assignment.json", leg het geëxporteerde bestand in de reports-map, en bij de volgende trainings-run met –benchmark (of de bijbehorende Inspector-instellingen) wordt precies deze fold-opdeling als test-holdout gebruikt — in plaats van de standaard „every-8th".
W23Knop „Open transforms.json…"
WAAR
Toolbar linksboven..
TECHNISCH
Opent een bestand-selectiedialoog die op JSON- bestanden beperkt is. Na bevestiging laadt de holdout-module het bestand. De loader parset zowel het nerfstudio-formaat (camera-intrinsics plus lijst van frames met beeldpad en transform-matrix) als het instant-ngp-formaat (gelijke opbouw). Per frame wordt de kijkrichting uit de transform-matrix geëxtraheerd (z-as van de camera-lokale basis) en opgeslagen. Wanneer het parsen mislukt, wordt een foutmelding in het statusgebied getoond.
Ook via CLI: –holdout-file /pad/naar/transforms.json start het venster direct met geladen bestand.
W24Picker „Strategy" (angular/linear)
WAAR
Linker zijbalk, boven..
TECHNISCH
Radio-picker met twee opties: Angular en Linear. Strategy-wissel triggert automatisch een herberekening van de folds. De kijkrichtingen zijn een lijst van 3D-eenheidsvectoren op de sfeer; de angular-strategie projecteert ze op de longitudinale hoek φ en sorteert, de lineaire strategie maakt gewoon een modulo-opdeling over de frame-index.
W25Slider „k Folds"
WAAR
Linker zijbalk, midden..
TECHNISCH
Slider van 3 tot 10, stapgrootte 1. Bij wijziging wordt de fold-berekening automatisch opnieuw aangestoten, zodat de folds-lijst, de train/test-indices en de per-fold-score meteen opnieuw worden berekend. De gekozen waarde wordt als monospaced-digit-tekst rechts naast het label getoond.
Vuistregel: k=5 is standaard (geeft je 20% test per fold, dat is gebruikelijk voor cross-validation). k=10 wanneer je heel veel data hebt en meer folds voor statistische betekenis nodig hebt. k=3 wanneer je weinig data hebt.
W26Picker „Test Fold"
WAAR
Linker zijbalk, onder de k-slider..
TECHNISCH
Menu-picker. Opties zijn dynamisch 0..<k, label „Fold 1" tot „Fold N" (dus 1-indexed in de UI, 0-indexed intern). Mocht de eerder gekozen index ≥ k zijn (bijv. omdat je k van 10 naar 5 hebt verminderd), wordt hij automatisch op 0 teruggezet. De gekozen test-fold wordt in de globe rood weergegeven, alle andere groen.
W27Knop „Export fold-assignment.json"
WAAR
Linker zijbalk, onderaan..
TECHNISCH
Opent een save-dialoog met standaard- bestandsnaam fold-assignment.json. Na bevestiging codeert de holdout- module de actuele opdeling in een JSON-schema (per-frame fold- toewijzing plus strategy-metablok). Dit bestand kan vervolgens bij de volgende training met –benchmark worden meegegeven, zodat dezelfde holdout voor de finale metriek-analyse wordt gebruikt. Schrijffouten worden als fouttekst getoond; succes in groene tekst als „Saved to (filename)".
W28SCNView (3D-cameraglobe)
WAAR
Middenpaneel in het holdout-venster..
TECHNISCH
SceneKit-globe-view. De scène bestaat uit: een wireframe-bol (radius 1,0, 36 segmenten, donkergrijs), drie gekleurde asuitsteeksels (rood/groen/blauw voor X/Y/Z, elk 1,2 lang), en per camera een kleine marker-bol (radius 0,03) op de bijbehorende kijkrichtingspositie op de eenheidsbol (licht buiten, zodat die niet IN de wireframe-bol verdwijnt). De markers worden bij elke fold-wijziging NIET opnieuw gebouwd — rebuild is alleen dan nodig, wanneer de framelijst verandert (dus een nieuwe JSON wordt geladen). In plaats daarvan loopt per update een in-place-actualisatie van de material- kleuren: rood voor test-indices, groen voor training, lichtgrijs wanneer geen van beide. Zo blijven slider-ticks performant zelfs bij N > 1000 camera's.
De camera-controle is geactiveerd — je kunt met de muis de globe roteren, zoomen, pannen. Belichting zorgt ervoor dat de markers niet plat ogen. Achtergrond is donkergrijs.
W29FoldCard (Tap to Select Fold)
WAAR
Rechter zijbalk, „Angular Correlation"-sectie..
TECHNISCH
Per fold een kaart-view — afgerond rechthoek met 6 pt radius, padding 10, verticale layout met twee regels (boven „Fold N" + camera-aantal, onder „Mean nearest angle:" + waarde in graden). Achtergrondkleur conditioneel: actieve fold = accentkleur halfdoorzichtig, inactieve = neutrale standaard-material. Tikken kiest de fold, en de globe kleurt zich live om.
De „Mean nearest angle"-score is de gemiddelde kleinste hoek per test-camera tot de dichtstbijzijnde trainingscamera (in radiaal intern berekend, in graden in de UI getoond).
BayesOpt Console (W30–W39)

Lege toestand met search-space-picker (RadianceKit defaults (6-dim)), trial-budget-slider (standaard 40), random-seed (42) en drie lege panelen voor convergence-chart, trial log en search-space-parameter-lijst.
Lege toestand (na het eerste openen) — convergence-chart en trial-tabel vullen zich zodra een run is gestart, zie volgende shot.

Status rechtsboven „Finished — best 0,9943 after 40 trials". Linker zijbalk: search-space-picker op RadianceKit defaults (6-dim), trial-budget 40, random seed 42. Parameter-lijst toont de zes te tunen hyperparameters met hun waardebereiken: mipSmoothing3DScale [0.05, 0.5], mipFilter2DVariance [0.1, 0.6], densifyGradThreshold [5e-07, 5e-06], ssimWeight [0.05, 0.5], mcmcNoiseScale [1e-05, 0.0001], mcmcRelocationInterval [50, 200]. Midden: convergence-chart (X = trial-index 1–40, Y = objective value 0–1) — grijze punten = initial-samples (LHS), blauwe punten = BayesOpt-acquisition, oranje punten = restart-trials (#22 en #31). Beste-waarde-lijn stijgt steil tot trial ~7, daarna nog slechts marginale verbetering tot trial 15, vanaf daar vlak plateau bij 0,99+. Rechter zijbalk: trial-log #1–#34 met score + tag (init/bo/restart). Save-Best-Config-knop rechtsboven schrijft bayesopt-best.json.
Wat het is: Een Bayes-optimalisatie-console voor hyperparameter-zoeken. Bayes-opt is een automatische methode die probeert met zo weinig mogelijk experimenten het optimale punt van een onbekende functie te vinden — typisch: „welke combinatie van mcmcMaxGaussians, capMultiplier, ssimWeight en gradThreshold levert de beste PSNR voor mijn scèneklasse?" In plaats van een grid van 6^4 = 1296 trials probeert Bayes-opt ongeveer 40–100 geïnformeerde trials en komt daarmee dicht bij het optimum.
Belangrijk: De actueel in de app uitgeleverde versie voert de optimalisatie niet uit tegen echte trainingsruns (dat zou dagen duren), maar tegen een synthetische demo-objective — een multimodaal landschap met hill-climbing-karakter plus lichte noise. Dat is bewust zo: het venster moet je het gedrag van de optimizer tonen (convergentieverloop, sample-punten, best-so-far) en je de search-space-definities laten begrijpen. Voor echte trainings-gedreven BayesOpt-runs (zoals in fase Q7 voor de scene-class-voorinstellingen uitgevoerd) wordt een aparte offline CLI-workflow gebruikt; het venster is de live-UI-variant.
Drie use-cases: 1. Je wilt begrijpen hoe BayesOpt werkt — start dan een demo-run en observeer de convergence-chart. 2. Je plant een nieuwe scèneklasse (bijv. „aquaria" of „antiek meubilair"), waarvoor de ingebouwde 10 voorinstellingen niet perfect passen. Definieer mentaal een zoekruimte, test hem hier met de „Bowl demo" of „Densify"-voorinstelling, exporteer dan de best-config als JSON en gebruik hem als startpunt voor een echte trainingsrun. 3. Je wilt de in het RKBayesOpt-package gedefinieerde standaard-search-spaces (Mip-subset, RadianceKit defaults) inspecteren — die worden in het parameter-paneel van de linker zijbalk opgesomd.
- Convergence-chart (middenkolom): Y = beste tot dusver bereikte objective-functie-waarde. X = trial-index. Aanvankelijk steil stijgend (BayesOpt probeert de initial-samples willekeurig, sommige ervan zijn gelukkig), daarna toenemend vlak, omdat de dicht-bij-optimum-regio is uitgeput. Wanneer de lijn 20+ trials lang vlak blijft, kun je de run stoppen — verdere trials brengen niets meer. De afzonderlijke punten in het chart zijn de individuele trial-waarden (dus niet „best so far"), gekleurd op fase: grijs = initial sample, blauw = BayesOpt-acquisition, oranje = restart. - Trial-tabel (rechterkolom): #1, #2, #3, … met elk waarde en fase-tag. De tot dusver beste trial is met een gele ster gemarkeerd. Uit de tabel kun je de best-trial identificeren en zijn parameter-waarden later bij de export bekijken. - Search-space-inspector (linker zijbalk): toont voor de gekozen voorinstelling alle parameternamen en hun zoekbereiken [lo, hi]. Wanneer je bij voorinstelling „RadianceKit defaults (6-dim)" staat, zie je bijv. „densifyGradThreshold [5e-7, 5e-6]" — dus log-uniform tussen deze twee waarden.
Kies voorinstelling „RadianceKit defaults (6-dim)", trial-budget 40, seed 42. Klik „Start". Observeer: de eerste 8 trials zijn grijs (initial samples, LHS-Latin-Hypercube), de volgende blauw (BayesOpt-geacquireerd). De convergence-chart wordt steil tot trial ~15, daarna vlakt hij af. Bij trial ~30–40 stabiliseert de beste waarde zich. Klik „Save Best Config" — een bayesopt-best.json wordt opgeslagen met de voorinstellingsnaam, trial-index, waarde en de gedecodeerde parameter-waarden. Deze JSON kun je dan handmatig in je voorinstellingsdefinitie overnemen.
W30Knop „Start"
WAAR
Toolbar links, in idle/finished-state..
TECHNISCH
Reset de trial-lijst, wisselt in de running-state, genereert een nieuwe run-ID (voor stale-detection bij meervoudige start-klikken) en genereert een verse pause-gate. Vervolgens start een achtergrond-task die de optimizer als asynchroon stream uitvoert. Initial-samples-grootte volgt uit min(8, budget / 4 + 1) — dus typisch 8 Latin-Hypercube-samples bij budget ≥ 28, minder bij klein budget. Trial-updates worden incrementeel ontvangen en in de lijst aangehangen. Stale-run-protection: wanneer ondertussen een tweede start-klik de run-ID opnieuw zet, worden updates uit de oude run verworpen.
Primary-action-stijl voor de prominente knop-look.
W31Knop „Pause"
WAAR
Toolbar links, in running-state..
TECHNISCH
Zet de pause-gate actief en wisselt in de paused-state. Het eigenlijke effect: de runner wacht in een 50-ms-polling-loop voordat hij de volgende objective-functie evalueert. Dat betekent: een momenteel lopende trial wordt afgemaakt (hij is immers synthetisch en duurt slechts microseconden), maar geen verder trial wordt aangestoten. Zodra Resume loopt, gaat het verder waar gestopt werd.
W32Knop „Stop"
WAAR
Toolbar links, in running- en paused-state..
TECHNISCH
Breekt de runner-task af, nullt de referentie, lost de pause-gate (mocht hij nog paused zijn), en wisselt naar de finished-state (wanneer trials bestaan) of idle-state (wanneer geen). De reeds berekende trials blijven in de lijst zichtbaar — stop verwijdert ze niet. Destructieve knop-rol toont de knop in rood, omdat hij de run afbreekt.
W33Knop „Resume"
WAAR
Toolbar links, in paused-state..
TECHNISCH
Lost de pause-gate en wisselt in de running-state terug. De runner-task loopt al (hij wacht immers in de polling-loop); zodra de loop merkt dat de pauze is opgeheven, loopt hij verder en start het volgende trial.
W34Knop „Save Best Config"
WAAR
Toolbar rechts, altijd zichtbaar (maar disabled wanneer geen bestTrial aanwezig)..
TECHNISCH
Opent een save-dialoog met standaard- bestandsnaam bayesopt-best.json, op JSON beperkt. Na bevestiging wordt een payload-dictionary gebouwd: voorinstellingsnaam, trial-index, waarde (objective-score), parameter (dictionary van de gedecodeerde parameter- namen → waarden). De decodering projecteert de genormaliseerde zoekruimte-coördinaten in [0,1]^d terug naar het origineel-waardebereik (met log-uniform/linear/integer-schalen overeenkomstig). JSON-output is pretty-printed en met gesorteerde keys. Bij schrijffout wordt (in de actuele demo-versie) stilzwijgend genegeerd — geen error-UI, omdat dat een demo-pad is.
De knop blijft grijs zolang geen trial is gelopen.
W35Picker „Search Space"-voorinstelling
WAAR
Linker zijbalk, boven..
TECHNISCH
Menu-picker met vier voorinstellingsopties: - „RadianceKit defaults (6-dim)" — de volledige standaard-zoekruimte met alle Q7-hyperparameters. - „Mip subset (2-dim)" — alleen mipSmoothing3DScale [0.05, 0.5] log-uniform en mipFilter2DVariance [0.1, 0.6] linear. Nuttig wanneer je Mip-Splatting voor een scèneklasse wilt tunen. - „densify-until + ssim-weight + grad-thresh" — drie densify-relevante parameters (densifyGradThreshold log-uniform, ssimWeight linear, densifyUntilIter integer). - „Bowl demo (1-dim)" — pedagogische single-parameter-zoekruimte voor „zo werkt BayesOpt"-demo's.
Terwijl een run actief is, kan de zoekruimte niet worden gewisseld (zou de optimizer in verwarring brengen).
W36Slider „Trial Budget"
WAAR
Linker zijbalk, onder de search-space-picker..
TECHNISCH
Slider van 10 tot 200, stapgrootte 5. Standaard 40. Dat betekent: BayesOpt mag maximaal N trials maken. Daarvan zijn de eerste paar initial samples (Latin-hypercube), de rest zijn echte BayesOpt-trials. Vuistregels voor de praktijk: een zoekruimte met d dimensies heeft ongeveer 10d tot 20d trials nodig voor een goed optimum. Bij 6-dim defaults dus 60–120, bij 2-dim Mip-subset 20–40, bij 1-dim bowl-demo 10–20.
Tijdens de run is de slider gedeactiveerd.
W37Slider „Random Seed"
WAAR
Linker zijbalk, onder de budget-slider..
TECHNISCH
Slider van 1 tot 100, stapgrootte 1. Standaard 42. De seed wordt zowel aan de initiële Latin-hypercube-samples als ook aan de noise-component van de demo-objective doorgereikt. Reproduceerbaarheid: dezelfde seed + dezelfde zoekruimte + hetzelfde budget geeft exact identieke trial-sequentie. Nuttig voor „krijgen alle collega's dezelfde run wanneer ze de demo nabouwen?". Tijdens de run gedeactiveerd.
W38Chart (Convergence)
WAAR
Middenkolom van het venster..
TECHNISCH
Swift-Charts-diagram met twee lagen: 1. een lijn voor „best-value-so-far" per trial — een monotoon stijgende of gelijkblijvende curve in accentkleur. 2. een punt per trial met de individuele objective-waarde, gekleurd op fase. Symboolgrootte 40. Drie fase-labels: „init" (grijs), „bo" (blauw), „restart" (oranje).
Een kleine legende toont de fasekleuren linksboven. Wanneer de trial- lijst leeg is (vóór de eerste start), wordt in plaats daarvan een empty- state-weergave met chart-icoon en hint „Press Start to begin a BayesOpt run." ingeblend.
W39Table (Trial Log)
WAAR
Rechterkolom van het venster..
TECHNISCH
Scroll-gebied met lazy gestapelde trial- regels. Per regel een horizontale stack: trial-nummer (3-digit monospaced, links), waarde (monospaced, rechtsgebonden, 70 pt breed), fase- tag (capsule, gevuld met fasekleur bij 25% opacity), optioneel een gele ster wanneer dit trial het momenteel beste is. Een auto-scroll-mechanisme springt automatisch naar het einde, zodra een nieuwe trial erbij komt — zodat je het live-verloop aan de schermbodem kunt meelezen, zonder zelf te scrollen.
Hoofdvenster: lossverloop en Gaussian-count (I39–I41, kruisverwijzing)
Drie van de Inspector-weergaven in het hoofdvenster verdienen een eigen uitleg, omdat ze tijdens een lopende training continu te zien zijn en er belangrijke vuistregels zijn over wanneer het verloop gezond oogt. De weergaven staan in de Inspector onder de „Loss Chart"-sectie (zie hoofdstuk 2 — Inspector) en vullen de holdout-analyse uit het Aux-venster boven aan.
Wanneer is de loss-curve gezond? Een gezonde loss-curve toont drie fasen: (1) warmup — de eerste 200–500 iteraties valt de loss steil van hoog (typisch 0,15–0,25 voor L1+SSIM-gecombineerd afhankelijk van scène) op ongeveer de helft. Wanneer de loss in deze fase NIET valt, is meestal de invoer verkeerd (beelden kapot, SfM-poses slecht, aantal initial Gaussians te klein). (2) densification — tussen ~500 en densifyUntilIteration (klassiek 15K, MCMC tot 20K of 25K) valt de loss verder, vaak met kleine sprongen naar beneden wanneer densify-operaties nieuwe Gaussians invoegen en de optimizer ze benut. De Gaussian-count stijgt in deze fase. (3) refinement — daarna loopt de loss in een vlakker wordende staart. Typische eindwaarden: Tanks-&-Temples Truck met P4 Quality landt bij L1 ≈ 0,023, Horse met Full Classic V546 bij L1 ≈ 0,0230, outdoor-Mip-NeRF360-scènes vaak slechter (0,04–0,07).
Wat betekent een plateau? Een plateau (loss-curve verloopt horizontaal over meerdere duizenden iteraties) heeft twee interpretaties: (a) het model is geconvergeerd, verdere training brengt niets meer — dat is het goede geval. (b) het model is stuck (lokaal minimum, slechte gradiëntinformatie, een cap aan de buffer-limit) — het slechte geval. Beide ogen in het chart identiek. Onderscheid: bekijk de Gaussian-count. Wanneer hij ook vlak is EN dicht bij de MCMC-cap (bijv. 150K van 150K bij .fullMCMC), ben je aan de limiet — ofwel cap verhogen ofwel plateau accepteren. Wanneer de Gaussian-count nog groeit, maar de loss niet valt, is dat stuck.
Wanneer afbreken vs verder trainen? Vuistregel: 10K iteraties lang geen verbetering van de min-loss → afbreken, verdere iteraties zijn verspild. Daarvoor: kun je via Cmd+T (Training-menu → Continue Training → +5K iterations) nog een verlenging aanhangen, mocht je grensgevallen-verbetering zien. Let op: bij MCMC is het plateau vaak echt — het cap is de natuurlijke grens.
Gaussian-count-plateau is GEEN „klaar"-signaal. Het betekent slechts dat MCMC het cap heeft bereikt of dat Classic densification uitgeput is. De echte „klaar"-vraag stelt pas de holdout-analyse — PSNR/SSIM/LPIPS op een onafhankelijke testset, geanalyseerd in het holdout-venster (W23–W29) of via –benchmark-flag.
PSNR/holdout is de waarheid, loss slechts proxy. De loss is een relatieve metriek: hij valt terwijl je model zich aan de trainings-views aanpast. Een lage loss betekent echter niet automatisch goed model — wanneer het model de trainingsbeelden uit het hoofd heeft geleerd (overfitting), zou de loss klein zijn, maar de PSNR op niet-geziene views (holdout) zou slecht zijn. Vandaar: voor de finale kwaliteitsbeoordeling altijd op holdout-metrics kijken, niet op end-loss alleen.
Vuistregel-box
- User Guide en Keyboard Shortcuts zijn statische hulp — bij trefwoordvragen snel, voor diepte de hier voorliggende handleiding gebruiken. - Manage Storage openen zodra de schijf onder 10% vrije ruimte valt. Logs en imports-staging zijn de gebruikelijke boosdoeners. - Pareto Dashboard pas na minstens drie of vier trainingsreports zinvol. X-as = kosten (Time / Gs), Y-as = kwaliteit (PSNR / SSIM). Pareto-front toont de efficiënte combinaties. - Holdout Analysis gebruiken voordat je PSNR-benchmarks met anderen publiceert — verzekert je dat je testset werkelijk representatief is. - BayesOpt Console is primair een leer- en inspectietool voor zoekruimte-definities. Voor echte trainings-gedreven hyperparameter-tuning de offline CLI-workflow gebruiken. - Loss-plateau en Gaussian-count-plateau zijn afzonderlijk te interpreteren. Cap-limit is geen „klaar"-signaal. Echte kwaliteit meet alleen holdout-PSNR. - 10K iteraties zonder min-loss-verbetering → training stoppen.