估计RGB图片的深度是一个长期存在的病态问题,计算机视觉、图形学、机器学习社区已经探索了数十年。立体匹配是最广泛见诸文献的技术之一,因为它与人类的双目系统有强关联。传统上,利用多张图片的人工特征匹配来处理基于立体的深度估计。尽管研究工作众多,传统方法仍然受困于高纹理区域、无纹理区域和遮挡。由于在解决各种2D和3D视觉问题方面取得了巨大的成功,基于立体的深度估计领域越来越青睐深度学习,在2014到2019年间已经发表了超过150篇文章。深度学习方法已经证明了它在性能上的飞跃,它可以应用在自动驾驶和增强现实。本文对该领域进行了综合性研究,总体了最常用的流水线,讨论了优势和局限性,还推测了未来可能的发展方向。
用一张或多张RGB图片估计深度是长期存在的病态问题,广泛应用于机器人、自动驾驶、目标识别、场景理解、4D建模和动画、增加现实、工业控制、医疗诊断。该问题已经被研究了几十年了。在见诸文献的技术中,立体匹配是传统上研究最多的领域之一,因为它与人眼双目系统有强关联性。
基于立体的深度估计方法的第一代用精确标定的相机和多张图片的像素匹配。尽管取得不错的结果,但也在很多方面受限。例如不适合处理遮挡和无特征区域或者高度重复纹理化区域。有趣的是,人类可以利用先验知识很好地解决这些病态问题。例如人类很容易估计目标的尺寸、相对位置、到人眼的距离。这是因为人类从以前看到的物体和场景获取一些先验知识,继而的头脑中建立了描述三维世界的模型。第二代方法用先验知识把问题转化为一个学习任务。深度学习技术的到来伴随着数据量的持续增长,让第三代方法能够恢复丢失的维度。这些方法已经在与计算机视觉和图形学相关的任务中取得了令人振奋的结果。
本文对利用深度学习技术实现基于立体的深度估计这一领域在最近的进展进行了综合的、结构性的回顾。这些方法使用空间分布的RGB相机拍摄的两人张或多张图片。我们收集了2014年1月到2019年12月发表于计算机视觉、计算机图形学和机器学习领域顶级会议和期刊的150余篇论文。目的是给读者一个引导。
本文的主要贡献是:
设是同一场景的个RGB图片的集体,相机的内外参可能是已知或未知。目标是一张或多张深度图,可以用相同视点的图片,也可以用不同视点的。本文聚焦于用深度学习方法实现基于立体的深度估计,当n = 2时是立体匹配,当n > 2时是Multi-View Stereo (MVS). 单目和基于视频的深度估计方法走出了本文的研究范围。
基于学习的深度重建可能被表述为学习一个预测器,输入是图片集I,输出是深度图,
尽可能地接近于真实的(也是未知的)深度图D。换句话说,我们试图找到一个函数,使 最小。其中是一组参数,是真实的深度图D与重建的深度图之间的距离度量。目标函数是已知的损失函数。
所有的方法主要区别为两类。第一类方法模仿传统的立体匹配技术,显式地学习匹配或像素关联。该关联可以被转化为光流或视差图,继而可以被转换为参考图片中每个像素的深度。预测器由三个模块组成:特征提取模块,特征匹配和损失值聚合模块,视差或深度估计模块。每个模块都是独立训练的。
第二类方法是端到端的训练。推荐两类主要方法。早期的方法把深度估计算作一个回归问题。不用显式的多视角的特征匹配直接把输入图片回归为深度图。该方法简单又快速,甚至可以实习运行,缺点是需要海量的训练数据,这是很难获取的。第二类方法模仿传统的立体匹配,但把问题划分成由差分块组成的几个阶段,因而允许端到端训练。
在这些方法中,都可以用精修模块或后处理模块继续优化估计的深度图。在每次有新的图片可用时这些模块就开始工作。
最后,基于深度学习的立体方法的性能不仅依赖于网络结构,也依赖于训练数据,还依赖训练过程中取参数的优化。参数优化包括损失函数的选择和监督模式,监督模块包括依赖人工标注的完全有监督、弱监督和自监督。本文后面会讨论这些方面。
下表总结了部分数据集。
基于立体的深度重建方法用两张RGB图片生成视差图D,其过程是最小化能量函数
其中x和y是图像像素,是x的领域内像素的数量。第一项是匹配损失。如果使用经过双目校正的双目相机,是左目与右目的匹配损失。此时是像素x的视差。可以通过三角化来计算深度。如果把视差离散化为个离散值,C就变成三维损失空间,其尺寸为。在更广泛的情况,也就是n ≥ 2时,损失值有深度的参考图片中x的逆似然。 方程(1)的第二项正则项,用来约束平滑性和左右一致性。
传统上,解决这个问题分四部分,分别是特征提取,特征匹配,视差计算,视差精修与后处理。前两部分构建损失空间C。第三部分调整损失空间并最小化方程(1)以获取视差图的初始估计。最后一部分精修并后处理初始视差图。
本节聚焦于已经由深度学习方法实现的各个部分,下表列出了最优秀的方法。
早期的深度学习技术用学习的特征取代人工特征来做立体匹配。这些方法取两个像素块,一个在左目以为中心,另一个在右目以为中心。用CNN计算它们的关联特征矢量,然后匹配,生成相似度得分,使用标准的相似度度规,比如L1,L2,相关度规,或者用上层网络学习的度规。这两部分可以分开训练也可以共同训练。
基础网络架构,如上图所示,由两个CNN编码分支组成,作为描述子计算模块。第一个分支取左目中像素周围的一个像素块,输出一个特征矢量。第二个分支取右目中像素周围的一个像素块,这里,是候选视差。编码器由四个卷积层组成,除了最后一层外每一层都配一个ReLU单元。有些研究者在此基础上增加了下述工作:
学习的特征被放到顶层模块,该模块返回相似度得分。它可以是相似度度规,例如L2距离,余弦距离,(归一化)相关距离(或内积)。相关L2距离的主要优势是它可以用一维或二维卷积操作来实现,也叫作相关层。相关层并不要求训练,因为实际上滤波器是网络的第二个分支计算的特征。相关层已经被一些文献使用起来。
最近的一些工作使用由全连接层组成的决策网络取代人工设计的相似性度量,全连接层可以由1×1卷积,全卷积层或卷积层加全连接层来实现。决策网络和两张图片的像素块的相似性的特征提取模块联合训练。[38]使用三个全连接层加softmax组成的头部网络。[37]使用两个线性全连接层(每个包含512个隐藏单元),它们中间有一个ReLU激活层。在这些文章中,特征编码模块的两个分支计算的特征先被串联起来然后送到头部网络中。[47]在把来自多个像素块的特征聚集在一起做平均池化再送入决策网络。该工作的主要优势是可以处理任意数量的像素块而无需改变网络或重新训练。同样地,它适合计算多个像素块的相似性。使用决策网络取代人工设计的相似性度量让学习的方法变成了可能。使用相关层精度会更高,但也会更慢。
基线结构被如下几种方式扩展:(1)使用残差网络(ResNet) 改善训练;(2)在不损失分辨率和计算效果的前提下增大网络的接受域;(3)处理多尺度特征;(4)减少正传传播的数量;(5)学习相似性,但不显式地学习特征。
[39][42][38]在特征提取块中使用标准的卷积层。[46]增加了带多级加权残差残差块,这样更容易训练更深的网络。它的特别之处是网络可以自己学习如何调节加入的跳级连接的贡献。[39]证明了这一架构优于基础网络。
学习的特征的尺度由下列各项决定:(1)输入像素块的尺寸;(2)网络接收域;(3)每层中卷积滤波器和池化操作的核尺寸。增加核尺寸可以在图像像素之间得到更多的全局交互,但也导致了较高的计算开销。在[39], [42]中使用的卷积池化,降低了分辨率并导致了细节上的损失,并不适合稠密的关联估计。
通过某些技术可以在增大接收域的同时不损失分辨率也不增加计算时间。例如[52]使用扩张卷积,也就是大的卷积滤波器,但该滤波器带一些孔。因此并不增加开销。其它的技术,如[48], [49]使用空间金字塔池化 (SPP) 模块放在网络的不同位置,如图 2-(c-e)所示。例如[48]在立体匹配中引入了FW-CNN,再在决定网络的末端加上SPP模块,如图2-(d)所示。作为一个结果,接受域可以被扩大。但是对于参考图片的每个像素,全连接层和层化操作需要计算次,这里是视差的层数。 为了避免这一问题,[49]在每个特征计算分支的末端放一个SPP模块,如图2-(c) and (e)所示。用这种方式,每一个像素块仅计算一次。[49]使用不同窗口尺寸的多个one-stride池化到不同的层,然后把它们级联起来产生特征地图。如图2-(e)所示。
[37], [40]使用的方法是:用多流网络在多尺度中学习特征,一个块尺寸对应一个流网络。如图3所示。[37]使用双流网络,其质是由两个连体的网络在头部结合在一起,如图3-a所示。第一个网络叫中心高分辨率流,它的输入是两个以某像素为中心的32×32像素块,第二个网络叫环绕纸像素流,它的输入是两个64×64的像素块,但下采样到32×32。两个流的输出被结合在一起然后送到决策网络,该网络返回匹配得分。[40]使用类似的方法,区别在于它是在每个流上附加一个头部网络来计算匹配得分。然后两个得分投票,如图3-b所示。多流结构的主要优势是它可以在单次前向传播中在多个尺度上计算特征。但是,它要求每个尺度一个流,如果超过两个尺度则并不实用。
本节描述的网络由特征抽取块和特征匹配块组成。因为目标是学习如何匹配像素块,这两个模块以监督方法或弱监督方法联合训练。
一般监督学习的训练集由正样和负样组成。每个正样(负样)由参考像素块和另一张图片的匹配像素块(非匹配像素块)组成。训练时一次取一个正样本或一个负样本,适应它们的相似性。或者一个正样本和一个负样本,最大化它们的相似性差异。也就是说:让两个正样比两个负样更加相似。后者称为三元对比学习。
[39], [42]在KITTI2012[15]或Middlebury[20]数据集上使用真值差异性。针对每一个差异值,该方法提取一对负样和一对正样作为训练样例。该方法可以得到从KITTI2012 [15]中提取2500万训练样例,从Middlebury数据集得到3800万训练样例。该方法忆经在[37], [38], [40]中得以应用。还可以使用数据扩增技术对训练集进行扩增。例如翻转像素块或者沿不同的轴旋转像素块。
尽管监督学习性能优良,但神经网络模型要求巨量的标注训练集,这是很困难的,或者成本也很高(例如,火星表面三维重建)。可以用深度传感器产生很多真值,但是它也包含噪声,这缩减了监督学习的有效性。使用随机噪声扩增数据或者合成数据都可以缓解这一问题。但是合成过程是人工设计的,这并不能说明规律,尤其是双目系统和目标场景。
损失函数:有监督的双目匹配网络训练的目的是最小化匹配损失,该损失是每个训练样例的真值和预测匹配分数之间的差异。可以定义为L1距离,铰合损失或交叉熵损失。
弱监督技术一个或多个双目约束来减少人工标注的数量。[50]认为多实例学习(MIL),结合双目约束和真值不可用时用场景的组信息去训练匹配网络。监督学习要求匹配块与非匹配块成对出现。而弱监督学习的训练集由N个三元组组成。每个三元组分成三个部:(1)在参考图片的水平线上提取W参考像素块;(2)在右目图片的水平线上提取W正样块;(3)同理提取负样块,即从右目图片的另一个水平线上提取不匹配的像素块。这样,训练集可以在没有人工标注的情况下自动构建。该方法在训练的时候使用五个约束:对极约束,像差范围约束,单值约束,平滑约束,顺序约束。定义三个损失项,分别应用这些约束的不同子集。
该方法已经用于训练深度连体神经网络,该网络用两个像素块作为输入并预测相似度度量。基于标准数据的基准化已经证明该方法的性能与MC-CNN-fst [39]相当,两者网络结构相同,但后者使用完全标注的数据。
一旦估计出了原始的损失空间,如果不使用方程(1)中的正则项,或者图1中的C模块,便可以通过最小化损失值来估计视差。但是从图像特征计算而来的原始损失空间可能会被噪声污染。例如,非朗伯表面、目标遮挡、重复纹理。因此估计出来的深度值含噪声。[39], [40], [44]使用传统的基于马尔可夫随机场(MRF)来规避这一问题。还可以把初始的损失空间C送到全局匹配[11]或半全局匹配[55]以计算视差图。半全局匹配在精度和开销上做了较好的权衡。其平滑项定义为:
其中。和是正权重,满足。是Kronecker delta函数,当括号中的条件满足时值为1,否则值为0. 为了求解该优化问题,把SGM势能项拆分成多个势能项,每都沿路径s定义。分别最小化这些势能项然后求和。接下来计算x点的视差,方法是总损失项在所有方向上对比,赢家通吃。
该方法要求在方程(2)中设置两个参数和,[56]训练SGM-Net神经网络来在每个像素上设置该参数。[39]人工调参得到了更好的惩罚项。
SGM方法使用多个一维扫描线求和组成损失项。该方法有两个主要缺点:(1)扫描线优化方法增加了人工痕迹,会导致结果不精确;(2)该方法内存占用很高,所以要么要求输入的图像分辨率低,要么要求较好的计算设备。[57]把融合模块解决为在图像的每个像素的所有扫描线优化项中选择最优的。使用每个像素的随机数分类器来求解该任务。
[58]学习一个加权和,其中每个一维扫描线的权限定义为使用传统技术或深度神经网络计算而来的置信度地图。
最近有一些工作用端到端流水线解决双目匹配问题。 这些方法主要分为两类。早期的方法,例如FlowNetSimple [51]和DispNetS [22]使用简单的编码解码器,把左目和右目叠加到一起,形成6D空间,然后用回归方法得到视差图。这些方法并不要求显示的特征匹配模块,因此计算得很快,以至于可以实时运行。但是,这些方法要求海量的训练数据,获取这些数据是比较困难的。第二类方法模仿传统双目匹配流水线,把问题分成了几步,每步都包含微分模块,因此允许端到端训练。下面将详细介绍这些技术。下图把最优秀的方法进行分类。下表对比了28个关键方法。
特征学习网络如图2和图3所示。但是并不单个有像素块,面是在单次前向传播时处理整张图片,产出与输入图片相同尺寸、相同分辨率的特征图。特征匹配遵循如下两个策略之一:
每个分支产生一个特征图,它们分别描述对应的输入图片。前提是图片已经做了双目较正,即左图和右图的特征关联在同一条水平线上。
第d个分支(),处理一组(两张)图片,如图2-(f)所示,第一张图片是参考图片,第二张图片是右目图片但重投影到第d张深度平面。每个分支生成一个相似性特征图,该特征图表征参考图和右目重投影图的相似度。这些技术并不较正图片,假设相机的内参和外参是已知的。视差等级的数量不能在不更新网络结构和重新训练的情况下发生变化。
在这两种方法中,特征提取模块使用全卷积网络,如VGG,或参考网络,如ResNets。它们也可以用膨胀卷积或多惊讶方法来获得并包含更多的一元特征上下文信息。例如,PSM-Net[64]加上空间金字塔池化(SPP)模块以提取并合并多尺度特征。[65]扩展了PSMNet,使用的是多等级上下文汇总模型,取名为多等级上下文超和(MLCUA),它简单地把所有的卷积特征组合成更加有区别性的表示。使用浅跳连接把最浅最小的尺度的特征与最深最大尺度的特征组合在一起。该方法的性能已经得到了证明。与PSM-Net相比,它没有明显地增加网络参数。
一旦计算出来特征,下一步就是计算匹配得分,该得分会被以损失空间的形式送入头部网络,用于正则化和视差估计。损失空间可以是三维的,四维的,或者混合的。三维损失空间的第三维是视差等级。四维损失空间的第三维是特征维,第四维是视差等级。混合损失空间兼具三维和四维损失空间的优点。一般来说,以较低的分辨率来构建损失空间,例如是输入分辨率的八分之一[72], [73]。接下来要么升级并精化,要么用于估计低分辨率的视差图,然后再升级并精化。
用左目图片和在预定义视差范围内的右目图片的特征之间的L1,L2或相关距离就可以构建简单的三维损失空间。基于相关的非相似性的优点是它可以用卷积层来实现,它并不需要训练,它的滤波器是用网络的第二个分支计算而来的特征。如估计网络,如FlowNetCorr [51],使用二维相关。视差估计网络,如[22], [68], iResNet [63], DispNet3 [75], EdgeStereo [76], HD3 [80]和 [83], [84],使用一维相关。
得到损失空间之后,有很多方法可能计算初始视差图。例如argmin,softargmin,在损失空间的深度这一维做亚像素的最大后验近似。如图5-(a)所示。这等价于在方程(1)中删除正则项。但是,一般来说,原始的损失空间是被噪声污染的(例如,存在非朗伯反射表面,遮挡,重复纹理)。正则化模块的目标是在估计视差图初值之前利用空间和视差的上下文关系去精化损失空间。
(1)使用传统方法正则化
早期的方法使用传统技术正则化损失空间,显示地引入空间约束,如深度图的平滑。例如马尔可夫随机场(MRF),条件随机场(CRF),半全局匹配(SGM)。最近的文章显示,深度学习网络可以用于精调这些方法的参数,例如[71]提出了混合CNN-CRF。CNN计算了方程(1)的匹配项,使其变成CRF模块的一元项。用另一个CNN计算边权重,该权重参数化CRF的二元项。端到端训练的CNN-CRF有远少于早期方法的参数,且很好地使用了训练数据,因为其性能是颇具竞争性的。
[89]提取一种方式在分割任务中把CRF模仿为RNN,所以它的整个流水线可以被端到端地训练。与分割问题不同,在深度估计问题中,深度样例的数量(深度样例对应语义分割任务中的语义标签)在不同场景中应该是变化的。[90]重新设计了RNN形式的CRF模块,其模型参数独立于深度样例的数量。[91]MRF中的推荐公式化为一个可微函数,因此使用反射传播(BP)来端到端训练。[89]和[91]专注于MVS。但是这些方法比较通用,且可以用于正则化双目产体网络的三维损失空间。
(2)使用二维卷积正则化,见图5-b(b), (c)
另一个方法是使用一系列二维卷积层产生另一个三维损失空间。二维卷积计算开销较少。但是该方法只获取并集合空间维的上下文,忽略视差维的上下文,如图5-(b)所示。[92]沿着深度方向,通过门循环单元(GRU)正则化二维损失地图,如图5-(c)所示。这急剧减少了内存占用。例如[93]把内存由15:4GB减少到约5GB。同时获取空间和视差维的上下文,使高分辨率重建变得可行。
(3)使用三维卷积正则化(3DConvNet),见图5-(d)
[72]使用L2距离来计算初始的三维损失空间,使用三维卷积来在空间和视差维进行正则化,见图5-(d)。由于内存要求,该方法首先估计了低分辨率视差图,然后用残差学习不断地改进该视差图。[73]提出的方法与此类似,区别在于精化部分,首先让卷积层分别运行在非采样视差和输入图片上,然后合并特征并产生残差。[81]发现,损失空间正则化这一步是最费计算资源步骤之一,因此提出一个正则化模块,该模块使用三维膨胀卷积,在宽度、高度和视差维度上膨胀以减少计算资源。
四维损失空间存领教特征的维度。四维损失空间的理论依据是头部网络学习合适的相似性,用它来对比特征而非使用人工方法。
有两种方法构建四维损失空间,一种方法是用预定义的视差范围的特征差异,该方法构建的损失空间的维数是;另一种方法是把网络的不同分支的计算得的特征组合在一起。[61]用该方法构建了一个尺寸为(c是特征的维度)的四维空间。[70]使用的方法类似,但以交错的方式把特征连结在一起。设是左目图像的特征地图,是右目图像的特征地图,最终的特征空间以这样的方式集成起来。在色差d = i时第2i个切片是左侧的特征地图,第(2i + 1)个切片是右侧的特征地图。该四维损失空间二倍于[61]中的损失空间。为了在损失空间中得到多尺度上下文信息,[64]为每张输入图片生成一个特征金字塔,把它们上采样到一个相同的维度,然后构建一个简单的四维损失空间。[79]用多尺度特征构建多尺度四维损失空间。
相比于三维损失空间,四维损失空间含有更加丰富的信息。但是,由关系得到的空间并不包含特征相似度信息,在学习相似性函数的时候需要更多的信息。
四维损失空间用三维卷积正则化,使用高度、宽度和视差维度上的相关来产生三维损失空间。 [61]使用带有卷积和跳跃连接的U-net编码解码器。[70]使用了类似的方法,只是增加到正则网络扩展部分的残差连接。考虑到大的上下文信息并没有大的附加计算负担,[61]分等级地正则化损失空间,分为四个亚采样等极,且允许显式地利用宽视域上下文。使用一个三维损失集成模型把多尺度的四维损失空间集成进一个简单三维损失空间,该模块始于最小的损失空间,并且成对运行。每个编码解码器处理一个空间,上采样到下一个分辨率金字塔,然后用三维特征融合模块进行融合。
半全局匹配(SGM)也用于正则化四维损失空间,可以使用卷积网络正则化四维损失空间。特别地,[77]先用由三维卷积组成的编码解码器处理初始的四维损失空间,然后上卷积,处理另一个三维损失空间。接下来的步骤是集成,使用一个端到端双流网络来实现。第一个流产生三个损失集成项,分别三个维度,即高度、宽度和视差。第二个流是用于选择最佳项的引导流。使用二维卷积产生三个引导图。最后一个三维损失空间是三个损失项的加权生,也就是。
三维卷积较为消耗内存和计算开销。因此,接下来的工作聚焦于(1)减少三维卷积层的数量;(2)逐渐地精化损失空间和视差图;(3)压缩四维损失空间。下面分别讨论:
(1)减少三维卷积层的数量
[85]引入了GANet,取代了正则项中的大量三维卷积层,这些正则项中包含(1)两个三维卷积层;(2)准全局集成层(SGA);(3)局部引导层(LGA)。SGA是准全局匹配(SGM)的可微近似。不像SGM,在SGA中用户定义的参数是可学习的,而且把它们添加为匹配损失项的惩罚系数。因此,它们是可适应的且在不同情境下的不同位置是更灵活的。另一方面,把LGA层添加到末尾,目的是精化薄结构和目标边。SGA层和LGA层取代三维卷积层,用于获取局域的和整张图片的损失依赖。这些方法大大提升了具有挑战的场景中的视差精度,如遮挡,大块无纹理区域,反射区域,薄结构。
(2)改进方法
有一些方法避免用开销较大的三维卷积直接正则化高分辨率四维损失空间。取而代之的是一个改进方法。例如[64]使用了PSM-Net,首先估计低分辨率四维损失空间,然后使用堆叠的沙漏三维编码解码块来进行正则化。每个块输出一个三维损失空间,然后上采样并使用额外的三维卷积层加softmax操作以回归得到高分辨率视差图。因此,堆叠的沙漏块可以被看作精化模块。
[88]使用三阶段视差估计网络AnyNet,用从粗到精的方式构建损失空间。第一步视作输入低分辨率特征图,构建低分辨率四维损失空间,然后使用三维卷积搜索一个小的视差范围以估计一个低分辨率视差图。上采样上一个等级的预测结构然后在高尺度上变换输入特征,用相同的视差估计网络估计视差残差。优点有两方面:第一,在高分辨率情况下,网络只学习预测残差,用以减少计算开销;第二,该方法是渐进的,且可以选择返回中间视差,以权衡精度和速度。
(3)四维损失空间压缩
[78]把特征压缩为比较紧致的匹配特征,在没有牺牲精度的情况下减少了内存占用。更重的是,允许网络处理任意数量的多视图图片,且在可以在运行时变换输入图片的数量,而无需重新训练网络。
A Survey on Deep Learning Techniques for Stereo-based Depth Estimation