wikillm

Paper · 2023-11-22 · cs.CV, cs.GR

Depth-Regularized Optimization for 3D Gaussian Splatting in Few-Shot Images

Few-shot 3D Gaussian Splatting with a dense depth prior. Monocular depth from ZoeDepth is scale- and offset-fitted to COLMAP points, then an L1 depth loss, a smoothness loss off Canny edges, max SH degree 1, an early stop on depth loss and no opacity reset regularise training. Author-reported on NeRF-LLFF (2 to 5 views): mean PSNR 15.94 vs 12.25 for 3DGS at 2 views, 18.74 vs 16.17 at 5 views.

Gaussian splattingNovel view synthesisMonocular depth estimation3d-reconstructiongaussian-splattingfew-shotdepth-regularizationnovel-view-synthesis

arXivPDFMarkdown13 min read

AI-compiled by claude-haiku-5-5 on 2026-11-05, 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 and learns them from photos. With only two to five photos, it fits those photos perfectly by putting blobs at the wrong distances from the camera. The result looks right from the training views and falls apart from others, with floating specks and broken shapes.

The paper adds a hint about the shape of the scene. A depth-estimating network guesses how far each pixel is from the camera. Its guesses are not in the right units, so the paper lines them up with the few sparse distance points that a standard camera-pose tool already produces. The training then also asks each blob's rendered distance to agree with this hint, and asks neighbouring pixels to have similar distances except across object edges. Training stops once the blobs drift too far from the hint. A few other settings are simplified because the usual ones assume many photos. The authors report that this gives clearly better images and shapes than the standard method when photos are scarce.

TL;DR

Few-shot 3DGS with a dense depth prior §3. Monocular depth from ZoeDepth §4.1 is scale- and offset-fitted per image to COLMAP points §3.1 eq. 4. Rendered depth gets an L1 loss §3.2 eq. 7, and an edge-masked smoothness loss adds §3.3 eq. 8. Three few-shot changes: max SH degree 1, early stop on a moving average of depth loss, no periodic opacity reset §3.4. Author-reported: on NeRF-LLFF with 2 to 5 views, mean PSNR is 15.94 to 18.74 against 12.25 to 16.17 for 3DGS tab. 1.

Problem

With few images, 3DGS overfits the training views and produces floating artefacts and wrong geometry §1 fig. 1. Sparse SfM points are too few to regularise every splat §1. Depth sensors would give dense depth, but they are impractical §1. Monocular networks give dense depth, but only up to scale and offset, and the scale mismatch between views creates geometry conflicts §1. The paper states that its target setting is few images with known camera poses from SfM §3 §4.1.

Method

Overview fig. 2. The method is 3DGS with an extra depth target, a smoothness term and three few-shot changes. The input is k images, with camera poses, intrinsics and a point cloud from SfM (COLMAP is the example) §3. The pipeline has four parts.

  1. Sparse depth from SfM. Each SfM point is projected into each image, giving a sparse depth map per image §3 eq. 1 eq. 2. Pixels without a point are empty.

  2. Dense depth prior. A pre-trained monocular depth network gives a dense depth D_dense = s·F(I) + t §3.1 eq. 3. The scale s and offset t are solved by a weighted least-squares fit to the sparse depth §3.1 eq. 4. The weight of each point is the reciprocal of its SfM reprojection error, normalised to [0, 1] §3.1. The adjusted depth D*_dense is the target for the depth loss §3.1. The paper calls this an "adjusted dense depth" and does not say whether s and t are fit once per image or once per scene; the equation is per image, so this card reads it that way.

  3. Depth rendering. The rendered depth reuses the per-splat alpha and transmittance weights from colour rendering: D = Σ d_i · α_i · T_i §3.2 eq. 5 eq. 6. Here d_i is the splat's depth in the camera frame §3.2. The depth loss is the L1 distance between rendered depth and D*_dense §3.2 eq. 7.

  4. Smoothness and training loss. Adjacent pixels should have similar depth, except where a Canny edge mask marks an edge §3.3 eq. 8. The total loss adds the 3DGS colour and D-SSIM terms with the depth and smoothness terms, each with its own weight §3.3 eq. 9.

Pseudocode
# Fit the dense depth prior for one training image  [§3.1] [eq. 4]
# image: one training view; sparse_depth: SfM depth, empty where no point
# weights: per-point reliability in [0, 1]
def fit_dense_depth(image, sparse_depth, weights):
    # Monocular network output, relative up to scale and offset  [§3.1]
    raw = monocular_depth(image)
    # Least squares for scale and offset over the sparse pixels  [§3.1] [eq. 4]
    scale, offset = weighted_least_squares(raw, sparse_depth, weights)
    # Adjusted dense depth is the depth target for the depth loss  [§3.1]
    return scale * raw + offset
