VGGT 论文学习

论文链接:https://arxiv.org/abs/2503.11651

代码链接:https://github.com/facebookresearch/vggt

简介

VGGT 是一个强大的、多功能的前馈神经网络模型。它能够从一个、几个甚至上百张同一场景的不同视角图片中,直接推断出该场景的多种关键 3D 属性,包括

  • 相机参数
  • 深度图
  • 点云图
  • 3D 点轨迹(同一个3D点在多张图片中被追踪的轨迹)

VGGT 的主要创新优势在于,

  • 多功能的一体化:这是 VGGT 最大的突破,传统的 3D 视觉模型通常只擅长单一功能(比如只做深度估计,或只做相机定位),而 VGGT 一个模型就能完成多项复杂任务。
  • 简单高效:作为一个前馈神经网络,推理速度非常快,无需复杂的后续优化步骤。它能在一秒内完成场景重建,但效果却比那些需要后续进行"视觉几何优化"的模型更好。
  • 性能卓越:在相机参数估计、多视角深度估计、密集点云重建和 3D 点追踪等多个任务上,都达到了业内顶尖水平。

除了直接进行 3D 重建,研究还表明,将预训练好的 VGGT 模型作为特征提取 backbone(主干网络),可以显著提升其他下游任务的性能,比如:

  • 非刚性点追踪:追踪变形物体(人体、动物)的点。
  • 前馈式新视角合成:快速生成从全新视角看到的场景图像。

VGGT 解决的问题是如何通过一个前馈神经网络,根据一组图像来估计场景的 3D 属性。

  • 传统方法基于几何优化方法,例如 bundle adjustment,该方法是一种迭代优化技术,通过反复微调相机参数和 3D 点位置,使得投影到图像上的误差最小。这个过程虽然精确,但通常计算量大、速度慢。
  • 后来,人们用机器学习(特别是深度学习)来解决一些几何方法难以单独处理的问题,比如特征匹配(在两张图片中找到对应的点)和单目深度预测(从一张图片估计深度)。
  • 当前,机器学习和几何方法结合得越来越紧密。出现了像 VGGSfM 这样的端到端的先进运动恢复结构(SfM)系统。它通过可微分的 bundle adjustment 将神经网络和几何优化模块连接起来,形成一个可以整体训练的网络。

尽管像 VGGSfM 这样方法很先进,但它们仍然依赖视觉几何模块(比如可微分的 bundle adjustment),带来了两个缺点:

  • 增加了系统复杂性,需要设计和集成几何优化模块。
  • 增加了计算成本:迭代优化过程本质还是耗时的。

随着神经网络越来越强大,作者提出一个问题:现在是否终于可以直接用神经网络解决3D任务,而几乎完全避开几何后处理?最近的一些工作如 DUSt3R 和 MASt3R 取得了不错的效果,但这些网络一次只能处理两张图片。当需要重建更多图片时,必须依赖后处理步骤来"融合"多个两两配对的重建结果。这本质上仍然没有摆脱后处理。本文更进一步,无需在后处理步骤中优化 3D 几何。本文通过 Visual Geometry Grounded Transformer,从一个场景的单张或多张图片中实现 3D 重建,一次性预测所有关键的 3D 属性(相机参数、深度图等)。仅需一次前向传播,在数秒内完成重建,而且效果要优于那些需要复杂迭代的传统方法(如 DUSt3R、MASt3R 或 VGGSfM),无需任何后处理。

VGGT 的成功证明,我们无需为 3D 重建任务设计复杂的专用网络。相反,它采用一个相对标准的大型Transformer架构(就像 GPT、CLIP 等模型使用的架构),除了在注意力机制上作了小调整(帧内注意力和全局注意力交替),几乎没有引入任何特定的 3D 结构性偏置。通过在大量3D数据上进行训练,就能成为一个强大的多任务3D基础模型。其关键在于让模型同时学习所有相关的3D属性,这种协同学习反而比单独学习每个任务效果更好,体现了"大模型"思想在3D领域的应用。这标志着3D重建领域开始向自然语言处理(NLP)和2D计算机视觉看齐,采用"预训练大模型"的范式。VGGT的目标是成为一个通用的3D基础模型,就像GPT是文本基础模型一样,可以通过微调来适应各种下游3D任务(如动态点追踪、新视角合成)。

