wikillm

Paper · 2024-06-21 · cs.CV, cs.GR

Taming 3DGS: High-Quality Radiance Fields with Limited Resources

Budgeted 3D Gaussian Splatting. Densification follows a parabolic schedule to an exact Gaussian budget. New Gaussians are sampled by a weighted score of gradient, opacity, size and pixel-loss terms. Faster backward pass and batched SH updates. Author-reported: 4-5x reduction in model size and training time, with competitive quality.

Gaussian splattingNovel view synthesis3d-reconstructiongaussian-splattingmemory-budgettraining-efficiency

arXivPDFMarkdown13 min read

AI-compiled by claude-haiku-5-5 on 2026-11-03, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.

In plain words

3D Gaussian Splatting builds a 3D scene out of many small soft blobs. Its usual training keeps adding blobs wherever the picture still looks wrong, and it does not stop at a fixed count. So the final model can be very large, the memory use is hard to predict, and the training time varies from run to run. This makes it hard to run on a phone or in any setting with a fixed limit.

The paper asks for a fixed size instead. The user picks how many blobs the model may end up with, and the method adds blobs on a smooth schedule until it reaches that number. Which blobs get copied is decided by a score that mixes several signals: how strongly a blob is pushed during training, how visible it is, how transparent it is, how big it is, and how wrong the picture is where it sits. The authors also make the training code itself faster, so a run finishes in less time. They report that the result looks close to the standard method while using far fewer blobs and far less time.

TL;DR

Budgeted 3DGS: densification grows the Gaussian count along a parabolic target that ends at a user-set budget, with no heavy pruning §1 §3.2. New Gaussians are drawn by a score built from per-Gaussian and per-pixel terms over 10 sampled views §3.3. Backpropagation is parallelised over splats, and higher spherical-harmonic bands are updated every 16 iterations §4.1 §4.2. Author-reported: a 4-5x cut in model size and training time against 3DGS, with quality that is competitive or better [abstract] tab. 1.

Problem

Standard 3DGS has four costs. Its optimisation is hard to control, and it often produces redundant Gaussians, which leaves some regions under-reconstructed §1. Model size can differ by up to about one order of magnitude between scenes that start from the same number of input points §1. Downstream tasks that need a fixed-size input cannot use the representation §1. Training time varies strongly and does not track the much faster rendering §1 §2. The authors also report that backpropagation is the main bottleneck, followed by Adam updates, and that the Adam cost rises as the Gaussian count grows §4 fig. 3.

Method

Overview fig. 2. Structure-from-Motion points initialise the model. A fixed densification schedule then adds Gaussians. A score-based sampler chooses which Gaussians to copy, using a per-pixel saliency map. Densification runs less often than in 3DGS §3. High-opacity Gaussians are switched on mid-training §3.4. Separately, the training step is made faster §4.

  1. Background. A Gaussian has a position, a covariance and an opacity. Its contribution at a point is given by eq. 1. Colour uses degree-3 spherical harmonics plus a base colour. Training minimises a combined L1 and SSIM loss over the rendered and ground-truth images §3.1.

G(x) = o\,e^{-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)}, \quad \Sigma = R\,S\,S^T R^T eq. 1

  1. Growth schedule. The number of added Gaussians per step follows a parabola that starts from the SfM count and peaks at the budget §3.2 fig. 2b. Each step adds the gap between the current count and the accumulated target, so that removed low-opacity Gaussians do not leave the count short §3.2. The paper prints the curve as eq. 2. Read literally, that form does not match the text (see Pitfalls).

A(x) = \frac{B-S-2N}{N^2}\,x^2 + 2x + B eq. 2

Here N is the number of densification steps, B the budget and S the number of SfM points §3.2.

  1. Saliency map per view. For view v, the per-pixel saliency combines the L1 error against the rendering and a Laplacian-filter edge map, restricted to a binary region-of-interest mask. Both weights are set to 0.5 in the experiments §3.3 eq. 3.

