Stereo Match
立体匹配是 3D 视觉的基石,目的是通过图像间的像素级对应关系来恢复深度信息。
在零样本和少样本的情况下,深度神经网络在部署阶段会出现明显的性能下降,因为我们不可能 Annotate Anything。
Stereo Anything:基于大规模混合数据的统一零样本立体匹配的提出,就是为了大幅增强 Stereo 模型在零样本下的泛化能力。
立体匹配由四个基本组成部分构成:特征提取、代价构建、代价聚合和视差回归。
特征提取:对左图和右图进行特征提取,捕获可用于识别图像之间对应点的特征
代价构建:使用提取到的特征来构建代价,代价表示左图中每个像素和右图中潜在匹配在不同视差(Disparity)级别上的相似性
代价聚合:通过考虑邻近像素的上下文信息来细化代价,减少噪声影响并提高匹配精度
视差回归:应用于聚合后代价,生成视差图,为图像中的每个像素提供深度信息
早先的立体匹配还在使用传统机器视觉的 Descriptor,现代的立体匹配模型使用 CNN 或者 Transformer 架构进行端到端学习,执行特征提取和代价优化的步骤。

In-domain Stereo Matching
In-domain Stereo Matching 指的是用于训练立体匹配模型的数据,和模型实际部署和应用的数据场景,来自于相同分布或者场景。
在这种情况下,模型往往能达到更好的性能。
不过高质量标注数据——尤其是视差图和深度图——的获取成本很高,因此依赖 SceneFlow 这类合成数据集进行训练。但是合成数据和真实视觉数据在纹理、光照、噪声等方面存在差异,导致模型在真实场景下表现不好。
Cross-domain Stereo Matching
训练数据和测试数据来自不同的数据集、场景或环境。
由于泛化能力不足,模型的性能会显著下降。
解决方案有以下几个方向:
- Domain Adaptation:在训练阶段,让模型能够利用目标域的无标签图像来提升自身在目标域上的表现
- Domain Generalization:在训练阶段完全不接触任何目标域的数据,但能在未见过的场景中依然表现良好
- 构建通用基础模型:通过海量数据,训练出一个具备零样本泛化能力的基础模型
Contribution
- 统一了多样化的标注立体数据和从单目图像合成的伪立体数据,来增强立体匹配的零样本泛化能力。
- 对不同的数据集如何影响模型性能进行全面探索,强调更大数据集规模的必要性。
- 提出了一种从单目图像合成立体图像的新流程来扩大数据集规模。
- 提出的训练策略也能显著增强零样本泛化能力。
Stereo Datasets
下图中总结了 Stereo Anything 涉及的标注数据集。
简写的列标题为 Indoor/Outdoor/Dynamic/Weather/Accuracy/Diversity。
Baseline 为双目相机的物理基线长度,即左右俩相机镜头的光心之间的物理距离。
FL 为焦距。

焦距 (Focal Length),视差 (Disparity) 和基线 (Baseline) 这三者构成了计算双目相机像素深度 (Depth) 的公式:
视差越大,说明深度越小,物体越近;视差越小,说明深度越大,物体越远。
上文提到,双目匹配的最后一步是通过特征匹配生成的视差图,恢复每个像素的深度。
上面公式中 FL 和 Baseline 都是固定值,最难获取的就是这个 Disparity。
Disparity
视差怎么计算呢?看下图^{[2]}。

视差计算公式如下,x_L 和 x_R 分别为同一空间点在左右图像上的水平像素坐标。
动态场景下,视差图不是一张可以预计算的图,是在实时变化的,因此 LUT 方法行不通。
传统 SIFT 等算子算出来的,是一张稀疏的特征点匹配图,1080p 图像中 200W 像素,可能只有几千个匹配点对。未匹配的点就没有视差,也计算不了深度。
Stereo Anything 就是要解决这个问题。
下图描述了 Stereo Anything 用到的不同数据集的视差数值分布。看得出来,不同数据集视差最值差异很大,不同视差层级的分布也存在较大差异。

