AI News HubLIVE
站内改写3 分钟阅读

那些让驾驶崩溃的漏洞

本文回顾了comma.ai的openpilot自动驾驶系统中几个最有趣的漏洞,包括车辆向右偏移、车道线误识别、弯道切内线、刹车导致图像模糊、高速巡航速度不收敛以及训练与运行时图像填充不一致等问题。这些漏洞的修复显著提升了系统性能。

来源Hacker News AI作者: LorenDB

软件中漏洞无处不在,而通常糟糕的软件正是因为这些漏洞,而非糟糕的算法选择。openpilot也不例外;多年来,我们通过引入激动人心的新机器学习技术取得了巨大进步,但大多数驾驶改进实际上源于发现并修复了一些明显的漏洞。本文将带你回顾这些年最有趣的几个漏洞。

向右偏移

2017年,comma还是一家不成熟的公司。用户少、日志质量低、训练中除了无量纲的验证损失外没有其他指标,也没有闭环模拟测试。因此,除了驾驶时注意到的明显问题外,我们基本上对openpilot的实际表现一无所知。从Slack消息中可以看出,我们意识到驾驶模型有轻微向右偏移的倾向,但数月来找不到根本原因或合理解释。

到年底,我们终于找到了主要原因。模型训练时,用于预测未来行驶轨迹和车道线的目标值是通过依赖陀螺仪测量及其他传感器的定位器进行真值标注的。陀螺仪通常存在偏置,而Android系统会在检测到设备静止时自动校正偏置。这意味着当openpilot启动且车辆静止时,偏置被正确校正。然而,当车辆开始移动后,openpilot设备会发热,导致偏置变化,但设备不再静止,因此偏置无法再被校正。偏置与温度的关联在所有设备上相似,因此所有数据都向同一方向倾斜。最终,通过采用一个更全面的、能准确处理偏置的定位器修复了此问题。

车道误识别

2019年,我们开始收到一些神秘投诉:在车道线清晰的公路上,车辆会偏离车道。这是因为当时openpilot仍依赖车道线进行驾驶决策,而如图像所示,在这些情况下,系统会莫名地在车道中间检测出一条车道线。经过进一步查找,我们发现所有例子都发生在明亮的日光条件下。

查看训练数据中带有同样缺陷的多个例子后,问题变得明显:在某些光照条件下,阳光会在引擎盖上反射,形成明亮的白色区域,这被真值标注栈检测为车道线标记,且始终位于车辆正前方,因此被重建为道路中间的车道线。通过在车道线检测器中加入这些特定例子的更好真值标注,我们重新训练了检测器,并训练了一个修复后的新驾驶模型。

弯道切内线

2020年10月,有多起投诉称openpilot在弯道中压到内侧车道线。查看例子后发现,它们都发生在夜间长距离缓弯中,且驾驶模型对路径和车道线的预测都偏向弯道内侧。

对真值标注的调查显示,定位器在这些情况下错误地计算了车辆运动。定位器调试揭示,头灯照射在连续的长车道线上会给视觉里程计带来问题。ORB特征检测器依据头灯照明选择了随车辆移动的边缘特征。这意味着在场景中其他可追踪特征很少时,定位器只会依赖这些错误特征,导致其持续偏向弯道内侧。通过更智能的ORB特征匹配和异常点剔除修复了此问题,重新训练后的模型解决了投诉。

刹车导致图像模糊

手机摄像头使用音圈电机移动镜头进行对焦。这意味着镜头并非刚性固定在对焦位置,而是安装在弹簧上,通过对焦电机施加力来实现移动。这也意味着如果设备有快速加速,镜头会因惯性力而偏移,为保持对焦,电机需要施加补偿力。

我们有一个算法来补偿2019年使用的OnePlus手机的这种偏移。后来我们换用了Leeco手机,但未重新评估对焦算法。结果发现,我们的补偿算法在新设备上导致了明显的刹车模糊,而这些手机其实完全不需要对焦补偿。这个算法恰恰导致了它本应防止的问题!

高速巡航模型不收敛

当openpilot引入实验模式后,它在高速公路上无法果断加速或减速到合适的速度。在稳态下,它会一直保持初始速度行驶。例如,在空旷的长直高速上以55英里/小时的速度一直开下去。

openpilot的驾驶模型是在驾驶模拟器中通过策略内训练(on-policy)进行的。模拟器的输入是六自由度姿态变化,我们用它代替动作(加速度和曲率),以便对模拟物理进行更精细的控制。我们注意到需要在模拟中加入大量俯仰噪声,模型才能学会刹车和加速。

经过调查,这是由于俯仰和加速度之间的紧密耦合。在任何正常车辆中,加速都会引起俯仰运动。这意味着加速度必须伴随相应的俯仰变化。模拟器中缺乏这种真实感可以被训练的学生模型利用。如下结果所示,通过在模拟加速中模拟真实的俯仰运动来修复这些人为因素,使得模型在速度收敛测试中表现更好。

运行时性能与训练时不一致

这个漏洞太经典了,我们写了四次。多年来,openpilot支持多种摄像头和安装配置。因此,模型有时训练时使用的图像尺寸比某些配置中可用的大。为了适配,需要对图像进行填充以符合模型期望的输入尺寸。训练时和运行时的填充必须一致,但推理栈和训练栈完全分离。多年来它们各自频繁更改,且缺乏匹配测试。

以下是所有因填充不一致导致运行时与训练时不同、从而造成输出退化的漏洞:2021年、2024年、2026年(两次)。

回顾

自2017年以来,很多事情发生了变化。借助我们当前的工具和基础设施,许多这些漏洞不太可能再进入生产环境。不过,我们仍会写出许多愚蠢的漏洞,如果你喜欢修复这些漏洞,也许你应该来这里工作。

—— Harald Schäfer,comma.ai首席技术官