Paper (arXiv:2607.08808) · IROS 2026
Feed-forward 3D Gaussian Splatting for autonomous driving scenes, built on KITTI-360. Official implementation of StereoSplat+: Feed-Forward Stereo Gaussian Splatting with Diffusion-Assisted Progressive Inference (Liu & Okutomi, IROS 2026).
This repository implements StereoSplat with confidence (15D Gaussians) and StereoSplat+, which augments stereo inputs with self-pseudo views, Difix3D enhancement, and per-pixel confidence fusion at inference time.
Main code lives in
stereosplat_conf/. Seestereosplat_conf/README.mdfor training/eval details andstereosplat_conf/eval/README.mdfor CLI flags.
This project uses Pixi to manage Python 3.10, CUDA 11.8, and all dependencies. Install Pixi first, then set up the repo.
curl -fsSL https://pixi.sh/install.sh | bash
Restart your shell (or source ~/.bashrc) so pixi is on your PATH, then verify:
pixi --version
Other install options (Homebrew, Windows, etc.) are documented on the Pixi installation page.
git clone https://github.com/Magicboomliu/StereoSplat_Plus.git
cd StereoSplat_Plus/stereosplat_conf
pixi install -e cu118
pixi run -e cu118 setup # build diff-gaussian-rasterization-conf (required once)
Run any command inside the environment with pixi run -e cu118 <cmd>, or enter an interactive shell:
pixi shell -e cu118
The PyPI Gaussian rasterizer does not support the confidence channel — always run
setupbefore training or evaluation.
| Stage | Method | Key idea |
|---|---|---|
| Stage 1 | StereoSplat-Conf | 15D Gaussians (14 geom/appearance + 1 conf); custom rasterizer outputs rendered_conf |
| Stage 2 | StereoSplat+ | Self-pseudo stereo views + Difix3D refinement during training; optional pixel-level conf fusion at inference |
Inference modes
| Mode | CLI --eval_mode | Description |
|---|---|---|
| 2-view baseline | stereosplat | Two GT stereo views → single forward → render novel views |
| StereoSplat+ (no pixel fusion) | stereosplat_plus | Pseudo trajectory + Difix3D + second forward |
| Full S+ pipeline | pixel_fusion (default) | Above + per-pixel conf fusion of 2-view vs pseudo-multiview renders |
StereoSplat_Plus/
├── stereosplat_conf/ # Core training, evaluation, and visualization
│ ├── src/stereosplat/ # Models, configs, metrics
│ ├── trainer/ # Stage 1 & Stage 2 training scripts
│ ├── eval/ # run.py (single-GPU) & run_multi_gpu.py
│ ├── scripts/
│ │ ├── train/ # complete/ and ablations/
│ │ ├── evaluation/ # metric evaluation shells
│ │ └── visualization/ # RGB / depth export (--output_vis)
│ ├── difix3d/ # Difix3D code used by eval/train (imported at runtime)
│ ├── filenames/kitti360/ # Train/val/demo filelists (paths only)
│ └── diff-gaussian-rasterization-conf/ # Custom CUDA rasterizer (conf channel)
├── difix3d/ # Standalone Pixi project (optional; duplicate of above)
└── docker/ # Optional container setup (CUDA 11.8)
Pixi setup is covered in Install Pixi above. Alternative:
# From repository root
docker build -t stereosplat-plus:cu118 -f docker/Dockerfile .
docker run --gpus all -it --rm -v "$PWD":/workspace/StereoSplat_Plus stereosplat-plus:cu118
See docker/README.md for entering the Pixi environment inside the container.
This repo does not ship KITTI-360 imagery or preprocessed .bin sequences. You need:
.bin files listing image/depth paths and poses (8 m splits used in our experiments).stereosplat_conf/filenames/kitti360/ pointing to your local .bin paths.Before running any script, edit data paths inside the shell scripts or pass them via CLI (--datapath, --val_filelist, etc.).
Download checkpoints from Google Drive, place them locally, and set paths in the shell scripts or CLI.
| Model | Split | Link |
|---|---|---|
| StereoSplat-Conf | Complete training set | Drive |
| StereoSplat+-Conf | Complete training set | Drive |
| StereoSplat-Conf | Ablations | Drive |
| StereoSplat+-Conf | Ablations | Drive |
| Model | Used by | Download | File to use |
|---|---|---|---|
| Refined Difix3D | Stage 2 train, stereosplat_plus, pixel_fusion eval/vis | model_130001.pkl (~4.9 GB) | model_130001.pkl |
| UniMatch (depth init) | Stage 1 / Stage 2 training | depth_estimation_224x840 folder (~406 MB) | checkpoint-90000/model.safetensors |
Refined Difix3D — finetuned from nvidia/difix_ref, step 130001. Download the .pkl, save anywhere, set --pretrained_diffix_model_path / --pretrained_difix3d.
UniMatch — download the depth_estimation_224x840 folder, then use checkpoint-90000/model.safetensors (set --unimatch-weights-path).
Difix3D also needs the Hugging Face base weights nvidia/difix_ref on first load (VAE / UNet backbone). Training/eval shells set HF_HUB_OFFLINE=1; either pre-download the model into your HF cache or remove those exports for an online first run.
Set in scripts / CLI:
--pretrained_difix3d /path/to/model_130001.pkl--pretrained_diffix_model_path /path/to/model_130001.pkl --use_ref--unimatch-weights-path /path/to/checkpoint-90000/model.safetensorsDifix3D restores degraded pseudo stereo renders before they are re-injected into StereoSplat+.
| Location | Role |
|---|---|
stereosplat_conf/difix3d/ | Used by StereoSplat — eval/run.py imports DifixRef from here |
difix3d/ | Optional standalone Pixi project (Python 3.11) for training Difix in isolation |
When it runs
train_kitti360_stereosplat_plus_with_difix3d.py): with probability mix_difix3d_ratio (default 0.9), pseudo views are enhanced before mixing into the batch.pixel_fusion, stereosplat_plus, bev_plus): trajectory render → select pseudo stereo → Difix3D (--use_ref) → second forward; pixel_fusion + whole requires Difix weights even without --use_diffix3d.Train / eval Difix standalone
cd stereosplat_conf
bash difix3d/scripts/train_difix3d.sh # finetune on paired restoration JSON
bash difix3d/scripts/eval_difix3d.sh # PSNR/SSIM/LPIPS on validation set
See stereosplat_conf/difix3d/README.md for dataset JSON format and config (configs/train_difix_ref.yaml: resolution 112×544, timestep=199).
All commands assume cd stereosplat_conf and a working Pixi cu118 environment.
Set checkpoint paths via env vars or edit each script, then run with bash (not sh):
| Env var | Used for |
|---|---|
STEREOSPLAT_CHECKPOINT | StereoSplat / StereoSplat+ model weights |
DIFIX3D_WEIGHTS | model_130001.pkl (S+ eval/vis only) |
export STEREOSPLAT_CHECKPOINT=/path/to/stereosplat_plus_conf_checkpoint
export DIFIX3D_WEIGHTS=/path/to/model_130001.pkl
# 2-view baseline
bash scripts/evaluation/evaluations/stereosplat.sh
# StereoSplat+ with pixel fusion + Difix3D + self-pseudo
bash scripts/evaluation/evaluations/stereosplat_plus.sh
Ablation splits: scripts/evaluation/ablations/.
Uses eval/run.py on a single GPU with --output_vis. Demo filelist: filenames/kitti360/trainval/demo.txt.
# 2-view StereoSplat
bash scripts/visualization/stereosplat.sh
# Full StereoSplat+ pipeline (pixel fusion + Difix3D)
bash scripts/visualization/stereosplat_plus.sh
Outputs are written under outputs/visualization/<method>/. Depth maps use the KITTI-style disparity colormap (see metrics.convert_depth_to_disp).
Optional BEV renders: scripts/visualization/stereosplat_bev.sh, stereosplat_plus_bev.sh.
Edit paths inside each script, or export env vars before running:
| Env var | Used for |
|---|---|
KITTI360_DATAPATH | KITTI-360 root |
UNIMATCH_WEIGHTS | checkpoint-90000/model.safetensors |
DIFIX3D_WEIGHTS | model_130001.pkl (Stage 2 only) |
STAGE1_CHECKPOINT | Stage 1 weights (Stage 2 only) |
STEREOSPLAT_CHECKPOINT | Eval / visualization model weights |
DIFIX3D_WEIGHTS | Eval / visualization Difix weights |
WANDB_API_KEY | WandB (optional; set use_wandb=true in script) |
# Stage 1 — StereoSplat with confidence
bash scripts/train/complete/train_stereosplat.sh
# Stage 2 — StereoSplat+ with Difix3D + self-pseudo
bash scripts/train/complete/train_stereosplat_plus.sh
Ablation training: scripts/train/ablations/.
pixi run -e cu118 test-stereosplat
Multi-GPU evaluation:
pixi run -e cu118 accelerate launch \
--config_file accelerate_configs/inference/multi_gpu.yaml \
eval/run_multi_gpu.py \
--eval_mode stereosplat \
--architecture whole \
--config_path src/stereosplat/configs/stereosplat/input_invariant_stereosplat_stage2.py \
--output_folder outputs/eval/my_run \
--val_filelist filenames/kitti360/train_complete/val.txt \
--pretrained_model_path /path/to/checkpoint
Single-GPU visualization (StereoSplat+ with Difix3D):
pixi run -e cu118 accelerate launch \
--config_file accelerate_configs/inference/gpu_0.yaml \
eval/run.py \
--eval_mode pixel_fusion \
--demo_filelist filenames/kitti360/trainval/demo.txt \
--pretrained_model_path /path/to/stereosplat_plus_ckpt \
--pretrained_diffix_model_path /path/to/model_130001.pkl \
--use_ref --self_pseudo \
--conf_pixel_level_fusion --fusion_mode soft \
--output_folder outputs/vis/demo \
--output_vis
Useful flags: --conf_pixel_level_fusion, --fusion_mode soft, --self_pseudo, --pretrained_diffix_model_path, --no_difix3d, --timestep 199. Full list → stereosplat_conf/eval/README.md.
Machine-specific paths have been removed from scripts and configs. Before publishing:
KITTI360_DATAPATH, UNIMATCH_WEIGHTS, DIFIX3D_WEIGHTS, etc. locally (see Quick Start above).all_results_dict.json from difix3d/filenames/Validation_Set/all_results_dict.example.json — do not commit local copies.diff-gaussian-rasterization-conf/ carries its own LICENSE.md derived from 3D Gaussian Splatting).If you use this code, please cite our paper:
@inproceedings{liu2026stereosplatplus,
title = {StereoSplat+: Feed-Forward Stereo Gaussian Splatting with Diffusion-Assisted Progressive Inference},
author = {Liu, Zihua and Okutomi, Masatoshi},
booktitle = {IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
year = {2026},
eprint = {2607.08808},
archivePrefix = {arXiv},
primaryClass = {cs.CV},
url = {https://arxiv.org/abs/2607.08808}
}
334 commits
Python
94.2%
Cuda
3.1%
Shell
1.8%
Paper (arXiv:2607.08808) · IROS 2026
Feed-forward 3D Gaussian Splatting for autonomous driving scenes, built on KITTI-360. Official implementation of StereoSplat+: Feed-Forward Stereo Gaussian Splatting with Diffusion-Assisted Progressive Inference (Liu & Okutomi, IROS 2026).
This repository implements StereoSplat with confidence (15D Gaussians) and StereoSplat+, which augments stereo inputs with self-pseudo views, Difix3D enhancement, and per-pixel confidence fusion at inference time.
Main code lives in
stereosplat_conf/. Seestereosplat_conf/README.mdfor training/eval details andstereosplat_conf/eval/README.mdfor CLI flags.
This project uses Pixi to manage Python 3.10, CUDA 11.8, and all dependencies. Install Pixi first, then set up the repo.
curl -fsSL https://pixi.sh/install.sh | bash
Restart your shell (or source ~/.bashrc) so pixi is on your PATH, then verify:
pixi --version
Other install options (Homebrew, Windows, etc.) are documented on the Pixi installation page.
git clone https://github.com/Magicboomliu/StereoSplat_Plus.git
cd StereoSplat_Plus/stereosplat_conf
pixi install -e cu118
pixi run -e cu118 setup # build diff-gaussian-rasterization-conf (required once)
Run any command inside the environment with pixi run -e cu118 <cmd>, or enter an interactive shell:
pixi shell -e cu118
The PyPI Gaussian rasterizer does not support the confidence channel — always run
setupbefore training or evaluation.
| Stage | Method | Key idea |
|---|---|---|
| Stage 1 | StereoSplat-Conf | 15D Gaussians (14 geom/appearance + 1 conf); custom rasterizer outputs rendered_conf |
| Stage 2 | StereoSplat+ | Self-pseudo stereo views + Difix3D refinement during training; optional pixel-level conf fusion at inference |
Inference modes
| Mode | CLI --eval_mode | Description |
|---|---|---|
| 2-view baseline | stereosplat | Two GT stereo views → single forward → render novel views |
| StereoSplat+ (no pixel fusion) | stereosplat_plus | Pseudo trajectory + Difix3D + second forward |
| Full S+ pipeline | pixel_fusion (default) | Above + per-pixel conf fusion of 2-view vs pseudo-multiview renders |
StereoSplat_Plus/
├── stereosplat_conf/ # Core training, evaluation, and visualization
│ ├── src/stereosplat/ # Models, configs, metrics
│ ├── trainer/ # Stage 1 & Stage 2 training scripts
│ ├── eval/ # run.py (single-GPU) & run_multi_gpu.py
│ ├── scripts/
│ │ ├── train/ # complete/ and ablations/
│ │ ├── evaluation/ # metric evaluation shells
│ │ └── visualization/ # RGB / depth export (--output_vis)
│ ├── difix3d/ # Difix3D code used by eval/train (imported at runtime)
│ ├── filenames/kitti360/ # Train/val/demo filelists (paths only)
│ └── diff-gaussian-rasterization-conf/ # Custom CUDA rasterizer (conf channel)
├── difix3d/ # Standalone Pixi project (optional; duplicate of above)
└── docker/ # Optional container setup (CUDA 11.8)
Pixi setup is covered in Install Pixi above. Alternative:
# From repository root
docker build -t stereosplat-plus:cu118 -f docker/Dockerfile .
docker run --gpus all -it --rm -v "$PWD":/workspace/StereoSplat_Plus stereosplat-plus:cu118
See docker/README.md for entering the Pixi environment inside the container.
This repo does not ship KITTI-360 imagery or preprocessed .bin sequences. You need:
.bin files listing image/depth paths and poses (8 m splits used in our experiments).stereosplat_conf/filenames/kitti360/ pointing to your local .bin paths.Before running any script, edit data paths inside the shell scripts or pass them via CLI (--datapath, --val_filelist, etc.).
Download checkpoints from Google Drive, place them locally, and set paths in the shell scripts or CLI.
| Model | Split | Link |
|---|---|---|
| StereoSplat-Conf | Complete training set | Drive |
| StereoSplat+-Conf | Complete training set | Drive |
| StereoSplat-Conf | Ablations | Drive |
| StereoSplat+-Conf | Ablations | Drive |
| Model | Used by | Download | File to use |
|---|---|---|---|
| Refined Difix3D | Stage 2 train, stereosplat_plus, pixel_fusion eval/vis | model_130001.pkl (~4.9 GB) | model_130001.pkl |
| UniMatch (depth init) | Stage 1 / Stage 2 training | depth_estimation_224x840 folder (~406 MB) | checkpoint-90000/model.safetensors |
Refined Difix3D — finetuned from nvidia/difix_ref, step 130001. Download the .pkl, save anywhere, set --pretrained_diffix_model_path / --pretrained_difix3d.
UniMatch — download the depth_estimation_224x840 folder, then use checkpoint-90000/model.safetensors (set --unimatch-weights-path).
Difix3D also needs the Hugging Face base weights nvidia/difix_ref on first load (VAE / UNet backbone). Training/eval shells set HF_HUB_OFFLINE=1; either pre-download the model into your HF cache or remove those exports for an online first run.
Set in scripts / CLI:
--pretrained_difix3d /path/to/model_130001.pkl--pretrained_diffix_model_path /path/to/model_130001.pkl --use_ref--unimatch-weights-path /path/to/checkpoint-90000/model.safetensorsDifix3D restores degraded pseudo stereo renders before they are re-injected into StereoSplat+.
| Location | Role |
|---|---|
stereosplat_conf/difix3d/ | Used by StereoSplat — eval/run.py imports DifixRef from here |
difix3d/ | Optional standalone Pixi project (Python 3.11) for training Difix in isolation |
When it runs
train_kitti360_stereosplat_plus_with_difix3d.py): with probability mix_difix3d_ratio (default 0.9), pseudo views are enhanced before mixing into the batch.pixel_fusion, stereosplat_plus, bev_plus): trajectory render → select pseudo stereo → Difix3D (--use_ref) → second forward; pixel_fusion + whole requires Difix weights even without --use_diffix3d.Train / eval Difix standalone
cd stereosplat_conf
bash difix3d/scripts/train_difix3d.sh # finetune on paired restoration JSON
bash difix3d/scripts/eval_difix3d.sh # PSNR/SSIM/LPIPS on validation set
See stereosplat_conf/difix3d/README.md for dataset JSON format and config (configs/train_difix_ref.yaml: resolution 112×544, timestep=199).
All commands assume cd stereosplat_conf and a working Pixi cu118 environment.
Set checkpoint paths via env vars or edit each script, then run with bash (not sh):
| Env var | Used for |
|---|---|
STEREOSPLAT_CHECKPOINT | StereoSplat / StereoSplat+ model weights |
DIFIX3D_WEIGHTS | model_130001.pkl (S+ eval/vis only) |
export STEREOSPLAT_CHECKPOINT=/path/to/stereosplat_plus_conf_checkpoint
export DIFIX3D_WEIGHTS=/path/to/model_130001.pkl
# 2-view baseline
bash scripts/evaluation/evaluations/stereosplat.sh
# StereoSplat+ with pixel fusion + Difix3D + self-pseudo
bash scripts/evaluation/evaluations/stereosplat_plus.sh
Ablation splits: scripts/evaluation/ablations/.
Uses eval/run.py on a single GPU with --output_vis. Demo filelist: filenames/kitti360/trainval/demo.txt.
# 2-view StereoSplat
bash scripts/visualization/stereosplat.sh
# Full StereoSplat+ pipeline (pixel fusion + Difix3D)
bash scripts/visualization/stereosplat_plus.sh
Outputs are written under outputs/visualization/<method>/. Depth maps use the KITTI-style disparity colormap (see metrics.convert_depth_to_disp).
Optional BEV renders: scripts/visualization/stereosplat_bev.sh, stereosplat_plus_bev.sh.
Edit paths inside each script, or export env vars before running:
| Env var | Used for |
|---|---|
KITTI360_DATAPATH | KITTI-360 root |
UNIMATCH_WEIGHTS | checkpoint-90000/model.safetensors |
DIFIX3D_WEIGHTS | model_130001.pkl (Stage 2 only) |
STAGE1_CHECKPOINT | Stage 1 weights (Stage 2 only) |
STEREOSPLAT_CHECKPOINT | Eval / visualization model weights |
DIFIX3D_WEIGHTS | Eval / visualization Difix weights |
WANDB_API_KEY | WandB (optional; set use_wandb=true in script) |
# Stage 1 — StereoSplat with confidence
bash scripts/train/complete/train_stereosplat.sh
# Stage 2 — StereoSplat+ with Difix3D + self-pseudo
bash scripts/train/complete/train_stereosplat_plus.sh
Ablation training: scripts/train/ablations/.
pixi run -e cu118 test-stereosplat
Multi-GPU evaluation:
pixi run -e cu118 accelerate launch \
--config_file accelerate_configs/inference/multi_gpu.yaml \
eval/run_multi_gpu.py \
--eval_mode stereosplat \
--architecture whole \
--config_path src/stereosplat/configs/stereosplat/input_invariant_stereosplat_stage2.py \
--output_folder outputs/eval/my_run \
--val_filelist filenames/kitti360/train_complete/val.txt \
--pretrained_model_path /path/to/checkpoint
Single-GPU visualization (StereoSplat+ with Difix3D):
pixi run -e cu118 accelerate launch \
--config_file accelerate_configs/inference/gpu_0.yaml \
eval/run.py \
--eval_mode pixel_fusion \
--demo_filelist filenames/kitti360/trainval/demo.txt \
--pretrained_model_path /path/to/stereosplat_plus_ckpt \
--pretrained_diffix_model_path /path/to/model_130001.pkl \
--use_ref --self_pseudo \
--conf_pixel_level_fusion --fusion_mode soft \
--output_folder outputs/vis/demo \
--output_vis
Useful flags: --conf_pixel_level_fusion, --fusion_mode soft, --self_pseudo, --pretrained_diffix_model_path, --no_difix3d, --timestep 199. Full list → stereosplat_conf/eval/README.md.
Machine-specific paths have been removed from scripts and configs. Before publishing:
KITTI360_DATAPATH, UNIMATCH_WEIGHTS, DIFIX3D_WEIGHTS, etc. locally (see Quick Start above).all_results_dict.json from difix3d/filenames/Validation_Set/all_results_dict.example.json — do not commit local copies.diff-gaussian-rasterization-conf/ carries its own LICENSE.md derived from 3D Gaussian Splatting).If you use this code, please cite our paper:
@inproceedings{liu2026stereosplatplus,
title = {StereoSplat+: Feed-Forward Stereo Gaussian Splatting with Diffusion-Assisted Progressive Inference},
author = {Liu, Zihua and Okutomi, Masatoshi},
booktitle = {IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
year = {2026},
eprint = {2607.08808},
archivePrefix = {arXiv},
primaryClass = {cs.CV},
url = {https://arxiv.org/abs/2607.08808}
}
334 commits
Python
94.2%
Cuda
3.1%
Shell
1.8%