跳转至

WAFT-Stereo: Warping-Alone Field Transforms for Stereo Matching

会议: ECCV2026
论文: ECCV 原文
代码: https://github.com/princeton-vl/WAFT-Stereo
领域: 3D 视觉
关键词: 立体匹配、特征变形、视差分类、循环细化、零样本泛化

一句话总结

WAFT-Stereo 用一次视差分类初始化和高分辨率特征变形驱动的循环回归取代代价体,在纯合成数据训练下取得 ETH3D BP-0.5-noc 0.89%,并以 DAv2-L、5 次迭代在 L40 上处理 540p 输入耗时 106 ms。

研究背景与动机

立体匹配从经过校正的左右图像估计水平视差,再由相机标定把视差转成深度。RAFT-Stereo、FoundationStereo 等方法通常先构建左右特征的代价体,再查询候选匹配并循环更新视差。代价体需要保留多个候选位置的信息,其开销随视差范围或局部查询窗口增大,因此常在原图的 1/4 分辨率上处理,细小结构却可能恰好在这一过程中丢失。

光流模型 WAFT 已经表明,可以按当前位移把目标特征变形到参考坐标系,直接拼接特征交给网络,而不显式计算候选匹配代价。但直接把二维光流输出改成一维视差并不够:相邻视频帧的位移通常较小,高分辨率双目图像却经常相差数百像素。从零开始反复回归残差,可能让大视差像素陷入错误估计,增加迭代也难以修正。

本文并不否定分类式匹配初始化,而是将其与代价体解绑:先预测离散视差概率以建立粗对应,再让变形后的特征支持连续残差修正。核心 idea:分类负责大范围定位,回归负责精细修正;二者都可以使用通用网络和特征变形,不必依赖代价体。

方法详解

整体框架

输入是校正后的双目图像,输出是左图每个像素的连续视差。图 3 的流程先由 LoRA 特征编码提取左右特征,再做一次分类初始化,最后重复执行变形循环细化;主模型的 5 次迭代包含 1 次分类和 4 次回归,不是 5 次回归之外再加分类。

分类模块与循环更新器采用相同的 ViT-S + DPT 架构形式,但论文没有声称二者共享权重。分类头给出全范围粗估计,回归阶段维护隐状态,并根据最新视差重新对齐右图特征。

%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
Input["校正后的左右图像"] --> Encoder["LoRA 特征编码"]
Encoder --> Classifier["分类初始化"]
Encoder --> Refiner["变形循环细化"]
Classifier --> Refiner
Refiner -->|更新视差与隐状态| Refiner
Refiner --> Output["全分辨率视差"]

关键设计

1. LoRA 特征编码:适配预训练表征而不附加侧路 U-Net

WAFT 原先用一个小型 U-Net 适配预训练编码器,WAFT-Stereo 则冻结主干权重,用秩为 8 的 LoRA 进行任务适配,并训练一个 DPT 头把低分辨率特征上采样。这样去掉侧路 U-Net 的延迟,同时保留预训练视觉表征。正式基准提交使用 DepthAnythingV2-L,较快版本采用 DepthAnythingV2-S 或 B。

左右特征在原图 1/2 分辨率上进行变形,而不是先生成 1/4 分辨率代价体。这里的高分辨率针对匹配信息的访问位置,不意味着所有 Transformer 层都直接处理半分辨率像素;后面的更新器仍会使用 patch 化控制计算量。

2. 分类初始化:先覆盖大视差,再交给回归修正

分类头预测预设视差位置上的概率。默认共有 \(B=40\) 个位置,最大视差 \(D_{\max}=800\),候选从 0 到最大值均匀排布。训练目标不是只把最近的候选标成 1,而是根据真值与各候选的距离构造软分布,再用软交叉熵监督。这保留了视差轴上的邻近关系,减少粗离散标签带来的突变。

预测概率经过 soft-argmax 得到连续初值,随后才进行回归阶段的第一次特征变形。将原文 §3.3 中排版破损的求和关系按正文定义整理为:

\[ d_0=\sum_{i=0}^{B-1}\left(i\frac{D_{\max}}{B-1}\right)P_i. \]

这个初值不要求一开始就达到亚像素精度,而是避免大视差位置彻底找错。§3.2 中,ETH3D 训练集视差超过 40 px 的像素,分类首步 EPE 为 0.89 px,纯回归首步为 1.11 px;超过 50 px 时分别为 1.80 和 2.88 px。作者也说明,纯回归的首步平均误差可能较低,但少量大位移错误会持续存在。

分类不是代价体的别名。这里由通用 ViT-S + DPT 模块直接预测概率,并没有先枚举所有左右特征对再形成相关性张量。表 5 将初始化改为代价体分类后没有获得更好的结果,支持“分类形式本身有价值”的解释。

3. 变形循环细化:在当前对应位置读取特征,并保留局部细节

每轮根据当前视差对右图特征进行反向变形,通过双线性采样读取其对应位置,再与左图特征及隐状态一起送入更新器。它不显式输出匹配代价,而是把已对齐和未对齐的特征关系交给网络解释;得到新的视差后,再次采样。图 4 的关键区别在于读取一个当前对应位置的特征,而非维护一整组候选匹配代价。

变形算子的计算和存储随空间分辨率线性增长,不再乘以视差搜索范围。这个性质只针对变形算子,不能扩大解释成整个网络或分类头都与候选数无关。大视差是否能被可靠定位,仍取决于初始化、训练分布和后续更新器。

循环更新器使用 ViT-S 加 DPT,进入 ViT 前采用 \(8\times8\) patch 化。为避免低分辨率处理抹掉边界和细结构,作者把 WAFT 的高分辨率隐状态跳连替换为 4 个 ResNet 块。MLP 从隐状态预测回归所需的混合拉普拉斯分布参数;分类概率和回归输出相关参数通过凸上采样恢复到输入分辨率。

这种组合不是只靠加大主干提高精度:表 5 在相同 DAv2-S 主干下分别验证分类初始化、高分辨率块和回归损失。变形负责访问匹配信息,高分辨率块负责保留细节,回归目标则负责训练连续更新,三者作用不同。

损失函数 / 训练策略

初始分类用软交叉熵,后续回归使用混合拉普拉斯损失(Mixture-of-Laplace,MoL)。它不是直接用 L1 惩罚一个点预测,而是让预测分布参与监督;缓存没有提供 MoL 的完整参数化,也没有给出折扣系数的具体数值,因此不补写这些超参数。总目标为分类损失加按迭代折扣的回归损失,下面按 §3.3 的文字和求和项整理记号:

\[ L_{\mathrm{total}}=L_{\mathrm{cls}}+\sum_{i=1}^{T-1}\gamma^{T-i}L_{\mathrm{MoL}}^{i}. \]

其中 \(T\) 包含第一次分类,\(\gamma\) 为折扣系数。主模型用约 770 万对 SynLarge 合成双目图像训练,来源包括 SceneFlow、FallingThings、FSD、TartanAir、TartanGround、Spring、CREStereo、Sintel、Virtual KITTI 2、UnrealStereo4K、WMGStereo 和 HR-VS。训练使用 480p 随机裁剪、batch size 32、学习率 \(5\times10^{-4}\)、400k 步,以及 AdamW 和 OneCycle 调度。

ETH3D 提交直接使用纯合成训练的模型。KITTI 微调使用 \(372\times1240\) 裁剪、batch size 16、学习率 \(10^{-4}\) 和 3k 步。Middlebury 则混合真实与合成数据微调,使用 \(540\times960\) 裁剪、batch size 16、学习率 \(2\times10^{-4}\) 和 50k 步,不能将其结果称为零样本。

实验关键数据

主实验

BP-X 是误差超过 X 像素的像素百分比;D1 同时要求绝对误差超过 3 px、相对误差超过真值的 5%;RMSE 为均方根误差。noc 只统计非遮挡像素,all 统计全部评测像素,所有下列指标越低越好。

数据集与原表 训练口径及指标 WAFT-Stereo DAv2-L, 5 对照方法 对照值
ETH3D test,表 1 零样本,BP-0.5-noc (%) 0.89 FoundationStereo,零样本 2.31
ETH3D test,表 1 零样本,BP-1-noc (%) 0.28 FoundationStereo,零样本 1.52
KITTI-2012 test,表 2 微调,BP-2-all (%) 1.47 MonSter++,微调 1.70
KITTI-2015 test,表 2 微调,D1-all (%) 1.28 MonSter++,微调 1.37
KITTI-2015 test,表 2 零样本,D1-all (%) 2.88 FoundationStereo,零样本 3.20
Middlebury test,表 3 微调,RMSE-all (px) 7.02 S2M2-XL 7.39
Middlebury test,表 3 微调,BP-2-all (%) 4.39 S2M2-XL 2.94

ETH3D 的 2.31 到 0.89 对应约 61% 相对误差下降,而 1.52 到 0.28 才对应约 81%;不能把摘要中的 81% 套到 BP-0.5 上。KITTI 零样本 D1-all 从 3.20 到 2.88 按表格计算下降 10%,原文另有“9%”表述;这里保留原始数值以免混淆统计口径。

消融实验

表 5 使用约 160 万对合成子集,训练 100k 步,最大视差改为 \(D_{\max}=320\);其余默认训练参数为 480p、batch size 32、学习率 \(5\times10^{-4}\)。结果来自 ETH3D 与 Middlebury-Q 的训练集零样本评测,不应与前表的测试集结果直接对比。

配置(原表 5) ETH3D BP-1-all (%) Middlebury-Q BP-2-all (%) MACs
DAv2-S,1 次分类 + 3 次回归,4 个高分辨率块,40 bins,MoL 1.48 4.62 560G
0 次分类 + 4 次回归 2.59 6.45 561G
4 次分类 + 0 次回归 66.8 26.1 560G
代价体分类初始化 + 3 次回归 1.53 4.74 561G
去掉高分辨率块 1.99 6.20 494G
5 bins 2.46 6.45 560G
L1 替换 MoL 2.44 6.39 560G
主干改为 DAv2-L,仍为 4 次总迭代 0.80 2.63 2172G

关键发现

  • 在几乎相同 MACs 下,分类加回归明显优于纯回归;纯分类又远弱于混合方案,说明粗定位与连续细化缺一不可。
  • 分类候选并非越多越好:原表 5 的 80 bins 在 ETH3D 上为 1.27%,但 Middlebury-Q 为 5.39%,不如默认 40 bins 的 4.62%。
  • 表 6 的效率测试统一为 540p、BF16、NVIDIA L40:DAv2-S/4 为 47 ms,DAv2-L/5 为 106 ms;FoundationStereo 为 708 ms,S2M2-XL 为 195 ms,BridgeDepth 为 51 ms。大模型不是最快方法,约 21 FPS 对应小模型。

亮点与洞察

  • 分类收益与代价体收益可以拆开验证。近乎等算力的代价体初始化变体没有超过直接分类,有助于避免把一种实现习惯误认为必要结构。
  • 半分辨率特征访问与 patch 化后的通用 Transformer 并不矛盾。高分辨率 ResNet 块补足局部细节,让几何信息访问和全局处理各自发挥作用。
  • 架构必须与数据覆盖联合评估。同一网络在多样合成数据上泛化较好,在单一合成数据上却可能严重失败,这比单独宣称“去掉代价体更好”更有启发。

局限与展望

  • 作者指出 Middlebury 的 Classroom2E 存在显著左右光照差异,明显拖累总体 BP-2。尽管 RMSE-all 最好,BP-2-all 仍为 4.39%,落后于 S2M2-XL 的 2.94%;不能宣称所有误差指标领先。
  • 表 4 中,仅用约 35k 对 SceneFlow 训练的 DAv2-S/4 在 ETH3D train 上 BP-1-all 达 71.0%,SynLarge 训练则为 0.86%。这暴露了数据偏差敏感性;同时主干不同的对照不能用于孤立归因架构优劣。
  • 作者的图 6 显示延迟随迭代次数近似线性增长,循环依赖限制并行度。更少迭代的更新器是明确方向,但 106 ms 的大模型结果本身不等于实时高速部署。
  • 从本文设置可推断,校正双目和预设分类范围仍是使用前提。更强的光照鲁棒特征、更广视差分布和自适应停止值得验证,但本文尚未给出相应实验。

相关工作与启发

  • WAFT:提供纯变形光流框架;本文针对双目大位移增加分类初值,并用 LoRA 和高分辨率 ResNet 块改变编码与更新结构,而非仅把输出改成一维。
  • RAFT-Stereo / FoundationStereo:用代价体查询驱动循环细化;本文保留迭代范式,替换的是匹配信息的获取方式,并不否认迭代更新本身。
  • BridgeDepth / S2M2:通过代价体上的分类或最优传输获得初始对应;本文证明直接分类也能提供有用初值,但 BridgeDepth 在表 6 中仍比本文大模型更快。
  • SEA-RAFT:提供 MoL 回归监督的相关基础;本文将其迁移到视差细化,并通过 L1 对照验证了收益。

评分

  • 新颖性: 4/5。创新在于将分类初始化与无代价体变形框架结合,核心组件本身多来自已有方法。
  • 实验充分度: 4/5。包含多基准、结构、训练数据与效率分析,但光照变化和小数据失败仍需更深入验证。
  • 写作质量: 4/5。框架清楚、消融有针对性,部分百分比表述需结合指标和表格仔细区分。
  • 价值: 5/5。对立体匹配是否必须使用代价体给出有竞争力的反例,同时公开代码和模型入口。