立体匹配深度估计零样本泛化Depth AnythingCVPR 2026Transformer## 摘要
零样本(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)
一、问题背景:GRU迭代优化的瓶颈
从RAFT-Stereo到IGEV再到MonSter,主流立体匹配管线遵循统一范式:
#mermaid-svg-0DkH4mXmDNssPpzb{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0DkH4mXmDNssPpzb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0DkH4mXmDNssPpzb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0DkH4mXmDNssPpzb .error-icon{fill:#552222;}#mermaid-svg-0DkH4mXmDNssPpzb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0DkH4mXmDNssPpzb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0DkH4mXmDNssPpzb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0DkH4mXmDNssPpzb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0DkH4mXmDNssPpzb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0DkH4mXmDNssPpzb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0DkH4mXmDNssPpzb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0DkH4mXmDNssPpzb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0DkH4mXmDNssPpzb .marker.cross{stroke:#333333;}#mermaid-svg-0DkH4mXmDNssPpzb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0DkH4mXmDNssPpzb p{margin:0;}#mermaid-svg-0DkH4mXmDNssPpzb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0DkH4mXmDNssPpzb .cluster-label text{fill:#333;}#mermaid-svg-0DkH4mXmDNssPpzb .cluster-label span{color:#333;}#mermaid-svg-0DkH4mXmDNssPpzb .cluster-label span p{background-color:transparent;}#mermaid-svg-0DkH4mXmDNssPpzb .label text,#mermaid-svg-0DkH4mXmDNssPpzb span{fill:#333;color:#333;}#mermaid-svg-0DkH4mXmDNssPpzb .node rect,#mermaid-svg-0DkH4mXmDNssPpzb .node circle,#mermaid-svg-0DkH4mXmDNssPpzb .node ellipse,#mermaid-svg-0DkH4mXmDNssPpzb .node polygon,#mermaid-svg-0DkH4mXmDNssPpzb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0DkH4mXmDNssPpzb .rough-node .label text,#mermaid-svg-0DkH4mXmDNssPpzb .node .label text,#mermaid-svg-0DkH4mXmDNssPpzb .image-shape .label,#mermaid-svg-0DkH4mXmDNssPpzb .icon-shape .label{text-anchor:middle;}#mermaid-svg-0DkH4mXmDNssPpzb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0DkH4mXmDNssPpzb .rough-node .label,#mermaid-svg-0DkH4mXmDNssPpzb .node .label,#mermaid-svg-0DkH4mXmDNssPpzb .image-shape .label,#mermaid-svg-0DkH4mXmDNssPpzb .icon-shape .label{text-align:center;}#mermaid-svg-0DkH4mXmDNssPpzb .node.clickable{cursor:pointer;}#mermaid-svg-0DkH4mXmDNssPpzb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0DkH4mXmDNssPpzb .arrowheadPath{fill:#333333;}#mermaid-svg-0DkH4mXmDNssPpzb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0DkH4mXmDNssPpzb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0DkH4mXmDNssPpzb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0DkH4mXmDNssPpzb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0DkH4mXmDNssPpzb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0DkH4mXmDNssPpzb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0DkH4mXmDNssPpzb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0DkH4mXmDNssPpzb .cluster text{fill:#333;}#mermaid-svg-0DkH4mXmDNssPpzb .cluster span{color:#333;}#mermaid-svg-0DkH4mXmDNssPpzb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0DkH4mXmDNssPpzb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0DkH4mXmDNssPpzb rect.text{fill:none;stroke-width:0;}#mermaid-svg-0DkH4mXmDNssPpzb .icon-shape,#mermaid-svg-0DkH4mXmDNssPpzb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0DkH4mXmDNssPpzb .icon-shape p,#mermaid-svg-0DkH4mXmDNssPpzb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0DkH4mXmDNssPpzb .icon-shape .label rect,#mermaid-svg-0DkH4mXmDNssPpzb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0DkH4mXmDNssPpzb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0DkH4mXmDNssPpzb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0DkH4mXmDNssPpzb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 特征提取
代价体构建
初始视差
GRU迭代优化
K次迭代
最终视差图
近期方法(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'_M dF=c⊙d0+(1−c)⊙dM′
其中 c c c 为学习的置信度图, d 0 d_0 d0 为初始立体视差, d M ′ d'_M dM′ 为尺度对齐后的单目深度。
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^i hk+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^0 hk0,低分辨率层保持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_k Vk 为以当前视差为中心的局部代价体。
关键设计选择 :两个Prompt都通过残差加法注入(而非拼接或替换),不破坏DPT解码器继承的先验。
渲染错误: Mermaid 渲染失败: Parse error on line 3: ...Structure Prompt
|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}\|_1 L=∥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证明了"站在巨人肩膀上做优化"比"自己重新学优化"高效得多。这一范式有望推广到光流估计、场景流等其他稠密匹配任务。