Stereo Match

立体匹配是 3D 视觉的基石,目的是通过图像间的像素级对应关系来恢复深度信息。

在零样本和少样本的情况下,深度神经网络在部署阶段会出现明显的性能下降,因为我们不可能 Annotate Anything。

Stereo Anything:基于大规模混合数据的统一零样本立体匹配的提出,就是为了大幅增强 Stereo 模型在零样本下的泛化能力。

立体匹配由四个基本组成部分构成:特征提取代价构建代价聚合视差回归

特征提取:对左图和右图进行特征提取,捕获可用于识别图像之间对应点的特征

代价构建:使用提取到的特征来构建代价,代价表示左图中每个像素和右图中潜在匹配在不同视差(Disparity)级别上的相似性

代价聚合:通过考虑邻近像素的上下文信息来细化代价,减少噪声影响并提高匹配精度

视差回归:应用于聚合后代价,生成视差图,为图像中的每个像素提供深度信息

早先的立体匹配还在使用传统机器视觉的 Descriptor,现代的立体匹配模型使用 CNN 或者 Transformer 架构进行端到端学习,执行特征提取代价优化的步骤。

StereoAnythiny-StereoMatchPipeline.webp

In-domain Stereo Matching

In-domain Stereo Matching 指的是用于训练立体匹配模型的数据,和模型实际部署和应用的数据场景,来自于相同分布或者场景。

在这种情况下,模型往往能达到更好的性能。

不过高质量标注数据——尤其是视差图和深度图——的获取成本很高,因此依赖 SceneFlow 这类合成数据集进行训练。但是合成数据和真实视觉数据在纹理、光照、噪声等方面存在差异,导致模型在真实场景下表现不好。

Cross-domain Stereo Matching

训练数据和测试数据来自不同的数据集、场景或环境。

由于泛化能力不足,模型的性能会显著下降。

解决方案有以下几个方向:

  1. Domain Adaptation:在训练阶段,让模型能够利用目标域无标签图像来提升自身在目标域上的表现
  2. Domain Generalization:在训练阶段完全不接触任何目标域的数据,但能在未见过的场景中依然表现良好
  3. 构建通用基础模型:通过海量数据,训练出一个具备零样本泛化能力的基础模型

Contribution

  1. 统一了多样化的标注立体数据和从单目图像合成的伪立体数据,来增强立体匹配的零样本泛化能力。
  2. 对不同的数据集如何影响模型性能进行全面探索,强调更大数据集规模的必要性。
  3. 提出了一种从单目图像合成立体图像的新流程来扩大数据集规模。
  4. 提出的训练策略也能显著增强零样本泛化能力。

Stereo Datasets

下图中总结了 Stereo Anything 涉及的标注数据集。

简写的列标题为 Indoor/Outdoor/Dynamic/Weather/Accuracy/Diversity。

Baseline 为双目相机的物理基线长度,即左右俩相机镜头的光心之间的物理距离

FL 为焦距。

StereoAnythiny-Dataset.webp

焦距 (Focal Length),视差 (Disparity) 和基线 (Baseline) 这三者构成了计算双目相机像素深度 (Depth) 的公式:

\text {Depth} = \cfrac{\text {FL} \times \text {Baseline}}{\text {Disparity}}

视差越大,说明深度越小,物体越近;视差越小,说明深度越大,物体越远。

上文提到,双目匹配的最后一步是通过特征匹配生成的视差图,恢复每个像素的深度。

上面公式中 FL 和 Baseline 都是固定值,最难获取的就是这个 Disparity。

Disparity

视差怎么计算呢?看下图​^{[2]}

StereoAnything-Disparity.webp

视差计算公式如下,​x_L​x_R 分别为同一空间点在左右图像上的水平像素坐标

d = x_L - x_R

动态场景下,视差图不是一张可以预计算的图,是在实时变化的,因此 LUT 方法行不通。

传统 SIFT 等算子算出来的,是一张稀疏的特征点匹配图,1080p 图像中 200W 像素,可能只有几千个匹配点对。未匹配的点就没有视差,也计算不了深度。

Stereo Anything 就是要解决这个问题。

下图描述了 Stereo Anything 用到的不同数据集的视差数值分布。看得出来,不同数据集视差最值差异很大,不同视差层级的分布也存在较大差异。

StereoAnythiny-DisparityDistribution.webp

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 估计深度,这个模型是一个参数化的深度神经网络,使用真值深度或者自监督训练。

Depth = G(I)

然后将估计的深度转换为视差图 ​\widetilde {D} ,其中 ​s 是从均匀分布 ​[Disp_{min}, Disp_{max}]随机采样的缩放因子,模拟不同基线和焦距。

\widetilde D = \cfrac{(s \times Depth_{max})}{Depth}

目标是使用 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