Project page | Paper | Video | Surfel Rasterizer (CUDA) | Surfel Rasterizer (Python) | DTU+COLMAP (3.5GB) | Viewer Pre-built for Windows
This repo contains the official implementation for the paper "2D Gaussian Splatting for Geometrically Accurate Radiance Fields". Our work represents a scene with a set of 2D oriented disks (surface elements) and rasterizes the surfels with perspective correct differentiable raseterization. Our work also develops regularizations that enhance the reconstruction quality. We also devise meshing approaches for Gaussian splatting.
2DGS.Viewer.mp4
The Pre-built Viewer for Windows can be found here. If you use Ubuntu or you want to check the viewer usage, please refer to GS Monitor.
Firstly open the viewer,
<path to downloaded/compiled viewer>/bin/SIBR_remoteGaussian_app_rwdi.exe
and then
# Monitor the training process
python train.py -s <path to COLMAP or NeRF Synthetic dataset>
# View the trained model
python view.py -s <path to COLMAP or NeRF Synthetic dataset> -m <path to trained model>
- 2024/05/30: Fixed a bug related to unbounded meshing. The foreground mesh quality should now be consistent with the bounded mesh.
- 2024/05/17: Improve training speed by 30%~40% through the cuda operator fusing. Please update the submodules if you have already installed it.
git submodule update --remote pip install submodules/diff-surfel-rasterization
- 2024/05/05: Important updates - Now our algorithm supports unbounded mesh extraction! Our key idea is to contract the space into a sphere and then perform adaptive TSDF truncation.
# download
git clone https://github.com/hbb1/2d-gaussian-splatting.git --recursive
# if you have an environment used for 3dgs, use it
# if not, create a new environment
conda env create --file environment.yml
conda activate surfel_splatting
To train a scene, simply use
python train.py -s <path to COLMAP or NeRF Synthetic dataset>
Commandline arguments for regularizations
--lambda_normal # hyperparameter for normal consistency
--lambda_distortion # hyperparameter for depth distortion
--depth_ratio # 0 for mean depth and 1 for median depth, 0 works for most cases
Tips for adjusting the parameters on your own dataset:
- For unbounded/large scenes, we suggest using mean depth, i.e.,
depth_ratio=0
, for less "disk-aliasing" artefacts.
To export a mesh within a bounded volume, simply use
python render.py -m <path to pre-trained model> -s <path to COLMAP dataset>
Commandline arguments you should adjust accordingly for meshing for bounded TSDF fusion, use
--depth_ratio # 0 for mean depth and 1 for median depth
--voxel_size # voxel size
--depth_trunc # depth truncation
If these arguments are not specified, the script will automatically estimate them using the camera information.
To export a mesh with an arbitrary size, we devised an unbounded TSDF fusion with space contraction and adaptive truncation.
python render.py -m <path to pre-trained model> -s <path to COLMAP dataset> --mesh_res 1024
Assuming you have downloaded MipNeRF360, simply use
python train.py -s <path to m360>/<garden> -m output/m360/garden
# use our unbounded mesh extraction!!
python render.py -s <path to m360>/<garden> -m output/m360/garden --unbounded --skip_test --skip_train --mesh_res 1024
# or use the bounded mesh extraction if you focus on foreground
python render.py -s <path to m360>/<garden> -m output/m360/garden --skip_test --skip_train --mesh_res 1024
If you have downloaded the DTU dataset, you can use
python train.py -s <path to dtu>/<scan105> -m output/date/scan105 -r 2 --depth_ratio 1
python render.py -r 2 --depth_ratio 1 --skip_test --skip_train
Custom Dataset: We use the same COLMAP loader as 3DGS, you can prepare your data following here.
We provide two scripts to evaluate our method of novel view synthesis and geometric reconstruction. For novel view synthesis on MipNeRF360 (which also works for other colmap datasets), use
python scripts/mipnerf_eval.py -m60 <path to the MipNeRF360 dataset>
For geometry reconstruction on DTU dataset, please download the preprocessed data. You also need to download the ground truth DTU point cloud.
python scripts/dtu_eval.py --dtu <path to the preprocessed DTU dataset> \
--DTU_Official <path to the official DTU dataset>
-
Training does not converge. If your camera's principal point does not lie at the image center, you may experience convergence issues. Our code only supports the ideal pinhole camera format, so you may need to make some modifications. Please follow the instructions provided here to make the necessary changes. We have also modified the rasterizer in the latest commit to support data accepted by 3DGS. To avoid further issues, please update to the latest commit.
-
No mesh / Broken mesh. When using the Bounded mesh extraction mode, it is necessary to adjust the
depth_trunc
parameter to perform TSDF fusion to extract meshes. On the other hand, Unbounded mesh extraction does not require tuning the parameters but is less efficient. -
Can 3DGS's viewer be used to visualize 2DGS? Technically, you can export 2DGS to 3DGS's ply file by appending an additional zero scale. However, due to the inaccurate affine projection of 3DGS's viewer, you may see some distorted artefacts. We are currently working on a viewer for 2DGS, so stay tuned for updates.
This project is built upon 3DGS. The TSDF fusion for extracting mesh is based on Open3D. The rendering script for MipNeRF360 is adopted from Multinerf, while the evaluation scripts for DTU and Tanks and Temples dataset are taken from DTUeval-python and TanksAndTemples, respectively. The fusing operation for accelerating the renderer is inspired by Han's repodcue. We thank all the authors for their great repos.
If you find our code or paper helps, please consider citing:
@inproceedings{Huang2DGS2024,
title={2D Gaussian Splatting for Geometrically Accurate Radiance Fields},
author={Huang, Binbin and Yu, Zehao and Chen, Anpei and Geiger, Andreas and Gao, Shenghua},
publisher = {Association for Computing Machinery},
booktitle = {SIGGRAPH 2024 Conference Papers},
year = {2024},
doi = {10.1145/3641519.3657428}
}