同期,其它的大型 3D 神经网络如 DepthAnything、MoGe 和 LRM 只关注于单目深度估计或新视图合成。然而,VGGT 使用一个共享的主干网络,预测全部的 3D 属性。尽管这些3D属性之间存在信息冗余(例如,有了深度图和相机参数,理论上可以算出点云),但实验证明,让模型同时学习这些相互关联的任务,反而能提高整体精度。任务之间起到了正则化和知识互补的作用。尽管模型被训练为同时输出所有结果,但在实际应用(推理)时,用户可以选择最可靠的输出路径。例如,他们发现用预测出的深度图和相机参数间接计算点云,比直接使用模型输出的点云结果精度更高。这展示了模型在实际部署中的灵活性。

本文主要贡献如下:

  • 提出了大型前馈 Transformer VGGT,给定一个场景的单张或多张图片,仅需几秒即可预测 3D 属性,例如相机内参和外参、点云图、深度图和 3D 点轨迹。
  • 证明 VGGT 的预测结果要优于当前 SOTA 的方法,而这些方法都需要漫长的后处理优化步骤。
  • 同时也证明了,VGGT 搭配 bundle adjustment 后处理,产生的效果甚至优于那些专门解决细分 3D 任务的方法。

相关工作

SfM

SfM是一个经典的计算机视觉问题,其目标是:从一组不同视角拍摄的静态场景照片中,估算出每张照片的相机参数(位置、姿态),并重建出场景的稀疏3D点云。传统的SfM解决方案是一个复杂的、分步骤的流水线,COLMAP 是这类传统方法的代表性工具,主要包括:

  • 图像匹配:在不同图像中找到相同的特征点。
  • 三角测量:利用匹配点和相机参数计算出特征点的 3D 位置。
  • 光束法平差:通过迭代优化来最小化重投影误差,同时优化相机参数和 3D 点位置。

近年来,深度学习开始改变这一领域。起初,深度学习主要用来改进SfM流水线中的各个独立组件,特别是在关键点检测和图像匹配这两个关键步骤上取得了巨大成功。最近,研究转向构建端到端可微分的SfM系统。这意味着将整个SfM流程构建成一个可训练的神经网络,其中 VGGSfM​ 是一个重要里程碑,它在具有挑战性的 "phototourism" 数据集上首次在整体性能上超越了COLMAP等传统算法。

MVS

多视图立体视觉(MVS)的目标是在已知相机参数(通常由 SfM 计算好)的前提下,从多张重叠图像中进行密集的 3D 几何重建(生成稠密的点云或表面模型),这与 SfM 通常产生稀疏点云不同。MVS 方法可以分为三类:

  • 传统的手工方法,依赖手工设计的特征和匹配规则。
  • 全局优化方法:使用复杂的优化算法来取得全局最优的 3D 模型。
  • 基于学习的方法:利用深度学习模型直接从数据中学习如何重建。这是当前的主流和进展最快的方向。

DUSt3R和MASt3R是MVS领域的重大进展。它们最大的突破是不需要已知的相机参数,可以直接从一对图像估计出已经对齐的稠密点云。这模糊了SfM(估计相机参数)和MVS(密集重建)的传统界限。尽管DUSt3R很强,但它有一个核心弱点:需要在测试时进行昂贵的优化后处理才能得到最佳结果。目前,有一些与VGGT同期的工作试图用神经网络取代 DUSt3R 的后处理步骤,但效果不理想,最多只能达到和DUSt3R 相当的性能。然而,VGGT 显著领先于 DUSt3R 和 MASt3R 方法。

TAP