\mathbf{S}_v = \mathbb{1}_{ROI} \odot \left(\lambda_1 \mathcal{L}_1(v, r_v) + \lambda_2 E(v)\right), \quad v \in V eq. 3

  1. Per-Gaussian score. For each of N views, the score function F is evaluated for every Gaussian and the results are summed. The inputs are the positional gradient, the covered pixel count, the pixel-to-centre distances, the saliency sum, the blending weight sum, depth, opacity and scale §3.3 eq. 4. The vector of Gaussian scores is eq. 5.

S_g = \sum_{i=1}^{N} F\!\left(\nabla_g, c_g^i, \mathbb{1}_g^i, \mathbf{D}_g^i, \mathbf{S}_v^i, \mathbf{B}_g^i, z_g^i, o_g, s_g\right) eq. 4

\mathbf{S}_G = [S_{g_1}, \dots, S_{g_M}]^T eq. 5

The terms of F and their coefficients are listed below. Each parameter's range is first normalised by median scaling to remove outliers, then multiplied by the view's photometric loss, and the results are summed with the coefficients §3.3.

TermMeaningCoefficientSource
\nabla_gmagnitude of positional gradient50§3.3
c_g^ipixels covered by g in view i0.1§3.3
\mathbf{D}_g^isummed distance of covered pixels to centre50§3.3
\mathbf{S}_v^isummed saliency over covered pixels10§3.3
\mathbf{B}_g^isummed per-pixel blending weights50§3.3
z_g^idepth in view i (0 outside the frustum)5§3.3
o_gopacity (high weight, steers away from floaters)100§3.3
s_gproduct of scales25§3.3
  1. Sampling and splitting. Given the target B of Gaussians to add, B primitives are drawn at random from all Gaussians, using \mathbf{S}_G as sampling weights §3.3. Algorithm 1 then applies a rule to each drawn Gaussian. If its positional gradient is above \mathcal{G}_t and its radius is above \mathcal{R}_t, it is split. If the gradient is above \mathcal{G}_t and the radius is at most \mathcal{R}_t, it is cloned alg. 1. Densification runs once every 500 iterations, one fifth of the 3DGS frequency §3.3.
Pseudocode
# Densify one step toward the target count  [§3.3] [alg. 1]
# gaussians: current model; views: training views; target: budget step
def densify_step(gaussians, views, target):
    # Accumulate the score over N sampled views  [§3.3] [eq. 4]
    scores = zeros(len(gaussians))
    for view in sample_views(views, count=10):  # N = 10 [§3.3]
        # Saliency: weighted L1 error and edges, inside the ROI  [eq. 3]
        saliency = roi * (0.5 * l1_error(view) + 0.5 * edges(view))
        # Per-Gaussian terms collected while rendering this view  [§3.3]
        terms = gaussian_terms(gaussians, view, saliency)
        # Median-scaled terms, weighted, times the view's loss  [§3.3]
        scores += view.photometric_loss * weighted_sum(terms)
    # Draw the number of new Gaussians, weighted by score  [§3.3] [alg. 1]
    num_new = target - len(gaussians)
    drawn = sample_by_weight(gaussians, scores, num_new)
    for g in drawn:
        # Split large Gaussians, clone small ones  [alg. 1]
        if grad(g) > G_t and radius(g) > R_t:
            split(g)
        elif grad(g) > G_t and radius(g) <= R_t:
            clone(g)
    return gaussians
  1. High-opacity Gaussians. At the midpoint of training, 15K iterations §3.4, the opacity activation is replaced by an absolute-value function. Blending weights are clamped to 1 from above during rendering §3.4. The paper reports that this raises PSNR in its ablation §5.3 tab. 2.
