跳到主要内容

π³:Permutation-Equivariant Visual Geometry Learning

论文:π³: Scalable Permutation-Equivariant Visual Geometry Learning
也可见题名:Permutation-Equivariant Visual Geometry Learning
arXiv:2507.13347
代码:yyfz/Pi3
论文地址:arXiv 2507.13347

这篇论文解决什么问题

前面读过的 DUSt3R、MASt3R、VGGT 都在做 feed-forward visual geometry:

输入一张或多张图像
-> 网络前向推理
-> 输出相机、depth、pointmap 或匹配关系

但这些方法里常见一个隐含设定:

需要选一张 reference view,把它当作全局坐标系。

例如 DUSt3R 会输出:

X1,1, X2,1X^{1,1},\ X^{2,1}

也就是两张图的 pointmap 都表达在第 1 张图的相机坐标系里。

VGGT 也把第一帧当作 reference frame,输出相机和 point maps 时默认第一帧定义世界坐标。

π³ 认为这会带来一个不必要的 inductive bias:

如果第一帧选得好,结果可能很好;
如果第一帧视角差、遮挡多、模糊、信息少,整体重建就可能被拖垮。

这篇论文的目标是:

去掉固定 reference view,让模型对输入图像顺序真正 permutation-equivariant。

π³ reference-free 思路重绘示意图

图源说明:根据 π³ 论文对 reference view bias 与 permutation equivariance 的描述重绘,非论文原图。

一句话版本

π³ 可以记成:

unordered images
-> DINOv2 patch tokens
-> alternating view-wise / global self-attention
-> per-view local pointmaps + confidence + affine-invariant camera poses
-> losses written with scale alignment and relative pose supervision

核心改变不是“模型更大”,而是“输出定义变了”:

不再让所有点云依赖第 1 张图坐标系;
每张图输出自己的 local pointmap;
相机监督使用相对位姿;
输入顺序变了,输出只跟着同样重排。

什么是 permutation-equivariant

输入是一组图像:

S=(I1,,IN)S=(\mathbf{I}_1,\dots,\mathbf{I}_N)

网络:

ϕ\phi

输出每张图对应的 camera pose、pointmap 和 confidence:

ϕ(S)=((T1,,TN),(X1,,XN),(C1,,CN))\phi(S) = \left( (\mathbf{T}_1,\dots,\mathbf{T}_N), (\mathbf{X}_1,\dots,\mathbf{X}_N), (\mathbf{C}_1,\dots,\mathbf{C}_N) \right)

其中:

  • TiSE(3)\mathbf{T}_i\in SE(3):第 ii 张图对应的相机位姿。
  • XiRH×W×3\mathbf{X}_i\in\mathbb{R}^{H\times W\times 3}:第 ii 张图的 pixel-aligned 3D pointmap。
  • CiRH×W\mathbf{C}_i\in\mathbb{R}^{H\times W}:第 ii 张图的 confidence map。

如果对输入顺序做一个排列:

Pπ(S)=(Iπ(1),,Iπ(N))P_\pi(S) = (\mathbf{I}_{\pi(1)},\dots,\mathbf{I}_{\pi(N)})

permutation-equivariant 要求:

ϕ(Pπ(S))=Pπ(ϕ(S))\phi(P_\pi(S)) = P_\pi(\phi(S))

也就是说:

输入图像顺序变了;
输出顺序也跟着同样变化;
但每张图对应的几何结果不应该本质改变。
⭐ permutation-invariant 和 permutation-equivariant 有什么区别?

Permutation-invariant 是:

输入顺序改变,输出完全不变。

典型例子是分类一个点云:

f({p1,p2,p3})=chairf(\{p_1,p_2,p_3\})=\text{chair}

点的顺序换了,类别仍然是 chair。

Permutation-equivariant 是:

输入顺序改变,输出按相同方式重排。

π³ 这里需要的是 equivariant,而不是 invariant。

