长篇自动驾驶技术综述论文(下)
三维目标检测
鉴于经济性,可用性和研究的广泛性,几乎所有的算法都使用相机作为主要的感知方式。把相机应用在ADS中,限制条件除了前面讨论到的光照等因素外,还有一个问题就是目标检测是在图像空间的,忽略了场景的尺度信息。而当需要进行避障等动态驾驶任务时,我们需要将二维图像映射到三维空间来获得三维的信息。实际上利用单个相机来估计深度也是可行的[30],当然利用立体相机或者多相机的系统更具鲁棒性。从二维到三维的映射必然需要解决一个图像匹配问题,这给已经够复杂的感知过程又增加了大量的计算处理成本。
所以我们换一种思路,是否可以直接在三维进行目标检测。我们知道3D雷达收集的数据是三维的,从本质上已经解决了尺度问题,而且3D雷达不依赖于光照条件,不容易受到恶劣天气的影响。3D雷达收集的是场景表面的稀疏3D点,这些点很难用于对象检测和分类,分割反而相对容易。传统方法使用基于欧式距离的聚类(Euclidean clustering)或者区域生长(region-growing)算法[31]来将点划分为不同对象。结合一些滤波技术,比如地面滤波(ground filtering)[32]或者基于地图(map-based filtering)的滤波[33],可以使该方法更具鲁棒性。下图我们展示了一个从原始点云输入中获取聚类对象的例子。
与基于图像的方法发展趋势一样,机器学习最近也取代了传统3D检测方法,而且这种方法还特别适用于RGB-D数据。RGB-D产生的数据与点云类似,不过包含颜色信息,由于范围比较有限而且可靠性不高,尚未应用于ADS系统。[34]利用3D占据栅格(occupancy grid)表示的方法完成了RGB-D数据的对象检测。此后不久,类似的方法被应用于激光雷达创建的点云。受基于图像的方法的启发,尽管计算开销很大,但仍然使用了3D CNN。VoxelNet[35]首次给出了令人信服的点云上三维边界框估计的结果。SECOND[36]利用激光雷达数据的自然稀疏性,改进了这些工作的准确性和计算效率。最近提出的几种算法比较如下表所示:
数据集是KITTI[42],结果以中等类别精度排序,算法中只使用点云数据。
基于激光雷达的感知的另一个选择是点云数据的二维投影。点云数据在2D中有两种主要表示形式,一种是深度图,主要是受通过深度估计执行3D对象检测[37]和在RGB-D数据上进行操作方法的启发。VeloFCN网络[38]提出使用单通道深度图像作为浅层单级卷积神经网络的输入,生成3D车辆候选,许多其他算法也都采用了这种方法。深度图的另一个用途是用于激光雷达点的语义分类(semantic classification)[39]。
另一种2D投影是指对鸟瞰图(bird’s eye view,BV)的投影,该方式越来越受欢迎。不过鸟瞰图仅有单纯的2D离散信息,因此如果激光雷达点的值仅有高度变化的话,在2D中必定会互相遮挡。MV3D算法[40]使用相机图像,深度图像以及多通道BV图像(这里不同通道对应不同的高度),来最小化这种遮挡。一些工作重复使用基于相机的算法,并训练了有效的网络来在2D BV图像上进行3D对象检测[41]。这些算法都是在KITTI数据集和nuScenes[43]数据集上进行测试的。2D的方法计算成本要比3D小得多,而且利用稀疏性改进这些工作的准确性和效率之后[36],这些方法可以迅速接近ADS系统所需的精度。
目标跟踪
对于复杂和高速情况下的自动驾驶,仅仅估计位置是不够的,为了避免碰撞,还需要估计动态目标的航向和速度,以便应用运动模型跟踪目标并预测目标未来的运动轨迹。同样的,一般都通过多个相机,激光雷达或者雷达来获取传感器信息,且未来更好地应对不同传感器的局限性和不确定性,通常采用传感器融合的策略进行跟踪。
常用目标跟踪算法依赖于简单的数据关联技术和传统的过滤方法。当在三维空间中以高帧速率跟踪对象时,最近邻方法通常足以建立对象之间的关联。基于图像的方法一般需要建立一些外观模型,例如使用颜色直方图,梯度或者其他特征(如KLT)等来评估相似度[44]。基于点云的方法也使用一些相似性度量,例如点密度,Hausdorff距离[45]。由于总是可能出现关联错误的情况,因此经常使用多假设跟踪(multiple hypothesis tracking)算法[46],这确保了跟踪算法可以从任一时间内的不良数据关联中回复。一般我们都是在每帧中使用占据地图(occupancy maps),然后在帧之间进行数据关联,尤其是在使用多个传感器时。为了获得平滑的动态特性,采用传统的Bayes滤波器对检测结果进行滤波。
对于简单的线性模型,Kalman滤波一般是足够的,而扩展Kalman滤波器(EKF)和无迹Kalman滤波器(UKF)可用于处理非线性动态模型。我们实现了一个基本的基于粒子滤波的目标跟踪算法,利用相机和3D激光雷达来跟踪行人,结果如下(白色的表示轨迹)。
为了使跟踪更具鲁棒性,经常会用到被跟踪对象的物理模型。在这种情况下,首先使用诸如粒子滤波器之类的非参数化方法,之后利用一些物理参数(如大小)来进行动态跟踪[47]。更为复杂的滤波方法,如raoblockwelled粒子滤波器,被用于跟踪L型车辆模型的动态变量和车辆几何变量(dynamic variables and vehicle geometry variables)[48]。针对车辆和行人,现在有各种各样的模型,甚至一些模型可以推广到任何动态对象。此外,深度学习也开始被应用于跟踪问题,尤其是对图像领域。[49]通过基于CNN的方法实现了单目图像的实时跟踪。利用多任务网络来估计物体动力学的方法也在涌现[50],这进一步表明了能够处理多种感知任务的广义网络可能是ADS感知的未来。
道路和车道线检测
前面介绍的边界框估计方法对于某些感兴趣的对象十分有用,但对于一些连续曲面(如道路)则不适用。可行驶曲面的确定是ADS的关键,所以把该问题从检测问题中单独出来作为一个子类研究。从理论上讲,利用语义分割可以解决该问题。一个简单的做法是从车辆自身来确定可驾驶区域,将道路分为若干个车道,并确立主车道,该技术被应用在许多ADAS中,如车道偏离警告,车道保持和自适应巡航控制[51]。更有挑战性的任务就是怎么确定其他车道和对应的方向,并在此基础之上理解更复杂的语义,比如转向和合并[52]。上述具体不同的任务对ADS的探测距离和可靠性要求各不相同,但是自动驾驶需要对道路结构有一个完整的语义理解以及长距离探测多条车道的能力。
前面提到的数据预处理(包括图像和点云)的方法,在道路处理中也同样适用,比如归一化照明条件(normalize lighting
conditions),滤波,颜色,强度,梯度信息统计等。另外,利用道路的均匀性和边缘的突变(elevation gap at the
edge )我们可以使用区域生长方法(region growing)[53]。也有一些基于机器学习的方法,包括将地图与数据融合[54]或者完全基于外观的分割[55]。一旦曲面被估计出来之后,就可以利用一些模型拟合来保证道路和车道的连续性,包括参数化模型(比如直线、曲线)和非参数化模型的几何拟合。[56]提出了一个集成了拓扑元素(如车道分割与合并)的模型,还可以结合车辆动力学和动态信息,利用滤波算法获得更平滑的结果。
目前道路和车道线检测已经有许多方法,并且有些已经集成到了ADAS系统中,但是大多数方法仍然依赖于各种假设与限制,能够处理复杂道路拓扑的真正的通用系统尚未开发出来。通过对拓扑结构进行编码来获得标准化的道路图并结合新兴的基于机器学习的道路与车道线分类方法,也许会形成一个鲁棒的可应用于自动驾驶的系统。
评估( ASSESSMENT)
一个鲁棒的ADS系统应该能够不断地评估当前状况的总体风险水平并预测周围驾驶员和行人的意图,缺乏敏锐的评估机制可能会导致事故。本节主要讨论以下三类评估:总体风险和不确定性评估,人类驾驶行为评估和驾驶风格识别。
总体风险和不确定性评估
总体评估可以理解为去量化驾驶场景的不确定性和风险水平,目的是为了提高ADS的安全性。[57]提出了一种利用贝叶斯方法来量化深度神经网络的不确定性。[3]设计了一个贝叶斯深度学习体系结构,并在一个模拟场景中展示了它相对于传统方法的优势。这种方法的总体逻辑是每个模块在系统中的传递与输入都服从概率分布,而不是一个精确的结果。
另一种方法就是单独评估驾驶场景下的风险水平,可以理解为前者是从系统内部评估,后者是从系统外部评估。[58]将传感器数据输入到一个风险推理框架中,利用隐马尔科夫模型(Hidden Markov Models ,HMMs)和语言模型检测不安全的车道变更事件。[59]引入了一个深度时空网络来推断驾驶场景的总体风险水平,也可以利用来评估车道变更的风险水平。下图是一个示例,代表两种图像序列下的风险评估结果
周围驾驶行为评估
实际环境中的自动驾驶决策还有周围驾驶员的意图与行为相关。目前该技术在ADS领域尚不常见。[60]用隐马尔可夫模型(HMM)对目标车辆的未来行为进行了预测,通过学习人类驾驶特征,将预测时间范围延长了56%。这里主要是利用了预定义的移动行为来标记观测值,然后再使用HMM以数据位中心学习每种类型的特征。除此之外,还有一些其他的方法,比如贝叶斯网络分类器,混合高斯模型和隐马尔科夫模型相结合[61],支持向量机等。这一类评估的主要问题在于观测时间短,实时计算量要求高,大多数情况下,ADS只能观测周围车辆几秒钟,因此不能使用需要较长观察周期的复杂模型。
驾驶风格识别
人和机器最大的不同在于人是有情绪的,有些驾驶员比较激进,有些比较稳重。2016年,谷歌的自动驾驶汽车在换道时和迎面而来的巴士相撞,原因就是自动驾驶汽车以为巴士会减速,而巴士司机却加速了。如果能事先知道司机的驾驶风格,并结合进行预测,这场事故也许是可以避免的。当然,驾驶风格目前还没有一个准确的定义,因此分类的依据也有很多种,比如油耗,均速,跟车行为等。一般来说,对驾驶风格的分类大多是将其分为若干类,对应于不同的离散值,但是也有连续型的驾驶风格分类算法,比如[62]将其描述为介于-1到+1之间的值。
同样,也有一些基于机器学习的方法。[63]采用主成分分析法( Principal component analysis, PCA),以无监督的方式检测出5个不同的驾驶类别。[64]使用了基于GMM的驾驶员模型来识别单个驾驶员的行为,主要研究了跟车行为和踏板操作(pedal operation)。[^65]使用词袋(Bag-of-words)和K均值聚类来表示个体的驾驶特征。[^66]使用了一个自编码网络(autoencoder network)来提取基于道路类型的驾驶特征。类似的还有将驾驶行为编码到3通道RGB空间中,利用一个深度稀疏的自编码器(deep sparse autoencoder)来可视化各个驾驶风格[67]。将驾驶风格识别成功应用到真实的ADS系统的目前还没有相关报道,但是这些研究可能是未来ADS发展的一个方向。
规划与决策
全局规划
全局规划是比较成熟的一个研究领域,几乎所有车都已经配备了导航系统,利用GPS和离线地图能够轻易规划全局路径。全局路径规划可以分为以下四种:目标导向(goal-directed),基于分割( separator-based),分级规划( hierarchical)和有界跳跃(bounded-hop)。目标导向最常见,比如Djikstra和A*,已经广泛应用于各个领域。基于分割的逻辑有点像路由算法,删去一些边或者顶点,计算每个子区域间的最短路径,这种方法可以有效加快计算速度。
基于分级的技术利用了道路的层次逻辑,比如道路有国道省道乡道等,对于路线的查询,层次结构的重要性应该随着距离的增长而增加。有界跳跃是一种典型的空间换时间做法,很明显,计算一对顶点间的所有可能路径是不切实际的,事先保存若干选定顶点之间的距离和路径并在导航中使用才是一种合理的做法,对于路径规划的查询可以利用标签集线器(hub labeling)[68]来加快查询速度。当然,这些方法并不互斥,互相组合的方法也很常见。[69]将分割法与有界跳跃法相结合,提出了Transit Node Routing
with Arc Flags(TNR + AF)算法。
局部规划
局部规划实际可以理解为为了实现全局规划来找到一条足够优化且能避开障碍物的轨迹。同样可以分为四类:基于图搜索(graph-based planners),基于采样( sampling-based planners),曲线插值( interpolating curve planners)和数值优化( numerical optimization)方法。当然,后续还有一些基于深度学习的方法。基于图搜索的方法基本和基于图的全局规划差不多,Dijkstra和A*以及其改进算法依然是最常见的方法。基于图搜索常见的做法都是将地图离散成状态格,这种做法在高维的情况下会产生指数爆炸。因此就有了基于采样的方法,最常见的基于采样的方法是概率图(PRM)和快速随机搜索树(RRT)。
这类方法的缺陷主要是不稳定,在某些特定环境下可能要很长时间才能收敛。曲线插值是在一系列已知点上拟合一条可行的轨迹曲线,常见的曲线有回旋线,多项式曲线,贝塞尔曲线等,这种方法的避障策略一般是插入新的无碰撞的轨迹,如果偏离了初始轨迹,则避开障碍之后再返回初始轨迹。这种方法生成的轨迹较光滑,计算量也比较大,但是在实际ADS中,轨迹光滑一般意味着对乘客比较友好。
数值优化一般可以用来改善已有的轨迹,比如[^70]利用非线性数值函数(numeric non-linear functions )来优化A*得到的轨迹,[71]利用牛顿法解决了势场法(Potential Field Method,PFM)的固有震荡问题。
随着人工智能的火热,一些基于深度学习和强化学习方法的规划策略也开始涌现出来。[72]利用三维全卷积神经网络(Fully convolutional 3D neural networks)从激光雷达等输入设备获取点云并生成未来的轨迹。[73]利用深度强化学习在仿真环境下实现了交叉路口的安全路径规划。基于深度学习的缺陷前面已经提到过了,缺乏硬编码的安全措施,除此之外还有泛化能力问题,数据来源问题等,但总的来说,这一类方法应该是未来的趋势之一。
人机交互
车辆一般通过人机模块(HMI)与驾驶员或乘客交互。互动的强度取决于自动化程度,传统的L0的车需要持续的用户操作输入,而理论上L5级别的车仅需要在行程开始的时候给予一个输入即可。根据目的不同大致可以把交互任务分为两类:首要任务(与驾驶相关)和次要任务,理论上讲,次要任务的交互输入更期望是非视觉选项,因为视觉在驾驶任务中是不可替代的,需要视觉的次要任务界面会影响首要任务,从而影响驾驶的可靠性[72]。一个可替代的方案就是听觉用户界面(Auditory User Interfaces ,AUI),听觉不需要刻意集中注意力于某个界面之上。音频交互的主要挑战是自动语音识别(automatic speech recognition, ASR)。ASR算是一个比较成熟的领域,但是在车辆领域还有一些挑战,比如一些不可控的噪声(驾驶噪声,风声,道路噪声等)。
除此之外,如何与ADS实现对话也是一个尚未解决的挑战。人机交互最大的挑战应该是出现在L3和L4,这两个阶段需要人和ADS互相理解对方的意图来实现手动和自动的切换。在监控自动驾驶时,驾驶员会表现出较低的主观认知欲望,尽管可以通过一些基于头部和眼睛追踪的摄像机来识别驾驶员的活动,并使用视觉和听觉来提示驾驶员做好切换准备,但目前主要是在模拟环境下实现[73],在真实环境中能够高效切换的系统目前还未出现。这是一个悬而未决的问题,未来的研究应着重于提供更好的方法来告知驾驶员以简化过渡过程。
数据集和开源工具
数据集对于研究人员和开发人员来说至关重要,因为大多数算法和工具在上路之前都必须经过测试和训练。通常的做法是将传感器数据输入到一系列具有不同目标的算法中,并在标注过的数据集上测试和验证这些算法。有些算法的测试是相互关联的,有些则是单独的。CV领域已经有很多专门用于目标检测和跟踪的标注数据集,而对于端到端系统,还需要额外的车辆信号,主要包括转向和径向控制信号。
随着学习方法的出现,支持它们的训练数据集也随之出现。从2005年一直增长到2012年,PASCAL
VOC数据集是第一个包含大量ADS相关数据的数据集之一。但是这些数据通常以单个对象为特征,不能代表驾驶场景中遇到的情况。2012年,KITTI
Vision Benchmark通过提供大量的标记驾驶场景弥补了这一缺陷,直到现在它仍然是自动驾驶中使用最广泛的数据集之一。当然,从数量上来说,它远远比不上ImageNet和COCO这样的通用图像数据库。
通用数据库在训练某一特定模块是有用的,但是由于缺少前后关联信息(the adequate context),不足以用来测试ADS的能力。加州大学伯克利分校DeepDrive是一个带有注释图像数据的最新数据集。牛津的RobotCar在英国使用六个摄像头、激光雷达、GPS和惯性导航系统收集了超过1000公里的驾驶数据,不过这些数据没有标注。还有一些其他的数据集可以见下表。
开源框架和模拟器
常见的ADS开源框架包括:Autoware、Apollo、Nvidia
DriveWorks和openpilot等。常见的模拟器包括CARLA、TORCS、Gazebo
、SUMO等。CARLA可以模仿各种城市场景包括碰撞场景,TORCS是一个赛车仿真模拟器,Gazebo 是一个常见的机器人模拟器,SUMO可以模拟车流量。
总结
这篇文章概述了在ADS中现有的一些系统及关键的创新。目前来看,自动驾驶在很多方面都存在着明显的缺陷。无论是模块化还是端到端系统,不同的模型都存在着各自的缺陷。具体到算法,建图,定位,感知等方面,仍然缺乏准确性和效率,对不理想的路况或者天气的鲁棒性也仍有待提高。V2X仍然处于起步阶段,由于所需的基础设施比较复杂,基于云的集中式信息管理也尚未实现。人机交互的研究还比较少,存在着许多问题。