Pseudocode
# Switch to high-opacity Gaussians at the training midpoint  [§3.4]
def enable_high_opacity(gaussians, iteration):
    # Midpoint of training, 15K iterations  [§3.4]
    if iteration != 15_000:
        return
    # Opacity activation becomes an absolute value  [§3.4]
    gaussians.opacity_activation = absolute_value
    # Blending weights are clamped to 1 from above in the renderer  [§3.4]
  1. Faster backpropagation. The original backward pass maps threads to pixels, iterates over splats back to front, and adds each per-pixel gradient to the splat's total with atomic operations. Contention on those atomics slows the backward pass §4.1. The proposed backward pass maps threads to splats instead. Each thread keeps a per-splat state. Pixel states (transmittance and accumulated colour) are passed between threads. The forward pass stores a pixel state every N splats, so the backward pass can start from those checkpoints §4.1 fig. 3b. Tiles also skip the tail of their sorted list once the last contributor is known. Tighter culling of splats is applied in both passes, following Radl et al. §4.1.
Pseudocode
# Backward pass parallel over splats, not pixels  [§4.1] [fig. 3b]
# Each tile keeps a per-splat state, passed between threads
def backward_tile(splats_sorted, pixel_checkpoints):
    # Start from checkpoints stored every N splats in the forward pass  [§4.1]
    for i in splats_back_to_front:
        # Receive the state of every pixel after blending splats 0..i-1  [§4.1]
        state = exchange_pixel_states(i, pixel_checkpoints)
        # Gradient portion of splat i for every pixel  [§4.1]
        grad[i] += gradient_portion(state, i)
  1. Batched SH updates. Bands above the first are updated with one Adam step every 16 iterations. Those bands hold 48 of the 59 optimised per-Gaussian attributes §4.2. The paper attributes most Adam time to these bands §4.2 fig. 3a. The first band is updated every iteration.

  2. Other speedups. The degree-0 SH term and higher bands are loaded from separate tensors in the rasteriser, which avoids a concatenation §4.2. The SSIM loss uses an 11x11 Gaussian kernel evaluated as two separable 1D convolutions, fused with the SSIM computation §4.2. The authors state these changes are equivalent to 3DGS, except for the batched SH update §4.2. They report 1.5-2x speedups over gsplat v1.0 §4.2.

  3. Pixel-level control (demonstration). A binary region-of-interest mask can be given to the saliency term. In a face example, the mask comes from SegmentAnything and its weight is set to 10^3. The face reaches the same PSNR as 3DGS sooner and with far fewer Gaussians §3.3 fig. 6.

Hyperparameters

NameValueWhereNotes
budget, MipNeRF-360 indoor2x SfM points§5.2
budget, Deep Blending5x SfM points§5.2
budget, MipNeRF-360 outdoor15x SfM points§5.2
budget, Tanks and Temples2x SfM points§5.2described as outdoor in §5.2
saliency weights \lambda_1, \lambda_20.5, 0.5§3.3
views for scores N10, sampled uniformly§3.3sampling with or without replacement not stated
densification intervalevery 500 iterations§3.3one fifth of 3DGS frequency
densification window (start, end, steps N)not stated§3.2
score coefficientssee table in Method, step 4§3.3
high-opacity switch15K iterations§3.4midpoint of training; total implied as 30K
SH learning rate0.001, stated as 4x§5baseline value not stated
SH batched updateone Adam step every 16 iterations§4.2
opacity learning rate0.025, stated as half§5
SSIM kernel11x11 Gaussian§4.2
gradient threshold \mathcal{G}_t, radius threshold \mathcal{R}_tnot statedalg. 1
position, scaling, rotation learning ratesnot stated§5paper says "most original hyperparameters are retained"
training iterationsnot stated§3.4implied 30K from the 15K midpoint
hardwareNVIDIA RTX A4500§5
SSIM and L1 loss weightsnot stated§3.1

Results

Author-reported. Setup: three scene sets, the same train/test split as 3DGS §5.1. Top of tab. 1: budgeted runs. Bottom: runs matched to 3DGS's model size. Evaluation ran on an RTX A4500. Baseline times were measured on the same hardware or adjusted §5.

Tanks and Temples (2 scenes) tab. 1