Tracking any point 任务是给定一个视频和一些初始的2D查询点,任务是在视频的所有帧中预测这些点的2D对应位置。这要求算法能处理遮挡、形变等复杂情况。从早期的 Particle Video,到深度学习时代的PIPs、TAPIR、CoTracker等,这个领域已经发展出许多强大的、专门为解决此任务而设计的模型。我们无需专门为追踪任务设计模型,只需将VGGT模型提取的通用3D特征提供给现有的TAP追踪器使用,就能实现业界顶尖的追踪性能。这反过来证明了VGGT所学到的特征具有非常强大的通用性和表现力。

方法

VGGT 是一个大型的 Transformer,输入是一组图像,输出是各种 3D 属性。

问题定义和符号

输入是同一个 3D 场景的一组图像序列 ( I i ) i = 1 N (I_i)_{i=1}^N (Ii)i=1N,包含了 N N N 张 RGB 图像, I i ∈ R 3 × H × W I_i\in \mathbb{R}^{3\times H\times W} Ii∈R3×H×W。VGGT transformer 是一个函数,将这个图像序列映射为对应的 3D 标注,每帧都有对应的一个标注,

f ( ( I i ) i = 1 N ) = ( g i , D i , P i , T i ) i = 1 N f((I_i){i=1}^N) = (g_i, D_i, P_i, T_i){i=1}^N f((Ii)i=1N)=(gi,Di,Pi,Ti)i=1N

Transformer 将每张图片 I i I_i Ii 映射为它的相机参数 g i ∈ R 9 g_i\in\mathbb{R}^9 gi∈R9(内参和外参)、深度图 D i ∈ R H × W D_i\in \mathbb{R}^{H\times W} Di∈RH×W、点云图 P i ∈ R 3 × H × W P_i\in\mathbb{R}^{3\times H\times W} Pi∈R3×H×W,以及一个用于点跟踪的 C 维度的特征图 T i ∈ R C × H × W T_i \in \mathbb{R}^{C\times H\times W} Ti∈RC×H×W。

对于相机参数 g i g_i gi,将旋转四元数 q ∈ R 4 q\in \mathbb{R}^4 q∈R4 和平移向量 t ∈ R 3 t\in\mathbb{R}^3 t∈R3 ,以及 FoV f ∈ R 2 f\in \mathbb{R}^2 f∈R2,拼接到一起得到 g = [ q , t , f ] g=[q,t,f] g=[q,t,f]。在常见的 SfM 框架中,假定相机主点(就是相机光轴(主轴)与图像传感器平面(成像平面)相交的那个点)位于图像的中心。

将图像 I i I_i Ii 的域定义为 I ( I i ) = { 1 , . . . , H } × { 1 , . . . , W } \mathcal{I}(I_i)=\left\{1,...,H\right\}\times \left\{1,...,W\right\} I(Ii)={1,...,H}×{1,...,W},即像素点位置的集合,它就像一个地址簿。深度图 D i D_i Di关联着每个像素位置 y ∈ I ( I i ) y\in\mathcal{I}(I_i) y∈I(Ii),它表示了从第 i i i个相机观测,对应的深度值为 D i ( y ) ∈ R + D_i(y)\in\mathbb{R}^+ Di(y)∈R+。点云图 P i P_i Pi 是第 i i i张图像的点云图。对于每个像素位置,点云图 P i P_i Pi 会给出一个三维向量 P i ( y ) ∈ R 3 P_i(y) \in \mathbb{R}^3 Pi(y)∈R3,代表像素所对应的那个点在真实三维空间的位置。最关键的一点是视角不变性,就像DUSt3R论文一样,所有点云图中的 3D 点 P i ( y ) P_i(y) Pi(y) 都被定义在第一个相机 ( g 1 g_1 g1) 的坐标系中。这个坐标系被当作整个场景的世界参考系。如果没有这个统一的坐标系,那么从不同相机视角计算出的3D点会散落在各自相机的局部坐标系中,无法直接拼合成一个完整的3D模型。通过将所有点都转换到第一个相机的坐标系下,它们天生就是对齐的,可以直接用于重建。

