[CVPR 2025] Sparse Voxels Rasterization: Real-time High-fidelity Radiance Field Rendering
944
stars
59
commits
Jupyter Notebook
primary language
Jul 25, 2025
updated

Updates:
1.13.1+cu117 and 2.5.0+cu124.conda install -y -c "nvidia/label/cuda-11.7.0" cuda-toolkitconda install -y -c "nvidia/label/cuda-12.4.0" cuda-toolkitpip install -r requirements.txt for other packages.pip install -e cuda/ for sparse voxel CUDA rasterizer and some utilities.Below go through the workflow for reconstruction from a scene capturing. Check example.ipynb for an actual example.
We recommend to follow InstantNGP video or images processing steps to extract camera parameters using COLMAP. NerfStudio also works.
We now only support pinhole camera mode. Please preprocess with --colmap_camera_model PINHOLE of InstantNGP script or --camera-type pinhole of NerfStudio script.
python train.py --eval --source_path $DATA_PATH --model_path $OUTPUT_PATH
All the results will be saved into the specified $OUTPUT_PATH including the following results:
config.yaml: The config file for reproduction.pg_view/: Visualization of the training progress. Useful for debugging.test_stat/: Some statistic during the training.test_view/: Some visualization during the training.The configuration is defined by the following three, the later overwrites the former.
src/config.py: Define the configuable setup and their initial values.--cfg_files: Sepcify a list of config files, the later overwrites the former. Some examples are under cfg/.src/config.py can be overwritten through command line. For instances: --data_device cpu, --subdivide_save_gpu.Like InstantNGP and other NeRF variants, defining a proper main scene bounding box is crucial to quality and processing time. Note that the main scene bound is defined for the main 3D region of interest. There are another --outside_level (default 5) Octree levels for the background region. The default main scene bound heuristic may work well in many cases but you can manually tweak them for a better results or covering new type of capturing trajectory:
--bound_mode:
default
forward or camera_median modes.camera_median
camera_max
forward
src/utils/bounding_utils.py for detail heuristic.pcd
src/utils/bounding_utils.py for detail heuristic.--bound_scale: scaling the main scene bound (default 1).For scenes with background masked out, use --white_background or --black_background to specify the background color.
Other hyperparameter suggestions:
--lambda_T_inside 0.01 to encourage rays to stop inside the Octree. Useful for real-world scenes.--lambda_T_concen 0.1 to encourage transmittance to be either 0 or 1. Useful for scenes whose background pixels are set to white or black. Remember to set either --white_background or --black_background in this case.--lambda_normal_dmean 0.001 --lambda_normal_dmed 0.001 to encourage self-consistency between rendered depth and normal.
--lambda_ascending 0.01 to encourage density to be increasing along ray direction.--lambda_sparse_depth 0.01 to use COLMAP sparse points loss to guide rendered depth.
--lambda_depthanythingv2 0.1 to use depthanythingv2 loss to guide rendered depth.
--lambda_mast3r_metric_depth 0.1 to use the metric depth derived from MASt3R to guide the rendered depth.
--save_quantized to apply 8 bits quantization to the saved checkpoints. It typically reduce ~70% model size with minor quality difference.python render.py $OUTPUT_PATH --eval_fps
python render.py $OUTPUT_PATH --skip_test --rgb_only --use_jpg--eval.python render.py $OUTPUT_PATH --skip_trainpython eval.py $OUTPUT_PATHpython render_fly_through.py $OUTPUT_PATHpython viz.py $OUTPUT_PATH
You can then navigate the trained scenes using a web browser. Another interactive viewer is in example jupyter notebook using Kaolin. The FPS of the visualizer is bottleneck by streaming images via network protocal, especially when the it runs on remote server.
https://github.com/user-attachments/assets/44f1737a-c4d3-416d-bdf1-da8b3ecad57b
WebGL is now supported. Thanks samuelm2 for implementing the svraster-webgl viewer.
Remember to train with --lambda_normal_dmean 0.001 --lambda_normal_dmed 0.001 to get a better geometry. Using sparse depth from COLMAP may also help --lambda_sparse_depth 0.01. After the scene optimization completed, run:
python extract_mesh.py $OUTPUT_PATH
We can fuse 2D vision foundation feature or sementic segmentation results into voxels easily and instantly. The fusion can naturally smooth out the multi-view inconsistent predictions. More video results are in the project page.


