ChatScene:一句话,生成你想要的自动驾驶关键场景
本文介绍了ChatScene,一个基于大型语言模型(LLM)的agent,它利用LLM的能力为自动驾驶车辆生成安全关键场景。给定非结构化的语言指令,该agent首先使用LLM生成文本描述的交通场景。然后,这些场景描述被分解为多个子描述,以指定诸如车辆行为和位置等详细信息。接着,该agent将文本描述的子场景独特地转换为特定领域的语言,这些特定领域的语言随后生成模拟器中的预测和控制实际代码,从而在CARLA仿真环境中创建多样化和复杂的场景。
附赠自动驾驶最全的学习资料和量产经验:链接
我们agent的关键部分是一个全面的知识检索组件,它通过训练一个包含场景描述和代码对的知识数据库,高效地将特定的文本描述转换为相应的特定领域代码片段。广泛的实验结果强调了ChatScene在提高自动驾驶车辆安全性方面的有效性。例如,与最先进的基线方法相比,当测试不同的基于强化学习的自动驾驶车辆时,ChatScene生成的场景显示出15%的碰撞率增加。此外,我们还展示了通过使用我们生成的安全关键场景来微调不同的基于RL的自动驾驶模型,它们可以实现9%的碰撞率降低,超过了当前的SOTA方法。
ChatScene有效地弥合了交通场景文本描述和CARLA实际仿真之间的鸿沟,为自动驾驶车辆的安全测试和改进提供了一种统一且便捷的方法来生成安全关键场景。代码可在https://github.com/javyduck/ChatScene获取。
主要贡献
为了应对大型语言模型(LLMs)直接生成代码的挑战,我们采用了一种间接方法,即利用LLMs首先构建一个包含Scenic代码片段的检索数据库。这些代码片段封装了驾驶场景的基本元素,如周围车辆的对抗性行为、道路几何形状等。然后,在评估阶段,如图1所示,我们的agent ChatScene通过四个步骤将描述映射到相应的模拟中:
i. 根据用户的指令,ChatScene利用LLMs的内在广泛知识生成一个安全关键场景的自然语言描述。
ii. ChatScene进一步解析这个描述,提取与关键场景组件(如周围车辆的对抗性行为)相一致的详细特征。
iii. ChatScene然后将这些特征编码为嵌入向量,以从我们预先构建的数据库中检索相应的Scenic代码片段。
iv. 最后,将检索到的代码片段组合成一个完整且可执行的Scenic脚本,该脚本能够在CARLA仿真环境中执行所描述的场景。
为了进一步定量分析,利用ChatScene为安全关键场景生成了一系列文本描述。这些叙述随后由我们的框架处理以生成模拟,然后使用Safebench平台进行评估。在这个平台中,本车(ego vehicle)由经过强化学习训练的模型控制,而我们的场景生成agent则负责管理围绕它的对抗性物体(如行人、骑自行车者或车辆)。图2提供了一些文本到模拟映射的示例,展示了我们框架的实际应用。
贡献可以总结为:
-
介绍了ChatScene,一个基于大型语言模型(LLM)的新型agent,它能够通过首先提供文本描述,然后仔细地将它们通过Scenic编程语言转换为CARLA中可执行的模拟来生成安全关键场景。
-
开发了一个包含大量Scenic代码片段的扩展检索数据库。它记录了各种对抗性行为和交通配置,利用存储在LLMs中的丰富知识,显著增加了生成驾驶场景的多样性和关键性。
-
在Safebench对八个CARLA挑战交通场景的评估中,我们的方法生成的对抗性场景与四个最先进(SOTA)基线相比,碰撞率增加了15%,这展示了我们框架在安全关键能力方面的优势。
-
随后的实验涉及使用我们生成的一部分对抗性场景对本车进行微调,然后与我们创建的其他场景和来自已建立基线的场景进行比较评估,结果显示平均碰撞率至少降低了9%。
-
我们的框架与检索数据库相结合,不仅促进了直接代码生成,还具备在未来适应多模态转换的潜力,包括文本、图像和视频,特别是针对自动驾驶应用。
方法介绍
这里描述了ChatScene这一大型语言模型(LLM)agent通过应用Scenic编程语言和目标检索机制来生成安全关键场景的方法。首先,简要地阐述了动机,包括关键术语的定义。然后,专注于检索数据库的构建,接着解释了将来自人类或LLMs的安全关键场景的文本描述转换为Scenic代码的过程。具体来说,将首先把原始的文本描述分解为每个组件(例如,对抗性行为)的子描述。接下来,将这些组件编码为向量,这些向量将作为从检索数据库中检索相应代码片段的键。然后,这些代码片段将被组合成一个完整的Scenic脚本,并在CARLA环境中执行以运行模拟。
1)动机与标记表示
我们注意到,Scenic编程语言在CARLA中渲染模拟非常有效且灵活。一个相关的问题自然产生:“我们能否直接提示像ChatGPT这样的大型语言模型,根据安全关键场景的描述来编写相应的Scenic代码?”虽然这种方法看起来很有前途,但往往会导致诸如生成无法编译的代码或使用代码库中不存在的API等问题。这可能是由于训练LLMs的Scenic示例稀缺,以及代码生成的复杂性和广泛性,这些都可能导致模型产生幻觉。
然而,在检查Scenic代码时,我们发现它通常可以分解为如图3所示的四个组件:(1) 默认地图和模型设置,通常是固定的;(2) 周围车辆的对抗性行为定义;(3) 道路几何形状,这也会影响自我车辆(ego vehicle)的生成点;(4) 周围车辆相对于自车的相对生成位置。值得注意的是,自车是由通过强化学习训练的模型控制的,因此我们不需要在这里定义其行为。
基于此,我们提出了一种更高效的方法:收集对应描述的关于最后三个组件的代码片段数据库。这种方法可能会减少幻觉,并允许灵活地将这些代码片段组装成完整的Scenic代码。
然后,在评估过程中,对于像“自车正在直路上行驶,当自车接近时,前方车辆突然刹车”这样的输入描述,我们的LLM agent可以很容易地通过示例将其分解为每个组件的子描述,例如,对于行为组件,“行为:当自车接近时,对抗车辆突然刹车”。然后,我们的agent将根据这些描述的嵌入进行相应的检索和组装相关的代码片段,以生成用于CARLA仿真的完整Scenic代码。为了更清楚地了解我们的方法,我们定义了以下基本概念:
路线(Route)。“路线”本质上是一系列的路标点,每个路标点都标记了车辆在其轨迹中预期经过的特定位置。在CARLA仿真环境中,这条路线代表了自车的预定路径,包括起点和终点。
基础场景(Base Scenario)。一个“基础场景”被用于构想高级对抗驾驶情境。它提供了一个抽象的框架,比如“自车前方有直行障碍物”,而没有深入探讨障碍物的身份或对抗行为的具体细节。这种抽象允许以一种泛化的方式来分类各种驾驶挑战。
Scenario(Scenario)。相反,一个“场景”在“基础场景”的基础上融入了关于障碍物及其特定行为的详细属性。例如,前面提到的例子“自我车辆正在直路上行驶,当自车接近时,前方车辆突然刹车”就是基于上述基础场景派生出的一个场景,它通过引入对抗情境的具体动态来丰富初始描述。
Scene(Scene)。一个“Scene”代表了一个“场景”的实际实例化,详细描述了对抗事件的具体细节。这包括自车的路线、周围对抗车辆的特征(例如,车辆类型),以及环境上下文(例如,建筑物或交通信号)。此外,它还指定了参与者的位置、速度和初始位置等参数。值得注意的是,如图3所示,Scenic实际上充当了一种概率编程语言;在CARLA中运行相应模拟之前,它会抽取像ADV SPEED(对抗车辆速度)这样的参数。这种能力使得一个单一的Scenic脚本能够通过在预定义范围内改变速度等参数值,为同一场景产生各种不同的场面。
2)构建检索数据库
代码片段的收集。我们的代码片段收集过程始于从Scenic存储库1中获取初始示例。这些示例涵盖了各种对抗性行为和几何配置(例如,直路、交叉口),然后手动分解为描述-代码片段对。利用这个初始组合数据集,我们利用大型语言模型(LLMs)进行少样本学习,以生成更多样化的代码片段。这个迭代过程涉及为不同组件生成代码片段,包括对抗性行为、几何布局和相对生成点。每个新生成的代码片段都会在其在Scenic的不同API上下文(如行人、摩托车和汽车等agent类型之间的差异)中的兼容性和可编译性方面进行严格的手动评估和纠正。在这项工作中,我们始终使用GPT-4来收集我们的代码片段。
数据库构建和查询优化。对于每个描述-代码片段对,我们继续提示GPT-4为每个描述生成更多不同的重新表述,同时保持每对中的原始代码片段不变。这种方法旨在提高检索的准确性。然后,使用Sentence-T5对描述进行编码,并通过faiss促进数据库构建和查询过程。我们独立地构建和管理不同组件(即对抗性行为、道路几何形状和相对生成位置)的数据库。
检索数据库构建完成后,我们的大语言模型(LLM)agent ChatScene现在可以首先为安全关键场景生成多种描述,然后在评估过程中通过Scenic代码将它们转换为相应的模拟。详细过程如下:
i. 指示LLM agent:首先指示我们的LLM agent生成潜在的对抗性场景描述。此类查询的一个例子是:“提供一个安全关键场景的描述,其中自我车辆在直路上行驶。”
ii. 每个组件的描述提取:为了确保每个场景组件的输出都是结构化的,我们的LLM agent将自动使用一组少样本示例来指导它生成格式化的子描述,这些子描述按照“行为:…\n几何结构:…\n生成位置:…”的格式排列,如图1(a)所示。因此,agent可以高效地使用正则表达式提取每个组件的相应描述。
iii. 检索Scenic代码片段:在提取描述后,agent将使用Sentence-T5模型对它们进行编码。这些嵌入将作为检索每个组件的相关Scenic代码片段的键,如图1(b)和(c)所示。
iv. 场景渲染和评估:然后,将Scenic代码片段组合成一个完整的脚本,并在CARLA中执行以运行模拟,如图1(d)所示,更多文本和模拟对的示例见图2。然后,将采样不同的参数值,如ADV SPEED在之间设置,ADV DISTANCE在之间设置,以收集多个场景。对于每个场景,将收集详细的信息,如每帧中所有车辆的位置、速度、加速度和碰撞信息。
v. 碰撞倾向参数的优化:为了增强导致自车碰撞的场景的生成,采样范围将根据先前收集的数据信息进行动态调整。具体来说,将持续记录与碰撞情况相关的参数,并简单假设导致碰撞的参数大致符合高斯分布。这种迭代策略已被证明在增加生成更多碰撞倾向场景的概率方面有效。最终,将保留最具对抗性的场景用于每个场景的测试。
实验说明
参考
[1] ChatScene: Knowledge-Enabled Safety-Critical Scenario Generation for Autonomous Vehicles.