最后,对于关键点跟踪 任务,作者遵循了 track-any-point 的方法。你只需要在一张图片 I q I_q Iq上指定一个点 y q y_q yq,VGGT就能自动在所有图片中找到这个点的对应位置,从而形成这个点在所有图片 I i I_i Ii中的运动轨迹 τ ∗ ( y q ) = ( y i ) i = 1 N \tau^\ast (y_q)=(y_i)^N_{i=1} τ∗(yq)=(yi)i=1N。注意,transformer f f f 并不直接输出轨迹,而是特征 T i ∈ R C × H × W T_i \in \mathbb{R}^{C\times H\times W} Ti∈RC×H×W,此特征将用于跟踪。然后,跟踪由一个单独的模块完成,它实现了函数 τ ( ( y j ) j = 1 M , ( T i ) i = 1 N ) = ( ( y ^ j , i ) i = 1 N ) j = 1 M \tau((y_j){j=1}^M, (T_i){i=1}^N)=((\hat{y}{j,i})^{N}{i=1})_{j=1}^M τ((yj)j=1M,(Ti)i=1N)=((y^j,i)i=1N)j=1M, M M M 表示查询点的个数。其输入是查询点 y q y_q yq 和 transformer f f f 预测的密集跟踪特征 T i T_i Ti,然后计算轨迹。网络 f f f 和 τ \tau τ 都是端到端训练的。

预测顺序。输入的图像顺序是任意的,除了将第一张图片作为参考坐标系。网络架构是置换等变的,除了第一帧图像以外,打乱其余输入图像的顺序,不会影响最终的输出结果,只是输出的顺序会跟着输入的顺序发生同样的改变。

过度完备的预测结果 。注意,VGGT 预测的属性不都是独立的。例如在 DUSt3R 中,我们通过解决 PnP 问题,可以从不变的点云图 P P P 推理得到相机的参数 g g g。此外,也可以从点云图和相机参数推理出深度图。在训练时,尽管深度、相机参数和点云图之间存在确定的数学关系(即可相互推导),但强制要求模型同时、明确地预测所有这些东西,能极大地提升模型的整体性能和所学特征的质量。但在模型推理阶段,要得到最准确的3D点云,最可靠的方法是"相信模型预测的深度值和相机参数,然后用几何公式算出3D点",而不是"直接相信模型为点云任务给出的答案"。

特征主干网络

作者设计了一个简单的架构,不包含复杂的 3D 先验知识,模型能从海量的 3D 标注数据中学习丰富的属性。模型 f f f 是一个大型的 transformer。首先将每张输入图像切分为 K K K 个小块,然后每个小图块经过 DINO 模型,转换为一个 c c c 维的向量,即 t I ∈ R K × C t^I \in \mathbb{R}^{K\times C} tI∈RK×C,称为 token。将所有帧的 tokens 合并为一个大集合 t I = ∪ i = 1 N { t i I } t^I=\cup_{i=1}^N\{t_i^I\} tI=∪i=1N{tiI},经过网络主体结构。网络主体由多层Transformer块组成,这些块交替使用两种自注意力机制:

  • 帧内自注意力:在这一层,模型只关注同一张图片内部的各个图像块之间的关系。例如,它学习图片中一个桌角和一个桌边之间的相对位置。
  • 全局自注意力:在这一层,模型可以关注所有图片中的所有图像块。例如,它可以将图片1中的一个桌角与图片2、图片3中的同一个桌角进行匹配,从而理解它们是同一个3D点在不同视角下的投影。

通过这种交替,模型既能理解单张图片的内部结构,又能建立不同图片之间的跨视角联系,这正是进行多视图 3D 重建所需的核心能力。

交替注意力。通过引入交替注意力,作者小幅改动了标准的 transformer 设计,让自注意力层在"帧内注意力"和"全局注意力"之间交替进行。这种设计能让模型在一层中专注于理解单张图片的内部结构,在下一层中则专注于建立所有图片之间的对应关系。这种交替循环进行,从而在"单图理解"和"多图关联"之间取得了完美的平衡,并被证明对性能有巨大提升。

  • 帧内自注意力只关注帧内的 tokens t k I t_k^I tkI,它会计算图片内所有 tokens 之间的关系。
  • 全局自注意力则可以看到所有图片的全部 tokens,计算任意两个 tokens 之间的关系,无论它们来自哪张图片,让模型建立跨图片的关联。这是实现多视图3D重建的关键,因为它能让模型发现"图片A中的这个点对应着图片B和图片C中的那个点"。

