作者简介:
吴双,原百度研究院硅谷人工智能实验室高级研究员,百度美国研发中心高级架构师。美国南加州大学物理博士,加州大学洛杉矶分校博士后,研究方向包括计算机和生物视觉,互联网广告算法,互联网文本和视频的推荐系统,语音识别和自然语言处理,曾在NIPS等国际会议中发表文章。
刘少山,PerceptIn联合创始人。加州大学欧文分校计算机博士,研究方向包括智能感知计算、系统软件、体系结构与异构计算。现在PerceptIn主要专注于SLAM技术及其在智能硬件上的实现与优化。曾在百度美国研发中心负责百度无人车系统架构与产品化。
无人驾驶汽车的成功涉及高精地图、实时定位以及障碍物检测等多项技术,而这些技术都离不开光学雷达(LiDAR)。本文将深入解析光学雷达是如何被广泛应用到无人车的各项技术中。文章首先介绍光学雷达的工作原理,包括如何通过激光扫描出点云;然后详细解释光学雷达在无人驾驶技术中的应用,包括地图绘制、定位以及障碍物检测;最后讨论光学雷达技术目前面临的挑战,包括外部环境干扰、数据量大、成本高等问题。
在实际应用中,LiDAR也面临着许多挑战,包括技术(空气中悬浮物)、计算性能以及价格挑战。要想把无人车系统产品化,我们必须解决这些问题。
本文是无人驾驶技术系列的第五篇,着重于GPS以及惯性传感器在无人驾驶中的应用。GPS是当前行车定位不可或缺的技术,但是由于GPS的误差、多路径以及更新频率低等问题,我们不能只依赖于GPS进行定位。惯性传感器(IMU)是可以检测加速度与旋转运动的传感器。基础的惯性传感器包括加速度计与角速度计。惯性传感器拥有很高的更新频率,可以跟GPS形成互补。而使用传感器融合技术,我们可以融合GPS与惯性传感器数据,各取所长,以达到较好的定位效果。
本章节里,作者首先介绍了KITTI的数据集,用来作为基于计算机视觉的无人驾驶感知方案的算法验证。之后又介绍了无人驾驶感知方面的三个研究内容:光流(Optical Flow)和立体视觉、物体的检测和跟踪以及视觉里程计算法。
在今年6月于美国拉斯维加斯召开的CVRP大会上,多伦多大学的Raquel Urtasun教授和她的学生改进了深度学习中的Siamese网络,用一个内积层代替了拼接层,把处理一对图片的时间从一分钟左右降低到一秒以内。
Siamese结构的深度神经网络
如图所示,这个Siamese结构的深度神经网络分左右两部分,各为一个多层的卷积神经网络(CNN),两个CNN共享网络权重。Optical Flow的偏移矢量估计问题转化为一个分类问题,输入是两个9x9的图片块,输出是128或者256个可能的偏移矢量y
。通过从已知偏移矢量的图片对中抽取的图片块输入到左右两个CNN,然后最小化交叉熵(cross-entropy):
我们可以用监督学习的方法训练整个神经网络。
i
是像素的指标。y_i
是像素i
可能的偏移矢量。p_gt
是一个平滑过的目标分布,用来给一两个像素的预估误差反馈一个非0的概率,gt
表示ground truth。p_i (y_i,w)
是神经网络输出的给定w
时y_i
的概率。在KITTI的Stereo2012数据集上,这样一个算法可以在0.34秒完成计算,并达到相当出色的精度,偏移估计误差在3-4像素左右,对大于3像素的偏移估计误差在8.61像素,都好于其他速度慢很多的算法。
在得到每个像素y_i
上的分布后,我们还需要加入空间上的平滑约束,这篇文章试验了三种方法:
这些平滑方法一起,能把偏移估计的误差再降低大约50%,这样一个比较准确的2维偏移矢量场就得到了。基于它,我们就能够得到如图8所示场景3维深度/距离估计。这样的信息对无人驾驶非常重要。
深度信息图
从像素层面的颜色、偏移和距离信息到物体层面的空间位置和运动轨迹,是无人车视觉感知系统的重要功能。无人车的感知系统需要实时识别和追踪多个运动目标(Multi-ObjectTracking,MOT),例如车辆和行人。物体识别是计算机视觉的核心问题之一,最近几年由于深度学习的革命性发展,计算机视觉领域大量使用CNN,物体识别的准确率和速度得到了很大提升,但总的来说物体识别算法的输出一般是有噪音的:物体的识别有可能不稳定,物体可能被遮挡,可能有短暂误识别等。自然地,MOT问题中流行的Tracking-by-detection方法就要解决这样一个难点:如何基于有噪音的识别结果获得鲁棒的物体运动轨迹。在ICCV 2015会议上,斯坦福大学的研究者发表了基于马尔可夫决策过程(MDP)的MOT算法来解决这个问题,下面我们就详细介绍这个工作。
运动目标的追踪用一个MDP来建模(图9):
图9 DMM状态图
s∈S=S_active∪S_tracked∪S_lost∪S_inactive
,这几个子空间各自包含无穷多个目标状态。被识别到的目标首先进入active
状态,如果是误识别,目标进入inactive
状态,否则进入tracked
状态。处于tracked
状态的目标可能进入lost
状态,处于lost
状态的目标可能返回tracked
状态,或者保持lost
状态,或者在足够长时间之后进入inactive
状态。a∈A
,所有作用都是确定性的。T:S×A→S
定义了在状态s
和作用a
下目标状态变为s'
。R:S×A→R
定义了作用a
之后到达状态s
的即时奖励,这个函数是从训练数据中学习的。π:S→A
决定了在状态s
采用的作用a
。如图10,这个MDP的状态空间变化如下:
图10 状态转换实例
在active
状态下,物体识别算法提出的物体候选通过一个线下训练的支持向量机(SVM),判断下一步的作用是a_1
还是a_2
,这个SVM的输入是候选物体的特征向量,空间位置大小等,它决定了在S_active
中的MDP规则π_active
。
在tracked
状态下,一个基于tracking-learning-detection追踪算法的物体线上外观模型被用来决定目标物体是否保持在tracker
状态还是进入lost
状态。这个外观模型(appearance model)使用当前帧中目标物体所在的矩形(bounding box)作为模板(template),所有在tracked
状态下收集的物体外观模板在lost
状态下被用来判断目标物体是否回到tracked
状态。另外在tracked
状态下,物体的追踪使用上述外观模型模板,矩形范围内的Optical Flow和物体识别算法提供的候选物体和目标物体的重合比例来决定是否保持在tracked
状态,如果是,那么目标物体的外观模板自动更新。
在lost
状态下,如果一个物体保持lost
状态超过一个阈值帧数,就进入inactive
状态;物体是否返回tracked
状态由一个基于目标物体和候选物体相似性特征向量的分类器决定,对应了S_lost
中的π_lost
。
这个基于MDP的算法在KITTI数据集的物体追踪评估中达到了业界领先水平。
基于视觉的定位算法有两大分类:一种是基于拓扑与地标的算法,另一种是基于几何的视觉里程计算法。基于拓扑与地标的算法把所有的地标组成一个拓扑图,然后当无人车监测到某个地标时,便可以大致推断出自己所在的位置。基于拓扑与地标的算法相对于基于几何的方法容易,但是要求预先建立精准的拓扑图,比如将每个路口的标志物做成地标。基于几何的视觉里程计算法计算比较复杂,但是不需要预先建立精准的拓扑图,这种算法可以在定位的同时扩展地图。以下着重介绍视觉里程计算法。
视觉里程计算法主要分为单目以及双目两种,纯单目的算法的问题是无法推算出观察到的物体的大小,所以使用者必须假设或者推算出一个初步的大小,或者通过与其它传感器(如陀螺仪)的结合去进行准确的定位。双目的视觉里程计算法通过左右图三角剖分(Triangulation)计算出特征点的深度,然后从深度信息中推算出物体的大小。图11展示了双目视觉里程计算法的具体计算流程:
图11 双目视觉里程计算法的计算流程
通过以上的视觉里程计算法,无人车可以实时推算出自己的位置,进行自主导航。但是纯视觉定位计算的一个很大问题是算法本身对光线相当敏感。在不同的光线条件下,同样的场景不能被识别。特别在光线较弱时,图像会有很多噪点,极大地影响了特征点的质量。在反光的路面,这种算法也很容易失效。这也是影响视觉里程计算法在无人驾驶场景普及的一个主要原因。一个可能的解决方法,是在光线条件不好的情况下,更加依赖根据车轮以及雷达返回的信息进行定位。
在无人车感知中,对周围环境的3D建模是重中之重。激光雷达能提供高精度的3D点云,但密集的3D信息就需要摄像头的帮助了。人类用两只眼睛获得立体的视觉感受,同样的道理能让双目摄像头提供3D信息。假设两个摄像头间距为B,空间中一点P到两个摄像头所成图像上的偏移(disparity)为d,摄像头的焦距为f,那么我们可以计算P点到摄像头的距离为:
所以为了感知3D环境得到z,需要通过双目摄像头的两张图像I_l和I_r得到d,通常的做法都是基于局部的图片匹配:
由于单个像素的值可能不稳定,所以需要利用周围的像素和平滑性假设d(x,y)≈d(x+α,y+β)(假设α和β都较小),所以求解d变成了一个最小化问题:
这和optical flow任务想要解决的是非常类似的问题,不过是(Il,Ir)变成了(It ,It+1),所以下面将要介绍的算法,两者都适用。
现在来看看Matching-Cost CNN算法,这个算法使用了一个CNN来计算上式的右侧matchingcost,MC-CNN的网络结构见图1。
图1 MC-CNN的网络结构
这个网络的输入是两个图片的一小块,输出是这两块不匹配的概率,相当于一个cost函数,当两者匹配时为0,不匹配时最大可能为1。通过对一个给定的图片位置搜索可能的d取值,找到最小的CNN输出,就得到了这一点局部的偏移估算。MC-CNN算法接下来做了如下后期处理:
最终算法效果如下:
图2 MC-CNN的算法效果
MC-CNN虽然使用了CNN,但仅限于计算匹配程度,后期的平滑约束和优化都是必不可少的,那有没有可能使用CNN一步到位呢?FlowNet就是这样做的。
为了实现端到端的模型结构,需要用CNN实现特征提取,匹配打分和全局优化等功能。FlowNet采取了encoder-decoder框架,把一个CNN分成了收缩和扩张两个部分。
图3 encoder-decoder的框架
在收缩部分FlowNet提出了两种可能的模型结构:
图4 FlowNetSimple与FlowNetCorr
FlowNet网络收缩部分不仅减少了CNN的计算量,同时起到了在图像平面上聚合信息的作用,这也导致分辨率下降。于是在FlowNet网络扩张部分使用 “up convolution”来提高分辨率,注意这里不仅使用了上一层的低分辨率输出,还使用了网络收缩部分相同尺度的隐层输出,如图5所示。
图5 FlowNet网络扩张
FlowNet算法在常见的公开数据集上都获得了不错的效果,值得一提的是它的速度很快。
物体检测技术是无人驾驶感知必不可少的部分。自从2012年CNN在图片分类问题上的突破,物体检测自然是CNN应用的下一个目标,CNN的物体检测算法层出不穷,我们挑选比较有代表性的几个算法做介绍。
Faster R-CNN
CNN在物体识别领域大行其道之前,通常做法类似于DPM(Deformable Parts Model)这样的解决方案:在图像上抽取局部特征的组合作为模板,比如基于图像的空间梯度的HOG特征;为了能够处理形变,遮挡等变化,我们建立一个“弹性”的结构,把这些“刚性”的部分组合起来;最后加上一个分类器判断物体是否出现。这样的算法一般复杂度较高,需要大量经验,而且改进和优化难度较大。CNN的到来改变了一切。
R-CNN系列算法是一个两段式的算法,它把物体识别这个问题分为:
在了解算法的大致架构后,来看看算法的具体实现,这里主要描述R-CNN这一系列算法的最新版:Faster R-CNN,它对应上面两步分为RPN(Region Proposal Network)和Fast R-CNN,接下来分别介绍。
RPN
我们称物体可能所在区域为候选,RPN(Region Proposal Network)的功能是最高效地产生一个候选列表。如图6,RPN选择以CNN为基础,图片通过多个(比如4)卷积层进行特征提取,在最后一个卷积层输出的特征图上使用一个3x3的滚动窗口连接到一个256或者512维的全连接隐层,最后再分支到两个全连接层,一个输出物体类别,一个输出物体的位置大小。为了能够使用不同的物体大小和长宽比,在每一个位置上考虑三个尺度(128x128, 256x256, 512x512)和三个长宽比(1:1, 1:2, 2:1)一共9种组合。这样一个1000x600的图片上考虑了(1000/16) × (600/16) × 9 ≈ 20,000种位置、大小和长宽比的组合,由于使用CNN计算,这一步耗时不多。最后根据空间重叠程度去掉冗余的候选区域,一张图片大约获得2000个左右的物体可能区域。
图6 Region Proposal Network
知乎的马塔同学做了一张图,很容易理解了
Fast R-CNN
在候选区域分类阶段,我们使用的是基于全连接的神经网络,如图7的右侧部分:
而左侧的特征提取部分可以重用RPN中的CNN计算结果,大大节约了计算时间,能达到5-17帧每秒的速度。
图7 Fast R-CNN
当然书中对 Fast R-CNN只是简单提了一下,如果想详细了解,可以参阅知乎的文章:https://zhuanlan.zhihu.com/p/31426458
MS-CNN
虽然Faster R-CNN算法大名鼎鼎,但在物体尺度变化很大的场景,比如无人驾驶,它还有提升的空间,Multi-scale CNN(MS-CNN)正是针对这个问题的尝试。CNN的层级结构由于pooling层的存在自然形成了和不同尺度的一个对应关系。那为什么不把对物体的检测放到CNN的不同层里去呢?这正是MS-CNN的想法。
在选择物体候选区域阶段,MS-CNN使用了图8的网络结构,我们看到如果把CNN网络里的卷积层看成一个大树的“主干”,那么在conv3、conv4和conv5这三个卷积层之后,这个网络都长出了“分支”,每个“分支”都连接了一个检测层,负责一定的尺度范围,这样多个“分支”一起,就能覆盖比较宽的物体尺度范围,达到我们的目的。
在候选区域识别阶段,我们让上一阶段多个检测层的输出特征图分别输入到一个子网络里,这里有几个值得注意的细节:
图8 MS-CNN
总的来说,MS-CNN和Faster R-CNN相比,优势是识别的准确度有很大提高,尤其在物体尺度变化的情况下,比如KITTI数据集里面的行人和自行车。但是Faster R-CNN还是有速度的优势。
图9 MS-CNN
SSD
虽然Faster R-CNN的速度比之前的R-CNN已有很大提高,但还达不到实时的要求。Single Shot Detector(SSD)就是一个能够实时运行,有更佳准确度的算法,最近人气很高。SSD沿用了滑动窗口的思想,通过离散化物体的位置,大小和长宽比,使用CNN高效计算了各种可能的物体情况,从而达到了高速检测物体的目的。
图10 Single Shot Detector
如图10所示,SSD使用了VGG-16网络来做底层的图片特征提取,通过取消生成候选区域,缩放图片缩放和特征图采样的步骤,一步到位判断物体位置和分类,得到了高速的物体检测算法。
在VGG网络的基础上,SSD加入了逐步变小的卷积层,这些不同尺度的卷积层分别使用3x3大小的卷积核进行物体位置偏移和分类的判断,使SSD能够检测到不同大小的物体。
详细的SSD介绍,请看知乎文章:https://zhuanlan.zhihu.com/p/33544892
当然,现在最火的目标检测的算法是YOLOv3,基本上已经一统江湖了,知乎我是小将的一篇文章讲的蛮仔细的,可以参考:https://zhuanlan.zhihu.com/p/32525231