ORION:基于VLM引导动作生成的端到端框架——论文精度
-
论文链接:https://arxiv.org/pdf/2503.19755
-
项目主页:https://xiaomi-mlab.github.io/Orion/
第一遍:粗读,用网页神器:
ORION: A Holistic End-to-End Autonomous Driving Framework by Vision-Language Instructed Action Generation | Cool Papers - Immersive Paper Discovery
Publish: 2025-03-25 15:18:43 UTC
Q: 这篇论文试图解决什么问题?
A: 这篇论文试图解决端到端(End-to-End, E2E)自动驾驶方法在交互式闭环评估中由于因果推理能力有限而难以做出正确决策的问题。尽管视觉语言模型(Vision-Language Models, VLMs)在语义理解方面表现出色,但将VLMs应用于E2E自动驾驶时,存在语义推理空间与动作空间之间的差距,导致大多数VLMs在闭环评估中的表现并不理想。为了解决这一问题,论文提出了一个名为ORION的框架,通过结合QT-Former、大型语言模型(Large Language Model, LLM)和生成式规划器,实现了视觉、推理和动作空间的统一优化,从而在闭环评估中取得了显著的性能提升。
Q: 有哪些相关研究?
A: 论文中提到了以下几类相关研究:
端到端自动驾驶(End-to-End Autonomous Driving)
- 经典的端到端方法通过多任务学习将感知、预测和规划模块集成在一起,通过模仿专家演示来优化驾驶轨迹。然而,这些方法缺乏常识,无法完成复杂的因果推理,在需要自主决策和动态环境交互的全面闭环基准测试中表现不佳。
- 最近的研究如UniAD、VAD和VADv2等,通过引入概率规划和生成模型来预测多模态轨迹,但这些方法主要在开环评估中表现出色,而在闭环评估中仍存在不足。
视觉语言模型(Vision-Language Models, VLMs)
- VLMs通过大规模数据训练,积累了丰富的世界知识,并通过视觉编码器将视觉信息引入大型语言模型(LLMs),实现了视觉和语言空间的对齐。例如LLaVA系列、Monkey和InternVL系列等,这些模型在视觉上下文理解和推理方面表现出色。
- 为了提高VLMs的效率,一些研究如QwenVL、Flamingo和Qwen2VL等通过交叉注意力和动态分辨率策略来减少令牌冗余,同时处理多种模态。
VLMs在端到端自动驾驶中的应用
- 一些方法尝试直接使用VLMs进行环境感知和以文本形式进行可解释的轨迹预测,但VLMs并不适合处理数学计算或数值推理,且其自回归机制限制了对复杂场景的处理能力。
- 其他方法尝试通过VLM输出的元动作来辅助经典端到端方法,但这种范式将推理空间和动作空间解耦,阻碍了轨迹优化和VLM推理过程之间的协同优化。
- 还有一些研究尝试在闭环评估中使用VLMs,但在处理复杂场景时仍存在局限性。
Q: 论文如何解决这个问题?
A: 论文提出了一个名为ORION的框架,通过以下三个关键组件来解决端到端自动驾驶中视觉语言模型(VLM)的语义推理空间与动作空间之间的差距问题:
1. QT-Former
QT-Former是一个基于查询的时序模块,用于聚合长期历史上下文信息。它通过以下机制实现:
- 场景查询(Scene Queries) 和 感知查询(Perception Queries):这两种查询通过自注意力(Self-Attention, SA)和交叉注意力(Cross-Attention, CA)模块与图像特征进行交互,提取关键场景信息。
- 历史查询(History Queries) 和 长期记忆库(Memory Bank):历史查询用于从记忆库中提取与当前场景最相关的前一帧查询,并与当前场景特征进行交互,从而增强模型的长期记忆能力。
- 多任务学习:QT-Former不仅用于场景理解,还用于目标检测、交通状态预测和动态目标的运动预测。
2. 大型语言模型(LLM)
LLM是ORION框架的核心,负责执行驾驶场景的推理任务。具体步骤如下:
- 文本编码:用户指令通过文本分词器编码为语言令牌。
- 推理任务:LLM结合场景令牌、历史令牌和语言令牌,执行包括场景描述、历史信息回顾、场景分析和行动推理在内的多种文本基础理解任务。
- 规划令牌生成:LLM生成一个规划令牌,该令牌将作为生成器的条件输入,用于控制轨迹生成。
3. 生成式规划器(Generative Planner)
生成式规划器用于弥合LLM的推理空间与轨迹动作空间之间的差距。具体实现如下:
- 变分自编码器(VAE):将推理空间中的规划令牌和动作空间中的真实轨迹映射到高斯分布的潜在空间中,并通过Kullback-Leibler散度损失进行分布匹配。
- 轨迹解码:使用GRU解码器从潜在空间解码轨迹,生成多模态轨迹预测。
4. 训练目标
ORION的训练目标包括:
- QT-Former的损失函数:包括检测损失、交通状态预测损失和运动预测损失。
- LLM的损失函数:使用自回归交叉熵损失。
- 生成式规划器的损失函数:包括VAE的Kullback-Leibler散度损失、均方误差(MSE)损失、碰撞损失和边界损失。
通过上述组件和训练策略,ORION能够有效地将视觉、推理和动作空间对齐,实现端到端自动驾驶的统一优化。
Q: 论文做了哪些实验?
A: 论文在多个方面进行了实验,以验证所提出的ORION框架的有效性和优越性。以下是实验的具体内容:
1. 数据集和评估指标
- 数据集:使用Bench2Drive数据集进行训练和评估,该数据集基于CARLA V2模拟器,提供了1000个训练剪辑和220个短路线的闭环评估。此外,还在nuScenes数据集上进行了开环评估。
- 评估指标:Bench2Drive数据集的评估指标包括驾驶分数(Driving Score, DS)、成功率(Success Rate, SR)、效率、舒适性和多能力。nuScenes数据集的评估指标包括L2距离误差和碰撞率。
2. 实现细节
- 模型设置:ORION是一个完全无高精地图的方法,仅使用导航指令作为轨迹预测的输入条件。模型使用EVA-02-L作为视觉编码器,Vicuna v1.5作为LLM,并使用LoRA进行微调。
- 训练过程:所有实验在32个NVIDIA A800 GPU上进行,输入图像在训练时进行了数据增强,分辨率调整为640×640。
3. 主要结果
- 闭环评估:ORION在Bench2Drive数据集上的闭环评估中取得了77.74的驾驶分数和54.62%的成功率,显著超过了现有的最先进方法DriveTransformer(+14.28 DS和+19.61% SR)。
- 多能力评估:ORION在多能力评估中也表现出色,平均能力得分为54.72%,比DriveTransformer高出16.12%。
- 开环评估:在nuScenes数据集的开环评估中,ORION取得了与现有经典方法相当的性能,但在与VLM相关的方法中表现稍逊一筹。
4. 定性结果
- 场景理解和行动推理:ORION能够准确感知场景中的关键信息,并识别影响自动驾驶车辆行为的关键对象,从而做出合理的驾驶决策。
- 历史信息记忆和检索:通过QT-Former中的长期记忆库和历史查询,ORION能够存储和检索历史信息,增强模型的长期记忆能力。
5. 消融研究
- 不同生成式规划器的比较:使用VAE作为生成式规划器时,ORION取得了最佳性能,而使用扩散模型时,性能有所下降,但仍优于现有的最先进方法。
- QT-Former设计的消融:通过逐步引入交通状态监督、运动预测模块和长期记忆库,ORION的性能逐步提升,证明了这些设计的有效性。
- 历史查询数量的影响:实验表明,适当增加历史查询数量可以提升性能,但过多的历史查询会导致性能下降。
- VQA任务训练与规划任务训练的相互影响:同时进行VQA和规划任务的训练可以提升模型在两个任务上的性能,证明了多任务训练的有效性。
6. 与现有方法的比较
- 与经典端到端方法的比较:ORION在闭环评估中显著优于现有的经典端到端方法,如UniAD、VAD和DriveTransformer。
- 与VLM辅助方法的比较:ORION在闭环评估中也优于现有的VLM辅助方法,如DriveVLM和Senna。
通过这些实验,论文证明了ORION框架在端到端自动驾驶中的有效性和优越性,尤其是在闭环评估中。
Q: 有什么可以进一步探索的点?
A: 尽管ORION在端到端自动驾驶领域取得了显著的成果,但仍有一些可以进一步探索和改进的方向:
1. 模型效率优化
- 模型压缩与剪枝:当前的ORION框架依赖于大型语言模型(LLM),这在实时驾驶场景中可能会带来较高的计算负担。通过模型压缩和剪枝技术,可以减少模型的参数量,提高推理速度,使其更适合实时应用。
- 硬件加速:探索专用硬件(如FPGA、ASIC)的加速能力,以进一步提升模型的实时性。
2. 多模态数据融合
- 多模态输入:目前ORION主要依赖视觉输入,未来可以考虑融合其他模态的数据,如激光雷达(LiDAR)、雷达(Radar)等,以提高模型对环境的感知能力。
- 跨模态对齐:在多模态数据融合中,如何有效地对齐不同模态的数据是一个关键问题。可以探索更先进的跨模态对齐技术,以提高模型的鲁棒性和准确性。
3. 长期规划与动态环境交互
- 长期规划:目前的ORION主要关注短期轨迹规划,未来可以探索更长期的规划策略,以应对复杂的交通场景和动态环境变化。
- 动态环境交互:在动态环境中,车辆需要与其他交通参与者进行实时交互。可以进一步研究如何使ORION更好地理解和预测其他交通参与者的意图,从而做出更合理的决策。
4. 强化学习与模仿学习的结合
- 强化学习:目前的ORION主要基于模仿学习,未来可以结合强化学习,使模型在实际驾驶环境中通过试错学习,进一步优化决策策略。
- 模仿学习与强化学习的融合:探索模仿学习和强化学习的结合方法,以充分利用两者的优点,提高模型的泛化能力和适应性。
5. 可解释性和透明度
- 可解释性:尽管ORION在推理和决策过程中表现出色,但其决策过程的可解释性仍有待提高。可以进一步研究如何使模型的决策过程更加透明,便于理解和验证。
- 可视化工具:开发更先进的可视化工具,帮助研究人员和工程师更好地理解模型的行为和决策过程。
6. 鲁棒性和安全性
- 鲁棒性测试:在更多复杂和极端的驾驶场景中测试ORION的鲁棒性,包括恶劣天气、复杂交通状况和突发情况。
- 安全性评估:进一步评估模型在实际驾驶中的安全性,包括碰撞避免、紧急制动等关键功能的性能。
7. 数据集和标注
- 大规模数据集:目前的Bench2Drive数据集虽然已经很大,但仍然有限。可以进一步扩展数据集,增加更多多样化的驾驶场景和标注信息。
- 高质量标注:提高数据集的标注质量,特别是在VQA任务中,确保标注的准确性和一致性。
8. 跨场景泛化能力
- 跨场景泛化:目前的ORION在特定的模拟环境中表现出色,但其在不同场景和环境中的泛化能力仍有待验证。可以探索如何提高模型在不同场景下的适应性和泛化能力。
- 迁移学习:研究如何将ORION在模拟环境中的学习成果迁移到实际驾驶环境中,减少实际环境中的训练需求。
9. 人机交互
- 人机交互:研究如何使ORION更好地与人类驾驶员进行交互,例如通过语音指令、手势等方式,提高人机协作的效率和安全性。
- 用户反馈:探索如何利用用户反馈来进一步优化模型的性能和用户体验。
通过这些方向的进一步研究和探索,可以进一步提升ORION框架的性能和实用性,推动端到端自动驾驶技术的发展。
Q: 总结一下论文的主要内容
A: 本文提出了一种名为ORION的端到端(End-to-End, E2E)自动驾驶框架,旨在解决现有方法在交互式闭环评估中由于因果推理能力有限而难以做出正确决策的问题。ORION通过结合视觉语言模型(Vision-Language Models, VLMs)的强大语义推理能力和生成模型的精确轨迹预测能力,有效地弥合了语义推理空间与动作空间之间的差距,实现了视觉、推理和动作空间的统一优化。
研究背景
端到端自动驾驶方法近年来取得了显著进展,但现有方法在需要自主决策和动态环境交互的闭环评估中表现不佳。尽管VLMs在语义理解方面表现出色,但直接将VLMs应用于E2E自动驾驶存在挑战,主要原因是VLMs的语义推理空间与E2E方法所需的数值动作空间之间存在差距。
研究方法
ORION框架通过以下三个关键组件来解决上述问题:
-
QT-Former:一个基于查询的时序模块,用于聚合长期历史上下文信息。它通过场景查询和感知查询提取当前场景的关键信息,并利用历史查询和长期记忆库存储和检索历史信息,增强模型的长期记忆能力。
-
大型语言模型(LLM):LLM负责执行驾驶场景的推理任务,包括场景描述、历史信息回顾、场景分析和行动推理。LLM生成一个规划令牌,该令牌将作为生成器的条件输入,用于控制轨迹生成。
-
生成式规划器:生成式规划器使用变分自编码器(VAE)将推理空间中的规划令牌和动作空间中的真实轨迹映射到高斯分布的潜在空间中,并通过Kullback-Leibler散度损失进行分布匹配。最终,使用GRU解码器从潜在空间解码轨迹,生成多模态轨迹预测。
实验
实验在Bench2Drive数据集上进行,该数据集基于CARLA V2模拟器,提供了1000个训练剪辑和220个短路线的闭环评估。评估指标包括驾驶分数(Driving Score, DS)、成功率(Success Rate, SR)、效率、舒适性和多能力。
- 主要结果:ORION在闭环评估中取得了77.74的驾驶分数和54.62%的成功率,显著超过了现有的最先进方法DriveTransformer(+14.28 DS和+19.61% SR)。在多能力评估中,ORION的平均能力得分为54.72%,比DriveTransformer高出16.12%。
- 定性结果:ORION能够准确感知场景中的关键信息,并识别影响自动驾驶车辆行为的关键对象,从而做出合理的驾驶决策。通过QT-Former中的长期记忆库和历史查询,ORION能够存储和检索历史信息,增强模型的长期记忆能力。
- 消融研究:通过逐步引入交通状态监督、运动预测模块和长期记忆库,ORION的性能逐步提升,证明了这些设计的有效性。同时进行VQA和规划任务的训练可以提升模型在两个任务上的性能,证明了多任务训练的有效性。
结论
ORION通过结合QT-Former、LLM和生成式规划器,有效地弥合了视觉语言模型的语义推理空间与动作空间之间的差距,实现了视觉、推理和动作空间的统一优化。实验结果表明,ORION在闭环评估中取得了显著的性能提升,证明了其在端到端自动驾驶中的优越性。未来的工作将集中在提高模型的实时性和效率,以及进一步优化模型在不同场景下的泛化能力。
第二遍,细读
方法一:E2E(类似UniAD、VAD和VADv2等,通过模仿专家演示来优化轨迹,也进行了概率规划或者生成模型来预测多模态轨迹)但是整体方法缺乏常识,无法完成复杂的因果推理,在闭环评估中仍存在不足。
VLMs通过大规模数据训练,通过视觉编码器将视觉信息引入大型语言模型(LLMs),实现了视觉和语言空间的对齐,类似InternVL系列等,后面QwenVL,Flamingo,Qwen2VL等通过交叉注意力和动态分辨率策略减少令牌冗余,同时处理多模态,优势在于视觉上下文理解和推理,场景识别等,
方法二:直接使用VLMs进行环境感知和以文本形式进行可解释的轨迹预测,但整体缺乏空间感知能力,并不适合做数值推理,且自回归机制限制了对复杂场景处理能力
- 自回归机制的含义:自回归机制是一种在生成任务中常用的技术,它是指模型在生成序列(如文本、图像序列等)的过程中,会根据已经生成的部分来逐步生成后续的内容。例如在文本生成中,模型会基于前面已经生成的单词或词组来预测下一个单词,这种机制在一定程度上能够保证生成内容的连贯性和逻辑性。
- 对复杂场景处理的限制:复杂场景往往包含多种因素、多样的交互关系以及大量的信息。在处理这类场景时,模型需要综合考虑各种因素之间的相互作用,并且能够同时处理多个任务或多个方面的信息。而VLMs的自回归机制在生成过程中是逐步进行的,它在每一步的生成决策中主要依赖于之前已经生成的部分,这可能导致在面对复杂场景时,模型难以全局地把握整个场景的复杂性和多样性。例如在对一个包含多个物体、多种动作和复杂背景的视频进行理解和描述时,VLMs可能在描述过程中因为自回归机制的局限而无法很好地同时考虑所有相关因素,从而导致生成的描述不够准确或完整,无法很好地处理这种复杂场景。
方法三:通过VLM输出的元动作来辅助经典端到端方法,但这种范式将推理空间和动作空间解耦,阻碍了轨迹优化和VLM推理过程之间的协同优化。还有一些研究尝试在闭环评估中使用VLMs,但在处理复杂场景时仍存在局限性。
本论文提出框架:
目的是解决推理空间和动作空间之间的差距:
框架组件及含义
-
Vision Space(视觉空间)
-
Vision Encoder(视觉编码器):负责将输入的视觉信息(如图像或视频)编码为特征向量。
-
Perception Queries(感知查询):用于提取场景中的感知信息,例如检测到的物体、运动状态等。
-
Scene Queries(场景查询):用于提取场景的全局信息,例如交通规则、道路布局等。
-
History Queries(历史查询):用于提取历史动作和状态信息,例如车辆的过去轨迹。
-
-
QT-Former
-
一个Transformer模块,用于提取长期上下文信息,并将视觉空间与推理空间连接起来。
-
-
Reasoning Space(推理空间)
-
Text Tokenizer(文本分词器):将输入的文本指令转换为文本向量。
-
Large Language Model(LLM,大型语言模型):用于执行推理任务,并预测规划令牌(Planning Token)。
-
LoRA(Low-Rank Adaptation):一种微调方法,用于在保持模型性能的同时减少计算资源。
-
-
Action Space(动作空间)
-
Generative Planner(生成式规划器):使用规划令牌生成多模态轨迹预测。
-
Planning Token(规划令牌):由LLM生成的用于指导轨迹生成的令牌。
-
具体流程:
输入阶段:
视觉输入:输入的图像或视频通过视觉编码器(Vision Encoder)转换为特征向量。
文本指令:输入的文本指令通过文本分词器(Text Tokenizer)转换为文本向量。
其他输入:图像,定位等
感知与推理阶段:
a)感知查询(Perception Queries):提取场景中的感知信息,例如检测到的物体、运动状态等。感知查询需要小模型来提取场景中的感知信息,例如检测到的物体、运动状态等。这些模型通常包括:
目标检测模型:如YOLO、Faster R-CNN等,用于检测场景中的物体(如车辆、行人)及其位置和类别。
运动估计模型:用于估计物体的运动状态,如速度和方向。
车道线检测模型:用于检测道路的车道线,帮助车辆理解道路结构。
交通信号灯检测和识别模型:用于检测和识别交通信号灯的状态 。
b)场景查询(Scene Queries):提取场景的全局信息,例如交通规则、道路布局等。场景查询需要小模型来提取场景的全局信息,例如交通规则、道路布局等。这些模型包括:
地图模型:如MapTR,用于提供高精地图数据,包括道路布局、交通规则等信息。
场景理解模型:用于对整个场景进行语义理解和分析,例如识别交叉路口、停车场等。
c)历史查询(History Queries):提取历史动作和状态信息,包含模型:
轨迹预测模型:用于分析和预测车辆的过去和未来轨迹。
状态估计模型:用于估计车辆的历史状态,如速度,加速度等
-->与QT-Former如何协同工作?
前面小模型输入,不做多述
后面QT-Former处理
-
特征提取:QT-Former接收来自小模型的感知、场景和历史信息,并将其转换为特征向量。
-
自注意力层:QT-Former内部的自注意力层对特征向量进行交互,捕捉输入数据中的关键信息。
-
交叉注意力层:QT-Former通过交叉注意力层与文本指令进行交互,将感知、场景和历史信息与文本指令相结合,生成统一的特征表示
最后特征融合与交互
-
特征融合:QT-Former将感知、场景和历史信息与文本指令进行融合,生成一个综合的特征表示,用于后续的推理和规划任务。
-
交互机制:QT-Former通过自注意力和交叉注意力机制,确保感知、场景和历史信息与文本指令之间的有效交互,从而提高模型的推理能力。
QT-Former:将视觉特征与推理特征融合,提取长期上下文信息。
-->QT-Former如何处理多帧图像以捕捉长期依赖关系?
QT-Former通过设置场景查询和感知查询来提取当前场景的关键信息,并利用历史查询和长期记忆库存储和检索历史信息。历史查询与记忆库中的信息通过交叉注意力机制进行交互,从而捕捉长期依赖关系。
推理与规划阶段
LLM(大型语言模型):根据输入的文本指令和感知信息,进行推理任务,并生成规划令牌(Planning Token)。
生成式规划器(Generative Planner):使用规划令牌生成多模态轨迹预测。
输出阶段
多模态轨迹预测:生成的轨迹预测用于指导车辆的动作。
QT-Former:
这是QT-Former的详细架构,它接受多种查询和图像特征作为输入,用于检测交通元素,预测运动,并聚合长期视觉上下文。
1.Image Features(图像特征)
含义:从多视图摄像头输入的图像中提取的特征,用于后续的感知和推理任务
作用:作为QT-Former的主要输入,提供当前场景的视觉信息
2.Perception Queries(感知查询)
含义:一组可学习的查询,用于提供图像中与感知任务相关的关键信息
作用:通过自注意力(Self-Attention)和交叉注意力(Cross-Attention)模块与图像特征交互,提取目标检测,运动预测和交通状态预测的关键信息
示例:感知查询可以检测出图像中的车辆,行人和交通信号灯等关键对象
3.Scene Queries(场景查询)
含义:一组科学系的查询,用于提取当前场景的关键信息
作用:通过自注意力和交叉注意力模块与图像特征交互,提取当前场景的整体信息,例如道路状况和天气条件
示例:场景查询可以识别当前场景是一个城市街道,天气晴朗,道路干燥
4.Self-Attention(自注意力)
含义:一种自注意力机制,用于查询和图像特征之间的交互
作用:将查询和图像特征结合,提取与查询相关的图像信息
示例:感知查询通过交叉注意力模块与图像特征交互,提取出图像中与感知任务相关的关键信息
5.Cross-Attention(交叉注意力)
含义:一种注意力机制,用于查询和图像特征之间的交互
作用:将查询和图像特征结合,提取与查询相关的图像信息
示例:感知查询通过交叉注意力模块与图像特征交互,提取出图像中与感知任务相关的关键信息
6.Detection(检测)
含义:基于感知查询的输出,进行目标检测任务
作用:识别图像中的关键对象,例如车辆,行人和交通信号灯
示例:检测到图像中有一辆静止白色的轿车,位于自车前方
7.Motion(运动)
含义:基于感知查询的输出,进行动态目标的运动预测
作用:预测动态目标(如车辆和行人)的运动轨迹
示例:预测前方车辆可能会保持静止,因为它的刹车灯已经亮起来
8.Traffic State(交通状态)
含义:基于感知查询的输出,进行交通状态预测
作用:识别当前的交通状况,例如交通灯的颜色和状态
示例:识别出当前交通灯为红色,要求自车停车
9.History Queries(历史查询)
含义:一组可学习的查询,用于提取与历史信息相关的当前场景信息
作用:通过交叉注意力模块与当前场景特征交互,提取与历史信息相关的细节。
示例:历史查询可以提取出前几帧中交通灯变化情况
10.Long-term Memory Bank(长期记忆库)
含义:一个存储历史信息的模块
作用:存储和检索历史查询提取的关键信息,增强模型的长期记忆能力
示例:长期记忆库存储了前几帧中交通灯状态变化,帮助模型更好地理解当前场景
11.Timestamp(时间戳)
含义:用于记录历史信息的时间信息
作用:帮助模型理解历史信息的时间顺序
示例:时间戳记录了前几帧的时间信息,帮助模型判断交通灯的变化时间
12.Update(更新)
含义:将历史查询的输出更新到长期记忆库中
作用:确保长期记忆库中存储的是最新的历史信息
示例:将当前帧的历史查询结果更新到长期记忆库中,以便后续帧使用
13.MLP(多层感知器)
含义:一个简单的神经网络模块,用于将更新后的历史查询和当前场景转换为历史令牌(History Token)和场景令牌(Scene Token)
作用:将历史信息和当前场景信息转换为推理空间中的令牌,供大型语言模型(LLM)使用。
示例:MLP将历史查询和场景查询的输出转换为历史令牌和场景令牌,用于后续的推理任务
14.History Tokens(历史令牌)和Scene Tokens(场景令牌)
含义:历史令牌和场景令牌是MLP的输出,表示历史信息和当前场景信息
作用:作为大型语言模型(LLM)的输入,用于执行推理任务
示例:历史令牌表示前几帧的交通灯变化,场景令牌表示当前场景的交通状况
生成式规划器:
引入了一个生成式规划器来弥合推理空间和动作空间之间的差距。具体来说,我们将动作空间中的当前轨迹 a 表示为条件概率分布 p(a∣s),其中 s 是规划令牌。为了构建 p(a∣s),在生成领域有许多优秀的方法(例如,变分自编码器(VAE)[Auto-encoding variational bayers] 和扩散模型[U-Net])
我们使用GenAD[70]中的GRU解码器从潜在空间 z 中解码轨迹。值得注意的是,本文中VAE的功能与GenAD中的不同。我们仅使用在推理空间中编码的单个令牌作为输入,旨在弥合推理空间和动作空间之间的差距。相比之下,后者利用在鸟瞰图(BEV)空间中编码的所有智能体的特征作为输入,旨在学习高度结构化轨迹的特定模式,包括自我车辆和其他智能体的轨迹。
此外,我们还尝试用其他生成式模型(如扩散模型)替代VAE进行轨迹生成。得益于我们提出的方法通过潜在空间中的分布学习弥合了推理空间和动作空间之间的差距,我们的框架在与其他方法的比较中仍表现出优越的性能。
ORION框架的训练目标
包括QT-Former、LLM(大语言模型)和生成式规划器的损失函数
QT-Former的训练目标
QT-Former负责感知,交通状态和运动预测任务,其训练目标包括以下损失函数:
a)检测损失(DetectionLoss)
公式:Ldet = Lcls + Lreg
Lcls:分类损失,使用Focal Loss,用于处理类别不平衡问题
Lreg:回归损失,使用L1损失,用于预测目标的位置和尺寸
举例:假设在某个输入图像中,需要检测出一个行人和一辆车。Focal Loss会专注于那些难以分类的目标(如远处的行人),而L1损失会确保预测的行人和车辆的位置和尺寸尽可能接近真实值。
b)交通状态和运动预测损失(Traffis State and Motion Prediction Loss)
公式:Ltra和Lm= Lmcls + Lmreg
Ltra:交通状态损失,使用Focal Loss,用于预测交通状态(如红绿灯状态)
Lmcls:运动分类损失,使用Focal Loss,用于预测其他交通参与者的运动类别(如静止,加速,减速)
举例:在某个输入图像中,需要预测前方车辆的运动轨迹。Focal Loss会专注于那些难以分类的运动状态(如突然刹车的车辆),而L1损失会确保预测的轨迹尽可能接近真实值。
总损失(Total Loss)
公式:Lqt = Ldet + Ltra +Lm
解释QT-Former的总损失是检测损失,交通状态损失和运动预测损失的加权和,确保模型在感知和任务上表现良好
LLM(大语言模型)的训练目标
LLM负责推理任务,其训练目标包含以下损失函数:
自回归交叉熵损失(Auto-Regressive Cross-Entropy Loss)
公式:Lce
解释:用于生成规划标记(Planning Token),确保生成的标记能够准确描述当前场景和动作指令
举例:假设当前场景是“前方有行人,需要减速”,LLM的自回归交叉熵损失会确保生成的规划标记能够准确描述这一场景和动作指令。
生成式规划器的训练目标
生成式规划器负责生成多模态轨迹,其训练目标包括如下损失函数
KL散度损失(Kullback-Leibler Divergence Loss)
公式:Lvae
解释:用于对齐推理空间和动作空间,确保生成的轨迹和推理结果一致
举例:假设推理空间生成规划标记式“向左转”,Kullback-Leibler散度损失会确保生成的轨迹与这一规划标记一致
碰撞损失(Collision Loss)
公式Lcol
解释:用于确保生成的轨迹不会导致车辆与其他物体发生碰撞,确保是安全的
举例:在生成轨迹时,碰撞损失会惩罚那些可能导致碰撞的轨迹,确保生成的轨迹是安全的。
边界损失(Boundary Loss)
公式:Lbd
解释:用于确保生成的轨迹不会超出道路边界
举例:在生成轨迹时,边界损失会惩罚那些超出道路边界的轨迹,确保生成的轨迹是合理的。
MSE损失(Mean Squared Error Loss)
公式:Lmse
解释:用于确保生成的轨迹与目标轨迹尽可能接近
举例:在生成轨迹时,MSE损失会惩罚那些与目标轨迹偏差较大的轨迹,确保生成的轨迹尽可能真实值
总损失(Total Loss)
公式 Lgp = Lvae+Lmse+Lcol+Lbd
解释:生成时规划器的总损失式Kullback-Leibler散度损失,MSE损失,碰撞损失和边界损失的加权和,确保生成的轨迹在多个方面表现良好。
ORION的总损失
公式 L= Lqt+Lce+Lgp
解释:ORION的总损失是QT-Former,LLM和生成式规划期的总损失的加权和,确保整个框架在感知,推理和规划任务上表现良好。
具体例子
假设场景是一个十字路口,车辆需要根据交通信号灯和周围车辆的状态决定是否左转、直行或右转。
感知查询(Perception Queries)
-
感知信息:检测到的物体(如其他车辆、行人、交通信号灯)及其位置和运动状态。
-
例如:检测到前方有一辆红色汽车正在减速,右侧有一辆蓝色汽车正在加速。
-
场景查询(Scene Queries)
-
场景信息:交通规则(如信号灯状态、车道方向)、道路布局(如十字路口的结构)。
-
例如:信号灯显示为绿灯,允许左转。
-
历史查询(History Queries)
-
历史信息:车辆过去的动作和状态(如过去几秒的轨迹、速度)。
-
例如:车辆在过去几秒内保持匀速行驶,没有急刹车或急加速。
-
流程示例
-
输入阶段
-
视觉输入:输入十字路口的图像,显示前方有红色汽车减速,右侧有蓝色汽车加速。
-
文本指令:输入文本指令“请根据交通信号灯和周围车辆的状态决定是否左转”。
-
-
感知与推理阶段
-
感知查询:检测到红色汽车减速,蓝色汽车加速。
-
场景查询:信号灯为绿灯,允许左转。
-
历史查询:车辆过去几秒保持匀速行驶。
-
QT-Former:将这些信息融合,提取长期上下文。
-
-
推理与规划阶段
-
LLM:根据输入的文本指令和感知信息,推理出当前场景下的最佳动作,并生成规划令牌。
-
生成式规划器:根据规划令牌生成多模态轨迹预测,例如左转、直行或右转的可能轨迹。
-
-
输出阶段
-
多模态轨迹预测:生成的轨迹预测用于指导车辆的动作,例如选择左转。
-
通过这种流程,ORION框架能够将视觉感知、推理和动作生成无缝结合,实现高效的多模态决策
实现细节:
无需高清地图,它仅使用导航命令(Navigation Command, NC)作为轨迹预测的输入条件,而不是车道中心线的位置(即目标点,TP)。ORION是一个无锚点的方法,输出6种模式的轨迹预测,这些轨迹预测对应于Bench2Drive中定义的7种NC,
- LANE_FOLLOW(车道跟随):指示车辆保持在当前车道内行驶。
- LEFT(左转):指示车辆向左转。
- RIGHT(右转):指示车辆向右转。
- STRAIGHT(直行):指示车辆直行通过交叉路口。
- CHANGE_LANE_LEFT(向左变道):指示车辆从当前车道向左变道。
- CHANGE_LANE_RIGHT(向右变道):指示车辆从当前车道向右变道。
- REACH_GOAL(到达目标):指示车辆已到达导航目标,通常用于终点或特定任务完成的场景
训练细节:
所有实验都在32个NVIDIA A800 GPU上进行,每个GPU拥有80 GB的内存。遵循Omnidrive的设置,ORION采用EVA-02-L作为视觉编码器。在ORION中使用了Vicuna v1.5,并使用LoRA进行微调,其中秩维度和alpha设置为16。场景查询、感知查询和历史查询的默认数量分别为512、600和16。内存库存储的帧数n设置为16。在训练过程中,对输入图像应用数据增强,这些图像首先被调整到640×640的分辨率。
-
方法对比:图中展示了四种不同的VLM应用方法:
-
(a) Plain Text:直接输出纯文本。
-
(b) Dual-System Paradigm:结合经典E2E方法和VLM接口。快慢双系统
-
(c) MLP Decoder:使用MLP解码器输出规划标记。
-
(d) Our Method:使用VLM生成规划标记,结合生成式规划器。
-
-
评估指标:使用驾驶评分(DS)、成功率(SR)和能力均值(Ability Mean)进行评估。
-
Plain Text的局限性:由于缺乏足够的数值推理能力,纯文本输出在闭环驾驶场景中表现不佳。
-
Dual-System Paradigm的瓶颈:虽然结合了经典E2E方法和VLM接口,但其性能可能受到经典E2E(即VAD)方法能力的限制。
-
MLP Decoder的有效性:MLP解码器在特征对齐方面表现出一定的有效性,但仍然不如我们提出的方法。
-
Our Method的优势:通过结合VLM和生成式规划器,我们的方法能够更好地对齐视觉、推理和动作空间,从而在所有评估指标上取得最佳性能。
消融实验:
-
生成式规划器:VAE相比Diffusion更有效,能够更好地对齐推理和动作空间。
-
QT-Former设计:引入交通状态和运动预测模块以及记忆库显著提升了性能。
-
历史查询数量:存在一个最优的历史查询数量(16),过多或过少都会影响性能。
-
VAE相比Diffusion有显著性能提升,主要原因包括:
-
VAE的潜在空间更直接地对齐了推理信息和动作空间。
-
VAE的训练过程更稳定,便于特征对齐。
-
第三遍:反思
性能在变道和合道上,比Driveadapter:Breaking the coupling barrier of perception and planning in
end-to-end autonomous driving.要差
小米汽车端到端VLA自动驾驶方案Orion,似乎在diss理想的MindVLA - 知乎
VAE解释:
Auto-encoding variational bayers(变分自编码器与贝叶斯推断)
定义
变分自编码器(Variational Autoencoder, VAE)是一种基于变分贝叶斯(Variational Bayes, VB)推断的生成式模型,由Diederik P. Kingma和Max Welling于2014年提出。VAE结合了自编码器和概率图模型的概念,能够有效地学习数据的低维表示并生成新的样本。
工作原理
VAE通过以下步骤实现:
-
编码器(Encoder):将输入数据映射到潜在空间中的均值(mean)和方差(variance)参数,定义一个高斯分布。
-
采样(Sampling):通过“重参数化技巧”从潜在空间中采样,确保采样过程可导。
-
解码器(Decoder):将潜在向量映射回原始数据空间,生成与输入数据相似的新样本。
-
损失函数(Loss Function):由重构损失(Reconstruction Loss)和KL散度(KL Divergence)组成,用于优化模型。
与贝叶斯推断的关系
VAE的核心思想是通过变分推断(Variational Inference)来优化潜在空间的分布。具体来说:
-
变分推断:通过引入一个近似后验分布(变分分布)来近似真实的后验分布,从而避免直接计算复杂的积分。
-
目标函数:最大化证据下界(ELBO),这等价于最小化KL散度,使潜在空间的分布接近标准正态分布。
应用
VAE在多个领域有广泛应用,包括:
-
图像生成:生成与训练数据相似的新图像。
-
特征学习:学习数据的潜在表示,用于降维和可视化。
-
数据增强:通过生成新的样本扩充训练数据集。
-
无监督学习:在没有标签的情况下学习数据的结构。
-
VAE代码例子:
-
import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms import matplotlib.pyplot as plt # 设置超参数 batch_size = 128 epochs = 10 learning_rate = 1e-3 latent_dim = 20 # 潜在空间的维度 # 数据预处理(使用MNIST数据集) transform = transforms.ToTensor() train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) # 定义编码器(Encoder) class Encoder(nn.Module): def __init__(self, latent_dim): super(Encoder, self).__init__() self.fc1 = nn.Linear(28*28, 400) #输入28*28像素的图片输出全连接层特征空间维度400 self.fc21 = nn.Linear(400, latent_dim) # 潜在变量的均值 self.fc22 = nn.Linear(400, latent_dim) # 潜在变量的标准差 def forward(self, x): h1 = torch.relu(self.fc1(x.view(-1, 28*28))) #输入图像数据,形状(batch_size,channels,height,width)对于MINIST数据集,28*28,且通道数为1(灰度图)将输入图像从形状(batch_size,1,28,28)转换为(batch_size,784),将二维图像展平为一维向量,以便输入self.fc1 z_mean = self.fc21(h1) z_log_var = self.fc22(h1) return z_mean, z_log_var # 定义解码器(Decoder)Decoder 类的作用是从潜在空间的向量 z 中重建原始图像 class Decoder(nn.Module): def __init__(self, latent_dim): super(Decoder, self).__init__() self.fc3 = nn.Linear(latent_dim, 400) self.fc4 = nn.Linear(400, 28*28) def forward(self, z): h3 = torch.relu(self.fc3(z)) reconstruction = torch.sigmoid(self.fc4(h3)) return reconstruction # 定义VAE(包括编码器、解码器及重参数化) class VAE(nn.Module): def __init__(self, latent_dim): super(VAE, self).__init__() self.encoder = Encoder(latent_dim) self.decoder = Decoder(latent_dim) def reparameterize(self, mu, logvar): std = torch.exp(0.5*logvar) eps = torch.randn_like(std) return mu + eps * std def forward(self, x): z_mean, z_log_var = self.encoder(x) z = self.reparameterize(z_mean, z_log_var) reconstruction = self.decoder(z) return reconstruction, z_mean, z_log_var # 定义损失函数 def loss_function(reconstruction, x, z_mean, z_log_var): BCE = nn.functional.binary_cross_entropy(reconstruction, x.view(-1, 28*28), reduction='sum') KL = -0.5 * torch.sum(1 + z_log_var - z_mean.pow(2) - torch.exp(z_log_var)) return BCE + KL # 初始化模型和优化器 model = VAE(latent_dim) optimizer = optim.Adam(model.parameters(), lr=learning_rate) # 训练过程 def train(epoch): model.train() train_loss = 0 for batch_idx, (data, _) in enumerate(train_loader): data = data optimizer.zero_grad() reconstruction, z_mean, z_log_var = model(data) loss = loss_function(reconstruction, data, z_mean, z_log_var) loss.backward() train_loss += loss.item() optimizer.step() if batch_idx % 100 == 0: print(f"Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)}] Loss: {loss.item() / len(data):.6f}") print(f"====> Epoch: {epoch} Average loss: {train_loss / len(train_loader.dataset):.4f}") # 生成图像 def generate_images(epoch, num_images=10): model.eval() with torch.no_grad(): z = torch.randn(num_images, latent_dim) sample = model.decoder(z).cpu() sample = sample.view(num_images, 28, 28) fig, axes = plt.subplots(1, num_images, figsize=(15, 15)) for i in range(num_images): axes[i].imshow(sample[i], cmap='gray') axes[i].axis('off') plt.show() # 训练VAE for epoch in range(1, epochs + 1): train(epoch) generate_images(epoch)