这样做能在融合帧间信息流和归一化帧内 tokens 的激活值之间取得平衡。如果只用全局注意力,模型可能会过早地陷入混乱,因为它要同时处理所有图片的所有信息,难以先建立对单张图的坚实理解。如果只用帧内注意力,模型则完全无法进行跨视图匹配。交替注意力​ 巧妙地平衡了这一点:先让模型在帧内层深化对单张图的理解,然后在全局层利用这个理解去进行匹配,之后再回到帧内层去 refine,如此反复。模型有多层组成,论文中是 L = 24 L=24 L=24,这些层不是单一的,而是两种注意力模式交替出现,一个简化的顺序可能是:第1层:帧内 -> 第2层:全局 -> 第3层:帧内 -> 第4层:全局 -> ...如此循环。一个重要细节是,VGGT 只使用了自注意力,没有用交叉注意力层。

预测头

这里介绍 f f f 是如何预测相机参数、深度图、点云图和点跟踪的。首先,对于每张输入图像 I i I_i Ii,用特殊的相机 tokens t i g ∈ R 1 × C ′ t_i^g \in \mathbb{R}^{1\times C'} tig∈R1×C′ 和四个 register tokens t i R ∈ R 4 × C ′ t_i^R \in \mathbb{R}^{4\times C'} tiR∈R4×C′ 来增广对应的图像 tokens t i I t_i^I tiI。相机 tokens 代表了图片相机参数的可学习向量,register tokens 可用于存储和传递中间信息,增强模型表达能力。将它们拼接到一起, ( t i I , t i g , t j R ) i = 1 N (t_i^I, t_i^g, t_j^R)_{i=1}^N (tiI,tig,tjR)i=1N 输入进"交替注意力" transformer,输出 tokens ( t ^ i I , t ^ i g , t ^ i R ) i = 1 R (\hat{t}_i^I, \hat{t}_i^g, \hat{t}i^R){i=1}^R (t^iI,t^ig,t^iR)i=1R。第一帧的相机 token 和 register tokens ( t 1 g : = t ˉ g , t 1 R : = t ˉ R ) (t_1^g:=\bar{t}^g, t_1^R := \bar{t}^R) (t1g:=tˉg,t1R:=tˉR) 会被单独初始化为一组特殊的可学习参数,其余帧的相机 token 和 register tokens 共享另一组可学习参数 ( t i g : = t ˉ ˉ g , t i R : = t ˉ ˉ R , i ∈ [ 2 , . . . , N ] ) (t_i^g:=\bar{\bar{t}}^g, t_i^R := \bar{\bar{t}}^R, i\in \left[2,...,N\right]) (tig:=tˉˉg,tiR:=tˉˉR,i∈[2,...,N])。这强制模型将第一帧的相机识别为世界坐标系的原点,所有其他帧的相机参数和 3D 点位置都将相对于这个原点来定义,从而确保了所有预测结果在同一个全局坐标系下对齐(即视角不变)。

注意,除了第一帧的所有帧的相机 tokens 都是相同的可学习参数,模型如何避免混淆,确保第 i i i 帧的相机 tokens 最终学到的是第 i i i 帧的相机参数,而不是其它帧的?这是因为交替注意力 transformer 包含了帧内自注意力层,让 transformer 将相机 tokens 和 register tokens 和图片内对应的 tokens 匹配,tokens 只能与同一帧内的其他 tokens 交互。因此,第 i i i 帧的相机 tokens 只能与第 i i i 帧的图像 tokens 进行信息交换。通过这种层内的反复交互,每个帧的相机 tokens 就会"吸收"专属于自己对应图像内容的几何信息,从而变得帧特定,能够精准地预测出该帧独有的相机参数。Register tokens t ^ i R \hat{t}_i^R t^iR的作用类似于"临时工作区"或"通信中继",它们在Transformer的注意力过程中帮助传递和整合信息。一旦信息交换完成,它们的任务就结束了。最终的预测任务(相机、深度、点云)由图像 tokens t ^ i I \hat{t}_i^I t^iI和相机 tokens t ^ i g \hat{t}_i^g t^ig 负责。

