纽劢研习社 | 深度图的「非深度讲解」

发布时间:2020-11-05

对很多人来说,自动驾驶早已不是一个陌生的名词,但是深度图(Depth Map)的话,相信不少人还是第一次听说。

顾名思义,深度图是用来反映深度信息的图像,而其中的深度信息指的就是距离信息。它用来描述相机拍摄到的场景图像中每个像素点到相机的深度,计算环境中物体到相机的距离。

(图1:深度图示意效果。颜色越浅的部分深度越小,距离越近。)

 

01  深度图的基础知识

在自动驾驶中,如果车辆能够稳定可靠地获取场景中各点的深度信息,那么它的作用是显而易见的,比如进行像素级的测距,3D目标检测,未定义障碍物的检测,等等。从而可以实现路面上所有突出障碍物的检测,以及任意障碍物的测距。

另外,将相机图像结合深度信息充填RGB色彩也可以生成像素级点云,实现类似于激光点云的效果。虽然它的测距准确性不及激光雷达,但点云远比后者稠密,而且RGB着色不需要人工进行同步、校准等工作。

(图2:视觉方法生成的像素级点云效果示意)

可以说,深度图在自动驾驶领域有着相当广阔的应用前景。业界求深度图方法的有很多种,归纳起来可以分为三类:

1)双目相机结合立体图像,模拟人眼的立体视觉,将同一点在左右两幅图像不同位置进行匹配后,结合相机外参求得深度。

2)单目相机结合单幅图像,直接进行深度推理。将单目的照片结合单目的深度图或激光点云,放入Encoder-Decoder模型中直接进行学习。

3)单目相机结合时序图像,用前后时间图像上的点进行匹配,运用一些SLAM的假设求出相机位姿和周边环境中各点的深度。

双目方法较为常用,它将两个相机横向严格放置,预先通过标定获取焦距和基线长度,在知道某点在左右两幅图上的横向位置后便可计算出视差,然后利用相似三角形的原理求出深度。

(图3:双目匹配的原理)

就像目标检测有mAP、检准率、召回率这些指标一样,深度图同样也有一些评估的方法和指标。目前比较常用的有KITTY D1 error,它计算的是匹配失准的像素比例,以及EPE(end-to-end point error)和一些深度图定量评价指标,如平均相对误差、均方根误差、均方根对数误差、平方相对误差、精确度。

在深度图方面,主流的公开数据集有三种类型:

1)合成数据集,它先进行3D建模,然后用虚拟相机捕捉图像。优点是精度非常高,成本非常低,也能实现一些复杂的功能。缺点在于成像不真实,场景不真实。

2)激光雷达和CAD数据集,它的优势是精度和真实性高,劣势是点云稀疏,对快速移动的障碍物难以补偿,成本相对较高。

3)传统算法生成的数据集,比如用SGM或者是SFM+SGM生成,它的优势在于零成本,缺点是可靠性极差。

(图4:不同类型数据集)

 

02  不同的技术路径

在这些年的发展当中,求深度图的方法衍生出了很多不同的技术路径,既有传统方法,也有诞生于深度学习不同时期的一些方法。正是在这些技术方向的共同突破,让深度图应用到量产自动驾驶方案上成为可能。

传统方法

传统方法的性能一般,但是当中一些具有代表性的经典算法,提供了很多有价值的思路。以SGM为例,它求深度图的过程可以分为匹配代价计算,代价聚合,视差计算和视差优化,这一经典思路和其中的不少细节为之后的很多算法所借鉴。

(图5:SGM算法示意)

传统方法的不足之处在于,面对弱纹理、重复纹理、明暗失调、遮挡等情况时会出现难以匹配的问题。因此它的效果并不理想,求得的深度图通常连续性差,或者轮廓不清晰,甚至是存在明显的深度错误。在一些环境和场景可控的工业领域传统方法尚且适用,但是对于场景繁多的自动驾驶感知环境而言,传统方法非常具有局限性,难以胜任。

早期深度学习方法

相比之下,早期的深度学习方法在性能上就要好上不少。早期深度学习方法是在传统方法基础上做了一步改进,那就是在匹配代价计算中不再用传统的手工提取特征方法进行计算,而是改用深度学习。

早期深度学习方法的特点是,性能不错但耗时较长。在2015年,像MC-CNN这样的卷积神经网络的KITTI 2015 D1 Error已经可以达到3.6%,而传统的SGM算法是10%左右。在运行时间几乎普遍以分钟计的早期,MC-CNN的运行时间也是略多于1分钟。