Pseudocode
# Training loss for one iteration  [eq. 7] [eq. 8] [eq. 9]
# rendered, target: RGB images; depth_rendered: alpha-blended splat depth
# depth_target: adjusted dense depth; depths: depths for neighbour terms
def total_loss(rendered, target, depth_rendered, depth_target, depths):
    # 3DGS colour and D-SSIM terms, weighted  [eq. 9]
    loss = (1 - lambda_ssim) * l1(rendered, target)
    loss += lambda_ssim * dssim(rendered, target)
    # L1 depth term toward the adjusted dense depth  [eq. 7]
    loss += lambda_depth * l1(depth_rendered, depth_target)
    # Smoothness between neighbouring depths, off Canny edges  [eq. 8]
    loss += lambda_smooth * smoothness_off_edges(depths, canny_mask)
    return loss

Few-shot changes §3.4:

  1. Spherical harmonics degree 1. The maximum SH degree is set to 1, to stop high-frequency colour coefficients from overfitting §3.4.

  2. Early stop on depth loss. Colour loss drives the optimisation, and depth and smoothness act as guides. A moving average of the depth loss decides when to halt, once the splats start to leave the depth guide §3.4.

  3. No periodic opacity reset. The paper removes 3DGS's periodic reset, because resetting opacity led to splats being removed or trapped in local optima §3.4.

Pseudocode
# Early stop on the moving average of the depth loss  [§3.4]
# depth_losses: depth loss per iteration so far
def should_halt(depth_losses, window):
    # Average over the window; window size and threshold are not stated  [§3.4]
    average = moving_average(depth_losses, window)
    # Halt when the splats leave the depth guide; the test is not given  [§3.4]
    return average_is_diverging(average)

Preprocessing §4.1: all images of a scene go through COLMAP so that poses and points are consistent across k-shot subsets. The points used for depth fitting and as initial points for a k-shot run are those visible in the chosen views (see Pitfalls).

Hyperparameters

NameValueWhereNotes
number of input views k2, 3, 4, 5§4.1k views drawn at random from the train set
random seedsten seeds; mean reported§4.1seed values not stated
train/test split (NeRF-LLFF)train = outer cameras of the convex hull; the rest are test§4.1convex hull algorithm cited, not specified
SfMCOLMAP on all images of a scene§4.1
sparse depth point filterpoints visible in at least three of the k cameras§4.1impossible for k=2 as written, see Pitfalls
monocular depth modelZoeDepth, pre-trained on NYU Depth v2 and KITTI§4.1checkpoint not named beyond that
fit weight wreciprocal of SfM reprojection error, normalised to [0,1]§3.1normalisation not stated
max SH degree1§3.4
early stopmoving average of depth loss§3.4window, threshold and test not stated
periodic opacity resetremoved§3.4
baseline iterations (3DGS)30k§4.1ours: iteration count not stated
λ_depth, λ_smooth, λ_ssimnot statedeq. 9symbols only
colour loss weightsnot statedeq. 9
optimiser, learning rates, densification schedulenot stated
Canny thresholdsnot stated§3.3
smoothness neighbourhoodnot stated§3.34- or 8-neighbour not said
image resolutionnot stated§4.1
hardware, run timenot stated

Results

Author-reported. Setup: NeRF-LLFF, eight scenes, k = 2, 3, 4, 5 views, ten seeds averaged, test on the held-out views §4.1. Baselines: 3DGS on the same k poses and filtered points, and an oracle that uses pseudo-ground-truth depth §4.1. Both the mean rows and the per-scene rows are copied as printed in tab. 1; the mean rows do not equal the averages of the scene rows (see Pitfalls).

Mean over eight scenes tab. 1

MethodPSNR 2PSNR 3PSNR 4PSNR 5SSIM 2SSIM 3SSIM 4SSIM 5LPIPS 2LPIPS 3LPIPS 4LPIPS 5
3DGS12.2513.7515.2616.170.3060.4070.4850.5330.4710.3880.3340.299
Ours15.9417.1718.1518.740.4390.4970.5410.5710.3650.3370.3090.288
Oracle18.2919.9521.0222.050.5390.6220.6600.7010.2660.2130.1880.167

Per scene tab. 1