坐标系 。我们预测相机参数、点云图、深度图都是在第一个相机 g 1 g_1 g1 的坐标系下。所以第一帧相机自身的外参就必须被设定为单位变换。具体来说,就是将其旋转设置为无旋转,即旋转四元数设为 q 1 = [ 0 , 0 , 0 , 1 ] q_1=\left[0,0,0,1\right] q1=[0,0,0,1]。将其平移设置为零平移,即平移向量设为 t 1 = [ 0 , 0 , 0 ] t_1 = \left[0,0,0\right] t1=[0,0,0]。这是通过将第一帧的特殊相机 tokens 初始化为一个独特的可学习向量来实现的, t 1 g : = t ˉ g , t 1 R : = t ˉ R t_1^g := \bar{t}^g, t_1^R := \bar{t}^R t1g:=tˉg,t1R:=tˉR,使得Transformer能够识别出它是第一个相机。

相机预测 。通过四个额外的自注意力层和一个线性层,从输出的相机 tokens ( t ^ i g ) i = 1 N (\hat{t}i^g){i=1}^N (t^ig)i=1N 预测相机参数 ( g ^ i ) i = 1 N (\hat{g}^i)_{i=1}^N (g^i)i=1N。这样就有了预测相机内外参的camera head

密集预测 。输出图像 tokens t ^ i I \hat{t}i^I t^iI 用于预测密集输出,即深度图 D i D_i Di、点云图 P i P_i Pi 和轨迹特征 T i T_i Ti。首先通过 DPT 层,将 t ^ i I \hat{t}i^I t^iI 转换为密集特征图 F i ∈ R C ′ ′ × H × W F_i \in \mathbb{R}^{C''\times H\times W} Fi∈RC′′×H×W。然后每个 F i F_i Fi 都会通过一个 3 × 3 3\times 3 3×3 卷积层映射为对应的深度图和点云图 D i D_i Di 和 P i P_i Pi。此外,DPT 也输出密集特征 T i ∈ R C × H × W T_i \in \mathbb{R}^{C\times H\times W} Ti∈RC×H×W,作为跟踪头的输入使用。此外,也会预测每个深度图和点云图的不确定图 ∑ i D ∈ R + H × W \sum_i^D \in \mathbb{R}^{H\times W}+ ∑iD∈R+H×W 和 ∑ i P ∈ R + H × W \sum_i^P \in \mathbb{R}^{H\times W}+ ∑iP∈R+H×W。在训练时,在损失函数中使用不确定图;在预测时,它和模型的预测置信度是正比的。

跟踪 。为了实现跟踪模块 τ \tau τ,作者使用了 CoTracker2 架构,输入是密集跟踪特征 T i T_i Ti。给定查询图像 I q I_q Iq 中的一个查询点 y j y_j yj(在训练时, q = 1 q=1 q=1,其它图像作为查询图像使用),跟踪头 τ \tau τ 预测所有图像 I i I_i Ii 中的一组 2D 点 τ ( ( y j ) j = 1 M , ( T i ) i = 1 N ) = ( ( y ^ j , i ) i = 1 N ) j = 1 M \tau((y_j){j=1}^M, (T_i){i=1}^N) = ((\hat{y}{j,i}){i=1}^N)_{j=1}^M τ((yj)j=1M,(Ti)i=1N)=((y^j,i)i=1N)j=1M,对应同一个 3D 点 y y y。首先对查询图像的特征图 T q T_q Tq 的查询点 y j y_j yj 做双线性插值,得到它的特征。然后该特征和其它所有的特征图 T i , i ≠ q T_i, i\neq q Ti,i=q 做关联,得到一个关系图集合。这些图会经过自注意力层来预测最终的 2D 点 y ^ i \hat{y}_i y^i,这些点都对应着 y j y_j yj。注意,本跟踪器没有假定任何的输入帧顺序,因此它可以用于任意的输入图像,不只是视频。

