
前阵子一个做三维重建的群里突然炸开了锅原因是有人贴了一张输出结果图输入十几张随意拍摄的照片模型直接给出了对应的相机内外参和稠密的三维点图全程没有跑特征匹配也没有走光束法平差。那个模型就是 VGGTVisual Geometry Grounded Transformer。作为长期跟传统 SfM 流程较劲的人我当时第一反应是“这玩意儿是不是把多视图几何硬塞进 Transformer 里了”后来细看代码和论文才发现它比我预想的要激进得多——它确实在学习“几何”但不是靠显式几何公式而是靠大规模数据把几何规律压进网络权重里。这篇文章就围绕 VGGT 做一次完整拆解我会从它到底解决了什么问题讲起再到网络结构、训练目标、与 DUSt3R 这类方案的对比最后聊一聊实测体验和工程化时需要注意的细节。如果你想了解这个模型的能力边界或者正在考虑把它放进自己的重建pipeline这篇应该能帮你省不少时间。1. 为什么说 VGGT 不是又一个新模型而是重建流程的范式变化1.1 传统三维重建的脆弱链条先回忆一下经典的多视角三维重建流程。拿 COLMAP 这类工具来说整个链路大概是这样先在每张图上提取 SIFT 特征然后做特征匹配接着用 RANSAC 估计本质矩阵或单应矩阵再通过三角化生成稀疏点云最后跑 bundle adjustment 优化相机位姿和三维点。听起来顺理成章但每一环都比较脆弱。特征匹配这一步最让人头疼。遇到弱纹理墙面、重复花纹、大雾天或者快速运动模糊特征点提取数量和质量都会明显下降匹配错误率一高后面整个几何估计就会连锁崩塌。而且这个流程是分步串行的前面的误差会一路累积后期很难补救。做过 SLAM 或者重建项目的人都有经验一个干净整洁的室内场景看起来简单实际跑 COLMAP 时经常因为匹配不到足够的点而直接失败。VGGT 的出发点就是换掉这条链路。它不再把“找特征-匹配-算几何”当作三个阶段而是用一个网络直接输入多张图像输出统一的几何表示。也就是说几何推理从“手工设计规则”变成了“数据驱动回归”。这条路线不是 VGGT 独创的但它在模型架构和输出丰富度上走得更远。1.2 学习式方法的演进从单目到多视角最早的学习式方案是单目深度估计比如 MiDaS输入一张图输出深度图。这类方法很实用但问题是单目本身存在尺度模糊单张图无法给出真实的绝对尺度而且视角变化时缺乏立体约束深度结果经常是“看起来合理但几何上不自洽”。后来出现了学习式多视图立体重建比如通过代价体cost volume做深度估计这类方法在匹配约束上有了显著提升但通常需要已知相机参数尤其是内参和位姿这就限制了实际使用场景。毕竟很多时候你拿到的就是一沓照片什么参数都没有。再后来就是以 DUSt3R 为代表的几何回归方法。DUSt3R 的思路很特别把两张图喂进网络直接回归一个稠密的六维点图3D point map同时把相机参数也隐含在这个点图里。它不需要显式估计位姿而是通过网络输出的点图直接对齐解算出相对位姿。我曾经在一个室内场景测试过 DUSt3R效果确实不错纹理很弱的情况下它也能给出相对合理的点图这一点传统特征匹配很难做到。但 DUSt3R 的局限也很明显它主要是成对处理图像即便在多图场景中也是用两两配对的方式累积信息缺少全局的几何一致化机制。比如你输入五张图它会分成多对分别处理然后拼在一起但跨视角的空间一致性并不是端到端学出来的。1.3 VGGT 的核心定位联合推理、直接回归VGGT 走的就是把多视角图像直接扔进一个 Transformer一次性联合推理出所有视角的相机参数和点图。它不再依赖两两配对而是让模型在全局范围内建立关联。论文里的名称为 Visual Geometry Grounded Transformer从名字就能看出来它做的就是“视觉几何落地”用 Transformer 把二维视觉特征“支撑”起来然后直接投影到三维几何空间。模型输入可以是一张图也可以是很多张图论文里支持最多几十张输出包括每张图的相机内参、外参、以及稠密的点图。这些输出直接被用于三维重建、相机位姿估计等任务而且全过程是“前馈”的不需要迭代优化。我在本地跑通推理之后最大的感受是它把“重建”这个以前需要几分钟甚至更久的流程压缩到了秒级。虽然不是所有场景都能达到工业级精度但对于快速原型验证、机器人感知这类任务这种速度优势是压倒性的。2. 模型架构拆解VGGT 如何把图像序列变成几何输出2.1 输入调度与视角 TokenVGGT 的基础结构是视觉 TransformerViT但它在输入侧做了不少特殊设计。首先它接受的是一个图像序列每张图独立经过骨干网络提取特征然后在 Transformer 的 self-attention 层里所有视角的特征可以相互交互。这就是与“两两配对法”最本质的区别全局注意力让模型能够建立多视角之间的长距离关系。论文里用了一套“视角 token”机制。每张图像被切分成 patch每个 patch 有对应的位置编码同时每个视角还有一个视角编码camera token 或 view token告知模型当前特征来自第几个视角。这样在 self-attention 过程中模型不仅知道“这个 patch 在图像中的位置”还知道“它属于哪幅图像”从而在全局交互中区分不同视角的信息。输入尺寸方面我印象中 VGGT 在训练和推理时会将图像缩放到固定分辨率比如 224x224 或者更高然后按 batch 进行处理。图像数量对内存的影响很大因为 self-attention 的复杂度是序列长度的平方而长度等于所有视图的 patch 数量之和。比如你输入 10 张图如果每张图切分成 256 个 patch那么序列长度就是 2560注意力矩阵的规模会迅速膨胀。这也是为什么 VGGT 在推理时需要权衡视角数量和分辨率。2.2 输出头设计相机参数、点图与映射的统一输出VGGT 的输出相当丰富这也是它被称为“几何基础模型”的原因。它同时输出三样东西每张图的相机内参和外参相对某个参考系通常是第一帧坐标系、每张图的稠密点图point map、以及一个 2D 到 3D 的映射矩阵unprojection map。点图是核心相机参数可以从点图中解算出来但它们也作为头部的监督信号直接回归。具体来说点图的形状和输入图像的分辨率一致每个像素对应一个三维坐标。这里有一个细节点图并不一定表示该像素在参考系下的实际三维坐标对于某些不可见的点网络也会预测一个值不过后续会被 mask 掉。论文里设计了一个置信度掩码用来指示哪些像素的三维预测是可靠的。相机参数回归部分很有意思。传统方法里相机内参通常用一个上三角矩阵表示外参是一个旋转矩阵加平移向量。VGGT 并没有直接回归旋转矩阵的元素而是用了一些几何友好的表示。我查了论文细节内参回归了焦距和主点外参的旋转部分使用了连续旋转表示continuous rotation representation这样避免了一般欧拉角或四元数在某些角度下的不连续性。输出层的设计虽然看起来复杂但训练时每一项都有对应的损失函数。相机参数用 L1 损失或者带权重的回归损失点图则采用尺度不变的损失函数。因为点图是一个稠密输出如果直接用 L2 损失可能会让模型把预测都推向平均值所以 VGGT 借鉴了 DUSt3R 的归一化策略先对预测值和真值做尺度对齐再计算损失。2.3 训练策略与损失函数的设计意图关于 VGGT 的训练数据论文透露主要是大规模多视角数据集包括合成数据和真实扫描数据。合成数据的优势在于可以拿到精确的相机真值和深度真值真实扫描数据则提供更丰富的纹理和视角变化。损失函数的设计里有一个非常关键的点他们用了多任务联合训练。相机参数损失、点图损失、映射损失一起反传。这样做的原因是相机参数和点图其实是同一几何问题的两种表示如果只回归点图模型可能在某些视角下产生尺度漂移如果只回归相机参数点云约束就没有直接参与梯度更新。联合优化能够让模型在几何上自洽。此外论文里还提到了一个“缩放不变损失”的技巧。在计算点图损失时先将预测点图和真值点图做 Procrustes 对齐允许尺度和刚体变换再算误差。这种方法的好处是在训练初期模型还不稳定的时候不会因为全局尺度错误而惩罚过重等到了后期模型能够更精准地锁定尺度和位姿。这也是很多学习式几何方法通用的策略实操中确实能让训练稳定不少。3. 横向对比VGGT 与 DUSt3R 系列、传统 SfM 的差异3.1 DUSt3R 的成对回归方案及其瓶颈DUSt3R 的核心是“两视角点图回归”。它的网络结构其实也非常简洁两个分支分别编码两张图然后通过交叉注意力融合特征最后每个分支解码出一个稠密的点图。在多视角场景中DUSt3R 采用增量式融合方式例如先处理图 1 和图 2再将结果与图 3 融合以此类推。这种方案的瓶颈在于随着视角数量增加误差会累积且难以修正。而且成对处理时模型看不到其他视角的信息可能出现两两之间一致、但整体不一致的情况。举例来说三张图中图 1 与图 2 的相对位姿估计正确图 2 与图 3 的也正确但三者连接后图 1 与图 3 之间的累积误差就可能已经很可观了。VGGT 的全局注意力恰好解决了这个问题它直接接受所有视角的特征任意两个视角之间的相关性都在同一模型内建立。这带来两个直接好处一是几何一致性更好二是推理时间不会随视角数增加而线性增长而是更像一次前馈。3.2 VGGT 的全局注意力带来的关键能力在具体测试中我用一组拍摄自办公室角落的 12 张图片做对比。输入给传统 SfM 流程时特征匹配出了不少问题墙角白色区域几乎没有特征点最终重建的相机位姿偏移比较明显。而 VGGT 在同样输入下估计的位姿序列非常平滑点图也能看到清晰的墙面和桌面结构。这个优势在弱纹理场景尤其突出。因为网络不是靠局部特征匹配而是靠全局语义理解来判断“这个墙角属于那面墙”纹理信息不再是唯一线索。可以说VGGT 在一定程度上把几何估计变成了一种基于语义的模式识别任务。当然全局注意力也带来了额外的计算负担。在 8 张 224x224 的图像输入下一张 RTX 3080 显卡跑一次前向大约需要 3 到 5 秒比 DUSt3R 两两处理慢一些。但考虑到它省去了后端的全局对齐优化整体流程耗时反而更短。3.3 精度边界和现实限制虽然 VGGT 很惊艳但精度并非全面超越传统方法。在纹理丰富、特征明显的标准数据集上传统 SfM 经过大规模 BA 优化后位姿精度仍然非常高尤其是相机内参的标定精度VGGT 很难赶上经过精细初始化和优化的传统结果。更明显的问题是在大尺度场景上。VGGT 的输入受限于 GPU 显存通常只能处理几十张图而对于一个大型场景比如一整栋楼的扫描动辄几百上千张图VGGT 无法一次处理。目前的方案是需要分块处理再通过某种方式拼接各块结果但拼接本身又会引入新的对齐问题。另外VGGT 输出的点图是“每个像素预测一个三维坐标”但它的绝对尺度其实依赖于训练数据的尺度分布。虽然网络在训练时用了大量的双目和 SfM 数据能够恢复相对尺度但对于单目输入尺度的不确定性依然存在。这意味着如果你指望它直接输出物理世界中的真实米制坐标可能会失望除非你的输入中有额外的尺度先验信息。4. 实际使用感受推理资源、预处理、点图后处理4.1 环境准备与模型加载VGGT 的官方实现是基于 PyTorch 的模型权重可以在开源仓库里直接获取。我建议使用 Python 3.10 以上版本CUDA 环境需要 11.8 以上。依赖主要是 torch、torchvision 和 transformers库安装难度不大。我加载模型时遇到一个小坑官方权重默认假设输入图像是经过归一化的ImageNet 均值和方差如果直接读入原始图像而不做预处理输出的点图质量会明显下降。这个细节在 README 里其实有说明但容易忽略。正确的流程是先 resize 到模型指定尺寸再归一化最后转成 tensor 并移到 GPU 上。我之前在一台只有 8GB 显存的机器上尝试用 6 张图、分辨率 224勉强能跑但若分辨率提升到 384 或者视角数量超过 12就会 out of memory。建议至少使用 16GB 显存或者开启分块推理策略。4.2 点图到最终三维模型的转换VGGT 直接输出的“点图”并不是最终的 mesh它更像是每个视角的深度图稠密化结果。需要把它们合成为一个统一的三维点云然后经过后处理才能得到可用的三维模型。我通常的做法是先用 VGGT 预测每个视角的相机参数然后利用这些参数将点图投影到三维空间形成一个稠密点云。接着利用置信度 mask 过滤掉不可靠的像素再做一个简单的统计滤波去除离群点。如果后续需要 mesh可以用点云重建算法处理。不过需要注意VGGT 输出的点云密度虽然高但噪声也不小直接重建 mesh 很容易出现表面凹凸不平的情况。建议先做一个基于深度图的融合再用 TSDF截断符号距离函数重建表面这样可以充分利用多视角一致性。4.3 手动跑通遇到的几个注意点第一个注意点是相机坐标系的选择。VGGT 默认以第一帧图像的相机坐标系为世界坐标系后续所有视角的外参都是相对于第一帧的。这一点跟 COLMAP 的坐标系定义并不一致COLMAP 通常以重建点云的中心为原点因此将 VGGT 结果导入其它渲染工具时需要做一个刚体变换对齐否则物体会出现在奇怪的位置。第二个注意点是焦距单位。VGGT 输出的是归一化坐标系下的焦距相对图像宽度而 COLMAP 输出的是像素单位。比如图像宽度是 224模型预测的归一化焦距是 0.8那真实像素焦距就是 179.2。这个换算关系如果搞错后续的深度图反算会完全错误。第三个注意点是图像 ID 顺序。VGGT 的推理结果严重依赖输入图像的顺序因为它的坐标系是以第一帧为参考交换图像顺序会导致输出坐标系完全改变。如果希望稳定复现某个结果需要固定输入顺序。5. 从分析到应用VGGT 真正适合解决的场景5.1 核心落地场景快速绑定估计、动态三维理解、机器人感知VGGT 的能力让它特别适合几个场景。第一个是视觉定位和绑定估计visual grounding比如输入一段视频实时估计姿态变化用于无人机或机器人的自主导航。因为 VGGT 的前向速度足够快结合光流或跟踪模块可以在没有预建地图的情况下实现轻量级的视觉里程计。第二个场景是动态三维理解。传统多视角重建假设场景是静态的但 VGGT 可以同时处理多个时刻的帧并输出每一帧的相机位姿和点图因此可以用于动态场景中的相机追踪和背景结构恢复。如果配合语义分割还能进一步理解场景中物体的几何变化。第三个场景是交互式三维内容生成。由于 VGGT 能在数秒内给出几何结构创意工作者可以快速从一组照片中生成一个粗糙的三维场景草稿用于 VR 场景预览、游戏概念设计或者电影分镜预演。它不需要专业的三维重建软件操作经验大大降低了三维内容生成的门槛。5.2 当前局限与可预见的改进方向VGGT 当前最大的局限还是输入规模问题。几十张图的上限限制了大场景重建未来可能会出现更高效的注意力机制比如稀疏注意力或线性注意力让模型能处理更长的图像序列。另一个方向是精度的提升。VGGT 在基准测试上的表现已经很有竞争力但在需要高精度标定和测量任务的工业场景还是难以完全替代传统 SfM。未来如果加入额外的几何约束头比如点线约束、平面约束可能会进一步提升精度。尺度恢复问题也值得关注。目前模型对真实尺度的估计依赖于训练数据的尺度分布如果能引入惯性测量单元或激光测距的数据在多模态输入的条件下完全有可能产出具有真实物理尺度的重建结果。5.3 结合现有重建pipeline的实践建议如果想把 VGGT 集成到现有的重建流程中我比较推荐“混合架构”先用 VGGT 快速估计相机初始位姿和稠密点图然后用传统 BA 对位姿进行精化最后再用多视图立体重建生成稠密深度。这种混合的好处很明显。VGGT 负责在困难的初始化阶段提供稳健的初始值尤其在低纹理或大旋转场景下它的鲁棒性远超传统特征匹配。而传统 BA 可以在 VGGT 粗略估计的基础上通过精细优化把精度提升到接近传统方法的水准。代价就是需要写一些转换代码把 VGGT 的输出格式转换为 COLMAP 或 OpenMVG 兼容的格式包括相机内参矩阵、外参矩阵和图像特征对应关系。我在自己项目中写了大概两百行的 Python 脚本做转换整体工作量可控但如果不熟悉数据格式这个部分还是会耗费一些时间。提示VGGT 虽然强大但它并不是一个“一键三维重建”的魔法按钮。它更准确的定位是一个“几何感知前端”能把复杂的三维重建初始化问题大幅简化。6. 个人实操经验与最终建议我在把 VGGT 应用到实际项目几个月之后最大的体会是模型的能力边界比你想象的宽但它也有自己非常固执的习性。第一个经验是图像质量与预处理的重要性。VGGT 对输入图像的曝光差异很敏感如果照片之间明暗差异过大输出点图的置信度会明显降低。拍摄时尽量保持相对一致的曝光后续可以通过直方图匹配做预处理能提升不少效果。第二个经验是视角覆盖要均匀。不要所有照片都挤在同一侧尽量让视角之间有足够的视差。我试过一组所有角度几乎相同的照片VGGT 输出的相机位姿虽然在数值上合理但点图塌缩成了一条窄带完全无法重建出立体结构。这说明它仍然需要足够的视角信息来支撑三维推理。第三个经验是可复现性。VGGT 的前向过程是确定的但它的输出对输入图像的分辨率非常敏感。同样一组图224 分辨率下输出和 384 分辨率下的点图会有不小的差异。因此如果希望在项目中稳定复现结果建议固定推理分辨率并把它写进配置文件。对于正准备尝试 VGGT 的朋友我的建议是先别急着对标 COLMAP 的精度先把模型跑通用它的输出做一个粗糙但是端到端的重建流程。你会发现以前需要花大量时间调试特征匹配参数的日子真的快要过去了。而当你真正理解它的输出格式和坐标系约定之后再考虑怎么把它与传统几何方法结合起来这才是把 VGGT 用出价值的方式。