原因是它不是只输出一个全局类别,而是要给每张输入图像输出对应结果:

I₁ -> T₁, X₁, C₁
I₂ -> T₂, X₂, C₂
I₃ -> T₃, X₃, C₃

如果输入变成:

I₃, I₁, I₂

那么输出应该变成:

T₃, X₃, C₃
T₁, X₁, C₁
T₂, X₂, C₂

这就是:

ϕ(Pπ(S))=Pπ(ϕ(S))\phi(P_\pi(S))=P_\pi(\phi(S))

为什么 reference view 是问题

reference-view 方法通常会把某一帧当成世界坐标系:

选第 1 帧
-> 所有相机 pose 相对于第 1 帧
-> 所有 pointmaps 表达到第 1 帧坐标系

这在数学上可行,但对神经网络有风险。

如果 reference view:

  • 视角很偏;
  • 纹理很少;
  • 被遮挡;
  • 运动模糊;
  • 只看到场景的一小部分;

那么其他帧的几何都要绕着这个不理想参考系表达,模型更容易不稳定。

π³ 的实验专门测试了这个问题:在 DTU 和 ETH3D 上,把输入序列循环重排,让不同帧成为第一帧,然后看重建指标的标准差。π³ 的标准差接近 0,而 VGGT 仍有明显波动。

论文报告的例子:

数据集指标VGGT stdπ³ std
DTUAcc. mean std0.0330.003
DTUComp. mean std0.0540.006
ETH3DAcc. mean std0.0490.000
ETH3DComp. mean std0.0620.000

这说明 π³ 的输出对输入顺序更稳定。

模型架构

π³ 的整体结构和 VGGT 一样都使用 alternating attention,但去掉会指定顺序或 reference 的设计。

π³ pipeline 重绘示意图

图源说明:根据 π³ 论文方法和附录架构描述重绘,非论文原图。

流程:

N images
-> DINOv2 patch embedding
-> alternating view-wise and global self-attention
-> lightweight per-image decoders
-> camera poses, local pointmaps, confidence maps

论文明确强调它省略了 order-dependent components,例如:

frame index positional embeddings
special reference-view tokens
VGGT-style camera tokens used to mark a reference view

附录里补充了 decoder 细节:

  • camera pose decoder、local pointmap decoder、confidence decoder 架构相同但不共享权重。
  • decoder 是轻量 5-layer Transformer。
  • decoder 的 self-attention 只作用在单张图像自己的 features 上。
  • pointmap 和 confidence head 是 MLP + pixel shuffle。
  • camera head 采用 Reloc3r 风格:MLP、average pooling、MLP。
  • rotation 先预测 9D 表示,再用 SVD orthogonalization 转为 3×33\times3 rotation matrix。
⭐ 为什么“去掉 camera token / frame embedding”会帮助等变性?

如果模型里有一个特殊 token 表示:

这张是 reference view

或者有 frame index embedding:

第 1 帧、第 2 帧、第 3 帧

那么模型就能区分“同一张图在不同输入位置”的身份。

这会破坏严格的 permutation equivariance。

例如同一组图像:

[A, B, C]

和:

[C, A, B]

如果模型给第 1 个位置加了特殊含义,那么 A 在第一种输入里是普通第 1 帧,A 在第二种输入里变成第 2 帧。模型看到的不再只是图像内容,还看到了“位置身份”。

π³ 的设计是:

不让任何输入位置天然更特殊。

这样输入只是一个集合。换顺序后,attention 里的内容关系不变,只是 token 顺序重排,输出也对应重排。

Local pointmap:不再全都放到第一帧坐标系

π³ 对每张图预测 local pointmap:

X^i\hat{\mathbf{X}}_i

它被定义在第 ii 张图自己的相机坐标系中,而不是某个全局 reference frame。

这和 DUSt3R/VGGT 的差别很关键:

方法pointmap 坐标系
DUSt3R图像对里通常表达在第 1 张图坐标系
VGGT多图 point maps 表达在第一帧参考系
π³每张图表达在自己的 local camera frame

好处是:

每张图只需要预测自己视角下的局部几何;
不需要把所有几何强行绑定到某个任意 reference view;
输入顺序变化不会改变几何定义。

但问题是:不同局部 pointmaps 之间还需要一个一致尺度和相机关系。因此训练时要做 scale-invariant local geometry 监督。

Scale-invariant local geometry

单目 / 多目 feed-forward reconstruction 里,尺度经常是不确定的。π³ 让所有图像的 local pointmaps 共享一个未知场景尺度:

ss^*

训练时先求一个最优尺度:

s=argminsi=1Nj=1H×W1zi,jsx^i,jxi,j1s^* = \arg\min_s \sum_{i=1}^{N} \sum_{j=1}^{H\times W} \frac{1}{z_{i,j}} \left\Vert s\hat{\mathbf{x}}_{i,j} - \mathbf{x}_{i,j} \right\Vert_1

其中:

  • x^i,j\hat{\mathbf{x}}_{i,j}:第 ii 张图第 jj 个像素预测的 3D 点。
  • xi,j\mathbf{x}_{i,j}:对应 ground-truth 3D 点。
  • zi,jz_{i,j}:ground-truth depth,也就是 xi,j\mathbf{x}_{i,j} 的 z 分量。
  • 1zi,j\frac{1}{z_{i,j}}:depth weighting,避免远处点因为绝对距离大而支配 loss。

然后 point reconstruction loss 是:

Lpoints=13NHWi=1Nj=1H×W1zi,jsx^i,jxi,j1\mathcal{L}_{points} = \frac{1}{3NHW} \sum_{i=1}^{N} \sum_{j=1}^{H\times W} \frac{1}{z_{i,j}} \left\Vert s^*\hat{\mathbf{x}}_{i,j} - \mathbf{x}_{i,j} \right\Vert_1
⭐ 为什么要先求一个统一尺度 s*?

因为模型输出的是 local pointmap,而不是带绝对单位的确定世界坐标。

如果同一个场景整体放大 2 倍:

x^i,j=2x^i,j\hat{\mathbf{x}}'_{i,j}=2\hat{\mathbf{x}}_{i,j}

很多相对几何关系其实不变:

表面形状不变;
点之间相对位置比例不变;
相机轨迹形状不变;
只是尺度单位变了。

如果直接用:

x^i,jxi,j\left\Vert \hat{\mathbf{x}}_{i,j} - \mathbf{x}_{i,j} \right\Vert

模型会被迫学习绝对尺度。但很多图像集合本身没有可靠绝对尺度,或者尺度由数据集标注方式决定。

所以 π³ 先找一个全场景共享的最优尺度:

ss^*

再比较:

sx^i,js^*\hat{\mathbf{x}}_{i,j}

和 ground truth。

这样 loss 关注的是:

形状是否对;
不同 view 的尺度是否一致;
局部几何是否稳定;
而不是任意参考系下的绝对大小。

Normal loss 与 confidence loss

π³ 还加入 normal loss 来鼓励局部表面光滑。

对于 pointmap 上某个像素,使用相邻像素形成的两个方向向量做叉乘,可以估计法向:

n^i,j\hat{\mathbf{n}}_{i,j}

然后和真值法向比较角度:

Lnormal=1NHWi=1Nj=1H×Warccos(n^i,jni,j)\mathcal{L}_{normal} = \frac{1}{NHW} \sum_{i=1}^{N} \sum_{j=1}^{H\times W} \arccos \left( \hat{\mathbf{n}}_{i,j}\cdot\mathbf{n}_{i,j} \right)

confidence map:

Ci\mathbf{C}_i

用 BCE 监督。论文把每个点是否可靠转成二分类:如果 scale-aligned 后的 L1 reconstruction error 小于阈值 ϵ\epsilon,标签为 1,否则为 0。