训练

损失函数

VGGT 模型 f f f 的训练是端到端的,

L = L c a m e r a + L d e p t h + L p m a p + λ L t r a c k \mathcal{L} = \mathcal{L}{camera} + \mathcal{L}{depth} + \mathcal{L}{pmap} + \lambda \mathcal{L}{track} L=Lcamera+Ldepth+Lpmap+λLtrack

作者发现相机、深度图和点云图有着相同的值域,不需要加权处理。跟踪损失 L t r a c k \mathcal{L}_{track} Ltrack 用系数 λ = 0.05 \lambda=0.05 λ=0.05 做加权。

相机损失 L c a m e r a \mathcal{L}{camera} Lcamera 监督相机参数 g ^ \hat{g} g^的训练: L c a m e r a = ∑ i = 1 N ∥ g ^ i − g i ∥ ϵ \mathcal{L}{camera}=\sum_{i=1}^N \left\| \hat{g}i - g_i \right\|\epsilon Lcamera=∑i=1N∥g^i−gi∥ϵ,使用 Huber 损失来计算预测相机参数 g ^ i \hat{g}_i g^i 和 ground-truth 参数 g i g_i gi 的损失。

带有不确定损失的深度损失 L d e p t h \mathcal{L}_{depth} Ldepth 延续了 DUSt3R,通过预测的不确定性图 ∑ ^ i D \hat{\sum}i^D ∑^iD 来加权预测深度 D ^ i \hat{D}i D^i 和 ground-truth 深度 D i D_i Di 之间的差异。与 DUSt3R 不同,作者也使用了一个基于梯度的项,这广泛用于单目深度估计里面。因此,深度损失定义为: L d e p t h = ∑ i = 1 N ∥ ∑ i D ⊙ ( D ^ i − D i ) ∥ + ∥ ∑ i D ⊙ ( ∇ D ^ i − ∇ D i ) ∥ − α log ⁡ ∑ i D \mathcal{L}{depth}=\sum{i=1}^N \left\| \sum_i^D \odot (\hat{D}i - D_i) \right\| + \left\| \sum_i^D \odot(\nabla \hat{D}i - \nabla D_i) \right\| - \alpha \log{\sum_i^D} Ldepth=∑i=1N ∑iD⊙(D^i−Di) + ∑iD⊙(∇D^i−∇Di) −αlog∑iD,其中 ⊙ \odot ⊙ 是通道逐元素乘积。点云图的损失定义类似,但是包含了点云图的不确定图 ∑ i P \sum_i^P ∑iP: L p m a p = ∑ i = 1 N ∥ ∑ i P ⊙ ( P ^ i − P i ) ∥ + ∥ ∑ i P ⊙ ( ∇ P ^ i − ∇ P i ) ∥ − α log ⁡ ∑ i P \mathcal{L}{pmap} = \sum{i=1}^N \left\| \sum_i^P \odot (\hat{P}_i - P_i) \right\| + \left\| \sum_i^P \odot (\nabla \hat{P}_i - \nabla P_i) \right\| - \alpha \log \sum_i^P Lpmap=∑i=1N ∑iP⊙(P^i−Pi) + ∑iP⊙(∇P^i−∇Pi) −αlog∑iP。

最终,跟踪损失定义为: L t r a c k = ∑ j = 1 M ∑ i = 1 N ∥ y j , i − j y ^ j , i ∥ \mathcal{L}{track}=\sum{j=1}^M \sum_{i=1}^N \left\| y_{j,i}-\hat{jy}{j,i} \right\| Ltrack=∑j=1M∑i=1N yj,i−jy^j,i 。这里,外面的求和是对所有的查询图像 I q I_q Iq 的全部 ground-truth 查询点 y j y_j yj 做的, y j , i y{j,i} yj,i 是 y j y_j yj在图像 I i I_i Ii中的 ground-truth 对应点,而 y ^ j , i \hat{y}{j,i} y^j,i 是跟踪模块中 τ ( ( y j ) j = 1 M , ( T i ) i = 1 N ) \tau((y_j)^{M}{j=1}, (T_i)^N_{i=1}) τ((yj)j=1M,(Ti)i=1N) 预测的对应点。此外,延续了 CoTracker2,使用了一个可见性损失(二元交叉熵损失)来估计一个点是否在给定帧中可见。