SceneMethodPSNR 2PSNR 3PSNR 4PSNR 5SSIM 2SSIM 3SSIM 4SSIM 5LPIPS 2LPIPS 3LPIPS 4LPIPS 5
Fern3DGS13.0314.2916.7318.590.3360.4080.5170.6030.4760.3890.2960.217
FernOurs17.5919.1319.9120.550.5160.5880.6160.6420.2860.2320.2030.167
FernOracle18.1820.3020.7821.810.5240.6360.6540.7010.2780.2010.1850.157
Flower3DGS14.9017.7519.7121.390.3510.5080.6050.6710.4060.2570.1900.146
FlowerOurs15.9217.8019.1520.450.3950.4450.5380.5760.4140.3760.3230.293
FlowerOracle19.7122.1623.2624.650.5700.6730.7140.7600.2500.1630.1280.097
Fortress3DGS13.8715.9819.2619.980.3630.4920.6090.6310.3890.2830.2010.191
FortressOurs19.8021.8523.0723.720.5670.6550.7240.7400.2320.1910.1620.144
FortressOracle23.0724.5126.3926.730.6540.7280.7870.7970.1590.1300.1000.093
Horns3DGS11.4312.4813.7614.750.2640.3390.4330.4980.5310.4640.3950.350
HornsOurs15.9116.2218.0918.390.4200.4660.5270.5650.3620.3490.3060.296
HornsOracle18.5620.0820.8822.520.5680.6440.6680.7250.2590.2120.1990.168
Leaves3DGS12.3312.3612.4912.260.2600.2750.2980.2970.4120.3970.3970.401
LeavesOurs13.0413.6313.9714.130.2350.2700.2830.2970.4600.4450.4400.438
LeavesOracle13.5214.2314.7814.850.2870.3530.3770.3970.3800.3480.3410.356
Orchids3DGS11.7813.9415.4116.080.1820.3200.4160.4600.4260.3100.2450.219
OrchidsOurs12.8814.7115.4016.130.2160.2970.3430.3910.4620.3830.3660.352
OrchidsOracle14.8916.4517.4218.450.3650.4710.5250.5760.3030.2370.2000.174
Room3DGS10.1811.5111.5912.210.4040.4940.5100.5520.6060.5590.5560.515
RoomOurs17.2118.1118.8719.630.6680.7190.7320.7570.3520.3600.3260.295
RoomOracle20.6622.3123.8024.590.7580.8010.8390.8640.2170.1880.1600.156
Trex3DGS10.7211.7213.1114.140.3220.4170.4920.5480.5200.4460.3940.351
TrexOurs14.9015.9016.7517.370.4800.5370.5670.6250.3580.3620.3480.305
TrexOracle17.7619.5820.8422.830.5910.6690.7140.7860.2840.2260.1920.134

Ablation on Horns tab. 2. Only the 2-view and 5-view columns are reported.

ConfigurationPSNR 2SSIM 2LPIPS 2PSNR 5SSIM 5LPIPS 5
w/o adjustment (§3.1)7.860.3190.74010.010.3460.761
w/o depth loss (§3.2)11.490.3440.53312.970.5060.418
w/o smoothness loss (§3.3)14.750.4150.39117.790.5610.297
w/o early stop (§3.4)13.990.3450.43317.280.4940.333
Ours15.910.4200.36218.390.5650.296

Initialisation on Fortress tab. 3.

Initial pointsPSNR 2SSIM 2LPIPS 2PSNR 5SSIM 5LPIPS 5
COLMAP from sparse-view (ours)19.800.5670.23223.720.7400.144
Unprojected from D*_dense16.390.4570.28119.150.5690.222
COLMAP from all-view21.180.6810.20024.090.7780.127

The text describes the qualitative results. On Fern at 2 views, 3DGS produces geometry that is "entirely erroneous" against its RGB match, while the method's depth looks plausible §4.2 fig. 3. Crops are shown in fig. 4. The oracle images are in fig. 5 §4.2. The paper says the method does better on indoor scenes (Fortress, Room, Fern) and worse on natural scenes (Orchids, Flower), and that Leaves fails for COLMAP §4.2.

Paper vs code

Official code exists at https://github.com/robot0321/DepthRegularizedGS. The paper's text gives no code link. The project page, linked from the abstract, has a "Code" link to this repository, and the repository is by the first author (the paper lists the same handle in the contact address). Searched: the arXiv abstract and comments, the project page, and the GitHub search API for "DepthRegGS" (no results). The repository's LICENSE is the Gaussian-Splatting License, which is non-commercial and research-only. So this card does not use the code: no code field, and nothing is cited or quoted from the code. The README warns that the depth rasteriser had errors and was changed after arXiv v1, so a reader who wants the code should not assume it matches the paper's tables.

