论文阅读-VGGT: Visual Geometry Grounded Transformer

2025-09-23发布于论文随笔 | 最后更新于2025-09-26 18:09:00

point cloud 3D SfM

CVPR2025 原文链接VGGT: Visual Geometry Grounded Transformer

基本介绍

做的任务称为“Structure from Motion”,即通过多张图片恢复重建出场景的三维结构以及各张图片的相机参数。本文颠覆了以往的传统方法,不再分若干阶段完成任务,而是通过Transformer网络一次产出相机参数估计、多视角深度估计、点云重建、点追踪的结果,并且在输入视角非常多时仍然保持极高的计算效率。

SfM(Structure from Motion)任务的传统解决方法一般包含以下步骤: 1. 特征提取与匹配:为每张图像提取特征点,并在图像间找到特征匹配的对应点 2. 相机内参估计:若图像本身没有包含相机内参信息,可以通过一些算法来估计这些内参 3. 初始重建:选择一对匹配良好且有足够视差的图像,估计相对位姿,并使用三角测量算法恢复初始的三维点云(后续基于此再不断优化) 4. 继续重建:逐步添加其他图像,调整重建情况。期间可使用Bundle Adjustment算法进行局部优化 5. 最终调整:处理完所有图像后,还可以进行一次Bundle Adjustment,优化全局的“最小重投影误差”(3D投影回2D的误差) 6. 后处理:应用一些数据处理方法整形最后的结果

VGGT框架图

具体方法

整体流程较为清晰简单,如上面的框架图所示: 1. 使用DINOv2作为token编码器 2. 在得到的token中添加camera token(与未画出来的register token) 3. 对tokens交替地进行global attention与frame attention,由一组global attention和frame attention构成的块称为alternating-attention 4. 将attention计算过后的tokens放入预测头中进行预测,相机参数通过一个超小型transformer迭代求解,其他均通过Dense Prediction Transformer预测

register token作用是稳定transformer,是其他文章中的内容,并非创新;camera token则用于预测具体结果,类似于CLS token。

以下是每一步的具体执行过程

token embedding

使用DINOv2对图片进行token编码,将\(N\)张输入图像 \(I\) patch化为若干token \(t^I\in\mathbb{R}^{K\times C}\)\(t^I = \cup_{i=1}^{N} \{ t_i^I \}\)

Alternating Attention (AA)

frame-wise self-attention和global self-attention交替进行,因此称为“alternate”。frame-wise self-attention作用于单张图像的token \(t_k^I\),global self-attention则作用于所有图像 \(t^I\)。具体来说,本文中 \(L=24\),即使用了24层AA。

细节上,在进入AA前,会在\(t^I_i\)前拼接camera token和register token:

$$ \begin{gather} \left( t_i^I, t_i^{\mathbf{g}}, t_i^{R} \right)_{i=1}^{N}\\ t_i^{\mathbf{g}}\in\mathbb{R}^{1\times C'},t_i^{R}\in\mathbb{R}^{4\times C'} \end{gather} $$

其中,第一帧的camera token和register token用的是单独,记为\(( t_1^{\mathbf{g}} = \bar{t}^{\mathbf{g}},\; t_1^{R} = \bar{t}^{R} )\);其余帧用的是一样的,记为\(( t_i^{\mathbf{g}} = \overline{\overline{t}}^{\,\mathbf{g}},\; t_i^{R} = \overline{\overline{t}}^{\,R},\; i \in [2, \dots, N] )\)。在具体实现中,会expand复制 \(\overline{\overline{t}}^{\,\mathbf{g}}\)\(\overline{\overline{t}}^{\,R}\) 为N-1份,这些拼接的token都是可学习的。

经过多层AA最后得到\(( \hat{t_i^I}, \hat{t_i^{\mathbf{g}}}, \hat{t_i^{R}} )_{i=1}^{N}\)

Prediction Head

预测时会丢弃register token \(\hat{t_i^R}\),只使用 \(\hat{t_i^I}, \hat{t_i^{\mathbf{g}}}\)

相机参数

相机参数预测头中包含了4层的self-attention和一个简单的MLP,这个简单网络以图片AA的最终token为输入,输出的是“当前预测的相机参数还需要偏移多少才准确”,即偏移量。

\((\hat{t_i^{\mathbf{g}}})_{i=1}^{N}\) 经由上述操作进行4次迭代修正,得到相机参数的预测\(( \hat{\mathbf{g}}^i )_{i=1}^{N}\)

深度图与点云

深度图和点云都属于密集数据。之前AA中某些层次的token embedding \(\hat{t_i^I}\) 会经由DPT层(来自于Vision Transformers for Dense Prediction)得到多层密集特征图 \(F_i \in \mathbb{R}^{C'' \times H \times W}\);这个多层特征图经过一系列融合块之后得到整体密集特征图 \(T_i \in \mathbb{R}^{C \times H \times W}\);最后再经过3×3卷积得到每帧对应的深度图\(D_i\in\mathbb{R}^+\)与3D点云图\(P_i\in\mathbb{R}^3\)

点追踪

point tracker使用了来自于CoTracker: It is better to track together系列的CoTracker2。要查询的M个点(二维坐标)来自于图片 \(I_q\) ,记为 \(\mathbf{y}_j\),将这些查询点和 \(T_i\) 一起输入Tracker,得到查询点在其他视角帧中的二维坐标 \(( ( \hat{\mathbf{y}}_{j,i} )_{i=1}^{N} )_{j=1}^{M}\),这些不同帧中的二维坐标认为在3D空间中是同一点。

具体来说,会先把帧q的 \(T_q\) 双线性插值以获得查询点(可能不是整数位置)上的特征;再把这个查询点的特征与其他帧的 \(T_i (i\ne q)\)做相似度匹配,以得到最相似的位置点。

实验结果

3D点云重建可视化

动态点追踪效果可视化

下面的结果表格分别展示了在不同任务上的性能比较

性能比较

Two-view matching:输入两个视角,并找到匹配的像素点 Dense MVS (multi-view stereo) Estimation:稠密多视角立体重建,输入有多个视角,输出是场景的稠密点云 Point Map Estimation:估计的点直接是3D点,而不是其他图中的2D点,另外还需要估计深度 Point Tracking:多个(大于两个)帧中的像素点匹配,也可以是动态场景

消融实验中可以看到,frame-wise和global self-attention交替进行的AA机制确实有效;还可以发现,相机参数的学习对整个模型的贡献最大。在动态point track任务中也取得了不错的效果。

消融实验与泛化实验结果