MethodSSIMPSNRLPIPSTrain time#G (10^6)Peak #G
C3DGS (Compressed 3DGS)0.84323.570.18228 m1.531.84
RVQ (Compact-3DGS, R-VQ)0.83123.300.20227 m0.831.46
Papantonakis et al.0.84423.660.17818 m0.710.71
Mini-Splatting0.84723.420.18120 m0.314.32
INGP-Big0.74521.920.3057 m--
Ours (budgeted)0.83723.950.2017 m0.290.29
Plenoxels0.71921.080.37925 m--
MipNeRF3600.75922.220.25748 h--
Zip-NeRF------
3DGS0.84723.650.17628 m1.841.84
Ours (#3DGS)0.85124.040.17020 m1.841.84

MipNeRF-360 (9 scenes) tab. 1

MethodSSIMPSNRLPIPSTrain time#G (10^6)Peak #G
C3DGS (Compressed 3DGS)0.81127.340.22143 m2.442.94
RVQ (Compact-3DGS, R-VQ)0.79726.990.24548 m1.412.57
Papantonakis et al.0.81427.430.22025 m0.830.83
Mini-Splatting0.82227.260.21730 m0.504.32
INGP-Big0.69925.590.3318 m--
Ours (budgeted)0.80127.310.25211 m0.630.63
Plenoxels0.62623.080.46326 m--
MipNeRF3600.79227.690.23748 h--
Zip-NeRF0.82828.540.1891.5 h--
3DGS0.81527.460.21543 m3.313.31
Ours (#3DGS)0.82227.790.20532 m3.313.31

Deep Blending (2 scenes) tab. 1

MethodSSIMPSNRLPIPSTrain time#G (10^6)Peak #G
C3DGS (Compressed 3DGS)0.90029.540.25239 m2.432.81
RVQ (Compact-3DGS, R-VQ)0.90129.750.26038 m1.042.25
Papantonakis et al.0.90229.570.24722 m0.970.97
Mini-Splatting0.90930.040.24424 m0.564.51
INGP-Big0.81724.960.3908 m--
Ours (budgeted)0.90429.820.2607 m0.270.27
Plenoxels0.79523.060.51028 m--
MipNeRF3600.90129.400.24548 h--
Zip-NeRF------
3DGS0.90429.640.24339 m2.812.81
Ours (#3DGS)0.90730.140.23522 m2.812.81

Ablations on Tanks and Temples, budgeted setting tab. 2. All rows yield the same Gaussian count.

ConfigurationTruck PSNRTruck LPIPSTruck timeTrain PSNRTrain LPIPSTrain time
Ours25.200.1657 m22.690.2389 m
without score-based sampling24.920.1896 m22.240.2468 m
without image loss24.940.1877 m22.080.2429 m
without high opacity25.010.1747 m22.290.2399 m
without reduced SH frequency25.390.1619 m22.750.23512 m
without per-splat backward25.200.16514 m22.690.23817 m

The text states that removing the image loss or the score-based sampling "significantly harms quality", and that the original SH update frequency can add minor quality at up to a 50% speed cost §5.3. The per-splat backward ablation keeps the same quality and changes only the time tab. 2.

Headline claims from the abstract: budgeted runs reach 4-5x reductions in model size and training time, and more generous budgets surpass 3DGS quality [abstract] fig. 1.

Paper vs code

Official code exists at https://github.com/humansensinglab/taming-3dgs. The URL the paper gives for the optimisations, https://github.com/nullptr81/3dgs-accel, resolves to that repository §4.2. This card does not use the code. The repository's base code is derived from 3DGS, and the copied LICENSE_ORIGINAL.md is the Gaussian-Splatting License, which forbids commercial use. The MIT statement in the README covers only the performance optimisations on a separate branch, so the default branch cannot be cited under our licensing rules. Searched: the paper's text, the project page, and the GitHub repository and its branches. Nothing in this card is taken from the code.

Pitfalls

  • Eq. 2 is internally inconsistent. Taken literally, eq. 2 gives A(0) = B, while the text says the curve starts at the SfM count S §3.2. At x = N it gives 2B - S, while the text says it peaks at B. The paper does not state a corrected form. Any implementation has to pick the curve by its endpoints (start at S, reach B at the last step) and say so.
  • Budget multiplier. The paper does not say how the SfM point count is obtained, or whether it is counted before or after any filtering §5.2.
  • Score normalisation is undefined. "Median scaling" is described but no formula is given §3.3. The paper also does not give the exact normalisation of F. Coefficients are given, but not how each term is scaled before weighting.
  • Positional gradient. The paper calls it "the magnitude of the positional gradient" §3.3 without saying whether it is accumulated over iterations, averaged, or taken in screen space.
  • Sampling details. The paper does not state whether the B draws are with or without replacement §3.3.
  • Drawn Gaussians may not yield B new ones. Algorithm 1 splits or clones only the drawn Gaussians whose gradient passes \mathcal{G}_t alg. 1. The paper does not say how a shortfall is handled or whether it is recounted.
  • Thresholds and windows missing. \mathcal{G}_t, \mathcal{R}_t, the densification start and end, and N are not given alg. 1 §3.2. Algorithm 1 uses radius for the split decision, but the text does not mention radius.
  • "Purely constructive" is not defined precisely. The paper says it does not require "substantial pruning or culling" §1. It also says 3DGS prunes low-opacity Gaussians over time §3.2. Whether any pruning occurs in this method is not stated.
  • High opacity. The paper does not say how existing opacity values are mapped when the activation changes at 15K §3.4. "Clamping blending weights to 1" does not say whether the clamp applies to per-Gaussian alpha or to the summed weight.
  • Per-splat backward. The paper describes it without equations. The state checkpoint interval is given as N in the text §4.1 and as 32 in the figure caption fig. 3. The caption also states 32-splat buckets, one per CUDA warp. These details are GPU-specific.
  • Batched SH update. The paper does not state how Adam's moment estimates are handled on skipped iterations §4.2. The ablation shows a speed cost of up to 50% when the batching is removed §5.3.
  • SH learning rate. The paper says the SH rate is raised "four times" to 0.001 §5, but the baseline value is not stated, so the factor cannot be checked.
  • Equivalence claim. The paper calls the speedups numerically equivalent to 3DGS, except the SH schedule §4.2. Table 2 supports this for the per-splat backward, which keeps the same PSNR and LPIPS tab. 2. The SSIM kernel claim has no separate test.
  • Resolution and downscaling. Image resolution used in each scene set is not stated.
  • Matched scenario budgets. The per-scene Gaussian budgets for the matched runs are not listed §5.2.
  • Baseline times may be adjusted. Times for baselines were "obtained on the same hardware or adjusted" §5. Treat cross-method timing as author-reported.
  • Unit of Peak #G. The table header gives no unit for Peak #G while #G is in units of 10^6 tab. 1.
  • Released code not checked. The optimisations are not verified against released code; see Paper vs code.

Lineage

  • Builds on: 3D Gaussian Splatting (Kerbl et al.), the base representation and training pipeline §3.1 §5.
  • Compared against: Compressed 3DGS (C3DGS, Niedermayr et al.) §5.2; Compact-3DGS (R-VQ) §5.2; Papantonakis et al. §5.2; INGP-Big (Instant-NGP) §5.2; Mini-Splatting §5.2; Plenoxels §5.2; MipNeRF360 and Zip-NeRF §5.2; DISTWAR for backward timing §4.1 fig. 4; gsplat v1.0 §4.2.
  • Superseded by: not recorded in the wiki.

Source and license

Adapted from “Taming 3DGS: High-Quality Radiance Fields with Limited Resources” by Saswat Subhajyoti Mallick, Rahul Goel, Bernhard Kerbl, Francisco Vicente Carrasco, Markus Steinberger, Fernando De La Torre (arXiv:2406.15643), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors.