Apollo 5.0 障碍物行为预测技术

 

 

 

障碍物行为预测是无人驾驶系统的核心模块之一。预测模块承接上游感知模块,结合高精地图和主车的定位信息,对周边障碍物的未来运动情况进行预测,帮助主车提前作出决策,从而降低交通事故的发生率,在无人驾驶系统中发挥着承上启下的关键作用。

在百度 Apollo 自动驾驶开源平台中,障碍物行为预测分为车辆轨迹预测和行人轨迹预测两大类。在车辆轨迹预测中,分为意图预测和速度预测两个过程。意图预测根据不同的场景,通过深度学习神经网络给出各行为意图的概率。速度预测考虑与主车的交互,运用采样+代价函数选择的方法,给出合理的速度预测。

在本篇分享中,我们有请 Apollo 资深研发工程师许珂诚为大家分享在百度 Apollo 平台上,障碍物行为预测的技术方案。

Apollo 预测模块概述

预测模块承接感知、定位、地图模块,通过预测算法,可以给出障碍物未来的运动轨迹,输出给下游规划模块。

Apollo 预测模块意义

 

那么预测模块在自动驾驶中扮演着一个什么样的角色呢?我们看图中这个例子。图中白色的车是我们的主车,上面蓝色的车是前方障碍车。蓝车的车头略微向右偏。这时候,我们就会有一个疑问,前面这辆车他会不会切进来?我们是否需要给他让道?

那么预测模块就可以解答这个疑问。我们可以通过预测周边障碍物的行为,帮助主车提前作出决策,从而降低交通事故的发生率。

指导思想

我们在研发和设计轨迹预测模块的时候,大致遵循了几点指导思想。

第一点

就是我们在预测一个物体未来的轨迹的时候,一定要考虑不同类型物体的不同特征。感知模块在发现一些周围障碍物的时候,已经会对障碍物进行了分类,这也是为了方便我们的预测。大致上,周围障碍物可以是机动车和非机动车、类似于行人等等。我们必须对不同类型的障碍物采用不同方法来处理。

第二点

因为预测模块运用了很多模型包括机器学习类的模型,所以我们要找到合适的模型来处理不同类型的输入特征。上游模块会传递以下几种不同类型的输入特征给预测模块,它们包括:障碍物自身的信息,基本的一些外观信息,还有一些运动状态,及运动状态的一些历史信息。

第二类输入特征就是障碍物所处的静态环境的相关信息,这个具体来说指的就是障碍物周围的道路情况、交通信号等信息。

第三类输入特征是障碍物周围的一些动态的环境,这个指的就是其他的障碍物,尤其是无人车自己,因为无人车对于其他物体而言也算一个移动的障碍物。这类所谓动态信息其实包含了大量的交互信息,比如一个车在变道的时候有一辆其他的车在目标车道上,它们之间会有一定程度的交互,其中一辆车会让另一辆先过。

对于这几种不同类型的输入,我们需要选择最适合的模型来提取特征,进而辅助我们的预测。

第三点

主要就是工程方面的考量,目前 Apollo 感知的帧率是 10 赫兹,也就是每一帧大约 100 毫秒,这也就意味着整个预测模块的耗时需要控制在几十毫秒。

而通常越好越精准的模型所耗的时间也就更多,这也就是说,我们必须在模型的运用上有所抉择。因此,我们对于所有障碍物,在运用预测模型之前,先会对其判断一个优先级,对于完全无关的障碍物,我们会忽略掉;对于存在一定交互可能性的障碍物,我们会重点谨慎处理;其他障碍物我们就正常来处理。

机动车行为轨迹预测综述

首先我们来分析一下机动车的一些行为特征。和人相比,车的运动特征很特别的一点就是轨迹是受到动力学限制的,而且车只能在马路上行驶,所以也是受到诸如车道线和路口形状等的限制。比如上面两张图中,车按照左边这个路线行进是比较现实合理的。但是车像右边这样绕麻花,甚至冲出路是不太可能的。

机动车还有一个特征就是他在常规道路,或者说高速公路上的行为和在交通路口的行为存在较大区别。常规道路上机动车通常会沿着车道来行进,而在路口中,车的行为受到车道的约束会相对较小。

