【读书笔记】第一本无人驾驶技术书 笔记汇总 1

作者简介: 
吴双,原百度研究院硅谷人工智能实验室高级研究员,百度美国研发中心高级架构师。美国南加州大学物理博士,加州大学洛杉矶分校博士后,研究方向包括计算机和生物视觉,互联网广告算法,互联网文本和视频的推荐系统,语音识别和自然语言处理,曾在NIPS等国际会议中发表文章。 
刘少山,PerceptIn联合创始人。加州大学欧文分校计算机博士,研究方向包括智能感知计算、系统软件、体系结构与异构计算。现在PerceptIn主要专注于SLAM技术及其在智能硬件上的实现与优化。曾在百度美国研发中心负责百度无人车系统架构与产品化。

2. 光学雷达在无人驾驶技术中的应用

无人驾驶汽车的成功涉及高精地图、实时定位以及障碍物检测等多项技术,而这些技术都离不开光学雷达(LiDAR)。本文将深入解析光学雷达是如何被广泛应用到无人车的各项技术中。文章首先介绍光学雷达的工作原理,包括如何通过激光扫描出点云;然后详细解释光学雷达在无人驾驶技术中的应用,包括地图绘制、定位以及障碍物检测;最后讨论光学雷达技术目前面临的挑战,包括外部环境干扰、数据量大、成本高等问题。

在实际应用中,LiDAR也面临着许多挑战,包括技术(空气中悬浮物)、计算性能以及价格挑战。要想把无人车系统产品化,我们必须解决这些问题。

3. GPS及惯性传感器在无人驾驶中的应用

本文是无人驾驶技术系列的第五篇,着重于GPS以及惯性传感器在无人驾驶中的应用。GPS是当前行车定位不可或缺的技术,但是由于GPS的误差、多路径以及更新频率低等问题,我们不能只依赖于GPS进行定位。惯性传感器(IMU)是可以检测加速度与旋转运动的传感器。基础的惯性传感器包括加速度计与角速度计。惯性传感器拥有很高的更新频率,可以跟GPS形成互补。而使用传感器融合技术,我们可以融合GPS与惯性传感器数据,各取所长,以达到较好的定位效果。

4. 基于计算机视觉的无人驾驶感知系统

本章节里,作者首先介绍了KITTI的数据集,用来作为基于计算机视觉的无人驾驶感知方案的算法验证。之后又介绍了无人驾驶感知方面的三个研究内容:光流(Optical Flow)和立体视觉、物体的检测和跟踪以及视觉里程计算法

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)是神经网络输出的给定wy_i的概率。

在KITTI的Stereo2012数据集上,这样一个算法可以在0.34秒完成计算,并达到相当出色的精度,偏移估计误差在3-4像素左右,对大于3像素的偏移估计误差在8.61像素,都好于其他速度慢很多的算法。

在得到每个像素y_i上的分布后,我们还需要加入空间上的平滑约束,这篇文章试验了三种方法:

  • 最简单直接的5x5窗口平均。
  • 加入了相邻像素一致性的半全局块匹配(Semi Global Block Matching,SGBM)。
  • 超像素+3维斜面。

这些平滑方法一起,能把偏移估计的误差再降低大约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 双目视觉里程计算法的计算流程

  1. 双目摄像机抓取左右两图。
  2. 双目图像经过Triangulation产生当前帧的视差图(Disparity Map)。
  3. 提取当前帧与之前帧的特征点,如果之前帧的特征点已经提取好了,那么我们可以直接使用之前帧的特征点。特征点提取可以使用Harris Corner Detector。
  4. 对比当前帧与之前帧的特征点,找出帧与帧之间的特征点对应关系。具体可以使用随机抽样一致(RANdom Sample Consensus,RANSAC)算法。
  5. 根据帧与帧之间的特征点对应关系,推算出两帧之间车辆的运动。这个推算是最小化两帧之间的重投影误差(Reprojection Error)实现的。
  6. 根据推算出的两帧之间车辆的运动,以及之前的车辆位置,计算出最新的车辆位置。

通过以上的视觉里程计算法,无人车可以实时推算出自己的位置,进行自主导航。但是纯视觉定位计算的一个很大问题是算法本身对光线相当敏感。在不同的光线条件下,同样的场景不能被识别。特别在光线较弱时,图像会有很多噪点,极大地影响了特征点的质量。在反光的路面,这种算法也很容易失效。这也是影响视觉里程计算法在无人驾驶场景普及的一个主要原因。一个可能的解决方法,是在光线条件不好的情况下,更加依赖根据车轮以及雷达返回的信息进行定位。

 

5. 卷积神经网络(CNN)在无人驾驶中的应用

无人驾驶双目3D感知

在无人车感知中,对周围环境的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),所以下面将要介绍的算法,两者都适用。

MC-CNN

现在来看看Matching-Cost CNN算法,这个算法使用了一个CNN来计算上式的右侧matchingcost,MC-CNN的网络结构见图1。

图片描述

图1 MC-CNN的网络结构

这个网络的输入是两个图片的一小块,输出是这两块不匹配的概率,相当于一个cost函数,当两者匹配时为0,不匹配时最大可能为1。通过对一个给定的图片位置搜索可能的d取值,找到最小的CNN输出,就得到了这一点局部的偏移估算。MC-CNN算法接下来做了如下后期处理:

  • Cross-based cost aggregation:基本思想是对邻近的像素值相似的点的偏移求平均,提高估计的稳定性和精度。
  • Semi-global matching:基本思想是邻近的点的平移应该相似,加入平滑约束并求偏移的最优值。
  • 插值和图片边界修正:提高精度,填补空白。

最终算法效果如下:

图片描述

图2 MC-CNN的算法效果

MC-CNN虽然使用了CNN,但仅限于计算匹配程度,后期的平滑约束和优化都是必不可少的,那有没有可能使用CNN一步到位呢?FlowNet就是这样做的。

FlowNet

为了实现端到端的模型结构,需要用CNN实现特征提取,匹配打分和全局优化等功能。FlowNet采取了encoder-decoder框架,把一个CNN分成了收缩和扩张两个部分。

图片描述

图3 encoder-decoder的框架

在收缩部分FlowNet提出了两种可能的模型结构:

  • FlowNetSimple:把两幅图片叠起来输入到一个“线性”的CNN中,输出是每个像素的偏移量。这个模型的弱点是计算量大,而且无法考虑全局的优化手段,因为每个像素的输出是独立的。
  • FlowNetCorr:先对两幅图片分别进行特征的提取,然后通过一个相关层把两个分支合并起来并继续下面的卷积层运算。这个相关层的计算和卷积层类似,只是没有了学习到的特征权重,而是由两个分支得到的隐层输出相乘求和。

图片描述

图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

知乎的马塔同学做了一张图,很容易理解了

【读书笔记】第一本无人驾驶技术书 笔记汇总 1_第1张图片

 

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

  • 第一层是“Deconvolution”,目的是为了提高特征图的分辨率,保证物体检测的准确率,特别是对尺度偏小的物体。
  • Deconvolution之后,在抽取物体特征时(绿色框),同时还抽取了物体周边的信息(蓝色的框),这些“上下文”信息对识别准确率的提高有明显帮助。

总的来说,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

你可能感兴趣的:(自动驾驶)