Ground Truth Coordinate Normalization

从一个场景的图片中无法确定其绝对大小和全局位置(尺度模糊性),存在无数个等价的正确重建结果。通过数据归一化来消除模糊性,为模型选择一个唯一的、规范的输出格式。在训练时,将所有真值数据统一到第一个相机的坐标系,并根据场景点云的平均尺度进行缩放。与DUSt3R等模型在推理输出后进行归一化不同,VGGT不对网络输出做后处理归一化,而是强制网络在内部学习这种归一化,直接输出符合规范的结果。

3D 重建是从 2D 图像反推 3D 结构。这个过程存在一个七自由度的模糊性(整体平移:3自由度,整体旋转:3自由度,整体尺度:1自由度)。你可以将整个重建场景等比例放大一倍,同时将所有相机远离场景一倍,得到的2D投影图像是完全一样的。因此,有无数个数学上等价的解。为了解决这个问题,必须人为设定一个标准。VGGT采用了和DUSt3R类似的两步标准化法:

  • 设定坐标系,解决平移和旋转模糊性。将所有3D点云和相机的位置,都定义在第一帧相机的坐标系下。这相当于说:"我们以第一帧相机的位置为坐标原点 (0,0,0),以它的朝向为基准方向。" 这解决了全局平移和旋转的模糊性。
  • 设定尺度,解决尺度模糊性。计算 ground truth 点云中所有 3D 点到原点(第一帧相机)的平均欧氏距离,然后用这个距离作为尺子,去归一化相机平移向量 t t t、点云图 P P P 和深度图 D D D。
  • 在 DUSt3R 中,网络 f f f 直接输出一个未经归一化的、尺度任意的 3D 重建结果,然后在推理时需要一个后处理步骤,进行归一化才能得到最终可用的结果。VGGT 在训练阶段,给网络的监督真值已经是归一化后的数据,网络 f f f 训练去直接预测这个归一化后的结果。推理时,网络的前向传播 f ( I ) f(I) f(I) 直接输出的就是归一化后的 3D 重建结果,无需任何后处理。

实现细节

使用了 L = 24 L=24 L=24 层的 Transformer 模型,包含了全局和帧内自注意力机制。模型大约有 12 亿参数。训练时,通过 AdamW 来优化训练损失,整个训练步骤大约有 16 万次迭代。作者使用了余弦退火机制,初始学习率为 0.0002 0.0002 0.0002,在最初的 8000 次迭代中,学习率从 0 0 0 线性增加到峰值 0.0002 0.0002 0.0002。在每个 batch 中,随即从一个场景中选取 2 到 24 帧图像。将图像、深度图和点云图的最大边长缩放为 518 518 518 像素。在 0.33 ∼ 1.0 0.33\sim 1.0 0.33∼1.0 之间随机改变图像的长宽比。随机改变图像的颜色、模糊程度,或转为灰度图。使用了 64 块 A100 显卡训练了 9 天。控制梯度的大小,防止其超过 1.0。使用了 bfloat16 精度和 gradient checkpointing 来确保训练的稳定性、提升 GPU 利用效率。

训练数据

使用了一个大规模、多样的数据集,包括 Co3Dv2、BlendMVS、DL3DV、MegaDepth、Kubric、WildRGB、ScanNet、HyperSim、Mapillary、Habitat、Replica、MVS-Synth、PointOdyssey、Virtual KITTI、Aria Synthetic Environments、Aria Digital Twin 和类似于 Objaverse 的合成数据资产。这些数据集涵盖了多个领域,包括室内、户外场景,有真实场景和合成场景的数据。这些数据集的 3D 标注来源于多个源头,如传感器直接采集的、合成引擎或 SfM 技术。这些数据集在规模性和多样性上可以和 MASt3R 相媲美。

相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习