Gurutva Patle1, Nilay Girgaonkar1, Nagabhushan Somraj1, Rajiv Soundararajan1
1Indian Institute of Science (IISc), Bengaluru
Contact: Gurutva Patle via email (gurutvac[at]iisc[dot]ac[dot]in).
✨ACM SIGGRAPH Asia 2025✨
This is the official repository for our paper AD-GS: Alternating Densification for Sparse-Input 3D Gaussian Splatting.
3D Gaussian Splatting (3DGS) has shown impressive results in real-time novel view synthesis. However, it often struggles under sparse-view settings, producing undesirable artifacts such as floaters, inaccurate geometry, and overfitting due to limited observations.
We propose AD-GS, a novel alternating densification framework that interleaves high and low densification phases. During high densification, the model densifies aggressively, followed by photometric loss based training to capture fine-grained scene details. Low densification then primarily involves aggressive opacity pruning of Gaussians followed by regularizing their geometry through pseudo-view consistency and edge-aware depth smoothness.
This alternating approach helps reduce overfitting by carefully controlling model capacity growth while progressively refining the scene representation. Extensive experiments on challenging datasets demonstrate that AD-GS significantly improves rendering quality and geometric consistency compared to existing methods.
Ubuntu 20.04.6 LTS,
NVIDIA-SMI 535.183.01 Driver Version: 535.183.01 CUDA Version: 12.2,
PyTorch 1.12.1
conda env create --file environment.yml
conda activate adgs
pip install submodules/diff-gaussian-rasterization-confidence
pip install submodules/simple-knn
We provide a sample file for horns scene here in repo. Run below command to run demo.sh .
bash demo.sh
A file "full_logs.json" contains the output.
├── /dataset
├── mipnerf360
├── bicycle
├── bonsai
├── ...
├── nerf_llff_data
├── fern
├── flower
├── ...
├── Tanks
├── ballroom
├── barn
├── ...
-
Download LLFF from the official download link.
-
run colmap to obtain initial point clouds with limited viewpoints:
python tools/colmap_llff.py
-
Start training and testing:
# for example # put integer number 0 or 1 or 2 in place of ${gpu_id} in below command bash scripts/run_llff_ad.sh ${gpu_id} dataset/nerf_llff_data/horns output/nerf_llff_data/horns
run_llff_ad.shruns with the same defaults as the paper (edit the variables at the top of the script to change the alternating-densification schedule, loss weights, or thresholds — see Alternating Densification: Training Options below). The originalscripts/run_llff.shstill works identically, with those settings hardcoded instead of exposed.
-
Download MipNeRF-360 from the official download link.
-
run colmap to obtain initial point clouds with limited viewpoints:
python tools/colmap_360.py
-
Start training and testing:
# for example bash scripts/run_360_ad.sh ${gpu_id} dataset/mipnerf360/bicycle output/mipnerf360/bicycle
(see the note on
run_llff_ad.shabove;scripts/run_360.shstill works identically)
-
Download Tanks & Temples from download link. We refer to NoPe-NeRF for downloading.
-
run colmap to obtain initial point clouds with limited viewpoints:
python tools/colmap_llff.py
We use the same LLFF colmap_llff.py file. Change the scene names in above file for Tanks & Temples.
-
Start training and testing:
# for example bash scripts/run_tanks_ad.sh ${gpu_id} dataset/tanksntemples/ballroom output/tanksntemples/ballroom
(see the note on
run_llff_ad.shabove;scripts/run_tanks.shstill works identically)
Similar to Gaussian Splatting, our method can read standard COLMAP format datasets. Please customize your sampling rule in scenes/dataset_readers.py, and see how to organize a COLMAP-format dataset from raw RGB images.
Schedule (N_W warm-up, then N_H/N_L cycle)
| Flag | Default | Meaning |
|---|---|---|
--alt_warmup_iters |
1500 |
N_W: iterations trained with photometric loss only, before alternation/regularization kicks in. |
--alt_cycle_len |
200 |
N_H + N_L: length of one full high-/low-densification cycle (applied after warm-up). |
--alt_high_dens_iters |
100 |
N_H: length of the high-densification part of each cycle; must be <= --alt_cycle_len. The rest of the cycle is the low-densification phase. |
Depth regularization (edge-aware depth smoothness + depth-range loss, applied only during the low-densification phase)
| Flag | Default | Meaning |
|---|---|---|
--depth_smooth_weight |
0.01 |
Weight of the combined depth regularization term. |
--depth_range_weight |
0.001 |
Weight (λ_r) of the depth-range loss inside that term. |
Per-phase densification thresholds (gradient threshold τ_pos controls splitting/cloning, prune threshold ε_α controls pruning)
| Flag | Default | Phase |
|---|---|---|
--warmup_densify_grad_threshold / --warmup_prune_threshold |
0.0005 / 0.005 |
Warm-up |
--low_dens_grad_threshold / --low_dens_prune_threshold |
0.0005 / 0.1 |
Low-densification (elevated prune threshold — aggressive pruning) |
--high_dens_grad_threshold / --high_dens_prune_threshold |
0.0002 / 0.005 |
High-densification (looser gradient threshold — more splitting/cloning) |
Dual-field co-regularization (inherited from CoR-GS, gated to the low-densification phase in AD-GS)
| Flag | Default | Meaning |
|---|---|---|
--gaussiansN |
1 |
Number of Gaussian fields to co-train (1 or 2). Use 2 to enable dual-field training. |
--coreg |
off | Enable pseudo-view photometric consistency loss between the two fields. |
--coprune |
off | Enable cross-field point-cloud consistency pruning. |
--coprune_threshold |
5 |
Distance threshold (Open3D registration) for a point to be considered consistent across fields. |
--coprune_interval |
500 |
Run co-pruning every N iterations. |
--coreg is off by default in train.py itself, but the provided run scripts (demo.sh, run_llff_ad.sh, run_tanks_ad.sh, run_360_ad.sh) all pass it explicitly, so it's on in practice for the paper's reported results. --coprune stays off unless you add it yourself.
Run python train.py --help for the full list, including the underlying 3DGS/CoR-GS options (--onlyrgb, --sample_pseudo_interval, --start_sample_pseudo, --end_sample_pseudo, etc.). See also scripts/run_llff_ad.sh, scripts/run_tanks_ad.sh, and scripts/run_360_ad.sh — editable templates (one per dataset, alongside the original run_llff.sh/run_tanks.sh/run_360.sh) that expose all of these arguments as variables at the top of the script.
The previous (pre-refactor) version of this file, with the alternating-densification schedule and loss weights hardcoded rather than exposed as flags, is kept at
train_old.py/README_old.mdfor reference.
Consider citing as below if you find this repository helpful to your project:
@inproceedings{Patle2025ADGS,
author = {Patle, Gurutva and Girgaonkar, Nilay and Somraj, Nagabhushan and Soundararajan, Rajiv},
title = {AD-GS: Alternating Densification for Sparse-Input 3D Gaussian Splatting},
year = {2025},
isbn = {9798400721373},
publisher = {Association for Computing Machinery (ACM)},
address = {New York, NY, USA},
url = {https://doi.org/10.1145/3757377.3763993},
doi = {10.1145/3757377.3763993},
booktitle = {Proceedings of the SIGGRAPH Asia 2025 Conference Papers},
articleno = {129},
numpages = {11},
keywords = {Rendering, novel view synthesis, sparse input 3D Gaussian splatting},
series = {SA Conference Papers '25}
}
This work was supported in part by the Kotak IISc AI–ML Centre (KIAC).
Special thanks to the following awesome projects!