正是由于这些机动车的行为特征,我们的策略就是先对车辆的意图进行预测,这里的意图指向比较广泛,车辆会选择哪条车道,会不会变道的意图,或者说车辆进入路口后,是会左转、还是直行等等。一旦我们有了车辆的意图,我们再结合车的运动学原理,便可以描画出更加具体的轨迹。而且,我们对常规道路和交通路口的车辆,也会运用不一样的预测模型进行处理。

常规道路

那么我们怎么预测机动车的意图呢?先来介绍一下对于常规道路上的意图预测。

首先,预测模型的输入是障碍车自身的运动状态的历史,以及障碍车周围车道中心线的相关信息。图中,红点表示的是障碍车的历史运动轨迹,而蓝线则代表了车道中心线的形状和走向。

我们可以用一个 Encoder(LSTM)来对障碍车的运动历史进行处理,进而得到了一个障碍车的编码。然后我们可以用同另外一套 Encoder 对车道线进行编码,这个 Encoder 可以是 LSTM 也可以是一维 CNN。这样对于每个车道,我们都会得到一组 Encoding。

但是,刚刚得到的编码仅针对于每个车道,缺乏对于整条道路一种比较宏观上的理解。因此,我们可以把刚才对于每条车道的 Encoding,经过一个 MLP 后,进行一个全局池化操作,这样我们就能够得到一个对于整体大环境的一个理解——Environment Encoding。

最后,我们要回归到我们本来的任务上,就是对于每个车道,都预测一个障碍车将来会选择该车道线的概率。我们可以把刚才得到的障碍物本身的 Encoding,和对应的每条车道的 Encoding,再加上对整个环境的 Encoding 拼接到一起,然后再进行一个 Softmax 的操作。这样,我们可以得出一个对于每条车道的选择的概率。

整理一下,这套算法的输入是障碍车自身运动状态的历史和车道中心线的相关信息。通过车道选择预测的神经网络,最后输出选择每条车道的概率。而我们训练这个分类问题的神经网络,则可以用常见的交叉熵来作为损失函数。

交通路口

下面我们来看一下对于处于交通路口附近的机动车的意图预测算法。由于路口交通情况比较复杂,所以我们对于路口的意图预测模型,除了前面两个关于障碍车自身信息和路口车道信息以外,也加入了周围其他障碍物的信息。具体的操作方式如下。

我们首先以障碍车的朝向为参考方向,划分出 12 个扇形区域,然后针对于每个扇形区域记录一个信息,就是该区域内是否有可能的离开路口的车道。比如上图中,根据车的朝向划分的 12 个区域,有三个区域是有出口的,它们也分别对应了左转、直行、和右转。于是,问题就被转化为了十二元分类问题,我们只需要预测车选择每个出口的概率即可。

为什么不直接预测左转、右转、直行这几种情况的概率呢?这也是因为路口并非都是十字的形状,也有很多丁字路口,有一些五叉,甚至更多叉的路口,那样的话,划分为左转、直行、右转这种三元分类问题可能未必一直可行。因此我们选择来用 12 个扇形区域来解决所有的路口问题。

那么既然我们已经将问题转化为一个十二元分类问题,下一步我们该如何有效的提取各种特征来帮助模型的预测呢?我们采取了这种语义地图的方式,就是将障碍车的历史运动状态,车道的形状和连接关系,以及其他车的运动状态和历史,都转化为图像信息。

下面我来解释下这两张图,图中对于需要预测的障碍车本身,我们首先以它为中心,对坐标进行旋转使其朝向是正上方,并对障碍物用红色标记,障碍物过去的历史同样用红色,但进行一些暗化,以区别它当前的位置。

对于道路的信息,我们画出道路中心线,车道线和路口这几种信息。如何表达道路间的连接呢?我们用颜色来区分,对于方向正好相反的两条路,采取反色,比如这里蓝色的反色就是黄色等等。

而对于有连接的道路,则采取渐变色,这样道路的走向和连接关系都被适当的用颜色表达出来。最后,其他障碍物我们用黄色画出来,同时对其历史进行一些暗化。这样我们就用一张图适当的融合了三大类的输入特征。

在这里插入图片描述

我们有了这张图,下面就是用适当的神经网络对其进行特征抽取,对于图像处理,现在已经有了很多很成熟的,预先训练好的神经网络。我们可以采用迁移学习的方法,用现成的 CNN 网络比如 Resnet 或 Densenet 等来对语义地图进行特征抽取。