Affine-invariant camera pose

由于没有固定 global reference frame,预测相机:

(T^1,,T^N)(\hat{\mathbf{T}}_1,\dots,\hat{\mathbf{T}}_N)

只能在一个任意 similarity transformation 下确定。简单说:

整体旋转、整体平移、整体缩放之后,
相对几何关系仍然是同一个场景。

所以 π³ 不直接监督每个相机的绝对 pose,而是监督相对位姿。

从 view jj 到 view ii 的预测相对位姿为:

T^ij=T^i1T^j\hat{\mathbf{T}}_{i\leftarrow j} = \hat{\mathbf{T}}_i^{-1} \hat{\mathbf{T}}_j

camera loss 对所有 ordered view pairs 求平均:

Lcam=1N(N1)ij(Lrot(i,j)+λtransLtrans(i,j))\mathcal{L}_{cam} = \frac{1}{N(N-1)} \sum_{i\neq j} \left( \mathcal{L}_{rot}(i,j) + \lambda_{trans}\mathcal{L}_{trans}(i,j) \right)

rotation loss 使用 geodesic angle:

Lrot(i,j)=arccos(Tr((Rij)R^ij)12)\mathcal{L}_{rot}(i,j) = \arccos \left( \frac{ \mathrm{Tr} \left( (\mathbf{R}_{i\leftarrow j})^\top \hat{\mathbf{R}}_{i\leftarrow j} \right) -1 }{2} \right)

translation loss 使用 Huber loss:

Ltrans(i,j)=Hδ(st^ijtij)\mathcal{L}_{trans}(i,j) = \mathcal{H}_\delta \left( s^*\hat{\mathbf{t}}_{i\leftarrow j} - \mathbf{t}_{i\leftarrow j} \right)

注意这里也用了同一个 ss^* 来修正 translation 尺度。

π³ 训练目标重绘示意图

图源说明:根据 π³ 论文的 scale-invariant pointmap、relative pose 和 total loss 描述重绘,非论文原图。

⭐ 为什么不用绝对 pose loss,而用所有两两相对 pose?

假设模型输出的一组相机 pose 是:

T^1,,T^N\hat{\mathbf{T}}_1,\dots,\hat{\mathbf{T}}_N

如果把所有相机整体乘上同一个刚体变换:

G\mathbf{G}

场景相对关系其实没有改变。

这和 SfM 里常见的 gauge freedom 一样:世界坐标原点放在哪里、整体朝哪个方向,本身不是由图像唯一决定的。

如果强行监督绝对 pose:

模型必须猜出某个任意世界坐标系;
这个世界坐标系通常来自 reference view 或数据集标注;
输入顺序变化时,监督目标也可能跟着变得不自然。

相对位姿更合理:

T^ij=T^i1T^j\hat{\mathbf{T}}_{i\leftarrow j} = \hat{\mathbf{T}}_i^{-1} \hat{\mathbf{T}}_j

它只关心:

相机 i 和相机 j 之间怎么运动;
不关心整个场景放在世界坐标哪里。

所以它天然更适合 reference-free / permutation-equivariant 的建模方式。

总 loss

最终训练目标:

L=Lpoints+λnormalLnormal+λconfLconf+λcamLcam\mathcal{L} = \mathcal{L}_{points} + \lambda_{normal}\mathcal{L}_{normal} + \lambda_{conf}\mathcal{L}_{conf} + \lambda_{cam}\mathcal{L}_{cam}

论文附录中给出的权重:

权重
λnormal\lambda_{normal}1.0
λconf\lambda_{conf}0.05
λcam\lambda_{cam}0.1
λtrans\lambda_{trans}100.0

