Gaussian Splatting 3 Ways
Tkinter + OpenGL desktop app for training and viewing 3D Gaussian splats from casual captures. It wraps COLMAP for camera poses, uses PyTorch + gsplat for training, and stores everything in a reproducible cache tree so scenes can be resumed later. nullsplats_720p30_h265_under10MB_noaudio.mp4 Ingest a video or image folder, extract and score frames, and auto-select a subset. Run COLMAP SfM to produce camera poses and sparse points. Train Gaussian splats on the GPU with gsplat; export checkpoints as .ply or .splat. View splats in an embedded OpenGL viewer inside the app. Keep per-scene inputs/outputs under cache for repeatable workflows. Nullsplats supports 3 methods of creating splats: Traditional colmap + gsplat training. Depth Anything 3 3D Gaussian Estimation. SHARP Monocular View Synthesis. Here are some sample splats trained using this program. Gsplat 50-view gsplat_50view_720p.mp4 Gsplat closeup gsplat_closeup.mp4 DA3 5-view DA3_5view_720p.mp4 DA3 closeup DA3_closeup.mp4 SHARP 1-view SHARP_1view_720p.mp4 SHARP closeup SHARP_Closeup.mp4 Side-by-side comparison Comparison_Closeup.mp4 On my RTX pro 6000 Blackwell the gsplat trained in around 5 minutes including colmap time. Depth Anything 3 took around 3-4 minutes but used a significant 16GB of vram. SHARP produced a splat in around 2.5 minutes. Overall each is pretty good considering the input. The single view SHARP splat is particularly impressive. If DA3 was less weird, was less transparent it would be significantly better. The geometry looks pretty good. Want to discuss development or get support? Open an Issue or checkout the discord . main.py - app entrypoint (Tk root + tabs). nullsplats/ ui/ - Tk UI, tabs, OpenGL viewers, shaders (ui/shaders/ .vert| .frag). backend/ - frame extraction, COLMAP pipeline, splat training. util/ - logging, config, threading helpers and tool path defaults. ui/ - Tk UI, tabs, OpenGL viewers, shaders (ui/shaders/ build.bat - portable bundle builder. run.bat - launcher used inside the portable bundle. requirements.txt - Python dependencies. The app is organized around a small core state object (AppState), four UI tabs (Inputs, COLMAP, Training, Exports), and a backend pipeline that handles frame extraction, COLMAP structure-from-motion, and gsplat training. main.py sets up logging, creates AppState, and builds the Tk root in ui/root.py. ui/root.py wires the four tabs and routes scene selection between them. Inputs tab creates scenes, extracts frames, and persists selected/resized frames. COLMAP tab runs SfM to generate camera poses and sparse points. Training tab runs gsplat training and streams live previews. Exports tab lists checkpoints and renders previews/turntables. nullsplats/app_state.py owns AppState (config + SceneManager + current scene). nullsplats/backend/io_cache.py defines ScenePaths and metadata read/write. Cache layout (per scene): cache/inputs/<scene_id>/source (original source copy) cache/inputs/<scene_id>/frames_all cache/inputs/<scene_id>/frames_selected cache/inputs/<scene_id>/metadata.json cache/outputs/<scene_id>/sfm cache/outputs/<scene_id>/splats cache/outputs/<scene_id>/renders nullsplats/backend/scene_manager.py handles scene discovery, selection persistence, and thumbnail caching (thumbnails.db). ui/root.py builds the ttk.Notebook, instantiates tabs, and coordinates tab changes. Tabs: Inputs: ui/tab_inputs.py + mixins COLMAP: ui/tab_colmap.py Training: ui/tab_training.py + layout/preview mixins Exports: ui/tab_exports.py Wizard flows: Inline wizard in Inputs: ui/tab_inputs_wizard.py (single popup with inputs + training preset + COLMAP options). Standalone wizard window: ui/wizard.py ui/tab_inputs.py is the coordinator for the Inputs workflow. ui/tab_inputs_scenes.py renders the scene sidebar and scene management. ui/tab_inputs_grid.py renders the virtualized frame grid and...
Preview: ~500 words
Continue reading at Hacker News
Read Full Article