Note: Be sure to double check the following two experimental details which has non-trivial impact to the quantitative results.
--res_downscale and (2) the preprocessed down-sampled images specified by --image_dir_name are very different. We follow the original 3DGS to use --image_dir_name.eval.py.exp_dir="baseline"
other_cmd_args=""
# Run training
./scripts/mipnerf360_run.sh output/mipnerf360/baseline $other_cmd_args
./scripts/synthetic_nerf_run.sh output/synthetic_nerf/baseline $other_cmd_args
./scripts/tandt_db_run.sh output/tandt_db/baseline $other_cmd_args
./scripts/dtu_run.sh output/dtu/baseline $other_cmd_args
./scripts/tnt_run.sh output/tnt/baseline $other_cmd_args
# Summarize results
python scripts/mipnerf360_stat.py output/mipnerf360/baseline
python scripts/synthetic_nerf_stat.py output/synthetic_nerf/baseline
python scripts/tandt_db_stat.py output/tandt_db/baseline
python scripts/dtu_stat.py output/dtu/baseline
python scripts/tnt_stat.py output/tnt/baseline
Our code is originally developed on the amazing open-source codebase: gaussian-splatting and diff-gaussian-rasterization. The codebase has been very different now.
If you find our work useful in your research, please be so kind to give us a star and citing our paper.
@inproceedings{svraster,
author = {Cheng Sun and
Jaesung Choe and
Charles Loop and
Wei{-}Chiu Ma and
Yu{-}Chiang Frank Wang},
title = {Sparse Voxels Rasterization: Real-time High-fidelity Radiance Field
Rendering},
booktitle = {{CVPR}},
year = {2025},
}
59 commits
Jupyter Notebook
92.9%
Python
5.1%
Cuda
1.5%
[CVPR 2025] Sparse Voxels Rasterization: Real-time High-fidelity Radiance Field Rendering
944
stars
59
commits
Jupyter Notebook
primary language
Jul 25, 2025
updated

