VGGT

image.png

输入 N 帧图,每个 Block 共有两种自注意力。

  • Global Attention:全局自注意力。
  • Frame Attention:帧内自注意力。

每帧的开头会放一个 Camera Token,让模型学习相机参数。然后每帧的特征图会进行多任务预测。

然后论文发现推理时,不要直接用网络生成的 Point Cloud。而是把 Camera 和 Deptp 结合,通过几何公式反投影得到 3D 点云,精度反而比直接预测点云还要高。

一下子输入所有帧,不会爆显存吗?

  • 论文将全局特征提取和密集预测进行了解耦。抽取特征后可以逐帧串行推理。

相机参数是几维?

  • 旋转部分 :4 维。在 3D 空间中表示旋转,最稳健、最不容易发生死锁(万向节锁)的方法就是使用四元数。它由 4 个实数组成,通常满足单位化条件。
  • 平移部分 :3 维。代表相机光学中心在世界坐标系下的 绝对位置坐标。
  • 内参部分 :1 维(焦距)论文为了简化,假设图像的像素是正方形的(即 ),且主点(Principal Point,即光轴在图像上的交点)固定在图像的几何中心。因此,只需要预测一个标量焦距

Camera 损失是怎么计算的?

  • 当误差很小()时,它跟 MSE 一样,用平方来平滑过渡;
  • 而当误差很大()时,它会自动切换成 损失(绝对值直线的斜率),不再进行平方放大。
  • 如果用 MSE 损失则不稳定,比如存在一些脏数据,误差会非常大。

深度损失是怎么计算的?

  • 基础深度误差:,用网络预测的深度 减去数据集里的真值深度 核心创新(不确定性估计 ): 密集预测头(DPT Head)不仅预测深度,还会额外输出一张不确定性图 。如果某个像素(比如物体边缘或反光区域)网络觉得很难猜,它就会在这里输出一个很大的不确定性,从而自动降低该像素在损失函数中的权重,防止网络被脏数据带偏 。
  • 空间梯度误差: 代表图像的空间梯度(即像素与像素之间的深浅变化趋势) 。网络不仅要求“绝对深度数值要准”,还要求“深度的边沿和过渡趋势”必须与真值完全一致 。
  • 惩罚项:。如果不加这一项,网络为了让损失变成 0,会倾向于把所有像素的不确定性 都设为无穷大。

点云损失 pmap 是怎么计算的?

  • 和深度损失高度相似,只不过从深度变成了坐标。

Track 损失是什么?

  • 给一个点,让模型能够在不同帧之间进行追踪。
  • 外层循环 从 1 到 ,代表我们在图像上随机采样了 个用于训练的真值关键点。
  • 内层循环 从 1 到 ,代表这 个点中,每一个点都要去计算它在所有 张图像里的追踪位置误差。
  • 距离度量():计算网络预测的 2D 像素坐标 与数据集里提供的真实 2D 像素坐标 之间的欧氏距离误差( 距离)。
  • 可见性损失(Visibility Loss): 除了算距离,还包含一个二分类交叉熵损失,用来强迫模型预测:“这个点在第 帧里有没有被挡住?”

数据集里没有动态视频,怎么在静态图像里做 Track 真值?

  • 我们在第 1 张图里随便选一个像素点 。 利用数据集里现成的真值深度图,把这个 2D 像素点往 3D 空间一拉,得到一个 3D 空间点 。 利用真值的相机参数(内参/外参),把这个 3D 点 投影到其他第 2 帧、第 3 帧……图像上,得到它们在其他图像上的 2D 像素坐标。
  • 遮挡检查: 投影过去后,检查投影点的深度是否与目标图像本身的深度图吻合。如果吻合,说明这个点没被挡住,这就完美地自动生成了一条跨越所有视图的真实轨迹轨迹线

其他问题

传统 3DGS/NeRF 和 Feed-Forward 3D 的区别?

传统 3DGS:

1
2
3
4
5
6
7
1. 拍很多张图
2. 跑 COLMAP / SfM 求相机位姿
3. 初始化点云和 Gaussian
4. 反复渲染
5. 和真实图片算 loss
6. 梯度下降优化 Gaussian
7. 几分钟后得到结果

Feed-Forward 3DGS:

1
2
3
1. 输入 2 张 / 多张图
2. 模型直接预测深度、点云、Gaussian 或相机
3. 秒级得到 3D 表示

比如 DUSt3R / MASt3R / VGGT / π3 / pixelSplat / MVSplat / Long-LRM 这类方法,就更接近这个思路。

本质:把“每个场景单独优化”的成本,摊销到“大规模预训练”里。


VGGT
https://d4wnnn.github.io/2026/06/29/Notion/VGGT/
作者
D4wn
发布于
2026年6月29日
许可协议