Datasets Rank
针对多数据集,作者提出了一个排序思路。
假设有 4 个数据集:KITTI、Middlebury、ETH3D、SceneFlow。
作者用其中 1 个 e.g. KITTI 来训练模型,训练结束以后,去 4 个测试机上测试,得到 4 个分数。
然后 4 个分数取平均分得到 P1。
然后再用其他 3 个数据重复一遍这个过程,得到 4 个平均分数 P1 ~ P4,我们假设得分为 98、90、78、66。
那数据集 Rank 从高到底就是KITTI——Middlebury——ETH3D——SceneFlow,反映了数据集自身的泛化能力。
Datasets Mix
混合过程不是上来就混合到一起,而是分步混合。
基于数据集 Rank 结果。
Mix1 = KITTI
Mix2 = KITTI + Middlebury
...
Mix4 = KITTI + Middlebury + ETH3D + SceneFlow
这样做的好处是不会让低质量数据集一上来就污染整个数据集,而是先使用泛化能力强的数据集。
而且可以观察每增加一个数据集带来的模型性能提升,可以按 Mix1——Mix2——Mix3——Mix4 的实验结果来分析。
Supervision
Stereo Anything 使用多种现有的数据集,每个数据集包含不同环境条件、场景结构和视差分布,能够让模型接触到梗广泛的视差和场景。
MiDaS 和 DepthAnything 使用未标注图像来进行图像增强,不过这些是单目深度模型,立体匹配之前还没有进行过使用未标注数据来扩大数据集的实验。
在单目深度模型(MiDaS、DepthAnything)中,一般会将深度值归一化。归一化操作会导致立体匹配内在的尺度信息丢失。
Stereo Anything 基于一些现有模型,从未标注的单目图像生成伪立体数据集,避免手工标注。
目标是根据单张图像集合创建合成立体图像和视差图。
给定一张彩色图像 I ,使用预训练单目深度估计模型 G 来为图像 I 估计深度,这个模型是一个参数化的深度神经网络,使用真值深度或者自监督训练。
然后将估计的深度转换为视差图 \widetilde {D} ,其中 s 是从均匀分布 [Disp_{min}, Disp_{max}] 中随机采样的缩放因子,模拟不同基线和焦距。
目标是使用 Warp 让原始图像 I_L + 预测视差 \widetilde D 合成出新的图像 \widetilde I_R,即通过 I_L 图像中的每个像素 i 向左平移 \widetilde D_i 个像素。
Warp 过程中,使用 RealFill 模型来补全未填充的区域。
Self-Supervision
深度模型的自监督,并非在单张图像上凭空产生深度。
方法都基于 Monodepth2 的思想,训练时无需深度 GT,而是需要 2 个模型和 3 个连续帧。
Depth Network 输出像素深度;Pose Network 通过当前帧 I_t 来预测相机运动。
两者结合来预测下一帧 I'_{t+1},然后根据真实 I_{t+1} 进行比较。
RealFill
一种用于真实图像补全(Authentic Image Completion)的生成式方法。
利用少量参考图像对预训练的扩散修复模型进行个性化微调,从而在补全目标图像缺失区域时,生成的是原本应该在那里的真实内容。
Experiment
基于开源的(也是这位作者提出的) OpenStereo 立体匹配训练框架,使用 NMRF-Stereo 作为基线模型。
特征提取使用 SwinTransformer,优化器使用 AdamW。
实验结果表明,Stereo Anything 实现了 2.68 像素的平均视差误差,远低于之前 SOTA 的方法。
在消融实验上,使用论文中的训练方法能显著降低误差。
Reference List
[1] [2411.14053] Stereo Anything: Unifying Zero-shot Stereo Matching with Large-Scale Mixed Data
[2] 立体视觉的核心技术:视差计算与图像校正详解_双目视差-CSDN博客
[3] [2309.16668] RealFill: Reference-Driven Generation for Authentic Image Completion
评论