深入探究 Openpilot:第一个端到端辅助驾驶产品
产品介绍:
Openpilot是由Comma.ai推出的相对成熟的开源L2辅助驾驶系统项目,实现了基于名为Supercombo的端到端模型的自适应巡航控制(ACC)、自动车道居中(ALC)、前向碰撞警告(FCW)和车道保持辅助(LKA)等常规辅助驾驶功能。用户界面如图所示。它已面向大规模消费者,并设计兼容超过150种车型。用户可以通过几个步骤在自己的汽车上安装Comma套件,体验辅助驾驶。
附赠自动驾驶最全的学习资料和量产经验:链接
软硬件介绍:
Openpilot主要由两部分组成:软件和硬件。软件部分包含各种算法和中间件。硬件设备名为EON,是一整套设备的大脑,负责运行NEO系统(高度定制的安卓系统)和软件算法。EON设备上的不同单元捕获相应的环境信息,例如摄像头拍摄物理世界的前方图像,名为Panda的车载接口从CAN总线提取车辆状态。在此步骤中还使用了车载雷达。然后,Openpilot利用这些数据运行Supercombo模型,并通过后处理软件和中间件验证其输出。最后,它通过Panda接口将控制信号发送到车辆控制器。
具体从官网可查询到,硬件使用的是8年前的乐视手机+8年前的高通芯片EON(算力2.5TOPS);【Comma 2】
研究意义:
2020年,《消费者报告》将Comma Two在整体评级中评为18个竞争对手中最佳,击败了特斯拉、凯迪拉克、福特等竞争对手。而我觉得,Openpilot的重要性在于其在整个自动驾驶系统中实现端到端设计的产品级成就;
下面我们看下Openpilot是如何做到这么拉胯的硬件实现L2辅助驾驶的:以下内容来自论文:【1】Level 2 Autonomous Driving on a Single Device: Diving into the Devils of Openpilot 论文中作者复现了openpilot的模型,包括训练部分。
系统架构
OpenPilot模型架构:
Openpilot在系统级设计上采用了端到端的理念,直接从摄像头图像预测轨迹。其差异如图2所示。Openpilot中的这个端到端网络被称为Supercombo。
整个系统的核心是运行在EON设备上的软件算法,负责感知、规划、定位和控制。在这些算法中,感知算法(即Supercombo模型)是值得深入研究的关键第一步。它接收摄像头的图像,并预测车道线、道路边缘、前车位置和速度,最重要的是,预测自车未来应遵循的轨迹。因此,它也被称为轨迹规划模型。我们在图5中给出了Supercombo的简化说明。
具体而言,模型执行的流程包括以下部分:
-
预处理。首先,从摄像头拍摄的原始单帧3通道RGB图像(大小为3×256×512)被转换为6通道YUV格式(大小为6×128×256)。然后,两帧连续图像被拼接在一起作为模型输入,结果输入大小为12×128×256。
-
主网络。主网络采用了Google的Efficientnet-B2,具有良好的性能和高效性。它采用组卷积以减少主干网络中的参数量。为了捕捉时序信息,一个GRU(门控循环单元)连接到主干网络。
-
预测头。几个全连接层附加到GRU上,作为预测头。输出包括5个可能的轨迹,其中置信度最高的一个被选择为计划轨迹。每条轨迹包含在自车坐标系统下的33个3D点的坐标。此外,Supercombo还预测车道线、道路边缘、前方物体的位置和速度,以及一些其他的车辆信息。值得注意的是,虽然网络结构以及预处理和后处理方法是开源的,但训练过程和数据仍是内部的。因此,需要从头开始重新实现它。此外,关于训练数据,Comma.ai声称其Supercombo模型是从100万分钟的驾驶视频中训练出来的。然而,他们只向公众提供了一小部分数据
-
输入部分还包含更高级别的控制输入:一个表示高级命令的向量(表示加速、减速),以及一个表示右/左交通约定的布尔值,他们作为输入与backbone特征进行concat。
复现过程:
事实上,由于可用数据不够充分,这篇论文的作者并没有完全按照openpilot提供的模型架构进行复现,作者进行了适当裁减:如图6所示
作者重新实现的模型的主要结构与原始的Supercombo非常相似。它从单个前视摄像头接收两帧连续图像,并直接预测未来的轨迹。输入帧通过主干网络后被压缩成长度为1024的特征向量。然后,将特征向量输入到宽度为512的GRU模块,使模型能够记住时间信息。最后,几个全连接层将网络输出组织成所需的格式;
更多模型细节:
- 预处理 - 透视变换。Openpilot设计用于所有类型的车辆。一个直接的问题是,不同用户可能会以不同的位置安装设备。这也被称为安装偏差。为了消除这一问题,Openpilot要求用户在安装后进行摄像头校准过程,期间司机应手动沿直路驾驶车辆一段时间,并保持相对固定的速度。然后,得出摄像头外参。此外,当设备工作时,会持续运行在线校准过程,以防止悬挂系统引起的振动导致外参变化。一旦确定了外参,就可以进行简单的图像扭曲操作,使图像看起来像是从标准摄像头拍摄的(虚拟相机技术)。图7展示了透视变换的结果以及从摄像头拍摄的原始图像。可以清楚地看到,Openpilot只关注非常狭窄的视野,在这一步中,图像被调整为128×256的大小
-
主干网络。Openpilot采用EfficientNet-B2作为主干网络。得益于最新的AutoML(自动机器学习)和模型扩展技术,它兼具精度和效率。给定形状为(6, 128, 256)的输入张量,主干网络输出形状为(1408, 4, 8)的张量。然后,一个带有3×3内核的卷积层将通道数减少到32。最后,形状为(32, 4, 8)的张量被压平为长度为1024的特征向量。
-
GRU模块。特征向量后连接一个宽度为512的GRU模块。使用GRU的目的是捕捉时间信息。
-
预测头。在GRU模块之后,几个全连接层负责将输出维度组织成所需格式。Supercombo模型将生成长度为6609的张量作为最终输出。预测包括计划的轨迹、预测的车道线、道路边缘、前车位置以及一些其他信息。由于数据集缺失,论文重新实现中仅关注计划的轨迹。设M为可能轨迹的数量。每条轨迹由自车坐标系下的N个3D点的坐标和一个置信度值组成。然后,输出维度D为:D=M×(N×3+1). 通常M=5和N=33。考虑到坐标的原始值相对较大,我们对所有x坐标添加一个指数函数,并对所有y坐标添加一个双曲正弦函数(sinh)
-
损失函数。使用MTP(多模态轨迹预测)损失,包括回归损失L_reg和分类损失L_cls。总体损失定义为:L=Lreg+αLcls.
训练细节:
作者使用AdamW作为优化器。batch大小和学习率分别设置为48和10^-4。应用梯度剪裁值为1.0。在训练期间,使用8个NVIDIA V100 GPU。由于存在GRU模块,需要通过填充零来初始化其隐藏状态。每40步更新一次参数,期间累计梯度。在Comma2k19数据集上训练100个epoch大约需要120小时。在单个NVIDIA GTX 1080 GPU上,网络可以以100 FPS的速度进行推理。
测试过程:
作者使用两种指标来评估方法,模仿指标和舒适度指标。
-
模仿指标。模仿指标旨在显示模型从人类驾驶员中学习的效果。首先根据x轴上的距离将轨迹点分为5组,即0 ∼ 10米、10 ∼ 20米、20 ∼ 30米、30 ∼ 50米和50+米。在每个范围内,计算两个指标,平均欧氏距离和平均精度。
-
平均欧氏距离误差。顾名思义,计算3D空间中对应预测点和真实点之间的欧氏距离,然后取平均值。单位为米。
-
平均精度。如果两点之间的距离小于一个阈值,标记为“命中”。否则,标记为“未命中”。然后,可以计算命中率,并取平均值。例如,AP@0.5表示在0.5米阈值下的平均命中率。数值越高越好。
-
-
舒适度指标。舒适度指标可以反映出某条轨迹是否会让乘客感到舒适。使用抖动和横向加速度来衡量舒适度
-
抖动。抖动是物体加速度随时间变化的速率。注意,抖动是一个有方向的量。单位是m/s^3。数值越低越好
-
横向加速度。横向加速度是车辆运动方向的横向加速度。同样,横向加速度是一个有方向的量。单位是m/s^2。数值越低越好。
-
-
复现结果:在Comma2k19数据集上。根据模仿指标,作者的模型在Comma2k19数据集上取得了非常好的结果。原始Supercombo模型显示了可比的结果,如表3a和表3b所示。总体上,复现的模型比原始Supercombo表现更好。然而,在舒适度指标方面,情况有所不同。正如表3c所示,复现模型生成的轨迹比Supercombo生成的轨迹具有更高的抖动和横向加速度
4. **实车测试:**作者复现的模型只训练了轨迹预测,所以模型实车部署时,除ego轨迹预测外其他的输出全部来自openpilot开源模型。整体效果与原模型表现一致(在carla和真实环境测试)。
讨论:
本文中,作者的模型是以开环方式进行训练和测试的。尽管结果看起来尚可,但这种方式存在一定的缺陷:
-
首先,模型只是学习和预测人类驾驶员最常见的行为。在现实世界中,驾驶员大多数时间只是让车辆直行,并避免任何可能的错误行为。这样一来,模型甚至没有机会学习如何从错误中恢复。
-
其次,开环训练可能会引入一种特征泄露。如车辆当前正在加速,模型将预测出一个更长更快的轨迹,反之亦然。此外,如车辆正在左转或右转,模型将预测出相应的左转或右转轨迹。这表明模型正在从驾驶员的驾驶意图中学习,而不是从道路特征中学习。一个典型的场景是根据交通信号灯起停。模型可能会在实际看到红灯或停止线之前很久就决定减速。然后,当车辆在红灯转绿之前缓慢启动时,模型可能会决定快速加速。
再谈闭环训练和测试:进行闭环训练和测试的障碍在于我们根本无法做到。目前有两种解决方案。
-
第一种是Comma.ai博客中介绍的。可以通过WARP机制模拟闭环训练和测试,使从一个角度收集的图像看起来像从不同角度收集的图像。
-
第二种方法是完全在模拟器中训练和测试模型。然而,这两种解决方案都不完美,因为WARP机制会引入图像伪影,而现有的模拟器无法渲染真实的图像。
当前模型存在的问题:
-
模仿学习:存在学习的模糊性。当前模型还是在学习驾驶员的行为,比如当前车刹停,有的驾驶员会直接绕道而行,有的驾驶员会刹车等待。这无疑给模型造成困惑。
-
端到端模型无法进行调试:传统上,在感知和规划模块分离的自动驾驶系统中,我们可以得出哪个部分出了问题。然而,对于像Supercombo这样端到端的模型,其感知和规划模块融合在一起,我们如何在失败时调试它?例如,如果模型拒绝在红灯时停车,我们如何知道它是否成功检测到了红灯和停止线?可能唯一的解决方法是加数据吧。
未来展望:
OpenPilot是最先将端到端落地的产品。我们可以看到整个方案架构十分简洁,将感知和规划放到了一个模块去做,节省了大量的cpu计算和人力成本(comma.ai公司人数仅为20多人);可以预见端到端是各类自动驾驶公司的翻身之战。
另一方面如上文讨论,数据和基建可能会是后面端到端能否做成的关键。如何做好仿真,如何做好world model,可能需要更多的人力投入才会看到答案。