depth3d-lab: depth, 3D reconstruction and view synthesis on nuScenes-mini

Zero-shot evaluation of public models plus small trained models, all measured on one NVIDIA L4. Every number on this page is generated from results/*.json. Author: Pavan Yadav Annappa. MIT licence for the code; nuScenes-mini is CC BY-NC-SA 4.0 and is not redistributed here (only tokens, metrics and small renders).

Charts

Track A: AbsRel, raw metric output vs per-image median scaling

Track A: AbsRel per camera (raw metric output)

Track A: AbsRel per camera (median-scaled = shape error)

Track A: AbsRel per depth bin (raw / scaled)

Track A: median scale factor GT/pred per camera (1.0 = metric scale correct)

Track C: held-out PSNR (higher is better)

Track C: held-out SSIM (higher is better)

Track C: held-out LPIPS alex (lower is better)

Track C: training loss and number of Gaussians

Track B: AbsRel on identical reference pixels, mean with 95% bootstrap CI

Track B: VGGT relative pose errors vs nuScenes GT (per view pair)

Track E: PSNR vs real next frame, 95% CI over held-out pairs

Track E: LPIPS (alex) vs real next frame, 95% CI over held-out pairs

Track E: training loss

Track D: SHARP render vs real frame, PSNR and LPIPS

Depth comparison viewer

depth preview

Colour scale: log depth 1-80 m (turbo, red = near). AbsRel on this frame's LiDAR pixels is shown on the right.

3D point cloud: VGGT vs LiDAR

VGGT point map of CAM_FRONT in scene-0061 (114,040 points, coloured by the image, scaled to LiDAR with one sequence scale) and the LiDAR return of the same keyframe (11,609 points, white). Drag to orbit, wheel to zoom. Toggle:

Trained 3D Gaussian Splatting scene

491,520 of 736,227 Gaussians from the 'lidar_depth0.2' variant (15.7 MB .splat). Drag to orbit, right-drag to pan, wheel to zoom. Moving cars and pedestrians appear as ghosts because the scene is modelled as static.

Renders

3DGS held-out previews

gs_lidar_15k_cam_back_left.jpg
gs_lidar_15k_cam_back_left.jpg (left: held-out photo, right: render)
gs_lidar_15k_cam_front.jpg
gs_lidar_15k_cam_front.jpg (left: held-out photo, right: render)
gs_lidar_cam_back_left.jpg
gs_lidar_cam_back_left.jpg (left: held-out photo, right: render)
gs_lidar_cam_front.jpg
gs_lidar_cam_front.jpg (left: held-out photo, right: render)
gs_lidar_depth0.05_15k_cam_back_left.jpg
gs_lidar_depth0.05_15k_cam_back_left.jpg (left: held-out photo, right: render)
gs_lidar_depth0.05_15k_cam_front.jpg
gs_lidar_depth0.05_15k_cam_front.jpg (left: held-out photo, right: render)
gs_lidar_depth0.05_cam_back_left.jpg
gs_lidar_depth0.05_cam_back_left.jpg (left: held-out photo, right: render)
gs_lidar_depth0.05_cam_front.jpg
gs_lidar_depth0.05_cam_front.jpg (left: held-out photo, right: render)
gs_lidar_depth0.2_15k_cam_back_left.jpg
gs_lidar_depth0.2_15k_cam_back_left.jpg (left: held-out photo, right: render)
gs_lidar_depth0.2_15k_cam_front.jpg
gs_lidar_depth0.2_15k_cam_front.jpg (left: held-out photo, right: render)
gs_lidar_depth0.2_cam_back_left.jpg
gs_lidar_depth0.2_cam_back_left.jpg (left: held-out photo, right: render)
gs_lidar_depth0.2_cam_front.jpg
gs_lidar_depth0.2_cam_front.jpg (left: held-out photo, right: render)
gs_random_15k_cam_back_left.jpg
gs_random_15k_cam_back_left.jpg (left: held-out photo, right: render)
gs_random_15k_cam_front.jpg
gs_random_15k_cam_front.jpg (left: held-out photo, right: render)
gs_random_cam_back_left.jpg
gs_random_cam_back_left.jpg (left: held-out photo, right: render)
gs_random_cam_front.jpg
gs_random_cam_front.jpg (left: held-out photo, right: render)

3DGS camera path

gs_lidar_15k_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)
gs_lidar_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)
gs_lidar_depth0.05_15k_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)
gs_lidar_depth0.05_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)
gs_lidar_depth0.2_15k_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)
gs_lidar_depth0.2_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)
gs_random_15k_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)
gs_random_cam_front_path.mp4: CAM_FRONT path rendered by the 3DGS model (train and held-out timestamps)

Track E: real vs generated next frames

next-frame grid
Rows: current frame t, real frame t+1, flow-matching sample of t+1 (held-out scenes, 128x64 upsampled 2x).

Track D: SHARP renders

sharp_scene-0061_next_keyframe.jpg
sharp_scene-0061_next_keyframe.jpg
sharp_scene-0655_next_keyframe.jpg
sharp_scene-0655_next_keyframe.jpg

All result tables (docs/RESULTS.md)

Results

Generated by python scripts/make_results.py from results/*.json. Do not edit by hand. All timings measured on an NVIDIA L4 (23 GB). Dataset: nuScenes v1.0-mini (10 scenes, 404 keyframes).

Track A - monocular metric depth vs LiDAR (zero-shot)

LiDAR ground truth: 2,424 images (404 keyframes x 6 cameras), points with 1 m < z < 80 m after z-buffering. Per camera (points per image, median depth):

camerapts/imgmedian z [m]frac 1-20 mfrac 20-40 mfrac 40-80 m
CAM_FRONT302011.90.690.230.09
CAM_FRONT_LEFT33449.20.850.130.03
CAM_FRONT_RIGHT318910.70.700.220.09
CAM_BACK45219.80.740.190.07
CAM_BACK_LEFT40008.40.870.120.01
CAM_BACK_RIGHT361410.80.700.230.07

Overall (all LiDAR points, all cameras)

variantAbsRelSqRelRMSE [m]RMSE_logd<1.25d<1.25^2d<1.25^3imagesms/img (NVIDIA L4)
depth_pro raw0.2572.1237.7600.4880.5250.8000.8942,424599
depth_pro median-scaled0.1781.6296.7250.3140.7600.9020.9512,424
depth_pro_gtfocal raw0.2772.4488.5790.5530.4600.7270.8582,424599
depth_pro_gtfocal median-scaled0.1781.6296.7250.3140.7600.9020.9512,424
dav2_metric_outdoor_large raw0.5825.1338.9570.5240.1990.6040.7872,424365
dav2_metric_outdoor_large median-scaled0.1941.6437.4460.3360.7150.8710.9372,424

'raw' is the metric output as predicted; 'median-scaled' multiplies each image by median(GT)/median(pred) so that the remaining error is shape error only. 'depth_pro_gtfocal' feeds the true nuScenes focal length instead of the model's own focal estimate. Timing is the median model time per 1600x900 image.

Scale factor and focal estimate per camera

variantcameramedian scale GT/predp10 / p90true f [px]pred f median [px]pred/true f
depth_proCAM_FRONT1.1220.881 / 1.467126613241.046
depth_proCAM_FRONT_LEFT1.2981.018 / 1.967127313221.039
depth_proCAM_FRONT_RIGHT1.2120.988 / 1.697126113771.092
depth_proCAM_BACK0.9430.767 / 1.26680910331.276
depth_proCAM_BACK_LEFT1.1950.930 / 2.508125713661.087
depth_proCAM_BACK_RIGHT1.2491.024 / 1.641126014151.123
depth_pro_gtfocalCAM_FRONT1.1650.951 / 1.529126613241.046
depth_pro_gtfocalCAM_FRONT_LEFT1.3421.072 / 2.176127313221.039
depth_pro_gtfocalCAM_FRONT_RIGHT1.2871.073 / 2.012126113771.092
depth_pro_gtfocalCAM_BACK1.1691.008 / 1.57080910331.276
depth_pro_gtfocalCAM_BACK_LEFT1.2671.063 / 3.170125713661.087
depth_pro_gtfocalCAM_BACK_RIGHT1.3901.076 / 2.069126014151.123
dav2_metric_outdoor_largeCAM_FRONT0.7280.625 / 0.847n/an/an/a
dav2_metric_outdoor_largeCAM_FRONT_LEFT0.6850.571 / 0.971n/an/an/a
dav2_metric_outdoor_largeCAM_FRONT_RIGHT0.7570.628 / 0.918n/an/an/a
dav2_metric_outdoor_largeCAM_BACK0.4740.432 / 0.557n/an/an/a
dav2_metric_outdoor_largeCAM_BACK_LEFT0.6770.522 / 0.961n/an/an/a
dav2_metric_outdoor_largeCAM_BACK_RIGHT0.7650.612 / 0.934n/an/an/a

A scale factor of 1.0 means the metric output is already on the LiDAR scale for that camera.

Per camera group (front / side / back) - AbsRel and d<1.25

variantgroupAbsRel rawAbsRel scaledd1 rawd1 scaledpoints
depth_profront0.1910.1240.6330.8451,219,883
depth_proside0.2700.1900.4950.7395,715,488
depth_proback0.2590.1770.5490.7711,826,681
depth_pro_gtfocalfront0.2020.1240.5950.8451,219,883
depth_pro_gtfocalside0.3060.1900.4110.7395,715,488
depth_pro_gtfocalback0.2360.1770.5250.7711,826,681
dav2_metric_outdoor_largefront0.3990.1400.2420.8211,219,883
dav2_metric_outdoor_largeside0.4770.2070.2220.6975,715,488
dav2_metric_outdoor_largeback1.0340.1910.0970.6991,826,681

Per camera - AbsRel raw / scaled

variantCAM_FRONTCAM_FRONT_LEFTCAM_FRONT_RIGHTCAM_BACKCAM_BACK_LEFTCAM_BACK_RIGHT
depth_pro0.191 / 0.1240.286 / 0.1820.237 / 0.2040.259 / 0.1770.301 / 0.1740.251 / 0.202
depth_pro_gtfocal0.202 / 0.1240.310 / 0.1820.275 / 0.2040.236 / 0.1770.326 / 0.1740.309 / 0.202
dav2_metric_outdoor_large0.399 / 0.1400.514 / 0.2020.432 / 0.2151.034 / 0.1910.542 / 0.1900.412 / 0.223

Per depth bin - AbsRel and RMSE

variantbinAbsRel rawAbsRel scaledRMSE raw [m]RMSE scaled [m]points
depth_pro1-20m0.2420.1583.522.996,653,105
depth_pro20-40m0.2800.21610.228.811,599,744
depth_pro40-80m0.3730.31523.3820.43509,203
depth_pro_gtfocal1-20m0.2500.1583.582.996,653,105
depth_pro_gtfocal20-40m0.3380.21611.558.811,599,744
depth_pro_gtfocal40-80m0.4380.31526.0820.43509,203
dav2_metric_outdoor_large1-20m0.6680.1686.962.506,653,105
dav2_metric_outdoor_large20-40m0.3340.23812.109.211,599,744
dav2_metric_outdoor_large40-80m0.2500.40516.9824.62509,203

Reading the scale error (generated from the tables above)

depth_pro: per-image median scaling lowers AbsRel from 0.257 to 0.178, i.e. 31% of the raw error is a per-image scale error and the rest is shape error. Worst camera group raw: side (AbsRel 0.270), best: front (0.191). Median scale factor CAM_FRONT 1.12 vs CAM_BACK 0.94. Focal estimate / true focal: CAM_FRONT 1.05, CAM_BACK 1.28. Fraction of LiDAR pixels where the raw prediction exceeded 80 m (clipped before scoring): 0.08%.

depth_pro_gtfocal: per-image median scaling lowers AbsRel from 0.277 to 0.178, i.e. 36% of the raw error is a per-image scale error and the rest is shape error. Worst camera group raw: side (AbsRel 0.306), best: front (0.202). Median scale factor CAM_FRONT 1.16 vs CAM_BACK 1.17. Focal estimate / true focal: CAM_FRONT 1.05, CAM_BACK 1.28. Fraction of LiDAR pixels where the raw prediction exceeded 80 m (clipped before scoring): 0.06%.

dav2_metric_outdoor_large: per-image median scaling lowers AbsRel from 0.582 to 0.194, i.e. 67% of the raw error is a per-image scale error and the rest is shape error. Worst camera group raw: back (AbsRel 1.034), best: front (0.399). Median scale factor CAM_FRONT 0.73 vs CAM_BACK 0.47. Fraction of LiDAR pixels where the raw prediction exceeded 80 m (clipped before scoring): 0.00%.

Per-image AbsRel, mean with 95% bootstrap CI over images

variantrawmedian-scaled
depth_pro0.255 [0.250, 0.260]0.177 [0.173, 0.182]
depth_pro_gtfocal0.276 [0.271, 0.282]0.177 [0.173, 0.182]
dav2_metric_outdoor_large0.560 [0.549, 0.571]0.193 [0.189, 0.197]

Track C - 3D Gaussian Splatting on one driving scene (gsplat, own training loop)

Scene choice: moving annotations (box velocity > 0.5 m/s) per scene; selected scene-0916.

scenekeyframesannotationsmoving (velocity)frac movingmoving (attribute)
scene-0916412,4241860.08265
scene-0655412,3732130.09216
scene-0757416042940.49297
scene-1100409564920.51611
scene-0796407165880.82599
scene-1077419097010.77762
scene-0553411,9917960.40778
scene-0103402,0909680.461,058
scene-0061394,6991,0170.221,114
scene-1094401,7761,1910.671,195

Scene scene-0916, 216 train / 30 held-out views (every 8th timestamp (offset 4), all 6 cameras), images 800x450 (downscale 2), 7000 steps, seed 0, NVIDIA L4.

variantdepth wPSNR testSSIMLPIPS (alex)init gaussiansfinal gaussianstrain min (NVIDIA L4)render ms/viewPSNR train subset
random-13.40 +- 3.780.5210.758200,000206,8111.51.920.01
lidar-16.29 +- 2.750.5870.580300,000576,1142.93.521.24
lidar_depth0.050.0517.54 +- 2.660.5990.525300,000674,3233.33.921.66
lidar_depth0.20.2018.51 +- 2.770.6080.497300,000736,2273.54.221.48
random_15k-12.36 +- 2.450.5120.729200,000427,1534.42.620.61
lidar_15k-14.04 +- 3.420.5220.605300,000948,7968.45.022.44
lidar_depth0.05_15k0.0516.94 +- 2.790.5740.469300,0001,337,19011.67.223.43
lidar_depth0.2_15k0.2018.32 +- 2.630.5840.417300,0001,516,75512.88.323.32

LiDAR init vs random init: 2.89 dB PSNR on held-out views (positive favours LiDAR init).

lidar_depth0.05 vs lidar: 1.26 dB PSNR, -0.054 LPIPS (negative LPIPS favours depth supervision).

lidar_depth0.2 vs lidar: 2.22 dB PSNR, -0.083 LPIPS (negative LPIPS favours depth supervision).

Held-out PSNR per camera

variantCAM_BACKCAM_BACK_LEFTCAM_BACK_RIGHTCAM_FRONTCAM_FRONT_LEFTCAM_FRONT_RIGHT
random16.0513.1513.0613.0312.5712.51
lidar18.0814.7416.7717.4414.2316.46
lidar_depth0.0518.8316.0617.3518.1816.9517.89
lidar_depth0.220.5417.1718.4918.6817.8918.28
random_15k12.6612.5512.9112.2911.8511.92
lidar_15k17.1812.2815.7413.8211.2214.02
lidar_depth0.05_15k18.5215.3617.3417.8915.3117.24
lidar_depth0.2_15k20.5416.7217.9919.0417.3718.27

Track B - feed-forward multi-view reconstruction (VGGT) vs LiDAR

Model: VGGT-1B (facebook/VGGT-1B), bf16 autocast, input 518x294. Mono reference: Depth Pro on the same reference image and LiDAR pixels. GPU: NVIDIA L4.

Setting (i) 6-camera rig, one timestamp, reference CAM_FRONT

40 sequences, 120,040 LiDAR points on the reference views, 1333 ms per sequence (NVIDIA L4, incl. Depth Pro and metrics).

alignment / modelAbsRel mean [95% CI]d<1.25RMSE [m]
vggt_raw0.901 [0.898, 0.903]
vggt_seq_scaled0.135 [0.120, 0.149]0.818 [0.787, 0.848]6.80 [6.08, 7.57]
vggt_sim3_scaled0.607 [0.517, 0.699]
vggt_img_scaled0.124 [0.108, 0.140]0.854 [0.828, 0.880]6.35 [5.64, 7.10]
depth_pro_raw0.188 [0.166, 0.211]
depth_pro_img_scaled0.135 [0.116, 0.161]0.821 [0.767, 0.863]6.74 [6.12, 7.36]
depth_pro_gtfocal_raw0.200 [0.178, 0.223]

Paired difference on identical pixels, VGGT (one scale per sequence) minus Depth Pro (per-image scale): -0.001 [-0.024, 0.017]; VGGT with per-image scale minus Depth Pro: -0.012 [-0.029, 0.003]. Negative means VGGT is better. Fraction of sequences where VGGT (seq scale) is lower: 0.42.

Relative camera pose vs nuScenes GT over 200 view pairs: rotation error mean 8.12 deg (median 4.65), translation direction error mean 48.6 deg (median 35.9, over the 200 pairs whose GT baseline exceeds 0.1 m; 0 pairs with a stationary ego vehicle have no defined direction and are excluded); mean GT baseline 0.81 m. Median sequence scale factor (LiDAR / VGGT units): 23.42.

Setting (ii) 5 consecutive CAM_FRONT keyframes, reference = centre frame

40 sequences, 120,495 LiDAR points on the reference views, 1192 ms per sequence (NVIDIA L4, incl. Depth Pro and metrics).

alignment / modelAbsRel mean [95% CI]d<1.25RMSE [m]
vggt_raw0.901 [0.898, 0.904]
vggt_seq_scaled0.118 [0.097, 0.146]0.867 [0.818, 0.903]5.88 [5.18, 6.68]
vggt_sim3_scaled0.321 [0.208, 0.452]
vggt_img_scaled0.123 [0.100, 0.153]0.862 [0.808, 0.902]5.93 [5.19, 6.74]
depth_pro_raw0.186 [0.162, 0.211]
depth_pro_img_scaled0.128 [0.112, 0.151]0.831 [0.778, 0.872]6.45 [5.88, 7.07]
depth_pro_gtfocal_raw0.191 [0.170, 0.214]

Paired difference on identical pixels, VGGT (one scale per sequence) minus Depth Pro (per-image scale): -0.010 [-0.026, 0.007]; VGGT with per-image scale minus Depth Pro: -0.005 [-0.020, 0.012]. Negative means VGGT is better. Fraction of sequences where VGGT (seq scale) is lower: 0.70.

Relative camera pose vs nuScenes GT over 160 view pairs: rotation error mean 0.31 deg (median 0.14), translation direction error mean 2.3 deg (median 2.0, over the 120 pairs whose GT baseline exceeds 0.1 m; 40 pairs with a stationary ego vehicle have no defined direction and are excluded); mean GT baseline 4.24 m. Median sequence scale factor (LiDAR / VGGT units): 29.68.

Track E - next-frame synthesis with conditional flow matching (plain PyTorch)

Data: 2,342 CAM_FRONT frames (keyframes + sweeps, 404 keyframes) at 128x64; 1,865 train / 467 test consecutive pairs (median dt 0.10 s); held-out scenes scene-0655, scene-1094.

Training fm: 12.4M-parameter UNet, 2,150 steps, batch 64, lr 0.0002, 40.0 min on NVIDIA L4 (world size 1; the two trainings shared the GPU), final logged loss 0.0430.

Training regression: 12.4M-parameter UNet, 2,150 steps, batch 64, lr 0.0002, 40.0 min on NVIDIA L4 (world size 1; the two trainings shared the GPU), final logged loss 0.0025.

Evaluation on 467 held-out pairs, sampler Euler, 50 steps, 173.8 ms per sampled frame (NVIDIA L4).

methodPSNR vs real next frame [95% CI]LPIPS (alex) [95% CI]
fm_sample23.82 [23.61, 24.04]0.099 [0.096, 0.102]
regression24.74 [24.52, 24.98]0.121 [0.119, 0.123]
copy_current24.38 [24.09, 24.69]0.040 [0.038, 0.042]

Paired LPIPS, flow-matching sample minus regression UNet: -0.022 [-0.025, -0.019] (negative = sample is perceptually closer).

Paired LPIPS, sample minus copy-current-frame: 0.059 [0.057, 0.061]; paired PSNR: -0.56 [-0.73, -0.40] dB.

FID of unconditional samples vs held-out frames: 390.3 (467 generated, 467 real). unconditional samples (condition zeroed) vs held-out real frames, 128x64 upsampled to 299 by torchmetrics; small n, treat as indicative only

Track D - single-image 3D Gaussians (Apple SHARP) rendered at the true next pose

10 CAM_FRONT keyframes (one per scene); Gaussians predicted from frame t, rendered at the identity pose and at the true relative pose of the next frame (nuScenes ego pose + calibration). Metrics only on pixels the render covers. GPU: NVIDIA L4.

targetPSNR [95% CI]SSIMLPIPS (alex)coveragecamera motion [m]
identity41.62 [40.69, 42.52]0.991 [0.987, 0.995]0.017 [0.014, 0.020]1.000.00
next_sweep26.80 [24.70, 28.87]0.773 [0.683, 0.858]0.096 [0.071, 0.122]1.000.48
next_keyframe20.42 [18.71, 22.09]0.592 [0.501, 0.684]0.231 [0.179, 0.290]1.002.82

Prediction time 5496 ms per image, render 22.0 ms per view (NVIDIA L4).