【PromptStereo】零样本立体匹配新范式:用结构与运动Prompt驱动迭代优化(CVPR 2026)
摘要
零样本(zero-shot)立体匹配的核心瓶颈在于迭代优化阶段:现有方法虽然利用了单目深度基础模型做特征提取和视差初始化,但GRU的有限表征能力无法充分利用这些先验。PromptStereo提出Prompt Recurrent Unit(PRU),直接继承Depth Anything V2的DPT解码器架构作为迭代优化器,并设计Structure Prompt和Motion Prompt两路提示信号引导优化方向。在SceneFlow单一数据集训练下,PromptStereo即在KITTI、Middlebury、ETH3D等多个基准上实现零样本SOTA,同时推理速度与RAFT-Stereo持平(0.36s),比MonSter快近一倍。
论文:PromptStereo: Zero-Shot Stereo Matching via Structure and Motion Prompts (CVPR 2026)
代码:Windsrain/PromptStereo
一、问题背景:GRU迭代优化的瓶颈
从RAFT-Stereo到IGEV再到MonSter,主流立体匹配管线遵循统一范式:
近期方法(MonSter、BridgeDepth)引入单目深度基础模型(Depth Anything V2)做特征提取器,显著提升了泛化性能。但关键问题在于:
| 阶段 | 利用了基础模型先验? | 现状 |
|---|---|---|
| 特征提取 | 是(ViT encoder) | 效果好 |
| 视差初始化 | 部分(单目深度做初始猜测) | 有帮助 |
| 迭代优化 | 否(从零训练GRU) | 瓶颈 |
核心矛盾:GRU的sigmoid门控将隐藏状态约束在[0,1]范围内,表征能力有限;且GRU从零训练,无法利用基础模型已学到的几何先验。
PromptStereo的洞察:为什么不直接用基础模型的解码器替代GRU做迭代优化?
二、核心方法
2.1 整体框架
图 1:PromptStereo整体架构。左侧为特征提取和代价体构建,中间为Affine-Invariant Fusion,右侧为PRU迭代优化模块。来源:[PromptStereo] GitHub
图 2:PromptStereo完整数据流。红色标注为核心创新点:PRU、Structure Prompt、Motion Prompt、AIF。重绘自 design skill
整体流程:
- 共享权重的ViT-L编码器(来自Depth Anything V2)提取左右图特征
- 构建Group-wise和All-pair两种相关代价体
- Affine-Invariant Fusion融合初始立体视差和单目深度
- PRU以Structure Prompt和Motion Prompt为引导,迭代优化视差
2.2 Affine-Invariant Fusion (AIF)
单目深度是相对值(尺度和偏移未知),不能直接与立体视差相加。AIF通过中值归一化对齐两者尺度:
d ^ = d − median ( d ) 1 N ∑ ∣ d − median ( d ) ∣ \hat{d} = \frac{d - \text{median}(d)}{\frac{1}{N}\sum|d - \text{median}(d)|}d^=N1∑∣d−median(d)∣d−median(d)
将单目深度投影到视差空间后,用置信度加权融合:
d F = c ⊙ d 0 + ( 1 − c ) ⊙ d M ′ d_F = c \odot d_0 + (1-c) \odot d'_MdF=c⊙d0+(1−c)⊙dM′
其中c cc为学习的置信度图,d 0 d_0d0为初始立体视差,d M ′ d'_MdM′为尺度对齐后的单目深度。
2.3 Prompt Recurrent Unit (PRU)
PRU是本文核心创新,直接继承DPT解码器的预训练权重替代GRU:
为什么不用GRU?
| 对比维度 | GRU | PRU (DPT Decoder) |
|---|---|---|
| 初始化 | 随机 | Depth Anything V2预训练 |
| 隐藏状态范围 | sigmoid约束[0,1] | 无约束,自由范围 |
| 分辨率 | 单分辨率 | 多分辨率(1/8→1/4→1/2→full) |
| 几何先验 | 无 | 丰富的单目深度先验 |
| 收敛速度 | 32次迭代 | 4次迭代即达高精度 |
PRU更新机制(多分辨率):
z k = σ ( ConvBlock ( [ h k i , h k i − 1 ] ) ) z_k = \sigma(\text{ConvBlock}([h_k^i, h_k^{i-1}]))zk=σ(ConvBlock([hki,hki−1]))
h k + 1 i = ( 1 − z k ) ⊙ h k i + z k ⊙ h ^ k i h_{k+1}^i = (1-z_k) \odot h_k^i + z_k \odot \hat{h}_k^ihk+1i=(1−zk)⊙hki+zk⊙h^ki
d k + 1 = d k + ConvBlock ( h k + 1 0 ) d_{k+1} = d_k + \text{ConvBlock}(h_{k+1}^0)dk+1=dk+ConvBlock(hk+10)
关键设计:Prompt仅注入到最高分辨率层h k 0 h_k^0hk0,低分辨率层保持DPT原始行为。
2.4 Structure Prompt (SP)
捕捉立体视差和单目深度之间的几何差异:
D = ∣ d ^ k − d ^ M ∣ D = |\hat{d}_k - \hat{d}_M|D=∣d^k−d^M∣
P S = Encoder ( F M , D ) , h = h + ConvBlock ( P S ) P_S = \text{Encoder}(F_M, D), \quad h = h + \text{ConvBlock}(P_S)PS=Encoder(FM,D),h=h+ConvBlock(PS)
直觉:哪里立体和单目"意见不一致",哪里就是优化需要重点关注的区域(如透明物体、反射表面)。使用仿射不变归一化确保比较不受尺度影响。
2.5 Motion Prompt (MP)
编码立体特有的运动信息(GRU方法也有类似输入,但PRU以Prompt方式注入):
P M k = Encoder ( V k , d k ) , h = h + ConvBlock ( P M k ) P_M^k = \text{Encoder}(V_k, d_k), \quad h = h + \text{ConvBlock}(P_M^k)PMk=Encoder(Vk,dk),h=h+ConvBlock(PMk)
其中V k V_kVk为以当前视差为中心的局部代价体。
关键设计选择:两个Prompt都通过残差加法注入(而非拼接或替换),不破坏DPT解码器继承的先验。
|d_k - d_M| 几何差异] -----------------------^ Expecting 'SQE', 'TAGEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PIPE'
2.6 训练损失
L = ∥ d 0 − d g t ∥ smooth + ∑ k = 1 K γ K − k ∥ d k − d g t ∥ 1 \mathcal{L} = \|d_0 - d_{gt}\|_{\text{smooth}} + \sum_{k=1}^{K} \gamma^{K-k} \|d_k - d_{gt}\|_1L=∥d0−dgt∥smooth+k=1∑KγK−k∥dk−dgt∥1
初始视差用Smooth L1损失,迭代输出用L1损失加指数衰减权重(γ = 0.9 \gamma=0.9γ=0.9),越后面的迭代权重越大。
三、工程实现
| 组件 | 技术细节 |
|---|---|
| 编码器 | ViT-Large (Depth Anything V2, frozen) |
| 解码器 | DPT decoder (pre-trained, 可训练) |
| 训练数据 | SceneFlow (基础) / +FoundationStereo+TartanAir+CREStereo (Unlimited) |
| 输入分辨率 | 192 或 576 高度 |
| 推理速度 | 0.36s (与RAFT-Stereo持平) |
| 框架 | PyTorch + xformers |
| 代码仓库 | Windsrain/PromptStereo |
四、实验分析
零样本泛化性能(SceneFlow训练)
| 方法 | KITTI’12 Bad3 | KITTI’15 Bad3 | Midd-T Bad2 | Midd-2021 Bad2 | ETH3D Bad1 | 速度 |
|---|---|---|---|---|---|---|
| RAFT-Stereo | 4.34 | 5.68 | 11.07 | 11.11 | 2.61 | 0.36s |
| IGEV-Stereo | 5.13 | 6.03 | 9.95 | 10.00 | 4.05 | 0.37s |
| MonSter | 4.62 | 5.52 | 8.97 | 15.55 | 3.20 | 0.64s |
| DEFOM-Stereo | 3.90 | 4.99 | 6.77 | 8.62 | 2.40 | - |
| PromptStereo | 3.77 | 4.59 | 6.03 | 8.26 | 1.56 | 0.36s |
PromptStereo在仅用SceneFlow训练的条件下,全面超越所有同条件方法,尤其在ETH3D上(1.56 vs 2.40)和Middlebury-T上(6.03 vs 6.77)优势明显。
Unlimited训练数据对比
| 方法 | Midd-2021 Bad2 | Booster-Sunny Bad2 | 速度 |
|---|---|---|---|
| FoundationStereo | 7.14 | 5.15 | 0.65s |
| MonSter | 12.43 | 11.55 | 0.64s |
| BridgeDepth | 13.66 | 11.25 | - |
| PromptStereo | 5.97 | 3.67 | 0.36s |
Middlebury-2021上比FoundationStereo低16%错误率;Booster-Sunny上低29%——透明/反射表面处优势巨大。
消融实验
| 配置 | MP | SP | AIF | Midd-T Bad2 | ETH3D Bad1 | 速度 |
|---|---|---|---|---|---|---|
| Baseline (MonSter) | - | - | - | 7.27 | 2.86 | 0.64s |
| PRU + MP | ✓ | - | - | 4.18 | 1.38 | 0.35s |
| PRU + MP + SP | ✓ | ✓ | - | 3.90 | 1.35 | 0.36s |
| PromptStereo | ✓ | ✓ | ✓ | 3.76 | 1.30 | 0.36s |
PRU本身带来最大提升(7.27→4.18),SP和AIF各贡献增量改进。
PRU通用性验证
PRU不仅适用于MonSter,也能提升RAFT-Stereo和IGEV:
| 方法 | KITTI’15 Bad3 | Midd-T Bad2 | ETH3D Bad1 |
|---|---|---|---|
| RAFT-Stereo | 5.68 | 8.41 | 2.29 |
| Prompt-RAFT | 4.78 | 6.39 | 1.49 |
| IGEV-Stereo | 6.03 | 7.04 | 3.61 |
| Prompt-IGEV | 4.84 | 6.50 | 2.21 |
作为即插即用模块,PRU对所有GRU-based方法都有显著提升。
收敛速度对比
图 3:PRU vs GRU收敛曲线。PRU在4次迭代时已达到GRU 32次迭代才能达到的精度水平,最终精度差距达67%。重绘自 design skill
| 迭代次数 | MonSter (Midd-2021) | PromptStereo (Midd-2021) |
|---|---|---|
| 4 | 10.75 | 4.35 |
| 8 | 10.64 | 3.28 |
| 16 | 9.61 | 2.79 |
| 32 | 8.46 | 2.78 |
PRU在4次迭代(4.35)即优于MonSter 32次迭代(8.46)。
小结
核心贡献:
- PRU:用基础模型解码器替代GRU做迭代优化,这个思路简洁而有效——不是设计更复杂的模块,而是直接"继承"已有知识
- 双Prompt机制:Structure Prompt抓单目-立体差异区域,Motion Prompt编码立体运动信息,两者通过残差注入不破坏继承先验
- AIF:仿射不变融合解决了单目深度的尺度模糊问题
局限性:
- 依赖Depth Anything V2的ViT-L,参数量和显存需求大
- 在KITTI等小视差场景上优势不如大视差场景明显
- Unlimited训练需要多个大规模合成数据集
个人判断:PromptStereo的PRU思路代表了一个重要趋势——将基础模型的知识从"特征提取"扩展到"迭代优化"。传统方法把GRU当作黑盒优化器从零训练,浪费了大量基础模型已学到的几何理解。PRU证明了"站在巨人肩膀上做优化"比"自己重新学优化"高效得多。这一范式有望推广到光流估计、场景流等其他稠密匹配任务。
