VGGT-Splat

Feed-forward VGGT poses vs. COLMAP for 3D Gaussian Splatting,
from 8 frames to all

Jiaming Chu

Independent research project, 2026

Code Release & models
Mip-NeRF 360 garden, all 161 training frames, 3DGS trained for 7k steps, both models rendered along the same novel orbit. Left: COLMAP poses (26.3 dB test PSNR, 770 s for pose estimation). Right: VGGT poses from one forward pass (21.8 dB, 68 s). With many frames COLMAP is sharper; with 8 or 16 frames it often fails (4 and 3 of 6 scenes), and VGGT does not.
TL;DR

Question

VGGT predicts camera poses, a point cloud and per-frame depth for a set of images in a single forward pass, so it can replace COLMAP as the front end of 3D Gaussian Splatting. For a casual phone capture, two practical questions follow: how many frames does each pipeline need before it works, and with few frames, does supervising 3DGS with VGGT's depth recover the missing quality?

Setup

6 scenes: three self-captured phone videos (desk, lawn, room; 1080p, sampled at 3 fps, trained at 960×540) and three Mip-NeRF 360 scenes (garden, bicycle, counter). Each scene has a fixed test set (every 8th frame after removing blurry frames, as in Mip-NeRF 360) and nested training sets of N = 8 / 16 / 32 / all frames. 3 methods share the same gsplat trainer with per-camera pose refinement, stopped at 7k steps:

Evaluation follows the protocol used for pose-free methods. Test cameras come from a joint run on training and test frames, are mapped into the trained model's frame by a Sim(3) fitted on the shared training cameras, and are refined for 500 steps with the Gaussians frozen. Methods are compared on the test frames they all registered. Re-running a configuration with different seeds moves PSNR by 0.06–0.35 dB (standard deviation), so single-run differences below about 0.3 dB are not conclusive; the depth-prior comparison is therefore checked with seed repeats.

Pipeline: three pose sources feed one shared gsplat trainer; test cameras are aligned by Sim(3) and refined with the Gaussians frozen before evaluation TRAINING EVALUATION Training frames N = 8 / 16 / 32 / all COLMAP poses + sparse points VGGT VGGT-1B poses + points VGGT + depth same, plus VGGT depth maps Shared gsplat trainer per-camera pose refinement 7k steps + depth loss (VGGT + depth) Trained Gaussians + refined train cameras Test cameras joint run on train + test Sim(3) alignment fit on shared train cameras Test-pose refinement 500 steps, Gaussians frozen PSNR / SSIM / LPIPS frames all methods register
The three methods differ only in where poses and initial points come from; training and evaluation are identical. Test cameras are brought into each trained model's frame by a Sim(3) fitted on training cameras, then refined with the Gaussians frozen.

Finding 1: with few frames, COLMAP fails and VGGT does not

COLMAP needs enough overlap between views to match features and register cameras. With 8 frames it fails outright on desk, room, bicycle and counter, and registers 3/8 and 6/8 frames on lawn and garden. With 16 frames it still fails on lawn, room and counter. Even at 32 frames it registers only 10/32 frames on bicycle and 15/32 on desk; on desk this is why its PSNR is lower than at 16. VGGT returns a pose for every frame in every configuration.

Bicycle with 16 training frames: COLMAP registers 3 and the render is mostly floaters; VGGT reconstructs the bicycle and bench
Bicycle, 16 training frames, one test view. COLMAP registers only 3 training frames; the render is dominated by floaters and empty space. VGGT uses all 16. PSNR values are for this view.
Test PSNR, SSIM and LPIPS versus number of training frames for six scenes and three methods
Test quality vs. training frames, on the test frames that every usable method registered (counts under each axis). Missing COLMAP points are failed runs. Room at 32 frames is excluded because COLMAP's two reconstructions (training-only and joint) disagree by 13% of the trajectory scale.

Finding 2: with all frames, VGGT is less precise

With every frame available, COLMAP leads by 2.1–4.6 dB on five scenes and by 0.7 dB on desk. To check whether this comes from VGGT covering less of the scene, I split each test image into pixels seen by at least one training view and pixels seen by none. On the seen pixels alone VGGT is still behind: garden 21.7 vs. 26.3 dB, bicycle 20.7 vs. 22.8, counter 24.9 vs. 27.2. The renders are smeared rather than incomplete. On lawn, garden and bicycle, VGGT's PSNR rises from 32 frames to all frames while LPIPS gets worse, the signature of blur. Likely, feed-forward poses are not mutually consistent enough for 3DGS to resolve fine detail, while bundle-adjusted COLMAP poses are.

Garden with all frames: both methods see almost the whole test view, but VGGT's render has higher error everywhere in the background
Garden, all frames. Both coverage maps are almost entirely green, yet VGGT's error is higher across the background.
Zoomed crops of the garden background: ground truth, COLMAP render and VGGT render
Crop of the same view. The brick wall, windows and slide are seen by many training views, but VGGT's render cannot resolve them.

VGGT's advantage at this end is speed: it estimates poses for all frames in 47–73 s, while COLMAP takes 167–790 s on the same GPU.

Pose estimation, all framesdesklawnroomgardenbicyclecounter
Frames110156114161166180
COLMAP (s)167790505770380480
VGGT (s)476049686873

Finding 3: with few frames, the bottleneck is coverage

With 8 frames, large parts of each test view were never seen by any training view. Those pixels are 0.5–9 dB worse than the seen ones, and the fraction of unseen pixels in a test frame is strongly anti-correlated with that frame's PSNR. Most of the error is in unseen regions rather than seen ones, so coverage, not pose accuracy, is the main limit here.