抽取好的特征,再和之前的 12 个扇形区域的信息拼在一起,输入给一个 MLP 网络,然后再输出 12 个经过 softmax 后的数值,对应了选择 12 个扇形区域中的出口的概率。

这样我们就有了一个基于语义地图的预测车道出口的神经网络。因为这本质上是个分类问题,所以我们可以用交叉熵来作为损失函数来训练它。

考虑与主车交互的轨迹预测

刚刚我们介绍的是对于处在常规道路和交通路口两类场景中的障碍车的意图的预测算法。那么有了对于障碍车意图的预测,我们还需要生成障碍物未来具体的轨迹,这样才能够有效的为下游的规划模块所用。

同时,刚刚我们的常规道路的意图预测算法,其实并未考虑到障碍车与周围其他车的交互;而路口算法虽然考虑到了这类交互问题,但是也没有着重的考虑最重要的一种交互——就是和主车间的交互。

为了弥补这个缺陷,我们采用的是考虑到和主车间交互特征的一种轨迹点的预测方法,下面我就来介绍下这个算法。

我们首先接收到了先前的对于意图的预测,比如说左面图中,蓝车是我们的主车,红车是我们要预测的障碍车,假设我们已经预测出了他的意图——就是有 20%的概率会右转,40%概率会直行,剩下 40%的概率会左转。

那么我们轨迹点预测的第一步,就是采样几条可能的运动轨迹。

第二步,就是对每条轨迹应用一个代价函数,这个代价函数考量了多种因素:第一,它考虑到了选择该轨迹的加速度;第二,它考虑到了选择该轨迹的向心加速度;第三,它考虑了该轨迹和主车间碰撞因素或者说距离。这三个因素通过加权的方式,最终会对每一条轨迹得出一个选择它的代价来。

然后,根据代价的大小,我们对每个意图中的采样到的多条轨迹进行进一步的筛选,选出一条最为合理的轨迹。左图中,原来的多条采样轨迹,已经挑出了最为合理的一条来。

最后,我们会进一步的做似然估计。于是我们有了之前的意图的概率,也就是先验概率;同时也有了根据代价函数的似然估计,可以通过求积的方式,算出一个后验概率。这个修改后的概率,就是最终的对于轨迹的预测概率。

参数训练方法

至于对于这个函数的三个参数——θ1 、θ2 、θ_3 的训练。我们采取的是这样一个损失函数。中间的 C 其实就是刚刚提到的代价函数,左边这个代价函数计算了实际轨迹的代价,而右边的计算了各种采样出来的轨迹的代价,我们的目标实际上是最小化它们间的差距。

对于这个损失函数,实际上我们可以将其转为一个神经网络的形式,我们将这几个部分叠加,然后通过一个 ReLU,最终得到的就是我们的损失函数的输出。之后,可以运用神经网络的训练方法,反向传播,对这三个参数进行训练。这样,我们就得到了一套合适的参数,帮我们根据意图来进一步预测障碍物未来的轨迹。

行人行为轨迹预测综述

下面来介绍一下行人的轨迹预测方面的技术。首先,我们来看一下行人行为区别于机动车行为的一些特征。

对于行人而言,它们的轨迹会更加的发散、更加的自由和多元。同时,它们对于地理位置的依赖会更小,因为没有说行人一定会走在人行道上,行人走到哪里都是有可能的。

此外,就是行人轨迹其实和周围障碍物的交互会很多,以上图为例子,如果三个人一起从对面走过来,而这边有一个人向他们走过去,那么大概率上,这一个人会稍微绕一下,错开路线。正是考虑到这些比较特别的行人行为特征,我们对于行人轨迹预测的模型也要着重考虑到障碍物间的交互问题。

同时,我们努力直接预测未来的轨迹点,并且努力对于每个轨迹点进行一些概率化的预测。

模型的最基本组成部分本质上就是个 LSTM。因为行人的行动轨迹是个有时序的问题,而针对这类问题,比较好的神经网络就是 LSTM 或类似的诸如 GRU 等 RNN 循环神经网络类的模型。我们对于模型的输入就是行人历史每一帧的轨迹,将其不断的输入进 LSTM 中,直到当前时刻为止。这样,这个 LSTM 的 Hidden State,其实包含了行人的历史轨迹的一些信息。

