Verbeterde Gaussian Splatting in Julia

Meerdere GPU-backends met dezelfde code

Omdat de software volledig in Julia is geschreven, ondersteunt het de volgende GPU-backends:

  • AMD GPU (AMDGPU.jl)
  • NVIDIA GPU (CUDA.jl)
  • MacBook GPU (Metal.jl)

Dit wordt gerealiseerd met KernelAbstractions.jl, waardoor een enkele kernel kan worden geschreven die vervolgens wordt gecompileerd voor een specifiek doel.

Multithreaded UI

Om te voorkomen dat de applicatie vastloopt tijdens zware taken (zoals JIT-compilatie van GPU-kernels, het laden van datasets, etc.), is de app nu gesplitst in twee threads:

  • Frontend: Beheert de gebruikersinterface (UI), voert OpenGL-rendering uit en stuurt commando's naar de backend.
  • Backend: Voert de Gaussian Splatting-rendering, training en het laden van datasets uit.

Hierdoor blijft de UI altijd responsief en kan de gebruiker ermee interageren, zelfs als er langdurige taken op de achtergrond draaien. Bovendien worden nu voortgangsbalken met tips getoond in plaats van dat het scherm bevriest. Dit is bijvoorbeeld zichtbaar wanneer de dataset wordt geladen of wanneer kernels worden gecompileerd voor de eerste trainingsiteratie. De UI/UX heeft daarnaast een grote update gekregen en toont nu live verliesgrafieken (loss plots) en alle hyperparameters tijdens het trainen.

Markov Chain Monte Carlo Strategie

Naast de standaard strategie voor het klonen en splitsen van densificatie, wordt nu ook de MCMC-strategie ondersteund (3D Gaussian Splatting as Markov Chain Monte Carlo).

Deze methode maakt een preciezere controle over het aantal Gaussians in de scène mogelijk en is over het algemeen minder afhankelijk van een goede initiële instelling. Gebruikers kunnen MCMC selecteren tijdens het laden van de dataset of direct in de code via:

Trainer(
    rasterizer, gaussians, dataset, opt_params;
    strategy=MCMCStrategy(; kwargs...),
)

Depth & Geometry Supervision

Om de gereconstrueerde geometrie te verbeteren, kunnen diepte-priors worden meegeleverd via bestaande depth-estimation modellen. Dieptebeelden moeten deel uitmaken van de dataset onder het pad <dataset-root>/depths/<BESTANDSNAAM>.png.

Om diepte-supervisie in te schakelen, kan dit via de UI of met OptimizationParams(; usedepthloss=true). Dieptekaarten bieden tijdens de training supervisie, wat resulteert in een betere geometrie en een vermindering van floaters. Aangezien de diepte per frame kan variëren, worden alle dieptekaarten eerst gefit tegen de prior point cloud naar dezelfde schaal. Kaarten die niet correct kunnen worden gefit, worden verwijderd en niet gebruikt voor supervisie.

Om de geometrie en gladheid verder te verbeteren, kan geometrische regularisatie worden uitgevoerd om de vorm van het oppervlak te beperken, terwijl diepte-supervisie alleen de locatie beperkt. Dit kan worden ingeschakeld in de UI of met OptimizationParams(; usenormalloss=true) en voert twee acties uit:

  1. Depth normal consistency: Zorgt dat de oriëntatie van het oppervlak vaststaat; normalen afgeleid van de gerenderde dieptekaart moeten overeenkomen met de per-Gaussian normalen.
  2. Flattening surface: Het platmaken van elke Gaussian langs zijn kleinste as.

Sky Dome

Om de lucht/verre achtergrond te scheiden en floaters te verminderen, ondersteunt GaussianSplatting.jl nu de 'Sky Dome'. Dit is een bevroren schil van Gaussians met een grote straal, die in een aparte pass wordt gerenderd en achter de scène wordt geplaatst.

Afhankelijk van de omgeving kan gekozen worden tussen een volledige sfeer of een halve sfeer (hemisfeer). Bij een volledige sfeer kan het gebeuren dat delen van de geometrie naar zichzelf toe worden getrokken, waardoor de grond minder opaak wordt. Bij een hemisfeer is de onderste helft van de achtergrond zwart en heeft dit geen invloed op de geometrie.

Vergelijkingen na 3.000 iteraties laten zien dat met een Sky Dome de lucht duidelijk gescheiden is van het object (bijv. een fontein) en niet meer als 'floaters' rondzweeft. De overhead van de Sky Dome is verwaarloosbaar (~32K Gaussians) vergeleken met de rest van de scène (miljoenen Gaussians).

Om de scheiding verder te optimaliseren, kunnen segmentatiemaskers voor de lucht worden gebruikt, verkregen uit bestaande sky-segmentation modellen. Deze moeten in de dataset staan onder het pad <dataset-root>/sky/<BESTANDSNAAM>.png. Dit helpt vooral bij kleine details rond de randen van de geometrie, zoals bladeren.

Camera Frustum

De visualisatie van het camera-frustum heeft een update gekregen en toont nu een miniatuurweergave van het beeld dat de actuele camera heeft genomen.

Overige Verbeteringen

Andere verbeteringen in willekeurige volgorde:

  • Automatische checkpointing: Slaat elke N stappen checkpoints op in de geselecteerde directory.
  • Custom hyperparameter configuratie: Instellingen voor leerfrequentie (learning rate), loss-gewichten, regularisatie, etc., kunnen worden meegeleverd via een hyperparameters.toml bestand tijdens het laden van de dataset (via de knoppen Load... en Save...). Deze kunnen later worden opgeslagen om reproduceerbaarheid te garanderen.
  • Camera pad voor Capture Mode: Kan nu exact worden opgeslagen, geladen en gereproduceerd over verschillende trainingsruns.
  • VRAM-monitor: De UI toont hoeveel VRAM er door de applicatie wordt gebruikt.

---

Dit concludeert de update van GaussianSplatting.jl 2.0.

Erkenningen

  • LichtFeld Studio voor de inspiratie.
  • De mensen die werken aan het JuliaGPU-ecosysteem.