VGGT
约 3757 字大约 13 分钟
2025-09-17
一、背景 & 问题
过去在 3D 视觉(多视图 / 多张图片重建)任务中,典型流程往往要用到 geometry-based 优化步骤,比如 Structure from Motion (SfM)、Bundle Adjustment (BA)、三角测量 (triangulation)、视差估计 + 深度融合等。这些方法虽然精确,但通常运算慢、难以端到端训练、不同任务(相机姿态估计、深度图、点云重建、特征追踪等)往往是分开处理的。
VGGT 的目标是:在一个前向传播(feed-forward)网络中,直接从若干视图(可能是一张、几张、甚至上百张)预测所有主要的 3D 属性,包括:
- 相机参数(extrinsics + intrinsics)
- 深度图(depth map)
- 点图 / 点云(point map)
- 3D 点跟踪(point tracks,即在不同视图中某些点的对应 /可视性)
重要的是,不需要在推理(inference)阶段再使用后处理的几何优化过程(比如 BA 或 SfM)来修正/精细化(尽管可以加但不是必须)。
二、主要架构
以下是 VGGT 的网络结构与训练流程的关键组成部分:
| 组成部分 | 内容 / 作用 |
|---|---|
| 输入处理 | 输入为一组图像(可能1张、几张或很多张)。图像先被“patchify”成 tokens。具体使用的是 DINOv2 来做 patch tokenization(将图像切成 patch 并提取视觉特征 token)。同时加入位置编码 etc。 |
| Transformer 主干 | 多层 attention block。每个 block 包含一个 frame-wise self-attention(只在单张图内做 self-attention)和一个 global self-attention(跨图像/frame 做 attention,融合各视图之间的信息)。这样交替使用 frame-wise 和 global attention。 |
| Heads(输出头) | 有多个 head 对应不同任务:• Camera head:输出相机的外参(extrinsic)与内参(intrinsic)。 • Depth head:输出每张图的 depth map + 与之相关的不确定性(uncertainty)• Point map head(point-map):直接输出点图(每个图像像素对应的三维点位置)及其不确定性。• Tracking head:给定一些 query 点(在某一个或多个视图中),预测这些点在其他视图中的对应 /可视性。 |
| 损失函数 & 多任务训练 | 整体是多任务损失:相机损失 (camera), 深度损失 (depth), 点图损失 (point-map), 跟踪损失 (tracking)。tracking 损失通常被 down-weight。深度 / 点图损失里还包含 gradient-based 项,以鼓励边缘/深度变化处也能预测好。 |
| 归一化 / 坐标规范化 | 为了消除整体场景尺度/参考系的歧义,VGGT 在训练数据中对场景做某种标准化:通常把第一个相机设为 world 的 reference frame,并标准化所有点到一个尺度(比如场景点到原点的平均距离作为尺度因子)。这个标准化用于监督数据,但模型预测时并不强制这样的操作,而是让模型“学习”正确的尺度/参考系。 |
三、性能 /优点
- 速度快:VGGT 在推理阶段非常迅速。相比传统的 SfM + BA 等几秒甚至几十秒的流程,VGGT 可以在“几张到几十张图”下在不到一秒的时间内给出结果。(arXiv)
- 端到端:训练是端到端的,不需要后处理或几何优化。这样简化了 pipeline,也减少了各种工程上的不确定性。(arXiv)
- 多任务 & 多视图兼容性强:能兼顾相机姿态估计、深度估计、点云重建、跨视图点追踪等多个任务;也能处理一张图/多张图/多达上百张视图输入。对于不同视图数具备较好的泛化。(arXiv)
- 结果表现强:在多个公开数据集上,VGGT 在这些任务上达到了 state-of-the-art 或接近最优。包括未知测试集/未见场景下的泛化表现。(arXiv)
四、限制 &挑战
虽然 VGGT 创新性很强,但也有一些限制或需要注意的地方:
- 内存/资源需求:处理很多视图(特别是上百张图)时 transformer 的 global self-attention 暴涨 token 数量,GPU 内存需求非常高。 (CVF开放获取)
- 极端情况表现会下降:如极端的视角旋转、畸变镜头(fisheye、全景投影等)、强非刚性变形(场景中的结构在不同视图之间变化很大)时效果较弱。(CVF开放获取)
- 训练成本:训练数据集很大(合成+真实+室内+室外等多个来源),训练时间也长,用了很多 GPU。(CVF开放获取)
- 尺度/参考系歧义:虽然训练中做了规范化,但实际推理时如果没有类似监督/参照,模型可能会对场景的整体尺度或参考帧存在一定的不确定性。
- 单视图重建精度 虽然有一定能力,但毕竟多视图输入下效果好很多。单视图输入的情况下可能在细节/深度精确度方面逊色。
五、总体贡献 &意义
VGGT 的意义可以从以下几个方面看:
- 提出一个比较“纯神经网络”的 3D 重建/几何理解方案(即减少或者去除传统几何优化),表明在很多情况下只用神经网络 + Transformer + 大量训练数据,就能赶上甚至优于带后处理/优化的传统方案。
- 多任务融合:把深度、点云、相机姿态、追踪这些通常分开的任务融合在一个统一模型中,使得这些任务之间可以互相“监督”/共享特征,从而改善总体效果。
- 提高实用性/效率:更快的重建、更简单的 pipeline,潜在地更适合部署到实际应用中(如 AR/VR/机器人视觉/3D 内容生成等)。
训练
1. 数据准备
VGGT 训练时使用了 大规模的多视图数据(包括合成与真实场景),每个样本通常包含多张图像 + 对应的相机参数与几何真值。 常见数据源包括:
- 合成场景:例如 Objaverse、Replica、Synthetic Scenes,用于提供多样且精确的 3D 真值。
- 真实数据集:ScanNet, CO3D, RealEstate10K, MVS 数据集等,提供真实图像和相机参数。
- 室内 + 室外混合:保证模型对广泛场景泛化。
关键:训练时输入的图像数量是可变的(有时一张,有时几张,最多上百张),这样模型学会处理不同的视角条件。
2. 输入预处理
- 每张图像会被切分成 patch → 送入 DINOv2 提取 token 表示。
- 图像 token + camera token 一起进入 transformer。
- 相机 pose 在训练时有真值,模型要预测并和真值比对。
3. 输出监督信号
VGGT 是 多任务训练,每个 head 对应一个监督:
| Head | 输出 | 监督方式 |
|---|---|---|
| Camera head | 外参 + 内参 | 与真值相机参数对齐(通过旋转、平移、焦距等 L2 损失) |
| Depth head | 深度图 | 与真值深度图比较(L1/L2 + gradient loss) |
| Point-map head | 每像素对应的 3D 点 | 与真值 3D 点对比(L1/L2),并约束点的几何一致性 |
| Tracking head | 跨视图点对应 | 给定某些 query 点,预测它们在其他视图的位置,和真值匹配(L2/交叉熵) |
此外,深度和点图还会加 不确定性 (uncertainty) 预测,用来做加权损失。
4. 损失函数设计
VGGT 的总损失是加权和:
L=λcam⋅Lcamera+λdepth⋅Ldepth+λpoint⋅Lpointmap+λtrack⋅Ltracking
- 相机损失:SE(3) 上的旋转(log map + geodesic loss)、平移(L2 loss)、内参(焦距/主点)回归。
- 深度损失:L1 / L2 + 边缘保持项(gradient loss)。
- 点图损失:直接监督 3D 点坐标。
- 跟踪损失:常用 soft-argmax / heatmap matching;tracking loss 权重较低。
5. 归一化 & 对齐
由于 3D 重建存在 尺度/参考系歧义,VGGT 在训练数据中做了归一化:
- 把第一个相机作为世界参考系。
- 场景点缩放,使得平均距离在一个固定范围内(避免数值过大过小)。
- 训练时监督在这个标准化坐标系下。
这样模型学到的输出更稳定。
6. 优化 & 训练细节
- 优化器:AdamW
- 学习率调度:cosine decay / warmup
- Batching:每个 batch 含多场景,每个场景含 N 张图像 (N 随机采样)。
- 训练策略:多任务 joint training,同时优化所有 head。
- 数据增强:随机裁剪、光照扰动、颜色抖动,以增强泛化。
- 资源消耗:训练需要上百 GPU 周,主要瓶颈是 transformer 的全局 self-attention。
✅ 总结一下: VGGT 的训练是一个 多任务端到端监督学习过程,核心是让 transformer 学会从 多视图图像 token → **几何属性(相机、深度、点云、跟踪)**的映射。没有显式 BA / SfM 优化环节,而是依赖大规模数据和多任务约束让网络隐式学到几何一致性。
要不要我帮你画一个 VGGT 训练流程图(输入 → transformer → 多 head 输出 → 多任务 loss),这样会更直观?
VGGT-SLAM
Dense RGB SLAM Optimized on the SL(4) Manifold(arXiv,2025 年)
VGGT-SLAM 是什么
VGGT-SLAM 是一个基于 VGGT 的密集 RGB SLAM 系统,其目的是利用 VGGT 的 feed-forward 场景重建能力,构建大范围(长序列/多帧)地图,同时估计摄像机轨迹 (pose) 和场景的密集结构。因为 VGGT 本身单次处理帧数受 GPU/内存限制,所以 VGGT-SLAM 通过分割子图(submap)+全局对齐+循环闭环优化来扩展到更长的序列。最关键的是,它在子图对齐上不只用 similarity transform,而是用更一般的 projective transformation(即 SL(4) 群上的变换)来处理“重建歧义”(reconstruction ambiguity)。 (arXiv)
构建流程/体系结构
下面是 VGGT-SLAM 的整体 pipeline 分步解析:
| 阶段 | 内容 |
|---|---|
| 1. 子图生成(Submap Keyframe Selection + Local Reconstruction) | - 从视频/图像序列中选取关键帧 (keyframes) 用来生成子图 submap。 - 对每个子图,用 VGGT 对这组关键帧做 feed-forward 重建,得到 depth map / point map /相机 poses + intrinsics 等。 - 每个子图对应一个节点(node)在后端图优化中。 - 为了过滤不可靠的点,用 confidence map(VGGT 输出的置信度)裁去置信度低的点。 (arXiv) |
| 2. 子图间对齐(Local Submap Alignment) | - VGGT 重建出的每个 submap 本身是对该子图内部视图的重建,有自己的坐标系。不同子图之间会重叠,但每个子图可能存在尺度、平移、旋转之外的 projective ambiguity(例如比例拉伸、透视扭曲、剪切等)。 - 所以两个重叠的 submap 不能只用 similarity transform (scale + rotation + translation) 对齐,而需要用更一般的 homography / projective transform。这里具体用到 SL(4) 群(special linear group of 4×4 matrices,行列式=1 的矩阵,涵盖 projective 的变换自由度)。通过估计两子图之间的 15 DOF 的 homography(projective transform)来对齐。 (arXiv) |
| 3. 循环闭环 (Loop Closure) | - 当轨迹中出现回环(即当前 submap 与之前某个 submap有重叠)时,应加入额外约束。这样可以纠正累积误差。 - 这些闭环约束通常也是基于重叠区域,估计 homography,并加入图优化中。 (arXiv) |
| 4. 后端优化:因子图 + SL(4) 群 优化 | - 将所有子图节点 + 对齐(相邻子图之间和闭环子图之间的变换)作为节点与边,构建一个因子图(factor graph)。 - 边上的变换因子是这些子图之间估计的 homography / projective transform。 - 优化目标是在 SL(4) 群上全局一致地优化这些变换,以减小对齐误差。这样能够同时处理多个子图,并使全局重建图更加一致。 - 优化过程为非线性优化 (nonlinear factor graph optimization)。 (arXiv) |
为什么用 SL(4) 而不仅 similarity transform
- VGGT 用的是未校准 (uncalibrated) 单目 RGB,相机内参可能未知,各帧之间视差可能很小 → 这会引入 projective ambiguity:即从图像重建出的场景可能与真实场景在一个 projective变换下等价,而不仅是 scale + translation + rotation。 (arXiv)
- 如果只用 similarity 对齐,有些形变(比如拉伸、扭曲、透视变形)无法被纠正,这会导致地图整体几何偏差在长序列中累积。
- 用 homography / projective transform (即 SL(4) 群) 则可以处理这类变换,使得不同子图间即使存在这类 projective 误差,也能对齐,提升最终地图密度与几何准确性。 (arXiv)
一些具体设计细节
这里是一些 VGGT-SLAM 在构建中比较关键/有特色的设计点:
- **子图大小(submap 大小,帧数)**的选择:要兼顾 VGGT 的推理开销与重叠情况(帧间重叠要足够,以便估计变换)。如果子图太大,VGGT 可能不能处理(GPU 内存问题);太小,又可能重叠不足导致对齐不稳定。 (arXiv)
- 重叠度:相邻子图必须有重叠帧,以便估计它们之间的相对变换。闭环的时候,也要检测重叠来添加闭环约束。 (arXiv)
- 置信度过滤:VGGT 输出有 confidence map,对于点云/深度点中置信度低的部分进行裁剪或加权,以减少对齐误差的来源。 (arXiv)
- 图优化初始化:子图间预估变换(homography)给图优化提供初始边(initial guess)。然后在因子图 / SL(4) 上做非线性最小化以获得全局一致性。
- 闭环检测 /约束添加:类似传统 SLAM,需要检测哪些子图是重叠的,以添加闭环。估计闭环间 transform,并把它加入优化。这样能纠正累积误差。 (arXiv)
优点与限制
优点
- 可以处理 长序列、大场景,超过 VGGT 单次 feed-forward 的帧数/内存的限制。 VGGT 本身不能处理太多帧 (如上百张) 因为内存,VGGT-SLAM 的子图 + 对齐机制解决这个问题。 (arXiv)
- 引入 projective 对齐可以处理因未校准 monocular 数据带来的几何歧义,比只有 similarity 对齐更鲁棒。
- 在闭环约束 + 全局优化之后的地图质量显著提高。 (arXiv)
限制
- 即使用子图 + 优化,也有额外开销(时间 +计算)。优化 SL(4) 群上的非线性问题加上闭环检测可能耗时。
- 如果子图重叠少或者 motion 变化太大,homography 估计可能不稳定。
- 未校准 monocular 本身在真实场景中有些情况下深度 /尺度误差会比较大;即使 projective 对齐,也不能完全恢复 metric scale 除非有额外信息。
- VGGT 的 feed-forward 重建部分仍然可能在极端视角、光照、遮挡等情况下误差较大,这会传递到 SLAM 系统中。
