MCPcopy Index your code
hub / github.com/DSL-Lab/StreamSplat

github.com/DSL-Lab/StreamSplat @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
579 symbols 1,646 edges 86 files 108 documented · 19%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

[ICLR 2026] StreamSplat: Towards Online Dynamic 3D Reconstruction from Uncalibrated Video Streams

arXiv Project Page

results

Overview

StreamSplat is a fully feed-forward framework that instantly transforms uncalibrated video streams of arbitrary length into dynamic 3D Gaussian Splatting representations in an online manner.

  • Feed-forward inference: No per-scene optimization required
  • Camera-free: Works directly with uncalibrated monocular videos
  • Dynamic scene modeling: Handles both static and dynamic scene elements through polynomial motion modeling
  • Probabilistic Gaussian prediction: Uses truncated Gaussian models for robust Gaussian position modeling
  • Two-stage training: Stage 1 trains the static encoder, Stage 2 trains the dynamic decoder

Videos

https://github.com/user-attachments/assets/d72b75de-e07a-4d81-a23f-f85e99c9bd05

https://github.com/user-attachments/assets/d975b425-1e4c-4dc9-8398-0a1a43d50e67

https://github.com/user-attachments/assets/d2a064f5-f4d7-46c4-8a3a-28fcb8679df5

https://github.com/user-attachments/assets/466a222d-f3b5-447a-84c0-a47538071c05

Environment Setup

  1. Create conda environment:
conda env create -f environment.yml
conda activate StreamSplat
  1. Build the differentiable Gaussian rasterizer:
cd submodules/diff-gaussian-rasterization-orth
pip install .
  1. Download pretrained depth model:

Download Depth Anything V2 checkpoint and place it in the checkpoints/ directory:

mkdir -p checkpoints
# Download depth_anything_v2_vitl.pth from https://github.com/DepthAnything/Depth-Anything-V2
# Place it in checkpoints/depth_anything_v2_vitl.pth

Dataset Preparation

StreamSplat supports training on multiple datasets. All datasets require pre-computed depth maps using Depth Anything V2.

Supported Datasets

Dataset Type Description
RealEstate10K Static Real estate videos
CO3Dv2 Static Object-centric multi-view
DAVIS Dynamic High-quality videos
YouTube-VOS Dynamic Large-scale videos

Preprocessing Depth Maps

Use the provided script to preprocess depth maps for DAVIS (similar scripts can be adapted for other datasets):

python preprocess_depth_davis.py --root_path /path/to/davis

Configure Dataset Paths

Edit configs/options.py and configs/options_decoder.py to set dataset paths:

root_path_re10k: str = "/path/to/re10k"
root_path_co3d: str = "/path/to/co3d"
root_path_davis: str = "/path/to/davis"
root_path_vos: str = "/path/to/youtube-vos"

Training

Configure Accelerate

Create an accelerate config file (or use the provided acc_configs/gpu8.yaml):

accelerate config

Stage 1: Train Static Encoder

Train the static encoder on combined datasets:

accelerate launch --config_file acc_configs/gpu8.yaml train.py combined \
    --workspace /path/to/workspace/encoder_exp

Stage 2: Train Dynamic Decoder

After Stage 1 completes, train the dynamic decoder with the frozen encoder:

accelerate launch --config_file acc_configs/gpu8.yaml train_decoder.py combined \
    --workspace /path/to/workspace/decoder_exp \
    --encoder_path /path/to/workspace/encoder_exp/model.safetensors

Monitoring Training

Training progress is logged to Weights & Biases. Set up wandb before training:

wandb login

Checkpoints are saved every 10 epochs and every 30 minutes to checkpoint_latest/.

Inference

Download our pretrained checkpoint at Google Drive and place it in the checkpoints/ directory:

python splat_inference.py \
    --resume checkpoints/streamsplat.safetensors \
    --input_frames_path=/path/to/rgb_frames \
    --input_depths_path=/path/to/depth_maps 

Citation

If you find this work useful, please cite:

@article{wu2025streamsplat,
    title={StreamSplat: Towards Online Dynamic 3D Reconstruction from Uncalibrated Video Streams}, 
    author={Zike Wu and Qi Yan and Xuanyu Yi and Lele Wang and Renjie Liao},
    journal={arXiv preprint arXiv:2506.08862},
    year={2025},
}

Acknowledgments

This project builds upon several excellent works:

Core symbols most depended-on inside this repo

sample
called by 15
model/mixture_model_utils.py
load_state_dict
called by 13
model/splat_model.py
_make_dinov2_model
called by 11
encoders/dinov2/hub/backbones.py
norm
called by 9
encoders/dinov2/hub/depth/decode_heads.py
_make_dinov2_linear_classifier
called by 8
encoders/dinov2/hub/classifiers.py
constant
called by 8
datasets/augmentv2.py
matrix
called by 7
datasets/augmentv2.py
constrain_to_multiple_of
called by 6
model/depth_anything/depth_anything_v2/util/transform.py

Shape

Method 309
Function 165
Class 105

Languages

Python97%
C++3%

Modules by API surface

model/transformer_utils.py51 symbols
encoders/dinov2/hub/depth/decode_heads.py37 symbols
model/model_utils.py33 symbols
utils/general_utils.py23 symbols
model/depth_anything/depth_anything_v2/dinov2.py21 symbols
encoders/dinov2/models/vision_transformer.py21 symbols
encoders/dinov2/layers/block.py20 symbols
encoders/dinov2/hub/depth/encoder_decoder.py19 symbols
datasets/augmentv2.py16 symbols
model/depth_anything/depth_anything_v2/dinov2_layers/block.py15 symbols
encoders/dinov2/hub/depthers.py14 symbols
encoders/dinov2/hub/classifiers.py14 symbols

For agents

$ claude mcp add StreamSplat \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact