3D Gaussian Splatting — Text-Driven Scene Editing

A room reconstructed from a 25-second handheld phone video, then edited by the instruction “make it look like a snowy winter scene” — applied to the 3D scene itself, not to a rendered image of it. Drag either pane to orbit.

379 / 379 frames registered held-out PSNR 33.51 SSIM 0.9664 LPIPS 0.0457 367,963 Gaussians 2,500 edit steps

Original reconstruction

Loading the reconstruction — about 9 MB…

After the edit — “a snowy winter scene”

Loading the edited scene — about 9 MB…

Drag to orbit · scroll to zoom · both panes are the real exported splat, compressed to .ksplat and rendered in your browser.

The edit is scene-wide, not localised

InstructPix2Pix edits whole frames, so naming one object does not confine the edit to that object. That is why a scene-level prompt works better here than an object-level one: “make the leaves look like autumn” turned the paisley bedspread into a carpet of fallen leaves. The weakness is prompt-dependent rather than absolute, which is a cheaper thing to learn than a segmentation pipeline would have been.

0.2% of the Gaussians were removed before serving

The export contains a few hundred Gaussians up to 3,840× the median size and almost fully opaque. From a training viewpoint they sit behind correct geometry and alpha-compositing hides them — which is why nerfstudio's own render looks clean. Orbit anywhere else and they are in front of everything. Dropping the 0.22% with a linear scale above 0.5 costs a rounding error of real scene content and removes the artifact. The counts above are after that pass: 368,785 reconstructed, 367,963 served.

Viewing angle is bounded by the capture

Gaussians are only fitted to the directions they were actually observed from. The 379 training cameras covered a handheld arc, so orbiting far outside it renders as spikes — that is the data being honest, not a bug.

Nothing is inferred here

All the GPU cost is up front. This page serves two pre-exported splats and renders them client-side in three.js, so it runs as a free static Space. They are shipped as .ksplat, the viewer's own compressed format — 43 MB of .ply becomes 17.7 MB, with no visible loss at spherical-harmonics degree 0, which is what the flat-colour export produces anyway.

The interesting part is the debugging

Two upstream nerfstudio bugs silently made twelve consecutive edit runs no-ops, and what caught it was Adam's own step counter rather than anything visible in a rendered frame. Full writeup, all twenty-one logged defects, and the reproduction recipe: github.com/E10o0/3dgs-generative-edit.

Built on nerfstudio (splatfacto), gsplat, Instruct-GS2GS and InstructPix2Pix. Viewer: GaussianSplats3D and three.js, both MIT.