(图6:MC-CNN示意)

值得一提的是,MC-CNN在高峰期时的变体非常多,主要的思路包括有提升网络性能,增加感受野,处理多尺度特征,简化训练过程,等等。

早期深度学习方法的思路是先用深度学习的方法求两点的相似度,然后构建3D的匹配代价体,余下部分全是传统方法去做,所以耗时很高。

当前深度学习方法

在2017年一些研究出来之后,基于深度学习求深度图的方法也到了一个新的阶段,端到端方法开始成为当前的主流。

深度学习端到端方法分为重型和轻型两条技术路径,而GC-Net是典型的重型路径。它先用2D卷提取特征,然后组建4D的代价体,全程进行3D的卷积,最后用Soft ArgMax函数求出模型的损失。

GC-Net的性能非常出色,D1-all指标达到了惊人的2.87%(对比之下MC-CNN是3.89%),而且耗时为0.9秒。不过,这类重型网络的嵌入式部署的难度很大,即使相比于早期深度学习方法已经很轻,但运行时间仍达几百毫秒。

相比之下,轻型网络的耗时很短,而且性能较可靠,最为接近量产部署。以DispNetC为例,它是DispNet的两种网络结构中稍复杂的一种,虽然它4.34%的D1-error略高于MC-CNN,但是耗时只为惊人的60毫秒。并且从一些试验结果来看,DispNet的泛化性理论上也较为不错。

深度学习方法可以比较好地处理遮挡,这也是与SGM等传统方法不同的一个地方。因为深度学习虽然学的是匹配,但或多或少还学了很多新的先验信息以及全局语义的理解。

结合时序信息的深度学习方法

这是深度学习方法求深度图的另一个独特技术分支,从2016年后开始出现,采用无监督或者是自监督的方式。

其中极具代表性的是MonoDepth2,它是一个单目深度估计的网络,利用SLAM方面的假设,将具有前后关系的图像输进网络,求得深度和相机位姿,并用t+1帧去监督t帧,将t帧推测生成的t+1帧图像与真值进行对比。

Monedepth2性能稳定,有较为不错的单目无监督的深度推理效果,但也存在一些问题,比如无法有效应对遮挡、移动目标以及非理想反射情况,而且单目推理没有求匹配关系,遇到未见过的场景会比较危险。

(图7:无监督方式求得的深度、深度变化、光流)

除了深度和相机位姿以外,这类方法也可以无监督地学习光流,比如GeoNet。而且求光流的方法与求深度的方法几乎完全相同,在匹配的时候用光度差值判断匹配正确与否,匹配上就能算出光流。

GeoNet在学习动态障碍物光流的过程中,可以将移动障碍物解耦出来,而且根据一些先验信息,可以直接求图像的深度,因此这个思路也相对来说有量产价值一些。

 

03  深度估计的主要模块

在早期的深度学习方法中,求深度图通常包括特征提取、形成代价体、代价体过滤和损失函数这几个模块。虽然当前的深度学习方法,大多属于端到端的方式,整体环节会少一些,但是也可以从中找到很多借鉴。

(图8:经典的GC-Net的网络结构图)

特征提取,分为基于孪生网络和基于串联(concact)的方法。孪生网络的话,左右图分别经过一个骨干网络,然后输出左右图的feature map,最后由这两个feature map组成3D或4D的代价体,这是大部分双目匹配网络使用的方法。而concat的方法在开始就将2幅图像合成6通道,全程不用孪生网络而是仅仅使用类似于分割模型的encode-decode结构,比如DispNet。

其中形成代价体也有几种方法,一种就是基于相关性的,计算两个特征向量之间的距离;另一种是基于concact的,即将左图特征直接基于视差值进行移动后与对应的右图特征进行拼接(concact),然后形成4D代价体。

在代价体过滤部分,4D代价体一般进行3D的卷积,但也可以用一些3D卷积配合2D卷积,3D代价体的话一般是2D的卷积。通常来说,4D代价体的准确性更佳,但计算量也更大。

损失函数是比较核心的部分,分为无监督和有监督两类。无监督方法包括有光度损失、视差平滑度损失、左右一致性校验损失等,有监督的则包括有L1和Smooth L1等函数。

在深度图领域,还有非常多值得研究的方向,包括域自适应、高分辨率深度图、高实时深度图、深度图置信度算法、无标签学习和一些新型应用等等。随着一些算法的不断发展和工程化方面的持续改进,深度图接下来很有希望部署到量产的自动驾驶方案中。

媒体垂询
media@nullmax.ai