训练细节:

  • 两阶段训练。
  • 第一阶段分辨率 224×224224\times224
  • 第二阶段使用随机分辨率,总像素数在 100k 到 255k 之间,宽高比范围 [0.5,2.0][0.5,2.0]
  • 每个 batch 包含 2 到 24 张图。
  • encoder 和 alternating attention 从预训练 VGGT 初始化。
  • encoder 在训练中冻结。
  • 使用 16 张 A100 训练第一阶段,64 张 A100 训练第二阶段。
  • 优化器学习率 5×1055\times10^{-5}
  • 使用 OneCycleLR
  • gradient clipping norm 为 1.0。

和 DUSt3R / MASt3R / VGGT 的关系

方法核心思想是否依赖 reference view输出重点
DUSt3R两图 pointmap regression是,通常锚定第 1 图pairwise pointmaps
MASt3R3D-grounded dense matching是,继承 DUSt3R pairwise 坐标pointmaps + dense descriptors
VGGT多图 feed-forward geometry是,第一帧是 referencecameras + depth + point maps + tracks
π³reference-free permutation-equivariant geometrylocal pointmaps + relative cameras + confidence

一个简化记忆:

DUSt3R:两图共同坐标系 pointmap。
MASt3R:把 DUSt3R 变成强 matching engine。
VGGT:多图一次前向输出多种几何属性。
π³:去掉 reference view,让多图几何对输入顺序稳定。
⭐ π³ 和 VGGT 最大区别是什么?

VGGT 已经可以输入多张图,并且也使用 alternating attention。

但 VGGT 仍然把第一帧当作规范参考系:

第一帧定义 world frame;
其他相机和 point maps 都相对第一帧表达。

这让模型输出容易受第一帧影响。

π³ 的改变是:

每张图输出自己的 local pointmap;
camera pose 用相对关系监督;
不引入表示 reference view 的特殊 token;
不靠 frame index embedding 绑定顺序。

因此输入顺序变化时,π³ 理论上只会让输出顺序跟着变化,而不会改变每张图对应的几何含义。

这就是它标题里的 permutation-equivariant。

实验结论

Camera pose estimation

论文在 RealEstate10K、CO3Dv2、Sintel、TUM-dynamics、ScanNet 上评估相机位姿。

部分关键结果:

数据集 / 指标VGGTπ³
RealEstate10K AUC77.6285.90
CO3Dv2 AUC88.5988.41
Sintel ATE0.1670.074
TUM-dynamics RPE-t0.0100.009
ScanNet ATE0.0350.031

论文特别强调:在 zero-shot generalization 的 Sintel 和 RealEstate10K 上,π³ 提升明显。

Video depth estimation

视频深度估计中,π³ 同时有较好的精度和速度。

方法参数量Sintel Abs RelBonn Abs RelKITTI Abs RelFPS
DUSt3R571M0.6620.1510.1431.25
MASt3R689M0.5580.1880.1151.01
VGGT1.26B0.2990.0570.06243.2
π³959M0.2330.0490.03857.4

这里可以看到 π³ 比 VGGT 参数更少,FPS 更高,同时视频深度指标更好。

Pointmap reconstruction

论文在 7-Scenes、NRGBD、DTU、ETH3D 等数据集上评估 pointmap reconstruction。它使用 Umeyama 做粗 Sim(3) alignment,再用 ICP refine,然后比较 Acc.、Comp. 和 Normal Consistency。

结论是:π³ 在不同类型数据上都比较稳,尤其在跨场景、跨尺度、稀疏/密集视角条件下表现强。

输入顺序鲁棒性

这是 π³ 最核心的实验。

做法:

同一个 N 帧序列;
构造 N 种输入顺序;
每次让不同帧排在第一位;
计算重建指标的标准差。

如果模型真的不依赖 reference view,标准差应该很小。

结果中 π³ 明显更稳定:

DTU Acc mean std:VGGT 0.033,π³ 0.003
ETH3D Acc mean std:VGGT 0.049,π³ 0.000

这正好验证了论文主张:reference-free design 不只是理论更漂亮,实际输出也更稳定。

Ablation:两个关键组件是否有用

论文定义了两个 ablated models:

  • Model 1:没有 affine-invariant camera pose,也没有 scale-invariant pointmap。
  • Model 2:有 scale-invariant pointmap,但没有 affine-invariant camera pose。
  • Full Model:两者都有。

部分结果:

模型ETH3D Acc meanETH3D Comp meanETH3D N.C. mean
Model 10.2290.1660.802
Model 20.1970.1180.820
Full Model0.1310.0790.841

论文的解释是:

scale-invariant pointmap 对户外/大尺度数据帮助更明显;
affine-invariant camera pose 能稳定提升结果;
更关键的是,它让完整模型具备 permutation-equivariance。

我认为最关键的理解

π³ 的重点不是又提出了一个更复杂的网络头,而是重新定义了 feed-forward visual geometry 的坐标表达方式。

传统思路:

先选 reference view;
再把所有几何写进这个 reference frame。

π³ 思路:

不选 reference view;
每张图输出自己的 local geometry;
用相对 pose 和统一尺度把它们约束起来。

这对你现在学习 pointmap / 多视角几何很重要,因为它指出:

“世界坐标系”很多时候只是人为规范,并不是图像本身唯一决定的物理事实。

在传统 SfM 里,这叫 gauge freedom;在神经网络里,如果处理不好,就会变成 reference-view bias。

⭐ 这是不是意味着 π³ 完全不需要全局坐标系?

训练和网络输出设计上,它不需要指定某一张图作为全局 reference。

但如果后续要做可视化、融合、导出点云,最终仍然通常要选择一个坐标系来展示结果。

区别在于:

reference-view 方法:
坐标系在网络预测阶段就被固定为第 1 帧。

π³:
网络先预测 reference-free 的 local geometry 和相对关系;
需要展示或融合时,再通过 Sim(3) alignment / pose composition 选择一个外部坐标系。

所以不是“没有坐标系”,而是:

不把任意输入顺序中的第一帧硬编码为模型的几何锚点。

读完后应该记住的公式

Permutation equivariance:

ϕ(Pπ(S))=Pπ(ϕ(S))\phi(P_\pi(S)) = P_\pi(\phi(S))

网络输出:

ϕ(S)=((T1,,TN),(X1,,XN),(C1,,CN))\phi(S) = \left( (\mathbf{T}_1,\dots,\mathbf{T}_N), (\mathbf{X}_1,\dots,\mathbf{X}_N), (\mathbf{C}_1,\dots,\mathbf{C}_N) \right)

统一尺度:

s=argminsi=1Nj=1H×W1zi,jsx^i,jxi,j1s^* = \arg\min_s \sum_{i=1}^{N} \sum_{j=1}^{H\times W} \frac{1}{z_{i,j}} \left\Vert s\hat{\mathbf{x}}_{i,j} - \mathbf{x}_{i,j} \right\Vert_1

相对位姿:

T^ij=T^i1T^j\hat{\mathbf{T}}_{i\leftarrow j} = \hat{\mathbf{T}}_i^{-1} \hat{\mathbf{T}}_j

总损失:

L=Lpoints+λnormalLnormal+λconfLconf+λcamLcam\mathcal{L} = \mathcal{L}_{points} + \lambda_{normal}\mathcal{L}_{normal} + \lambda_{conf}\mathcal{L}_{conf} + \lambda_{cam}\mathcal{L}_{cam}

个人总结

如果把 DUSt3R、MASt3R、VGGT、π³ 连起来看:

DUSt3R 证明 pointmap regression 能绕开传统几何长链条。
MASt3R 证明 3D-grounded representation 能提升 image matching。
VGGT 证明多图 feed-forward transformer 能直接输出一组 3D 属性。
π³ 进一步指出:多图模型不应该被任意 reference view 绑定。

π³ 最值得记住的一点是:

输入图像集合本身没有天然第 1 帧;
模型结构也不应该强行制造一个第 1 帧的几何特权。