Pitfalls

  • Sparse-point rule impossible for k = 2. The paper selects points "visible in at least three out of the k cameras" §4.1. With k = 2 no point can meet that test as written, yet 2-view results are reported. The paper does not say whether the rule is applied to all train views or to some other set. Implementers need to decide and document the choice.
  • Sparse depth source differs between sections. §3.1 projects all visible SfM points §3 eq. 2. The experiments use the filtered set §4.1. The card's reading is the filtered set for experiments.
  • Weighting in the fit is ambiguous. Equation 4 places w(p) on the sparse depth term: ||w(p)·D_sparse(p) − D_dense(p; s, t)||² eq. 4. Multiplying the sparse depth by the weight, rather than the residual, is an unusual choice. The normalisation of w is not stated §3.1. Whether the fit is per image is implied, not stated.
  • Empty sparse pixels. D_sparse is defined as p_z over [0, ∞] eq. 2. How pixels without a point are marked (zero, NaN, or excluded) is not stated. The fit must skip them.
  • Monocular depth scale claims conflict. §1 says these networks give relative depth §1. §4.1 uses ZoeDepth trained on NYU Depth v2 and KITTI, which the paper does not describe as relative. The fit makes either reading work, but the checkpoint is not named.
  • Notation clash in the rendering equation. T_i is the transmittance product in eq. 5 and the translation vector in d_i = (R_i p_i + T_i)_z §3.2. Also p is used for both a projected pixel eq. 1 and a 3D point in §3.2. Use separate names when implementing.
  • Loss norms and weights are not given. The depth loss is written as a norm eq. 7, but the norm's order and whether it sums or averages over pixels are not stated. λ_depth, λ_smooth and λ_ssim are symbols only eq. 9. The depth term's size depends on the depth units and on these weights, so they are the main tuning risk.
  • Smoothness details. The adjacency is not defined §3.3 eq. 8. The squared-difference form is given. The Canny thresholds are not stated, and the edge mask is applied to both depths of a pair §3.3.
  • Few-shot changes count mismatch. The text says "we modify two optimization techniques" §3.4, then lists three: SH degree, early stop and reset removal. Treat all three as modifications.
  • Early-stop rule is missing. The paper says it uses a moving average of the depth loss to halt when splats deviate §3.4. The window, threshold, direction and what stops (the whole optimisation or only some parts) are not stated.
  • Reset rule not restated. The paper removes the periodic reset but does not say its interval or its exact 3DGS behaviour §3.4. An implementer who keeps the stock 3DGS schedule for other settings will get a different run.
  • Oracle uses test views. The oracle's pseudo-ground-truth depth comes from optimising both train and test images §4.1. It is an upper bound that has seen the test views, not a method result.
  • Table means do not match the scene rows. Averaging the eight scene rows of tab. 1 gives values different from the printed means in four cases I checked: 3DGS 2-view PSNR 12.28 vs 12.25 printed; ours 2-view PSNR 15.91 vs 15.94; ours 5-view PSNR 18.80 vs 18.74; 3DGS 5-view PSNR 16.18 vs 16.17. Use per-scene values when comparing.
  • Not uniformly better. On Flower, 3DGS has higher PSNR at 4 and 5 views (19.71 vs 19.15; 21.39 vs 20.45). On Leaves, 3DGS has higher SSIM at 2 to 5 views and lower LPIPS at every view. On Orchids, 3DGS LPIPS is lower at every view. The mean claims hide these.
  • Caption copy-paste. Table 2 and Table 3 captions repeat the same text about "supervising with sparse depth from COLMAP instead of dense depth", which does not describe Table 3 tab. 2 tab. 3. Table 2's caption says "evaluated in Horns" and Table 3's says "Fortress"; those match the scenes used.
  • Ablation text overstates one claim. The text says the smoothness loss without depth "yields worse results compared to the baseline" §4.3. In the table, "w/o depth loss" at 2 views (11.49) is slightly above 3DGS on Horns (11.43), and only worse at 5 views (12.97 vs 14.75) tab. 2.
  • Single-scene ablations. Table 2 is Horns, Table 3 is Fortress. The paper does not say whether these averages cover all ten seeds.
  • Hidden preprocessing cost. Poses and points come from running COLMAP on all images of each scene, including test images §4.1. Consistent poses across k-shot subsets depend on it. In a truly few-shot deployment this full-scene step is not available.
  • Baselines are narrow. Only 3DGS and the oracle are compared §4.2. No other few-shot method is compared.
  • Depth model cost and domain. Each training image needs one monocular depth inference, and the authors say quality depends heavily on it, with worse results on natural scenes §5 §4.2. The paper gives no run time.

Lineage

  • Builds on: 3D Gaussian Splatting (Kerbl et al.), the base representation and optimisation §3 §4.1.
  • Uses: ZoeDepth (Bhat et al.) for dense monocular depth §4.1; COLMAP (Schönberger et al.) for SfM §3; the smoothness constraint is inspired by Godard et al. §3.3; Canny edge detection §3.3.
  • Compared against: 3DGS on the same poses and points, and an oracle with pseudo-ground-truth depth §4.1 tab. 1.
  • Superseded by: not recorded in the wiki.

Source and license

Adapted from “Depth-Regularized Optimization for 3D Gaussian Splatting in Few-Shot Images” by Jaeyoung Chung, Jeongtaek Oh, Kyoung Mu Lee (arXiv:2311.13398), 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.