1 现状
从立体图像中估计深度信息对于计算机视觉的应用至关重要,包括车辆的自动驾驶,3D模型重建和物体的检测与识别。由于各种现实问题,例如遮挡,大的无纹理区域(例如天空,墙壁等),反射表面(例如窗户),薄结构和重复纹理,这是具有挑战性的。本文主要对基于深度学习的双目匹配与视差估计方法进行调研。
2 方法
对于一对矫正过的立体图像,深度信息估计的目标就是计算参考图像上每一个像素点的视差值d。视差值就是左右两幅图像上对应点之间在水平方向上的位置差。对于左图中的像素点(x,y),它在右图中对应点的坐标为(x-d,y),这个点的深度值可以通过fB/d来计算,其中f是摄像机的焦距,B是两个相机中心之间的距离。因此,深度精度随着视差预测的精度而提高。
传统的立体匹配流程通常包括以下四个步骤的全部或部分,匹配代价计算,代价聚合,视差优化和后处理。 匹配代价计算为左图像块和可能的对应右图像块提供初始相似性度量,这是立体匹配的关键步骤。 一些常见的匹配代价包括绝对差值(SAD),平方差和(SSD)和归一化互相关(NCC)。 代价聚合和优化步骤结合了上下文匹配代价和正则化项,以获得更强大的视差预测。
当前最前沿的研究聚焦于如何利用CNNs准确的计算匹配代价和如何利用半全局匹配(SGM)去优化视差图。例如利用网络学习预测图块之间的相似性,并采用经典的立体匹配流程,包括代价聚合,SGM和其他视差优化方法来提高匹配结果。还有一些研究聚焦于视差图的后处理方面。近期,用于预测整个视差图并不用后处理的端到端的网络得到极大发展。
3.1 传统方法
双目立体匹配可划分为四个步骤:匹配代价计算、代价聚合、视差计算和视差优化。
Step1 匹配代价计算
匹配代价计算的目的是衡量待匹配像素与候选像素之间的相关性。两个像素无论是否为同名点,都可以通过匹配代价函数计算匹配代价,代价越小则说明相关性越大,是同名点的概率也越大。
每个像素在搜索同名点之前,往往会指定一个视差搜索范围D(Dmin ~ Dmax),视差搜索时将范围限定在D内,用一个大小为W×H×D(W为影像宽度,H为影像高度)的三维矩阵C来存储每个像素在视差范围内每个视差下的匹配代价值。矩阵C通常称为DSI(Disparity Space Image)。
匹配代价计算的方法有很多,传统的摄影测量中,使用灰度绝对值差(AD,Absolute Differences)、灰度绝对值差之和(SAD,Sum of Absolute Differences)、归一化相关系数(NCC,Normalized Cross-correlation)等方法来计算两个像素的匹配代价;计算机视觉中,多使用互信息(MI,Mutual Information)法、Census变换(CT,Census Transform)法、Rank变换(RT, Rank Transform)法、BT(Birchfield and Tomasi)法等作为匹配代价的计算方法。不同的代价计算算法都有各自的特点,对各类数据的表现也不尽相同,选择合适的匹配代价计算函数是立体匹配中不可忽视的关键步骤。
下图为DSI示意图(C(x,y,d)代表像素(x,y)在视差为d时的匹配代价):
Step2 代价聚合
代价聚合的根本目的是让代价值能够准确的反映像素之间的相关性。上一步匹配代价的计算往往只会考虑局部信息,通过两个像素邻域内一定大小的窗口内的像素信息来计算代价值,这很容易受到影像噪声的影响,而且当影像处于弱纹理或重复纹理区域,这个代价值极有可能无法准确的反映像素之间的相关性,直接表现就是真实同名点的代价值非最小。
而代价聚合则是建立邻接像素之间的联系,以一定的准则,如相邻像素应该具有连续的视差值,来对代价矩阵进行优化,这种优化往往是全局的,每个像素在某个视差下的新代价值都会根据其相邻像素在同一视差值或者附近视差值下的代价值来重新计算,得到新的DSI,用矩阵S来表示。
实际上代价聚合类似于一种视差传播步骤,信噪比高的区域匹配效果好,初始代价能够很好的反映相关性,可以更准确的得到最优视差值,通过代价聚合传播至信噪比低、匹配效果不好的区域,最终使所有影像的代价值都能够准确反映真实相关性。常用的代价聚合方法有扫描线法、动态规划法、SGM算法中的路径聚合法等。
下图为代价聚合前后视差图示意图:
Step3 视差计算
视差计算即通过代价聚合之后的代价矩阵S来确定每个像素的最优视差值,通常使用赢家通吃算法(WTA,Winner-Takes-All)来计算,如下图所示,即某个像素的所有视差下的代价值中,选择最小代价值所对应的视差作为最优视差。这一步非常简单,这意味着聚合代价矩阵S的值必须能够准确的反映像素之间的相关性,也表明上一步代价聚合步骤是立体匹配中极为关键的步骤,直接决定了算法的准确性。
Step4 视差优化
视差优化的目的是对上一步得到的视差图进行进一步优化,改善视差图的质量,包括剔除错误视差、适当平滑以及子像素精度优化等步骤,一般采用左右一致性检查(Left-Right Check)算法剔除因为遮挡和噪声而导致的错误视差;采用剔除小连通区域算法来剔除孤立异常点;采用中值滤波(Median Filter)、双边滤波(Bilateral Filter)等平滑算法对视差图进行平滑;另外还有一些有效提高视差图质量的方法如鲁棒平面拟合(Robust Plane Fitting)、亮度一致性约束(Intensity Consistent)、局部一致性约束(Locally Consistent)等也常被使用。
由于WTA算法所得到的视差值是整像素精度,为了获得更高的子像素精度,需要对视差值进行进一步的子像素细化,常用的子像素细化方法是一元二次曲线拟合法,通过最优视差下的代价值以及左右两个视差下的代价值拟合一条一元二次曲线,取二次曲线的极小值点所代表的视差值为子像素视差值。如下图所示。
局部匹配算法的步骤一般包括匹配代价计算、代价聚合和视差计算三个步骤,全局算法则包括匹配代价计算,视差计算与视差优化三个步骤,半全局算法SGM则四个步骤都有。
3.2 深度学习方法
本文使用了3D卷积的概念去获得更多的上下文信息,并采用回归的方法去预测视差值,不再使用传统的成本聚合,视差计算,视差优化的方法,利用一个端到端的网络直接生成最终的视差图。这一思路无疑比传统的图块匹配的方法更加先进,而且不用再给图块设置标签,直接将预测结果与真实视差图进行比对,再将误差反向传播即可,后来的许多网络都采用了这一思路。
下图是定义的GC-Net网络框图,上下文在3D卷积中体现,而几何特性在左右图像合并在成本容积(cost volume)时候引入。
匹配代价卷(Cost Volume)
对于每一幅立体图像,我们都构建了一个四维的匹配代价卷(高度、宽度、最大视差+1(0~maxdisp)、特征图数目)。我们将左图的每一个一元特征和右图每一个视差下的特征图级联起来,并封装成一个四维的代价卷。(对于某一个特征,匹配代价卷就是一个三维的方块,第一层是视差为0时的特征图,第二层是视差为1时的特征图,以此类推共有最大视差+1层,长和宽分别是特征图的尺寸,假设一共提取了10个特征,则有10个这样的三维方块)。
可微分的Argmin
我们定义了一种柔性Argmin方法,它既是完全可微的,又能回归得到一个光滑的视差估计值。首先,我们通过将匹配代价值Cd(对于每个视差d)取负数,把匹配代价卷转换为可能性卷(匹配代价越高,可能性越低),我们利用softmax操作σ(⋅)对可能性卷在视差维度上进行正则化。然后对每个视差值d进行加权求和,权重就是他对应的可能性。数学定义如下:
实验结果
Kitti2015 test results
代码链接:https://github.com/LinHungShi/GCNetwork(tensorflow)
本文提出了PSMNet,一个金字塔立体匹配网络,它主要由两个模块组成:金字塔池化和3D卷积神经网络。金字塔池化模块通过聚合不同尺度和不同位置的环境信息构建匹配代价卷(cost volume)来充分利用全局环境信息。3D CNN通过将多个堆叠的沙漏网络(hourglass network)与中间监督(intermediate supervision)结合起来,去调整匹配代价卷。模型框架如图所示。
估算视差图的方式同GC-Net的可微分的Argmin。
实验结果
代码链接:https://github.com/JiaRenChang/PSMNet(pytorch)
本文将语义特征嵌入特征图中,并将规则化的语义信息作为损失项来改善视差学习效果。
SegStereo架构如下图:我们从输入的立体图像中提取中间特征Fl和Fr。通过correlation算子计算匹配代价卷Fc。左分割特征图Fls整合到视差分支中作为嵌入的语义特征。右分割特征图warp到左图视角,以实现每个像素的语义预测。所有的步骤都是为了结合语义信息来改善视差估计效果。
SegStereo网络能够实现无监督或有监督学习,通过光度损失Lp或视差回归损失Lr。
目标函数分为无监督模式和有监督模式两种。无监督系统的整体损失函数Lunsup包括光度损失Lp,平滑损失Ls和语义信息损失Lseg。其中平滑损失是对视差图的梯度采用L1惩罚项。要说明的是在损失计算中没有用到真实的视差值因此视差估计被认为是无监督学习过程(语义损失计算需要真实标签值);有监督系统的整体损失函数Lsup包括视差图回归损失Lr,平滑损失Ls和语义信息损失Lseg。
实验结果
SegStereo模型可以获得更加可靠的结果,尤其是在模糊的区域。
代码链接:https://github.com/yangguorun/SegStereo (only tested with caffe)
本文的目标是大大加快当前最先进的立体匹配算法的运行速度,以实现实时推理。文章提出可区分的Patch Match模块,该模块能够丢弃大部分disparity,而无需进行全面的成本量评估。然后,利用此表示,来了解每个像素的修剪范围。通过逐步减少搜索空间并有效地传播此类信息,能够针对高可能性假设有效地计算成本量,并节省内存和计算量。最后,利用图像引导的优化模块来进一步提高性能。实验表明,此方法在KITTI和SceneFlow数据集上以62ms的速度实时运行时取得了竞争性结果。其网络结构如图所示:
概述:给定一对立体图像,首先提取深度多尺度特征。 然后,利用可微的Patch Match估计每个像素的一小部分视差,并利用置信度范围预测因子进一步修剪解决方案空间。
Differentiable PatchMatch
1.粒子采样层:对于每个像素i,我们根据预测/预定义搜索空间上的均匀分布,随机生成k个视差值;
2.传播层:来自相邻像素的粒子,通过卷积与预定义的,单热滤镜模式一起传播(见图3),该模式编码了一个事实,即我们允许每个像素将粒子传播到其4邻域。
3.评估层:对于每个像素i,通过获取左特征和右特征之间的内积来计算匹配分数:Si,j=(f0(i),f1(i+di,j)),对于所有候选项j。每个像素的最佳k视差值将进行下一次迭代。
图2描绘了一个递归步骤的计算图,该步骤结合了传播和评估:
实验结果
本文方法可以快速地为每个像素修剪成本体积的一部分,而不需要充分评估其匹配分数。实验表明,我们的模型在实时方法中取得了最好的性能,并与性能最好的方法进行了比较,同时保持了几倍的速度。
代码链接:https://github.com/uber-research/DeepPruner/tree/master/deeppruner(pytorch)
立体匹配估计矫正过的图像对之间的视差,这对深度感测,自动驾驶和其他相关任务非常重要。先前的工作建立了在所有视差水平上具有交叉相关或串联左右特征的代价量,然后利用2D或3D卷积神经网络来回归视差图。在本文中,我们建议通过分组相关来构建代价量。左边特征和右边特征沿着通道维度被分成组,并且在每个组之间计算相关图以获得多个匹配代价提议,然后将其打包到代价量中。分组相关为测量特征相似性提供了有效的表示,并且不会丢失过多的信息(如完全相关)。与以前的方法相比,它在减少参数时也能保持更好的性能。在先前的工作中提出的3D堆叠沙漏网络被改进以提高性能并降低推理计算成本。
GwcNet扩展了PSMNet,具有分组相关代价量和改进的3D堆叠沙漏网络。在PSMNet中,必须通过3D聚合网络从头开始学习级联特征的匹配代价,这通常需要更多的参数和计算成本。 相比之下,完全相关(DispNetC)提供了一种通过点积测量特征相似性的有效方法,但它丢失了很多信息。我们提出的分组相关性克服了这两个缺点,并为相似性度量提供了良好的特征。
实验结果
代码链接:https://github.com/xy-guo/GwcNet(pytorch)
传统的半全局匹配(SGM)和代价过滤都是强大而有效的代价聚合方法,但是它们不是可微的,不能以端到端的方式轻松训练。本文提出了两种新的神经网络层:第一种是半全局聚合层,它是半全局匹配的可微近似(在整个图像上聚合不同方向的匹配代价,这使得能够在遮挡区域或大的无纹理/反射区域中进行精确估计);第二种是局部引导聚合层(处理薄结构和对象边缘,以便恢复由下采样和上采样层引起的细节损失),它遵循传统的成本过滤策略来精炼细结构。这两个层可用于代替广泛使用的3D卷积层(其具有立方计算/存储器复杂性,因此计算成本高并且消耗存储器)。实验表明,具有双层引导聚合块的网络容易胜过具有19个3D卷积层的最先进的GC-Net。
实验结果
代码链接:https://github.com/feihuzhang/GANet(pytorch)
小结:
速度+精度-:DeepPruner(0.182s)
速度-精度+:GwcNet(0.32s)
4 数据集
SceneFlow:是合成立体数据集的数据集集合,由Flyingthings3D,Driving和Monkaa组成。包含35454个训练和4370个测试立体对的ground truth视差图(H=540,W=960)。通常使用端点误差(EPE)作为SceneFlow数据集的评估指标。
FlyingThings3D:是用于场景匹配的虚拟数据集,包括光流估计和视差预测。该数据集由具有背景对象和3D模型的计算机图形技术提供。它提供22,390张用于训练的图像,4,370张用于测试的图像。
KITTI 2012:包括从测试车辆收集的具有挑战性且变化多样的道路场景图像,为训练图像提供稀疏的LIDAR ground truth视差图。包括194个训练图像对和195个测试图像对。
KITTI 2015:包括200个训练图像对和200个测试图像对(H=376,W=1240)。ground truth视差图是通过使用Velodyne HDL-64E激光扫描仪收集的激光雷达点获得的。与KITTI 2012不同,动态场景存在密集的真实视差。
CityScapes:城市场景图,它提供了校正后的立体图像对和由SGM算法预先计算的相应视差图。它包含用于左视图的5,000个高质量像素级精细map注释。包括2975、500和1525的数量进行训练,验证和测试。 此外,该数据集在额外的训练集中提供了19997个立体图像及其SGM标签。
Middlebury:具有多个手工布局的室内场景。与KITTI数据集相比,视差图由结构光捕获,具有更高密度和精度。
附:
相关代价量的计算
1.在DispNetC之后,有很多工作直接从相关代价量中回归差异图。 给定左和右特征图fl和fr,计算每个视差水平d的相关代价量,
2.最近的工作采用了基于串联的特征量和3D聚合网络,以实现更好的上下文聚合。 肯德尔等人提出了GC-Net并且是第一个使用3D卷积网络来汇总代价量的人。 左侧和右侧特征fl,fr不是直接给出代价量,而是连接在一起形成4D特征量,
度量标准
EPE:终点误差,即以像素为单位的平均视差误差。
D1:异常值被定义为其视差误差大于max(3px,0.05d*)的像素,其中d*表示ground truth。
损失函数
一般采用平滑的L1损失函数来训练模型。 与L2损失相比,平滑L1在视差不连续处是鲁棒的并且对异常值或噪声具有低灵敏度。
无监督/自监督:
有监督方法基于大量精准的ground truth disparity和stereo image pairs。这些数据难以获取,所以这些方法一般用合成数据。虽然合成数据越来越真实,但是需要为每个应用人工创建新内容。接下来介绍不需要用到真实视差图的无监督/自监督的深度学习方法。
(单目)
网络通过推测视差将左图warp来匹配右图。可以只用左图同时预测两个视差,用左右一致性来增强它。通过采用双线性采样(Spatial Transform Networks)来生成图像,整个网络完全可微。
如下图所示:
Naïve:从左图采样,生成与目标右图对齐的视差图。
NO LR:从右图采样输出与左图对齐的视差图。这么做的话,被推断出来的视差图表现出“纹理拷贝”人工合成和深度图连续性上面误差。
Ours: 单个左图作为卷积神经网络的输入,同时推断出左图视差和右图视差,右图只在训练时候使用。用左右图一致性损失增强左右视差图的一致性可以让结果更准确。
Loss
由外观匹配loss,视差平滑loss以及左右一致性loss组成.
Appearance Matching Loss:
这里作者用了简化的SSIM,3*3块作为滤波器,而不是用高斯,设置。
Disparity Smoothness Loss:
Left-Right Disparity Consistency Loss:
最后的训练损失:
其中每一项都包换左右视图,但是只有左图会喂到卷积层中。s代表尺度,本文选取4个尺度,组成总体损失:
在测试的时候,网络在最好的尺度层预测左图视差图,它的分辨率和输入图像一样。
后处理
为了减少立体遮挡的影响(立体遮挡会在图像的左侧和遮挡物的左侧产生视差斜坡),作者做了个后处理。对于测试时候的输入图片I,计算它镜面翻转之后的图I’的视差图dl’, 通过把这个视差图翻转回去,得到一个视差图dl’’,接着将这个视差图对齐dl,而此时视差坡是在图像的右侧和遮挡物的右侧,结合两个视差图组成最后的结果(用dl’’的左边5%和dl的右边5%),中间部分是两个视差图之间的平均。这一步后处理提升了准确度并且减少了人工合成的感觉。但是代价是测试时间加倍了。
注:单目深度估计,实验与双目视差估计有出入,实验结果不再贴出。
代码链接:https://github.com/mrharicot/monodepth(tensorflow)
文章提出多loss网络结构,包括6个loss(DNM6)和扩展的12个loss(DNM12)。
DNM6
Loss
由外观匹配loss,视差平滑loss以及左右一致性loss组成,每个loss包括左和右网络,所以可细分为6个loss。
Appearance Matching loss:
Disparity Smoothness Loss:
Left Right Consistency Loss:
为了使损失函数更具鲁棒性,文中采用了左右两个网络的四个输出尺度:
DNM12
DNM6的左右视差图由左右网络分为独立生成,而DNM12提出了左右交叉视差图:
Loss
外观匹配loss,视差平滑loss以及左右一致性loss分别扩展为4个loss,所以可细分为12个loss。
Appearance Matching loss:
Disparity Smoothness Loss:
Left Right Consistency Loss:
代码链接:https://github.com/ishmav16/Dual-CNN-Models-for-Unsupervised-Monocular-Depth-Estimation (tensorflow with only tested)
(被动双目)
网络以自我学习的方式端到端训练,只需一对立体图像对作为输入,无需ground truth视差图或其他标签。网络可以以两种不同的模式应用:一种是传统模式,其中训练阶段和测试阶段明显分开,并且在测试阶段,网络的所有参数都被固定。 另一种模式是我们所谓的“自我改进”模式,该模式允许网络在新的立体声图像上进行测试时,不断调整其参数。后一种模式有效地使我们的网络能够适应新的前所未有的场景图。
对于给定的左图以及右图视差,warp的右图为:
Loss:
其中Lm对处理无纹理区域提供了强大的正则化。各项具体定义见paper。
实验结果
小结:精度比传统方法有很大的提升,并且与先进的监督学习方法比较接近。
(主动双目)
本文首次提出了第一个主动双目视觉系统的深度学习解决方案 ActiveStereoNet。由于缺乏 ground truth,本文采用了完全自监督的方法,即使如此,本方法克服了过度平滑的问题,保留了边缘,并且能有效处理遮挡。
深度传感器
TOF系统受运动伪影和多路径干扰的影响。
结构光容易受到环境光和多设备干扰的影响。
在需要昂贵的全局优化技术的无纹理区域,尤其是在传统的基于非学习的方法中,被动式立体斗争尤为突出。
还有一种深度传感器类型提供了潜在的解决方案,那就是主动立体系统。使用红外立体摄像机对,伪随机模式通过模式化的IR光源将场景投射到纹理上。 通过适当选择波长感应,摄像机对可捕获主动照明和被动光的组合,从而改善结构光的质量,可同时在室内和室外场景中提供强大的解决方案。
网络结构
ActiveStereoNet的输入是具有主动照明的经过校正的同步图像对,输出是原始分辨率下的一对视差图。
算法采用两阶段模型, 首先建立一个低分辨率的成本项并进行的第一次视差估计。然后进行双线性采样,其后跟一个残差网络来预测最终的误差。 还对“失效网络”(底部)进行了端到端培训,以预测置信度图。
最后的残差细化检索高频细节(即边缘)。 ActiveStereoNet还可以同时估算一个失效掩码,以去除最终结果中的不确定区域。
Loss
作者声称,尽管loss的一个可行选择是光度误差,但由于强度和视差之间的相关性很高(明亮的像素比暗点的像素更容易产生较大的残差),因此它不适用于active的情况。
提出了一种局部对比度归一化(LCN)方案,该方案不仅消除了强度和视差之间的依赖性,而且在被遮挡区域中提供了更好的残差:
计算围绕每个像素的9×9小块中的局部均值µ和标准偏差σ,其中η是一个小常数,防止除零
现在将左图像I上原始像素与重建的左图像I^之间的光度损失重新计算如下:
重新对光度损失进行加权,以使标准偏差σ接近零的低纹理区域不会放大任何残差以及两个匹配像素之间的噪声。
窗口优化
传统的立体匹配使用自适应的支持窗口(ASW),进行成本聚合,这虽然有效但是却非常慢,本文提议在训练过程中使用 ASW 方案,因此他不影响运行时的成本。使用一个2Kx2K窗口大小的聚合成本:
失效网络
到目前为止,提出的loss还没有解决被遮挡的区域和错误的匹配(即无纹理的区域)的问题。 遮挡区域并不能在成本项中提供任何有效的信息。
为了解决遮挡问题,ActiveStereoNet使用了传统立体声匹配方法(称为左右一致性检查)的改进版本。 从左和右视点(分别为d_1和d_r)计算出的视差用于定义像素p(i,j)的mask:
m_ij = 0的那些像素在loss计算中被忽略,作为失效网络的副产品,ActiveStereoNet获得深度估计的置信度图。