图像是立体场景的投影,投影只捕获了平面信息,因此单目深度估计很具挑战性。但是双目可以通过匹配用几何方法直接计算出深度信息。因此单目深度估计具有一定的研究价值。
深度估计可以用于3D建模、场景理解、深度感知(depth-aware)的图像合成等领域。
基于深度学习的单目估计依据是像素值关系反映深度关系,方法是拟合一个函数把图像映射成深度图:。从得出的深度图轮廓和不断提高的实验结果可以看出,的确可以用一个这样的函数从像素值中恢复出相对深度值。
论文A-E是2005年、2007年斯坦福大学的文章。由于深度学习这时还不流行,这些方法是基于机器学习的。
A.High Speed Obstacle Avoidance using Monocular Vision and Reinforcement Learning(2005)
B.Learning Depth from Single Monocular Images(2005,Saxena)
把RGB到深度图的映射看成一个函数。使用线性回归、MRF和手工设计的多尺度纹理特征对单个像素的深度和多个像素的深度关系建模。后来扩展为Make3D产生3D模型。
C.Depth Estimation using Monocular and Stereo Cues(2007)
D.3-D Depth Reconstruction from a Single Still Image(2007)
E.Learning 3-D Scene Structure from a Single Still Image(2007)
论文F-G是Eigen组的文章。
F.文章一(2014)
对立体图像,估计深度可以通过局部对应关系;对单目图像,估计深度需要综合全局和局部线索。基于这个思路,作者设计了一个包含两个网络的系统:第一个coarse网络利用整个图像做粗略的全局预测;第二个fine网络局部地优化预测结果。网络框架如下:
两个网络的输入都是原图,然后coarse的输出和fine的第一层输出叠加(concat)后作为fine第二层的输入。coarse网络基于AlexNet;fine网络不改变特征图的尺寸。训练时先训练coarse,再固定coarse训练fine,也就是说训练fine时不向coarse反向传播。
本文提出的评估方法也被以后的工作采用。
G.文章二(2015)
改进的框架可以预测深度、表面法向量和语义标签。框架包含三个网络,其中第一个网络基于VGG16。
H.Liu(2015)
深度值具有连续性,因此可以看作连续CRF学习问题。创新点:
- 由于深度值的连续性,概率密度函数中的配分函数可以解析地计算出来,这样就可以不做任何近似地计算对数似然优化。
- 在一个统一的深度CNN框架中学习连续CRF的一元和二元势能。
- 提出一个基于FCN的模型和超像素池化方法提高了速度。
引入CRF可以提高精确度,但也增加了复杂度。
I.monoDepth(2017,Godard)
作者受DispNet的启发(DispNet受FlowNet的启发。FlowNet参考了全卷积网络FCN,没有全连接层),利用视差估计深度。使用对极几何约束,利用图像重建损失训练网络产生视差图。创新是左右视差一致性。
使用双目立体视频(footage)训练。假设和是一个标定过的双目相机同一时刻拍摄的左右两幅图像,作者不直接估计深度而是估计一个稠密对应场(dense correspondence field)。和左图像一起可以合成右图像,合成的右图像称为,同样可以用右图估计左图:。假设图像是矫正过的,是图像视差,即每个像素的一个标量值,也是我们的网络要预测的。相机基线距离是,焦距是,则深度。
自此以后的深度估计大都基于DispNet。有些工作使用无监督单目图像,是未知的,因此通常对DispNet输出的视差图的每个元素求倒数当作深度图。
J.SfMLearner(2017,Zhou)
作者zhou的工作主要是视图合成,因此在深度估计的工作中也使用视图合成作为监督。文中的单目深度估计使用的是DispNet网络架构,这是一个带跳跃连接(skip connections)和多尺度边(multi-scale side)预测的编码器-解码器网络,后来的深度估计工作基本都采用这样的结构。DispNet预测的是视差,而视差和深度互为倒数,因此用来求深度。
作者设计了一个位姿估计网络(PoseNet),这个网络被后来的工作直接采用。为了处理遮挡和动态区域,作者提出了可解释性掩码(Explainability mask)网络(ExpNet)。ExpNet共享PoseNet的前5层(它们的前5层相同),这5层卷积层称为特征编码层,具体实现如下:
cnv1 = slim.conv2d(inputs,16, [7, 7], stride=2, scope='cnv1')
cnv2 = slim.conv2d(cnv1, 32, [5, 5], stride=2, scope='cnv2')
cnv3 = slim.conv2d(cnv2, 64, [3, 3], stride=2, scope='cnv3')
cnv4 = slim.conv2d(cnv3, 128, [3, 3], stride=2, scope='cnv4')
cnv5 = slim.conv2d(cnv4, 256, [3, 3], stride=2, scope='cnv5')
无监督的工作大都以视图合成作为监督,使合成的视图与目标视图差异最小化。但遮挡区域、动态区域、非共同视野区域在目标视图中没有对应区域,因此之后的工作多像本文一样,采用掩码排除这些区域。
K.vid2depth(2017,Mahjourian)
这篇文章的网络结构完全基于SfMLearner。其它工作基本都是利用诸如光度一致性、梯度一致性等图像平面先验约束网络。作者提出用点云对齐做三维空间约束。点云对齐在SLAM和三维重建等领域很常用,其基本思想就是:相机在两个位置看到同一些空间点(点云),则可以利用特征匹配(传统方法)或深度学习(我们现在讨论的方法)估计出这两个相机的相对位姿和空间点到相机的距离(深度),然后根据位姿和深度把在坐标系中的坐标变换的另一个坐标系中,变换得到的坐标和中本来的坐标应该是重合的,点云对齐就是调整位姿和深度使点云更好地重合,这样就优化了位姿和深度。
L.GeoNet(2018,Yin)
利用视频端到端地同时训练单目深度、光流、位姿估计网络。提出具有适应能力的几何一致性损失,提高对遮挡和纹理模糊区域的健壮性。
系统包含三个子网络:DepthNet、PoseNet和ResFlowNet(残差流)。前两个网络构成刚体结构重建器,最后一个网络利用前两个网络的输出定位非刚体运动。DepthNet和ResFlowNet基于monoDepth,PoseNet来自Zhou。ResFlowNet的输入是一批张量tensor,张量由图像对和、刚体流、合成的视图、合成的视图与原帧的误差图这5部分在通道维度上叠加而成。
M.DF-Net(2018,Zou)
用无标签的视频序列无监督地联合训练单目深度估计网络和光流预测网络。提出交叉一致性。
网络框架。光流网络来自UnFlow,位姿网络来自Zhou的SfMLearner项目,深度网络基于ResNet-50和ELU激活函数设计。
刚体流计算方法。对两个连续的帧和,预测的深度地图和相对位姿。是的一个2D齐次坐标,是相机内参。我们可以这样计算的对应点在上的坐标:。合成前向刚体流的公式是:。
创新的交叉一致性。对无遮挡的静态区域,刚体流和光流应该相互一致。最小化它们的差异可以同时优化更新深度和流模型。最小化来自刚体流的流向量和来自光流网络的流向量的终点距离。用表示合成的刚体流,用表示估计的流。并使用计算的有效掩码,可以对有效的像素施加交叉一致性约束:。
N.利用语意关联和关注驱动损失函数进行单目深度估计(Jiao,2018)
同样用多任务做深度估计的还有这个。
这篇文章设计一个监督学习方法,提出两点:1.像素数量在深度值和语义标签上都呈长尾分布;2.深度估计、语义分割相结合。
长尾分布:
作者发现像素个数在像素深度和语义标签上呈现长尾分布,如下图1。深度值呈现长尾分布主要由获取深度时的透视效应(the perspective-effect during the depth acquisition process)造成。把所有区域等同看待的损失函数使网络更多地受深度值较小的区域影响,而对深度值较大的区域(长长的尾部)不敏感。
深度感知目标函数:
- 关注驱动损失:。其中是像素索引,是深度图的像素数量,和分别是预测的深度值和实际的深度值,是距离度量如或范式等,是一个深度感知关注项(depth-aware attention term)使网络更关注深度值较大的区域。这样,反向传播时梯度更偏重少数远距离区域。因此和深度相关,可以定义为真实深度值的一个线性函数。作者的实验中,其中是归一化的实际深度(图2的attention guidance),是范式。
- 为了避免训练刚开始时出现梯度消失,学习近距离区域时出现中断,引入正则化项描述训练过程中的学习状态。如果网络预测的深度值接近实际值,接近0,否则接近1。这样,即使对近距离区域(接近0),梯度仍然能通过原始损失函数反向传播。增加了训练稳定性。
总之,使网络关注近距离区域的同时,还使网络更关注远距离区域。
协同网络:
作者提出的网络框架在编码器后分为深度估计、语义标注两路,是两个子网络,实现两个任务(深度估计和语义标注),如图2。为了更好地利用语义信息,提出一个协同网络使两个任务共享信息。协同网络定义信息在子网络间(通过横向共享单元LSU)和子网络内(通过半稠密上跳跃连接SUC)的传播方式,主要把语义整合到深度估计中。LSU和SUC本质都是残差跳跃连接。
这样做的依据是:语义标签有助于深度估计(如天空是远的,墙是竖直的),深度估计也有助于语义标注(尤其是外观相似的不同物体)。
协同网络架构:
协同网络是一个多任务DCNN,主要包含4部分:深度预测子网络、语义标注子网络、知识共享单元/连接、关注驱动损失,如下图2。一个主干(backbone)编码器(如VGG、ResNet)把输入的RGB图像从颜色空间转换到高维特征空间,得到的高维特征空间分别被两个子网络用于重建深度和语义标签。
1.横向共享单元LSU:
在协同网络中,LSU以一个动态路由的方式学习共享策略。信息传播通过正向传播和反向传播实现。每隔两个反卷积层,添加LSU共享另一个任务的残差知识/表示。不同于手工调优的结构,LSU能够从任务间层和任务内层获得额外细微的共享信息。LSU的结构如图3左部,它在两个任务中提供全分享(fully-sharing)路由。假设当前的反卷积层产生的特征图是和,分享的特征表示可以表示为:,其中和是特征图的权重参数,和是特征图的权重参数。和传播到下层反卷积层。所有的参数都是学习来的。虽然所有LSU有相同的内部结构,但它们有各自的参数,这样可以更灵活地共享。
还加入了恒等映射保证任务内的信息传播,避免传播中断或特征污染。这种类残差结构(恒等连接+残差共享)有利于梯度反向传播。图4说明了LSU的效果。
2.半稠密上跳跃连接SUC:
SUC在解码器中进行上采样和跳跃连接。我们用代替作者的那个上部带'/'的符号。
在任务内添加SUC是为了任务内的知识共享和保存长期记忆(前一层反卷积层传过来的反卷积结果称为短期记忆)。SUC可以表示为:,其中和分别是解码器的输入输出,是第层反卷积的输出,如图3,作者的实验中。是一个上采样操作,和其他跳跃连接一样,如果不用上采样,特征图尺寸不同,不能合并(如tf.concat)。
其它损失项:
- 梯度损失:,核(两个带绝对值符号的项)来自Sobel特征检测器,和分别代表水平方向和竖直方向。语义信息也考虑进来。所以总的梯度损失是:。
- 语义焦点损失:焦点损失起源于目标检测。为了让网络更关注长尾,使用损失项,其中是像素的预测标签,是类别索引。和是调节关注度的平衡权重和焦点参数。
总的关注损失:。
关注可视化:
使用空间关注图表示网络特别关注的部分。如图5。
O.带关联、竖直池化和标签增强的单目深度估计(Gan,2018)
基于CNN的方法一般只提取诸如边界、纹理这样的绝对特征,而忽略邻接像素的深度关系(constraint)(相对特征)。针对这个问题,用一个关联层对不同图像位置的关系建模。
深度变化主要在竖直方向上,也就是说从图像下部到上部距离会越来越远,如驾驶场景。所以提取长距离(long-range)竖直特征优化深度估计,因此引入竖直池化竖直地聚合图像特征提高深度精度。
雷达获取的深度图很稀疏。不同于之前的方法(Garg,Kuznietsov)使用光度损失学习视差,然后根据反比例关系得出深度,作者以左右图像对作为输入,用现成的立体匹配方法产生高质量的稠密深度图作为辅助标签和雷达获取的深度一块用于训练。
位置相邻且外观相似的像素应该有相近的深度,外观不同则深度很可能相差很大。因此像素间的关系,称作关联( affinities),是深度估计的重要特征。
基于CRF的成对势能(pairwise potential)就是利用关联关系,如斯坦福大学Saxena等人的工作。本文使用一个简单有效的关联层学习相对特征。作者把像素对间的关联定义为它们绝对特征的相关性。因此关联层中一个像素的相对特征就是由该像素和它周围像素的关系值构成的一个向量。由于一个像素和它附近的像素的关联关系较重要,所以关联层只考虑局部区域。而且为了降低计算量,只考虑最低特征尺度的关联关系。
P.CSPN(Cheng,2018,百度研究院在NVIDIASPN的基础上设计)
Q.Into the Twilight Zone(Sharma,2018)
R.Learning Monocular Depth by Distilling Cross-domain Stereo Networks(Guo,2018)
S.T2Net(Zheng,2018)
T.WSN(Heo,2018)
U.TRL(Zhang,2018)
V.Deep Virtual Stereo Odometry(Yang,2018)
W.Estimating Depth from RGB and Sparse Sensing(Chen,2018)
X.Joint Blind Motion Deblurring and Depth Estimation of Light Field(Lee,2018)
Y.OmniDepth(Zioulis,2018)