VGGT
输入 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 | |
Feed-Forward 3DGS:
1 | |
比如 DUSt3R / MASt3R / VGGT / π3 / pixelSplat / MVSplat / Long-LRM 这类方法,就更接近这个思路。
本质:把“每个场景单独优化”的成本,摊销到“大规模预训练”里。
VGGT
https://d4wnnn.github.io/2026/06/29/Notion/VGGT/