Pseudo-Stereo Inputs: A Solution to the Occlusion Challenge in Self-Supervised Stereo Matching¶
会议: ECCV 2026
论文: ECCV 原文
代码: https://github.com/qrzyang/Pseudo-Stereo
领域: 3D视觉
关键词: 自监督立体匹配, 遮挡处理, 伪立体输入, 光度一致性, 视差估计
一句话总结¶
本文用当前正在训练的模型自渲染出一张伪视图来替换输入对中的一侧,把网络输入与光度反馈解耦,使遮挡在遮挡物两侧等概率出现,再配合渲染过程给出的遮挡掩码与全伪立体输入策略保证稳定收敛;在 KITTI 2015 测试集上把 D1-all 从之前最好的 6.11% 降到 4.39%,遮挡区域的 D1 误差从 20.82% 降到 9.05%。
研究背景与动机¶
自监督立体匹配用视图之间的光度一致性顶替昂贵的视差真值,本应与监督方法同步发展,却在遮挡问题上早早撞到瓶颈——遮挡区域的光度一致性假设根本不成立,把一侧的图像按视差重投影过去必然出现大片色差,回传的是纯噪声梯度。这类错误反馈规模大、贯穿整个训练过程且不随网络结构变化而消失,是自监督立体匹配精度长期上不去的最主要来源。作者给出的关键观察很朴素:对任何一个遮挡物,可靠的反馈信号只能来自它未被遮挡的那一侧。问题在于,标准范式里网络永远拿不到那一侧的信息。
此前的解法大致分两路。一路是识别出遮挡区域并把它从光度损失里抠掉(各类遮挡掩码方法),代价是留下一个信息真空,只能靠边缘感知的平滑损失、或遮挡区与其邻域视差的规整性去"猜",本质上都假设遮挡区与紧邻像素高度相关——而这个假设在很多真实场景里并不成立。另一路是想从别处取信息:flip 数据增强试图从对称区域借信息,但输入图像与反馈图像是同一对、遮挡方向被几何关系锁死,翻转之后遮挡依旧落在遮挡物的同一侧,本文消融(Tab. 4)里 naive flip 与 baseline 的结果几乎完全一致(D1-all 5.61 vs 5.67),证实这条路走不通;而引入第三视角的方法在概念上是正确的(三目相机、或用 NeRF 渲染新视角),却要么依赖专用对称硬件,要么需要额外的场景重建,无法用在常规双目数据集上,这与自监督"在任何目标场景上直接训练"的初衷相悖。
既然有效反馈只存在于遮挡物的某一侧、且这一侧被几何锁死,那就不要再在固定的一侧修修补补,而是让遮挡本身不再固定。核心 idea:用一张当前网络自渲染的伪第三方视角图像替换输入对中的一侧,把网络输入与光度反馈彻底解耦——输入用(真实图, 伪图),反馈只用原始图像——从而把"遮挡永远固定在遮挡物一侧"的静态缺陷,转化成"遮挡在两侧等概率出现"的动态过程,让遮挡物两侧都有机会提供正确的监督信号。
方法详解¶
整体框架¶
本文要解决的是自监督训练中遮挡区域永远拿不到正确监督信号的问题,做法是把一次训练迭代拆成"用伪图当输入、用真图算反馈"两条彼此独立的路径。给定一对真实立体图,整体流转是这样的:先用当前正在训练的模型做一次无梯度的前向,得到与右视图对齐的视差,再按这套视差把右视图渲染成一张伪图像;网络实际的输入由此变成(右视图, 伪图像)这个非对称组合,输出与右视图对齐的视差;与此同时,反馈一路只使用原始图像——把真实的左视图按刚预测出的视差重投影到右视图视角,与真实的右视图比较光度;渲染过程中被判为无效的像素(越界、或被别的像素挡住)充当遮挡掩码,这些位置的梯度被截断;最后叠加边缘感知平滑项组成总损失。整条链条是自举的:模型越准,渲染出的伪图越接近真实图像,网络能利用的双目信息就越好;而左输入与反馈图像始终是真实可靠的,为这个自举过程提供了稳定锚点。整个方案只在训练期生效,推理时不需要生成任何伪图。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
A["真实立体对 I^L, I^R"] --> B["伪立体输入<br/>真实图 + 伪图"]
B -->|全伪立体输入| C["伪图像生成<br/>渲染 → 填充 → 加宽裁剪"]
C --> D["立体匹配网络<br/>输出当前视图视差"]
D --> E["遮挡估计与梯度截断<br/>渲染无效像素不回传梯度"]
D --> F["光度反馈<br/>原始对侧视图重投影"]
E --> G["损失 L_p + λ L_s"]
F --> G
G -.->|无梯度前向、下轮重渲染| C
关键设计¶
1. 伪立体输入:把网络输入与光度反馈彻底解耦
原范式里输入对与反馈对是同一对图:网络吃 \((I^L, I^R)\) 输出与左视图对齐的视差 \(D^L\),再用 \(D^L\) 把 \(I^R\) 重投影回来与 \(I^L\) 比光度。输入和反馈被绑死在同一组几何关系上,遮挡就只能出现在固定的一侧,网络永远缺掉另一侧的信息。本文让两者分家:先由当前模型估计出与右视图对齐的视差 \(D^R\),据此渲染出伪图像 \(\widetilde{I}^R\);网络输入改成 \((I^R, \widetilde{I}^R)\),输出与右视图对齐的视差;反馈则完全不碰伪图,只用原始图像——把真实的 \(I^L\) 按 \(D^R\) 重投影到右视图视角得到 \(I^L_{warp}\),与真实的 \(I^R\) 比较光度。
关键在于视角互换带来的方向反转:当网络的左输入是 \(I^L\) 时,被遮挡区域出现在遮挡物的左侧;把左输入换成 \(I^R\) 之后,被遮挡区域就落到了右侧。两种配置交替出现,遮挡物的两侧便都有机会成为"未被遮挡、能给出正确反馈"的那一侧。这里必须强调输入与反馈的解耦是双向的——反馈端始终只用原始图像,所以伪图的质量不会污染监督信号的可信度,这也是后面整个自举过程能够稳定收敛的前提。
2. 伪图像生成:一次无梯度的简化渲染,把伪图做得足够像真图
伪图从哪来是这套方案能否落地的第一道坎。成熟的视角合成方法(NeRF、3DGS 之类)需要额外数据来训练合成模型本身,会引入外部先验,与自监督的前提冲突;而立体匹配流程里现成的 warp 操作也派不上用场——warp 需要一张与目标视角对齐的视差图,可伪图在生成之前根本不存在这样一张视差图。作者的替代方案是一个简化版渲染:把右视图的每个像素按它自己的视差反向搬到新位置,若多个像素落到同一坐标,只保留视差最大的那个,这正好对应渲染中的遮挡(z-buffer)行为。
渲染的结果是一张带缺失的图,表现为小尺度空洞和右边缘的大块缺失。为了让伪图尽量接近真实图像,小空洞先用相邻非空洞像素的均值补掉;右边缘则采用"加宽生成"策略——生成一张比输入更宽的图再裁回原尺寸,边缘的大块缺失就被裁掉了。这一步并非锦上添花:伪图越像真图,网络越难靠"认出这是伪图"来给输入分类,而这正是下面过拟合问题的根源。另一个容易被忽略的细节是,伪图生成只用当前模型的一次无梯度前向,不需要额外显存,也不会有梯度从渲染路径回流。
3. 遮挡估计与梯度截断:用渲染过程自身的信息当遮挡掩码
伪输入策略本身已经能明显超过标准范式,但它有一个内在矛盾:策略保证了遮挡侧有 50% 的概率拿到正确信息,也就意味着另有 50% 的概率拿到错误信息,网络会同时去最小化这两类互相冲突的损失,最终在遮挡区收敛到一个折中的视差。量级问题让情况更糟——光度损失的梯度与图像相似度负相关,训练到后期整体相似度升高、全局平均梯度趋近于零,而遮挡区即便视差正确也会因为没有对应像素而产生很大色差,于是这些注定无法消除的错误梯度在总梯度中的占比反而越来越突出。
解法是让渲染过程顺手交出答案:渲染时被判为无效的像素(越出图像边界的、或被其他像素挡住的)就是遮挡像素,把这些位置的掩码 \(\widetilde{O}_{ij}\) 置 0,其梯度不再回传。相比常用的左右一致性检查,这样做不需要额外推断另一视图的视差图(省掉近一半计算),也不会出现"错误视差恰好满足一致性检查"这类在物体边界上最典型的误判,因为它用的是当前视图渲染过程自身产生的信息,而不是从另一个视角反推出来的间接证据。消融里加入这一项后精度有明确提升(Tab. 3 中 (d) 相比只有伪输入配置的 4.99% 降到 4.08%)。
4. 全伪立体输入:让网络无从分辨真伪,从根上断掉过拟合
加上遮挡掩码后精度进一步提升,但长时间训练会暴露一个隐患:精度冲顶之后开始缓慢下滑。自监督天然没有标注数据、也就没有验证集,early stopping 无从谈起,必须保证网络稳定收敛。作者定位到的根因是:在"一侧真图、一侧伪图"的配置下,用真图还是伪图直接决定了遮挡出现在哪一侧,于是网络只要学会判别输入是不是伪图,就能对两类输入给出不同的解——"两侧等概率获得正确信息"的设计意图被彻底绕过,网络变相记住了数据而不是学到了几何。
既然网络能分辨,那就让它无从分辨:全伪立体输入策略把输入统一换成 \((I^L, \widetilde{I}^L)\) 与 \((I^R, \widetilde{I}^R)\) 两种全伪组合,每一路都是"真实视图作左输入 + 对应伪图作右输入",网络失去了可供依附的判别特征。此时光度损失变成两侧对称的两项、各以 \(p=0.5\) 加权:
⚠️ 原文式 (1)/(3) 在 PDF 文本抽取时严重损坏,上面这行是按论文正文对公式结构的文字描述复述的:两项分别对应两个方向"用原始对侧视图重投影后与当前视图比光度",\(\widetilde{O}_{ij}\) 为非遮挡时为 1、遮挡时为 0 的掩码。精确的符号写法以原文为准。这里能看出设计 2 为何重要:当生成的伪图带有明显伪影时(即没有做精化生成),强行切到全伪策略反而会掉点(Tab. 3 中 (f) 的 4.31% 对 (g) 的 4.06%),因为网络此时更容易从伪影本身找到可辨识的捷径;只有伪图足够真实,全伪策略才真正兑现稳定收敛的收益。
损失函数 / 训练策略¶
除光度项外,沿用 Monodepth2 的边缘感知平滑项,配合均值归一化视差 \(D^{L*}=D^L/\overline{D^L}\):
光度误差由 L1 与 SSIM 组合,权重 \(\alpha=0.85\),同样是 Monodepth2 的设置:\(pe=\frac{\alpha}{2}(1-\mathrm{SSIM})+(1-\alpha)\lVert\cdot\rVert_1\)。作者发现早期过大的平滑损失会抑制模型的探索能力、对最终性能有轻微负面影响,因此把 \(\lambda\) 改成渐进式参数,从 0.001 起步、在 10k 次迭代内线性升到 0.5。
训练上,所有数据集共用同一套超参:2 张 RTX 4090、PyTorch、Adam(\(\beta_1=0.9\)、\(\beta_2=0.999\))配 cosine annealing,图像裁到 \(512\times256\)、batch size 8。数据增强只施加在输入图像上、不加在反馈图像上,包含随机裁剪、亮度增强与对比度调整。全部从零训练,无预训练、无真值标签、无后处理。开销方面,伪图生成只需一次无梯度前向、不增加显存占用,总训练时间增加约 25%;推理阶段完全不使用伪图生成,计算量与基线网络完全相同。
实验关键数据¶
主实验¶
KITTI 2012 / 2015 在线榜单(Test 集,全部为作者提交的官方评测结果)。表格用本文自己训练的两个骨干:PSMNet 用来证明增益来自方法而非网络结构的进步,MonSter 用来证明方法对最新架构同样适用。
| 方法 | 2012 3-noc (%) | 2012 3-all (%) | 2012 EPE-all | 2015 D1-bg (%) | 2015 D1-fg (%) | 2015 D1-all (%) | 2015 D1-noc (%) |
|---|---|---|---|---|---|---|---|
| OASM | 6.39 | 8.60 | 2.0 | 6.89 | 19.42 | 8.98 | 7.39 |
| PASMnet | - | - | - | 5.41 | 16.36 | 7.23 | 6.69 |
| OASM-DDS | 4.81 | 5.69 | 1.2 | 4.46 | 15.76 | 6.51 | 6.02 |
| UHP | 6.05 | 7.09 | 1.3 | 5.00 | 13.70 | 6.45 | 5.93 |
| Flow2Stereo | 4.58 | 5.11 | 1.1 | 5.01 | 14.62 | 6.61 | 6.29 |
| CRD-Fusion | 4.38 | 5.40 | 1.1 | 4.59 | 13.68 | 6.11 | 5.69 |
| Pseudo-Stereo-PSMNet | 3.46 | 4.08 | 0.9 | 3.11 | 12.52 | 4.68 | 4.40 |
| Pseudo-Stereo-MonSter | 3.08 | 3.62 | 0.8 | 2.93 | 11.67 | 4.39 | 4.22 |
跨骨干、跨数据集的泛化实验(EPE 与 3-px 误差,数值越低越好)。注意 Spring 因算力限制在半分辨率下评测。
| 骨干 / 数据集 | 指标 | w/o Pseudo-Stereo | w/ Pseudo-Stereo |
|---|---|---|---|
| PSMNet @ SceneFlow | EPE (px) / 3-px (%) | 5.41 / 16.85 | 3.10 / 9.80 |
| GMStereo @ SceneFlow | EPE (px) / 3-px (%) | 5.09 / 15.01 | 3.11 / 8.49 |
| MonSter @ SceneFlow | EPE (px) / 3-px (%) | 5.28 / 16.15 | 2.32 / 7.86 |
| PSMNet @ Spring | EPE (px) / 3-px (%) | 2.41 / 6.58 | 2.30 / 5.12 |
| GMStereo @ Spring | EPE (px) / 3-px (%) | 2.33 / 6.31 | 2.18 / 4.78 |
| MonSter @ Spring | EPE (px) / 3-px (%) | 2.37 / 6.56 | 1.77 / 4.65 |
消融实验¶
组件消融在 KITTI 2015 训练集上进行,PS = 伪立体输入策略,Occ = 遮挡估计与梯度截断,RG = 精化伪图生成(填充 + 加宽裁剪),FPS = 全伪立体输入策略。
| 配置 | PS | Occ | RG | FPS | D1 (%) ↓ | EPE ↓ | 原文备注 |
|---|---|---|---|---|---|---|---|
| (a) 基线 | 5.67 | 1.17 | / | ||||
| (b) | ✓ | 5.73 | 1.24 | 遮挡区过度平滑 | |||
| (c) | ✓ | 4.99 | 1.07 | 过拟合 | |||
| (d) | ✓ | ✓ | 4.08 | 0.99 | 过拟合 | ||
| (e) | ✓ | 5.17 | 1.11 | / | |||
| (f) | ✓ | ✓ | ✓ | 4.31 | 1.04 | 伪图伪影拖累 | |
| (g) 完整 | ✓ | ✓ | ✓ | ✓ | 4.06 | 1.01 | / |
⚠️ 原文 Tab. 3 的勾选列在文本抽取后对齐不可靠,这里按论文正文的归组方式标注:(a)–(d) 未启用全伪立体输入且存在过拟合,(e)–(g) 启用后过拟合消失;正文明确给出 (f)=PS+Occ+FPS、(g)=PS+Occ+RG+FPS,其余行的勾选组合请以原文表格为准。
针对遮挡区域本身,以及"朴素翻转"这一常见做法的对照(KITTI 2015,遮挡区由 3.2 节的渲染法判定):
| 配置 | D1-all | EPE-all | D1-occ | EPE-occ | D1-noc | EPE-noc |
|---|---|---|---|---|---|---|
| base | 5.67 | 1.17 | 20.82 | 3.24 | 4.37 | 1.01 |
| naive flip | 5.61 | 1.14 | 20.77 | 3.20 | 4.34 | 1.00 |
| ours | 4.06 | 1.01 | 9.05 | 1.36 | 3.68 | 0.97 |
关键发现¶
- 增益几乎全部来自遮挡区域。这是本文最有说服力的证据:D1-occ 从 20.82% 直接砍到 9.05%、EPE-occ 从 3.24 px 降到 1.36 px(降幅约 58%),而非遮挡区的 D1-noc 只从 4.37% 温和降到 3.68%。这说明方法确实作用在它声称的那个瓶颈上,不是靠整体正则化碰巧涨点。
- 朴素翻转被定量证伪。naive flip 在四个指标上与 base 几乎逐项重合(D1-all 5.61 vs 5.67、D1-occ 20.77 vs 20.82),印证了作者的论点:翻转改变不了输入与反馈耦合造成的固定方向性,遮挡依然在同一侧。
- 全伪策略的价值在稳定性而非单点最优。这一点值得诚实指出:(d) 的 D1 4.08 与完整模型 (g) 的 4.06 几乎持平,EPE 上 (d) 的 0.99 甚至略优于 (g) 的 1.01。全伪策略真正换来的是长时间训练不退化(原文 Fig. 8 的训练曲线),而非某一次评测的峰值——这也说明该组件的必要性主要靠收敛性论证支撑,单看表格峰值容易低估它。
- 过度平滑与过拟合是两类不同故障。(b) 与 (c)-(d) 的备注显示:只有伪输入而不做遮挡处理会掉进遮挡区过度平滑,做了遮挡处理后又会掉进过拟合,两个组件必须一起用;而 (f)→(g) 的对比说明精化伪图生成是这个链条的前置条件,伪图伪影大的时候强行上全伪策略反而会掉点。
- 泛化性有实打实的证据。三个差异很大的骨干(PSMNet / GMStereo / MonSter)与两个风格迥异的数据集(SceneFlow / Spring)上都有提升,SceneFlow 上的 3-px 误差几乎减半(PSMNet 16.85% → 9.80%)。这说明遮挡是自监督立体匹配与网络结构、数据集都无关的共同瓶颈。
亮点与洞察¶
- 把"监督信号坏了"重新表述为"输入可以换"。以往处理遮挡的思路都是"信号不可靠 → 修信号"(掩码、补正则、换邻域),本文换了个方向:让产生信号的几何关系本身变得对称。这个视角转换是全文最"啊哈"的地方——不引入任何额外约束、不加新损失项,只改输入的构造方式就绕开了根本矛盾。
- 用一个正在训练中的网络当渲染器。伪图质量与网络精度同步提升,形成"越准 → 伪图越好 → 监督越好 → 更准"的正循环;同时把左输入与反馈图像钉死在真实图像上,为这个自举过程提供了不随伪图质量漂移的锚点。这个"不引入任何外部模型/数据"的约束最终反而变成了设计优势,比用 NeRF 或三目硬件更贴合自监督的定位。
- 直接复用渲染过程的副产品当遮挡掩码。渲染时本来就要求解哪些像素被挡住、哪些越界,作者直接把这些无效像素当作遮挡标签,省掉了额外的视差推断,也规避了一致性检查在物体边界上的误判。这是一个近乎零成本的设计,可迁移到任何带合成/重投影步骤的自监督管线。
- "过拟合的根因是输入可辨识"这一诊断可迁移。当训练数据里混有两类来源不同的样本(真图/伪图、仿真/真实、原始/增强)时,模型倾向于先学会区分来源、再分别拟合,从而绕开设计者的意图。本文的解法是消除可辨识性(让所有输入都带伪图),这个思路同样适用于 sim-to-real 训练、生成数据增强等场景。
- 训练期加约束、推理期零成本。伪图生成只在训练出现,推理时计算量与基线完全一致,训练时间只涨约 25%、显存不涨。这种"只改训练信号、不动推理结构"的改进对工程落地非常友好。
局限与展望¶
- 作者自己承认没有显式处理纹理贫乏区与反射/高光区域,并指出这类病态区域仅靠双目线索本身就难以给出准确反馈,指向了多帧自监督范式(如 UnOS)——跨帧时序一致性处理纹理歧义、单帧视差精度处理运动物体的深度歧义,两者互补。
- 遮挡之外的错误来源未被触及。方法针对的是"遮挡导致反馈错误",但光度一致性还会被曝光变化、无纹理、运动物体破坏,本文没有给出对应的机制。
- 消融证据的强度不均。全伪策略的必要性主要建立在训练曲线不退化上,却没有给出多随机种子的方差或长程训练的定量曲线,而 (d) 与 (g) 的单点指标几乎持平,读者难以从表格独立判断这个组件值多少。
- 伪图质量与网络精度的耦合关系没有被量化。早期伪图"严重缺乏真实感"却能收敛,这一点的解释停留在定性层面("强制网络利用单目线索"),缺少类似"伪图质量 vs 最终精度"的曲线来支撑。
- 评测场景偏窄。KITTI 是驾驶场景,遮挡类型相对单一(多为车辆、杆状物的横向边缘);Spring 又因算力被降到半分辨率评测,与全分辨率方法不完全可比。方法在室内、密集遮挡或非刚体场景上的表现尚不清楚。
- 一个天然的上限:推理时不使用伪输入,因此方法改善的是训练信号质量,并没有改变网络在测试时面对遮挡的固有偏差。如果测试时遮挡区域的可观测信息本就不足,精度天花板仍由网络结构与感受野决定。
- 可改进方向:伪图生成目前是"按视差反向搬移 + z-buffer"的极简渲染,可以尝试用网络自身的多尺度特征做 splatting 或轻量 amortized 合成来提升伪图真实度,从而让全伪策略在更难的场景(弱纹理、反射)上也能用;也可以把"伪输入一次前向"扩展为多尺度迭代细化,让伪图质量与视差精度在同一个循环里互相促进。
相关工作与启发¶
- vs OASM / PASMNet / OASM-DDS 等掩码类方法: 它们识别遮挡区并从光度损失中剔除,代价是留下信息真空,再用平滑损失或邻域规整去补偿;本文不额外引入任何约束或损失项,而是从输入构造上让遮挡物两侧都拿到正确反馈。区别在于前者是"止损 + 外推",后者是"把信息缺口本身消掉"。
- vs ES3Net / Godard 等的 flip 与左右一致性策略: 它们把左右一致性直接当损失项或靠翻转从对称区域取信息,但错误的视差同样可以满足一致性、翻转也改变不了固定的遮挡方向;本文用 Tab. 4 定量证明 naive flip 相对 base 基本没有增益(5.61 vs 5.67)。
- vs NeRF-Supervised Deep Stereo / 多目自监督: 概念上最接近——都是从辅助视角获取未遮挡信息。但前者需要真值或额外数据训练 NeRF 来合成新视角,后者需要专用的对称多目硬件;本文的伪视角由当前训练中的网络自渲染,零外部依赖,可运行在任意常规双目数据集上。
- vs 无监督光流中的遮挡处理(UnFlow / Janai 等): 同源问题——光度一致性在遮挡处失效。那些方法以掩码为主,本文"解耦输入与反馈"的思路可以平移过去:用当前模型渲染一张伪帧作输入、用原始帧算光度,缓解光流里的遮挡与运动边界错误。
评分¶
- 新颖性: ⭐⭐⭐⭐⭐ 把遮挡问题从"修信号"重构为"改输入",用自渲染伪视图实现输入与反馈解耦,这个视角在自监督立体匹配里是新的,且不依赖任何外部模型或硬件。
- 实验充分度: ⭐⭐⭐⭐ 三个骨干 × 三个数据集 + 完整的组件消融与遮挡区专项指标,证据链扎实;但消融行的勾选组合在原文表格中不易辨读,全伪策略的收敛性也缺少多 seed 与定量曲线支撑。
- 写作质量: ⭐⭐⭐⭐ 动机推导清晰、图示(Fig. 1 的翻转失效对比、Fig. 5 的伪图生成过程)很有说服力;不足在于第 3 节的公式在排版上不够易读,部分组件命名与消融表列的对应关系需要读者自行推断。
- 价值: ⭐⭐⭐⭐⭐ 只改训练信号、推理零开销,且跨骨干跨数据集通用,对任何基于光度一致性的自监督立体/光流管线都是可直接套用的改进。