在仔细阅读了所有到目前已公开的比赛top-20解决方案后,以较为粗的视野,探讨一下如何解决自动驾驶中的运动预测问题。
大概在几个月前,lyft在kaggle平台上组织了一个比赛[1]:Lyft Motion Prediction for Autonomous Vehicles,旨在用算法预测自动驾驶汽车周围的交通参与者的运动轨迹。
比赛刚启动时我还跃跃欲试,把数据下载了准备训练一波,无奈却被后续无比忙碌的工作和学习给耽搁了。在比赛结束后,心有不甘的我仔细阅读了截至目前已经公开的top-20解决方案,以较为粗的视野,和大家共同探讨一下如何解决自动驾驶中的运动预测问题。
01 问题定义和数据集
自动驾驶中的运动预测或轨迹预测,在这里我们定义为:
给定
交通参与者(例如行人、骑车人、车辆)在过去一段时间的路径/轨迹
道路信息(例如道路结构、交通灯信息)
相关交通参与者过去一段时间对路径/轨迹等
对
未来一段时间的(一段或多段可能)路径/轨迹
或运动意图
或占用格栅图
进行预测。
上面这段文字便定义了问题的输入(“给定”部分)和输出(“对”部分),基于问题的定义,现存的研究有诸多方法,传统的方法如:
1. 基于运动学和动力学的预测(如卡尔曼滤波),缺点在于没有考虑到环境中其他交通参与者对被预测目标运动的影响;
2. 考虑了环境因素的方法,如社会力模型、逆强化学习等。
基于deep learning的方法可以大致分为:
1. 循环神经网络(RNN)方法,由于轨迹具有明显的时序信息,通过RNN对时间维度建模;
2. 卷积神经网络(CNN)方法,将轨迹和环境信息编码成图的形式(例如多通道的鸟瞰图),用CNN方法进行建模。在比赛中的baseline和大多数参赛者的方法均基于此;
3. 其他,例如图神经网络、RNN+CNN的结合等;
在Deep Learning-based Vehicle Behaviour Prediction for Autonomous Driving Applications: a Review [2]一文中,对基于深度学习对轨迹预测方法进行了下图的分类(蓝色按输入类型分,绿色按输出类型分,灰色按预测方法分):
在数据上,自动驾驶场景中的主流开源数据集对比如下,其中能用于轨迹预测的数据包括nuScenes、ApolloScape Trajectory、Argoverse Forecasting和Ours(指的是本次比赛中使用的lyft新开源的数据集):
lyft数据集的数据采集车如下图左所示,其中感知部分包括3个Lidar(一个车顶64线10Hz,两个前保险杠40线)和7个Camera(下图右,都在车顶)、5个Radar(4个位于顶部,一个位于前保险杠)。
由20辆配备了同等传感器的数据采集车,从2019年10月到2020年3月,采集到到数据包括:
1. 17万个场景,每个场景25秒,通过感知传感器捕捉自车状态、自车周围的交通参与者(骑车人、行人、车辆)状态和交通灯状态;
2. 高精度语义地图,包括(详见下表):车道边界、车道连接性、行驶方向、道路类型、道路材料、道路限速、车道限制、人行横道、交通灯、交通标志、限制区域、减速带;
3. 高分辨率的卫星图片,覆盖74平方公里区域,由181个GeoTIFF切片构成,每个切片大小10560 x 10560 像素(640 x 640 米)。可用于辅助预测。
数据集的数据整体统计情况见下表:
02 赢得比赛的技巧
由于kaggle比赛有其显著的局限性(例如参赛者往往不具备从事运动预测研究的背景、比赛时间也就短短2-3个月),导致一般而言,小概率事件在kaggle比赛中能产生出SOTA的新方法。大概率事件是,对一些论文中已有SOTA方法的运用,并针对赛题添加针对性的trick。
在这个赛道上,lyft官方公开了一个baseline方法 [4] (属于第一部分中介绍的基于CNN的方法),大致可以分为下面两个步骤:
1. 将轨迹和环境信息编码成多通道的鸟瞰图,根据编码信息的不同,可以有下图中的几种形式:语义图(右上)、卫星图(右下)、语义卫星图(左下);
2. 将编码后的图(224 x 224大小,以目标车辆为中心)作为CNN的输入数据,基网络为ResNet-50,模型预测值为未来5秒内的一连串位置点。
由于这个官方baseline并不弱,并且为参赛选手提供了便利,因此大多数参赛者都是基于此进行了修改。从赛道上top解决方案[5]来看,有一些重要的修改技巧摘选如下(都是图像比赛的基本操作,但根据问题领域的不同有所调整):
1. 对样本的筛选:对训练样本进行筛选,使其与评测样本保持一致。例如在这个赛题中,评测样本基本在未来十帧都有数据,因此在训练样本筛选时也只保留有未来十帧数据的样本;
2. 对数据的编码:
a) 历史帧的数目:第一名方案中history_num_frames=30,即构建了66通道的“图像”输入,包括30通道自车运动历史轨迹、30通道他车运动历史轨迹、3通道语义地图、3通道卫星地图;
b) 其他可以实验的参数:例如“图像”的整体大小、“图像”每个像素点代表的物理范围;
3. 数据增强:
a) 图像级增强:如 cutout、模糊、下采样;
b) 栅格级增强:如 随机丢弃他车数据;
4. 对训练过程的加速:lyft官方提供的上述数据栅格编码过程复杂,一次训练中的大部分时间都耗费在CPU上的数据处理中。因此可以优化编码部分代码,解决CPU运算瓶颈,提升多GPU训练效率,有助于在比赛中快速实验;
5. 单模型的选择和训练:第一名方案:EfficientNetB3模型,先用低分辨率图像预训练4个epoch,而后从第5个epoch开始,在原图上用余弦退火和阶梯下降学习率的方式进行训练;
6. 多模型的融合:
a) 第一名方案:用不同的数据编码参数训练得到5个模型,用stacking方法进行融合;
b) 第四名方案:用GMM方法将多模型的多条轨迹采样并拟合成最终的三条轨迹;
03 总结
在看了已公开的部分top20解决方案后,稍微有一些失望的是:由于数据量太大,大部分参赛者的方法都没能得到充分的训练,因此往往在baseline模型上稍微调调参数、训练足够久、训练出来多个模型,便能够获得好的名次;
虽然用于参赛的方法和实际工程方法之间,或者和学术创新方法之间的差别还是很大,但对我个人而言也有一些启发:
1. 设计高效的、表征强的数据编码方式极为重要, 在比赛中证明了“先对轨迹和环境数据在鸟瞰图上渲染,后用CNN进行学习”的方法是有效的,但也暴露出编码过程有信息损耗(eg.每个像素的物理范围)、编码效率低的问题;
2. 使用VectorNet方法[6] (CVPR 2020),提出了更高效的编码方式和模型,在比赛中以极少的计算资源便取得了第十名的成绩。
言而总之,如下图所示,对于自动驾驶而言,感知得到交通参与者和环境的探测结果、基于感知结果对环境中交通参与者的行为预测、根据预测结果进行轨迹和路径规划,这三个环节将持续地被深度学习的方法重构。过往几年我们看的比较多的是感知部分,未来相信在轨迹预测和规划上也会见到相同的趋势。
参考资料:
[1] https://www.kaggle.com/c/lyft-motion-prediction-autonomous-vehicles/overview/description
[2] https://arxiv.org/abs/1912.11676
[3] https://arxiv.org/abs/2006.14480
[4] https://github.com/lyft/l5kit
[5] https://www.kaggle.com/c/lyft-motion-prediction-autonomous-vehicles/discussion/201470
[6] https://arxiv.org/abs/2005.04259
- END -
新朋友们可以看看我过往的相关文章
⬇
【相关推荐阅读】
PRML-14章-组合模型
多模态:自动驾驶中的多模态学习
NCP:19个神经元完成自动驾驶?
从2018到2020的AI发展预测