在预测将来的轨迹的时候,我们仍然通过同样的 LSTM,一点一点地预测,每次预测的轨迹都在 LSTM 的 Hidden State 的基础上,通过一个 MLP,获得预测轨迹点。每次预测出了这个未来的新轨迹,我们就把它当作更下一帧的预测轨迹时 LSTM 的输入。这样渐次推进。

当然,行人的模型不可能这么简单,刚刚也提到了行人间行为的特征,就是他们之间存在着大量的交互。这里我们介绍如何来应对这种交互的问题。图中的例子就是红色和黄色轨迹的行人一起走,蓝色的行人渐渐靠近他们,而紫色的行人正从对向走来,假设我们是要预测蓝色行人的未来轨迹点,那么我们如何考虑他们间的交互呢?

我们还是用 LSTM 来持续的跟踪每个行人,但是在这个 LSTM 的基础上,我们在每一次 LSTM 的输入中增加一些社会学交互的信息。我们可以将行人周围的地段划分出几个区域来,然后看一下每个区域有没有其他行人的存在。

如果没有,则就填充 0,如果有,就把那个行人的追踪历史,也就是他的 Hidden State 填进去。而如果有多位行人,我们就把他们的 Hidden State 叠加起来。然后,我们可以把这个行人周边其他人的信息作为除了行人轨迹外的额外输入,输入到 LSTM 中,这样我们的预测,就不再仅仅是考虑了行人本身的运动历史的预测,而是同样考量了周围其他人的预测。

那么我们刚刚看到了一种行人间的交互的情况,我们现在来看另一种不太一样的情况。在这个例子中,行人间的距离不一定很近。黄色行人离我们的蓝色行人近一些,但是其实他在往远处走;而红色和紫色行人虽然目前远一点,但是我们可以看出来他们正在高速的往蓝色行人方向奔跑。

这时候我们如果还用刚才的方法在行人的附近画一个方框的话,那么其实这些交互信息都不会被考虑在其中,那么预测就会有失偏颇。因为,正常人看到远处有两个人跑过来的话,他也会稍微避开一下,避免迎面撞上。

那么我们该如何处理这类情况呢?我们可以运用一个注意力机制。同样,我们仍然对每个行人保留一个 LSTM 来追踪历史轨迹,这样每个行人都有个自己的 Hidden State,那么我们在预测的时候,除了行人轨迹的输入以外,还将一些交互信息用注意力机制结合起来。

具体的方法,就是我们可以通过行人间的 Hidden State,或者距离的变化,先来输出一个注意力分数。比如在这个例子里,蓝色行人对于黄色行人的注意力就很低,因为虽然他们很近,但是黄色行人是在渐行渐远,并不大会影响蓝色行人的运动轨迹。而相反,红色和紫色行人的注意力分数就非常高。最后我们可以把他们的 Hidden State 通过这个注意力分数加权然后求和,作为额外的 LSTM 的输入,这样我们就可以更准确的预测蓝色行人的轨迹了。

总结一下,行人轨迹预测的模型,输入的是障碍物自身的运动历史,还有其他障碍物的持续追踪的历史。在模型上,我们在 LSTM 的基础上,加入了注意力机制,不仅仅是对于身边的注意力, 还有各种比较重要的行人,我们也能够用注意力机制,考虑到和他之间的交互情况。

输出上,我们不再像机动车一样预测意图,我们努力直接预测障碍物未来的一段时间的具体轨迹点。

损失函数上,我们可以用两种,一种就是最简单的,非概率化的这种均方误差损失函数,来直接计算 ΔX 和 ΔY 的 MSE loss。我们也可以用更加考虑概率化的损失函数,二维正态分布的一种最大似然估计,也就是说我们模型的输出可以不再是 X 和 Y。而是 μ 和 σ,μx,μy,σx,σx,和 ρ 这 5 个输出,然后用最大似然的 log 值的相反数来作为损失函数。

虽然 Apollo 自动驾驶预测技术不断地进行迭代,但仍存在许多挑战。我们也会继续迎难而上,继续研发更好的技术。

posted on 2019-08-21 14:15  程十三  阅读(14127)  评论(0编辑  收藏  举报

导航