π³: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 会输出:
也就是两张图的 pointmap 都表达在第 1 张图的相机坐标系里。
VGGT 也把第一帧当作 reference frame,输出相机和 point maps 时默认第一帧定义世界坐标。
π³ 认为这会带来一个不必要的 inductive bias:
如果第一帧选得好,结果可能很好;
如果第一帧视角差、遮挡多、模糊、信息少,整体重建就可能被拖垮。
这篇论文的目标是:
去掉固定 reference view,让模型对输入图像顺序真正 permutation-equivariant。
图源说明:根据 π³ 论文对 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
输入是一组图像:
网络:
输出每张图对应的 camera pose、pointmap 和 confidence:
其中:
- :第 张图对应的相机位姿。
- :第 张图的 pixel-aligned 3D pointmap。
- :第 张图的 confidence map。
如果对输入顺序做一个排列:
permutation-equivariant 要求:
也就是说:
输入图像顺序变了;
输出顺序也跟着同样变化;
但每张图对应的几何结果不应该本质改变。
⭐ permutation-invariant 和 permutation-equivariant 有什么区别?
Permutation-invariant 是:
输入顺序改变,输出完全不变。
典型例子是分类一个点云:
点的顺序换了,类别仍然是 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₂
这就是:
为什么 reference view 是问题
reference-view 方法通常会把某一帧当成世界坐标系:
选第 1 帧
-> 所有相机 pose 相对于第 1 帧
-> 所有 pointmaps 表达到第 1 帧坐标系
这在数学上可行,但对神经网络有风险。
如果 reference view:
- 视角很偏;
- 纹理很少;
- 被遮挡;
- 运动模糊;
- 只看到场景的一小部分;
那么其他帧的几何都要绕着这个不理想参考系表达,模型更容易不稳定。
π³ 的实验专门测试了这个问题:在 DTU 和 ETH3D 上,把输入序列循环重排,让不同帧成为第一帧,然后看重建指标的标准差。π³ 的标准差接近 0,而 VGGT 仍有明显波动。
论文报告的例子:
| 数据集 | 指标 | VGGT std | π³ std |
|---|---|---|---|
| DTU | Acc. mean std | 0.033 | 0.003 |
| DTU | Comp. mean std | 0.054 | 0.006 |
| ETH3D | Acc. mean std | 0.049 | 0.000 |
| ETH3D | Comp. mean std | 0.062 | 0.000 |
这说明 π³ 的输出对输入顺序更稳定。
模型架构
π³ 的整体结构和 VGGT 一样都使用 alternating attention,但去掉会指定顺序或 reference 的设计。
图源说明:根据 π³ 论文方法和附录架构描述重绘,非论文原图。
流程:
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 转为 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:
它被定义在第 张图自己的相机坐标系中,而不是某个全局 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 共享一个未知场景尺度:
训练时先求一个最优尺度:
其中:
- :第 张图第 个像素预测的 3D 点。
- :对应 ground-truth 3D 点。
- :ground-truth depth,也就是 的 z 分量。
- :depth weighting,避免远处点因为绝对距离大而支配 loss。
然后 point reconstruction loss 是:
⭐ 为什么要先求一个统一尺度 s*?
因为模型输出的是 local pointmap,而不是带绝对单位的确定世界坐标。
如果同一个场景整体放大 2 倍:
很多相对几何关系其实不变:
表面形状不变;
点之间相对位置比例不变;
相机轨迹形状不变;
只是尺度单位变了。
如果直接用:
模型会被迫学习绝对尺度。但很多图像集合本身没有可靠绝对尺度,或者尺度由数据集标注方式决定。
所以 π³ 先找一个全场景共享的最优尺度:
再比较:
和 ground truth。
这样 loss 关注的是:
形状是否对;
不同 view 的尺度是否一致;
局部几何是否稳定;
而不是任意参考系下的绝对大小。
Normal loss 与 confidence loss
π³ 还加入 normal loss 来鼓励局部表面光滑。
对于 pointmap 上某个像素,使用相邻像素形成的两个方向向量做叉乘,可以估计法向:
然后和真值法向比较角度:
confidence map:
用 BCE 监督。论文把每个点是否可靠转成二分类:如果 scale-aligned 后的 L1 reconstruction error 小于阈值 ,标签为 1,否则为 0。
Affine-invariant camera pose
由于没有固定 global reference frame,预测相机:
只能在一个任意 similarity transformation 下确定。简单说:
整体旋转、整体平移、整体缩放之后,
相对几何关系仍然是同一个场景。
所以 π³ 不直接监督每个相机的绝对 pose,而是监督相对位姿。
从 view 到 view 的预测相对位姿为:
camera loss 对所有 ordered view pairs 求平均:
rotation loss 使用 geodesic angle:
translation loss 使用 Huber loss:
注意这里也用了同一个 来修正 translation 尺度。
图源说明:根据 π³ 论文的 scale-invariant pointmap、relative pose 和 total loss 描述重绘,非论文原图。
⭐ 为什么不用绝对 pose loss,而用所有两两相对 pose?
假设模型输出的一组相机 pose 是:
如果把所有相机整体乘上同一个刚体变换:
场景相对关系其实没有改变。
这和 SfM 里常见的 gauge freedom 一样:世界坐标原点放在哪里、整体朝哪个方向,本身不是由图像唯一决定的。
如果强行监督绝对 pose:
模型必须猜出某个任意世界坐标系;
这个世界坐标系通常来自 reference view 或数据集标注;
输入顺序变化时,监督目标也可能跟着变得不自然。
相对位姿更合理:
它只关心:
相机 i 和相机 j 之间怎么运动;
不关心整个场景放在世界坐标哪里。
所以它天然更适合 reference-free / permutation-equivariant 的建模方式。
总 loss
最终训练目标:
论文附录中给出的权重:
| 项 | 权重 |
|---|---|
| 1.0 | |
| 0.05 | |
| 0.1 | |
| 100.0 |
训练细节:
- 两阶段训练。
- 第一阶段分辨率 。
- 第二阶段使用随机分辨率,总像素数在 100k 到 255k 之间,宽高比范围 。
- 每个 batch 包含 2 到 24 张图。
- encoder 和 alternating attention 从预训练 VGGT 初始化。
- encoder 在训练中冻结。
- 使用 16 张 A100 训练第一阶段,64 张 A100 训练第二阶段。
- 优化器学习率 。
- 使用
OneCycleLR。 - gradient clipping norm 为 1.0。
和 DUSt3R / MASt3R / VGGT 的关系
| 方法 | 核心思想 | 是否依赖 reference view | 输出重点 |
|---|---|---|---|
| DUSt3R | 两图 pointmap regression | 是,通常锚定第 1 图 | pairwise pointmaps |
| MASt3R | 3D-grounded dense matching | 是,继承 DUSt3R pairwise 坐标 | pointmaps + dense descriptors |
| VGGT | 多图 feed-forward geometry | 是,第一帧是 reference | cameras + depth + point maps + tracks |
| π³ | reference-free permutation-equivariant geometry | 否 | local 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 AUC | 77.62 | 85.90 |
| CO3Dv2 AUC | 88.59 | 88.41 |
| Sintel ATE | 0.167 | 0.074 |
| TUM-dynamics RPE-t | 0.010 | 0.009 |
| ScanNet ATE | 0.035 | 0.031 |
论文特别强调:在 zero-shot generalization 的 Sintel 和 RealEstate10K 上,π³ 提升明显。
Video depth estimation
视频深度估计中,π³ 同时有较好的精度和速度。
| 方法 | 参数量 | Sintel Abs Rel | Bonn Abs Rel | KITTI Abs Rel | FPS |
|---|---|---|---|---|---|
| DUSt3R | 571M | 0.662 | 0.151 | 0.143 | 1.25 |
| MASt3R | 689M | 0.558 | 0.188 | 0.115 | 1.01 |
| VGGT | 1.26B | 0.299 | 0.057 | 0.062 | 43.2 |
| π³ | 959M | 0.233 | 0.049 | 0.038 | 57.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 mean | ETH3D Comp mean | ETH3D N.C. mean |
|---|---|---|---|
| Model 1 | 0.229 | 0.166 | 0.802 |
| Model 2 | 0.197 | 0.118 | 0.820 |
| Full Model | 0.131 | 0.079 | 0.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:
网络输出:
统一尺度:
相对位姿:
总损失:
个人总结
如果把 DUSt3R、MASt3R、VGGT、π³ 连起来看:
DUSt3R 证明 pointmap regression 能绕开传统几何长链条。
MASt3R 证明 3D-grounded representation 能提升 image matching。
VGGT 证明多图 feed-forward transformer 能直接输出一组 3D 属性。
π³ 进一步指出:多图模型不应该被任意 reference view 绑定。
π³ 最值得记住的一点是:
输入图像集合本身没有天然第 1 帧;
模型结构也不应该强行制造一个第 1 帧的几何特权。