Updates:
1.13.1+cu117 and 2.5.0+cu124.conda install -y -c "nvidia/label/cuda-11.7.0" cuda-toolkitconda install -y -c "nvidia/label/cuda-12.4.0" cuda-toolkitpip install -r requirements.txt for other packages.pip install -e cuda/ for sparse voxel CUDA rasterizer and some utilities.Below go through the workflow for reconstruction from a scene capturing. Check example.ipynb for an actual example.
We recommend to follow InstantNGP video or images processing steps to extract camera parameters using COLMAP. NerfStudio also works.
We now only support pinhole camera mode. Please preprocess with --colmap_camera_model PINHOLE of InstantNGP script or --camera-type pinhole of NerfStudio script.
python train.py --eval --source_path $DATA_PATH --model_path $OUTPUT_PATH
All the results will be saved into the specified $OUTPUT_PATH including the following results:
config.yaml: The config file for reproduction.pg_view/: Visualization of the training progress. Useful for debugging.test_stat/: Some statistic during the training.test_view/: Some visualization during the training.The configuration is defined by the following three, the later overwrites the former.
src/config.py: Define the configuable setup and their initial values.--cfg_files: Sepcify a list of config files, the later overwrites the former. Some examples are under cfg/.src/config.py can be overwritten through command line. For instances: --data_device cpu, --subdivide_save_gpu.Like InstantNGP and other NeRF variants, defining a proper main scene bounding box is crucial to quality and processing time. Note that the main scene bound is defined for the main 3D region of interest. There are another --outside_level (default 5) Octree levels for the background region. The default main scene bound heuristic may work well in many cases but you can manually tweak them for a better results or covering new type of capturing trajectory:
--bound_mode:
default
forward or camera_median modes.camera_median
camera_max
forward
src/utils/bounding_utils.py for detail heuristic.pcd
src/utils/bounding_utils.py for detail heuristic.--bound_scale: scaling the main scene bound (default 1).For scenes with background masked out, use --white_background or --black_background to specify the background color.
Other hyperparameter suggestions:
--lambda_T_inside 0.01 to encourage rays to stop inside the Octree. Useful for real-world scenes.--lambda_T_concen 0.1 to encourage transmittance to be either 0 or 1. Useful for scenes whose background pixels are set to white or black. Remember to set either --white_background or --black_background in this case.--lambda_normal_dmean 0.001 --lambda_normal_dmed 0.001 to encourage self-consistency between rendered depth and normal.
--lambda_ascending 0.01 to encourage density to be increasing along ray direction.--lambda_sparse_depth 0.01 to use COLMAP sparse points loss to guide rendered depth.
--lambda_depthanythingv2 0.1 to use depthanythingv2 loss to guide rendered depth.
--lambda_mast3r_metric_depth 0.1 to use the metric depth derived from MASt3R to guide the rendered depth.
--save_quantized to apply 8 bits quantization to the saved checkpoints. It typically reduce ~70% model size with minor quality difference.python render.py $OUTPUT_PATH --eval_fps
python render.py $OUTPUT_PATH --skip_test --rgb_only --use_jpg--eval.python render.py $OUTPUT_PATH --skip_trainpython eval.py $OUTPUT_PATHpython render_fly_through.py $OUTPUT_PATHpython viz.py $OUTPUT_PATH
You can then navigate the trained scenes using a web browser. Another interactive viewer is in example jupyter notebook using Kaolin. The FPS of the visualizer is bottleneck by streaming images via network protocal, especially when the it runs on remote server.
https://github.com/user-attachments/assets/44f1737a-c4d3-416d-bdf1-da8b3ecad57b
WebGL is now supported. Thanks samuelm2 for implementing the svraster-webgl viewer.
Remember to train with --lambda_normal_dmean 0.001 --lambda_normal_dmed 0.001 to get a better geometry. Using sparse depth from COLMAP may also help --lambda_sparse_depth 0.01. After the scene optimization completed, run:
python extract_mesh.py $OUTPUT_PATH
We can fuse 2D vision foundation feature or sementic segmentation results into voxels easily and instantly. The fusion can naturally smooth out the multi-view inconsistent predictions. More video results are in the project page.


Note: Be sure to double check the following two experimental details which has non-trivial impact to the quantitative results.
--res_downscale and (2) the preprocessed down-sampled images specified by --image_dir_name are very different. We follow the original 3DGS to use --image_dir_name.eval.py.exp_dir="baseline"
other_cmd_args=""
# Run training
./scripts/mipnerf360_run.sh output/mipnerf360/baseline $other_cmd_args
./scripts/synthetic_nerf_run.sh output/synthetic_nerf/baseline $other_cmd_args
./scripts/tandt_db_run.sh output/tandt_db/baseline $other_cmd_args
./scripts/dtu_run.sh output/dtu/baseline $other_cmd_args
./scripts/tnt_run.sh output/tnt/baseline $other_cmd_args
# Summarize results
python scripts/mipnerf360_stat.py output/mipnerf360/baseline
python scripts/synthetic_nerf_stat.py output/synthetic_nerf/baseline
python scripts/tandt_db_stat.py output/tandt_db/baseline
python scripts/dtu_stat.py output/dtu/baseline
python scripts/tnt_stat.py output/tnt/baseline
Our code is originally developed on the amazing open-source codebase: gaussian-splatting and diff-gaussian-rasterization. The codebase has been very different now.
If you find our work useful in your research, please be so kind to give us a star and citing our paper.
@inproceedings{svraster,
author = {Cheng Sun and
Jaesung Choe and
Charles Loop and
Wei{-}Chiu Ma and
Yu{-}Chiang Frank Wang},
title = {Sparse Voxels Rasterization: Real-time High-fidelity Radiance Field
Rendering},
booktitle = {{CVPR}},
year = {2025},
}
59 commits
Jupyter Notebook
92.9%
Python
5.1%
Cuda
1.5%