Desk with 8 versus 32 training frames: with 8 frames the regions around the box that no training view saw are blurred
Desk, one test view, VGGT with 8 vs. 32 training frames. With 8 frames the floor and background that no training view saw (red in the coverage map) are where the error is.

Finding 4: a depth prior changes the geometry, not the novel views

The depth loss does what it is designed to do: on training views, the local correlation between rendered depth and VGGT depth rises from 0.4–0.8 to 0.7–0.9. But novel-view PSNR barely moves. After repeating the relevant configurations with three seeds, only two differences exceed noise: desk at 32 frames gets 0.68 dB worse and lawn at 8 frames gets 0.17 dB better. Finding 3 explains why. The prior constrains surfaces the training views already see, while the error is concentrated in regions they do not.

Desk with 32 frames, with and without the depth prior: the difference is in the reflective floor at the lower left
Desk, 32 frames, with and without the depth prior. Over all test frames, the two match on seen pixels (31.2 vs. 31.3 dB) and differ on unseen ones (20.3 vs. 23.0 dB). In this view the difference sits on the reflective floor at the lower left. This view shows where the loss occurs, not its size.

More scenes

All frames, COLMAP on the left and VGGT on the right. For the 360° scenes (garden above, bicycle, counter) both models are rendered along one elliptical orbit around the scene center: the orbit is built from COLMAP's training cameras and mapped into the VGGT model by a Sim(3) fitted on the shared training cameras (median center error under 1% of the trajectory scale), so both sides always show the same novel view. The self-captured scenes were not filmed all the way around, so they are shown along the training camera path instead. Desk shows both methods; lawn and room show VGGT only, because COLMAP registered fewer frames there (149/156 and 75/114) and its camera path differs.

Bicycle: 23.4 vs. 21.3 dB test PSNR.
Counter: 27.3 vs. 25.0 dB.
Desk (self-captured): 32.5 vs. 31.8 dB.
Lawn (self-captured), VGGT: 19.4 dB (COLMAP 21.4 dB).
Room (self-captured), VGGT: 21.2 dB (COLMAP 23.4 dB).

All results

Test PSNR (dB) after test-time pose refinement, averaged over the test frames every usable method registered. Brackets give COLMAP's registered / total test frames when it did not register all of them; the other methods are averaged over the same subset. fail = pose estimation or alignment failed, or COLMAP's two reconstructions disagree. Best per column in bold.

SceneMethodN = 8N = 16N = 32All
deskCOLMAPfail25.75 (7/16)23.4732.46
VGGT24.3630.2032.3431.79
VGGT + depth24.3630.2031.7930.97
lawnCOLMAP13.75 (15/23)fail18.67 (22/23)21.44 (22/23)
VGGT15.6617.4718.5119.35
VGGT + depth15.6117.4118.6419.39
roomCOLMAPfailfailfail23.40 (14/17)
VGGT13.7716.6218.2421.20
VGGT + depth13.7716.5218.5421.64
gardenCOLMAP14.2719.5723.1926.34
VGGT15.6418.1319.9321.79
VGGT + depth15.7018.1719.9922.39
bicycleCOLMAPfail12.03 (9/24)14.2523.40
VGGT14.4216.4518.2621.30
VGGT + depth14.4616.0818.2820.93
counterCOLMAPfailfail21.0427.25
VGGT14.1219.0221.5825.04
VGGT + depth14.4018.7222.4424.71

Takeaway

For a casual capture of 16 frames or fewer, VGGT is the safer front end for 3D Gaussian Splatting: it always produces usable poses, and COLMAP often does not. Once a capture has a hundred frames or more, COLMAP's bundle adjustment gives noticeably sharper results on most scenes, at 3.6–13× the pose-estimation time. A VGGT depth prior is not a substitute for more views: with few frames, what is missing is coverage, and only more views or priors on unseen regions can supply it.

Limitations

One capture per scene and, for the main grid, one seed; seed repeats cover a subset of configurations. COLMAP is not deterministic with few frames: reproducing garden at 8 frames in a fresh environment, COLMAP registered 5/8 training frames instead of 6/8 and reached 13.35 dB instead of 14.27 (VGGT: 15.67 vs. 15.64 dB), although five further COLMAP runs on the same frames all registered 6/8. Training stops at 7k steps for every run (on desk at 16 frames, the 30k checkpoint was slightly worse on test views, with the same ranking). Whether a test pixel is “seen” by a training view is judged from the geometry each model reconstructs; that geometry may itself be inaccurate, so the split is only an approximation. Test cameras come from a separate joint run and are refined with the scene frozen, the standard protocol for pose-free methods but not the same as evaluating with ground-truth test poses.

Reproducibility

Code, the evaluation protocol, and the scripts that produce every table and figure on this page are in the repository, with pinned versions of gsplat, VGGT and COLMAP and the commands to rerun the full grid. The trained all-frames models of every scene (.splat and compressed .ply) and the self-captured frames are attached to the release page. The 3DGS trainer is a modified copy of gsplat's example trainer; every change is listed in trainer/NOTICE.md.

Citation

@misc{chu2026vggtsplat,
  title        = {VGGT-Splat: Feed-forward VGGT Poses vs. COLMAP for
                  3D Gaussian Splatting, from 8 Frames to All},
  author       = {Chu, Jiaming},
  year         = {2026},
  howpublished = {\url{https://github.com/chu-jiaming/VGGT-Splat}},
  note         = {Version 1.0.0}
}