LMDrive 是首个将大语言模型(LLM)引入端到端自动驾驶的系统。它不再用规则或简单神经网络做驾驶决策,而是让 LLM 充当"大脑"——接收多摄像头图像、LiDAR 点云和自然语言导航指令,直接输出车辆控制信号。核心创新:用BEV 视觉编码器 + Q-Former将传感器数据压缩为 LLM 可处理的 token,让 LLM 在闭环驾驶中理解场景、遵循指令。
| 属性 | 规格 |
|---|---|
| LLM backbone | LLaVA-v1.5(最佳)、Vicuna-v1.5、LLaMA2 等 6 种对比 |
| 视觉编码器 | ResNet(图像)+ PointPillars(LiDAR)+ BEV Decoder |
| Token 压缩 | Q-Former(BLIP-2 风格),每帧 406 → M 个视觉 token |
| 传感器 | 4 路 RGB 摄像头(左/前/右/后)+ 64 通道 LiDAR + focus-view 前裁切 |
| 动作输出 | N 个未来航点 + 指令完成标志 → PID 控制器 → 油门/刹车/方向盘 |
| 训练数据 | ~3M 帧、64K 导航片段、464K 通知指令、8 城镇 21 种天气 |
| 指令类型 | 56 种(follow / turn / others + notice 通知) |
| 仿真平台 | CARLA Simulator |
传统端到端自动驾驶(如 LAV、TCP、ThinkTwice)从传感器数据直接映射到控制信号,存在一个根本问题:它们不理解"指令"。导航系统说"前方 200 米左转",传统系统只能靠全局路径规划模块处理,神经网络本身无法关联语言语义和驾驶行为。
现实驾驶中,指令来源非常丰富:
核心洞察
LLM 天然理解自然语言和常识推理。如果把驾驶场景编码为 LLM 可读的 token,LLM 就能像人类驾驶员一样:听指令 → 观察环境 → 推理决策 → 执行控制。
LMDrive 工作在闭环(closed-loop)设置:每帧的决策会影响下一帧的环境状态。一条导航指令可能持续几秒到几分钟,需要累积历史观测来减少累积误差、提高时序一致性。但历史帧越多,视觉 token 数量线性增长,必须用 Q-Former 压缩。
Token 爆炸问题
每帧 406 个视觉 token,几百帧 = 数万 token,远超 LLM 上下文窗口。Q-Former 将每帧压缩为 M 个 token(M ≪ 406),是整个架构可行性的关键。
| 传感器 | 规格 | 用途 |
|---|---|---|
| 左/右摄像头 | 侧向 60° 角 | 侧面路况 |
| 前摄像头 | 前方 | 主视角 |
| 后摄像头 | 后方 | 后方来车 |
| Focus-view | 前摄像头中心裁切 | 远处交通灯状态 |
| LiDAR | 64 通道,600K 点/秒 | 3D 空间感知 |
每路摄像头图像过 ResNet 提取 2D 特征图,flatten 为 1D token。然后多视角 token 通过一个 K_enc 层 Transformer Encoder(Multi-Head Self-Attention + MLP + LayerNorm)融合,实现跨视角的全局上下文理解。
LiDAR 点云用 PointPillars 处理:将点云划分为 0.25m × 0.25m 的柱体(pillar),每个 pillar 内的点用 PointNet 聚合特征,下采样为 C×H×W 的 BEV 特征图。这些 LiDAR BEV 特征同时作为后续 BEV Decoder 的查询(query)。
BEV Decoder 是一个 K_dec 层标准 Transformer。它以 LiDAR BEV 特征(H×W 个 query)去 attend 多视角图像特征,生成BEV token。同时还输入 N 个可学习 query 和 1 个可学习 query,分别生成航点 token和交通灯 token。
| 视觉 token 类型 | 数量 | 内容 |
|---|---|---|
| BEV token | H × W | 鸟瞰图场景特征(障碍物、道路结构) |
| 航点 token | N | 未来路径信息 |
| 交通灯 token | 1 | 交通灯状态(红/绿/黄) |
| 合计 | ~406 | 每帧总视觉 token 数 |
Vision Encoder 先在感知任务预训练阶段训练,冻结后供 LLM 使用。三个预训练任务:
| 任务 | 预测头 | 损失函数 |
|---|---|---|
| 目标检测 | CenterPoint(one-stage)→ 检测 H_m × W_m 范围内的 bbox + 速度 | detection loss(同 InterFuser) |
| 未来航点预测 | GRU 网络 → N 个未来航点 | L1 loss |
| 交通灯分类 | 2 层 MLP → 红/绿/黄 | cross-entropy loss |
关键设计
这些预测头仅用于预训练。微调 LLM 和推理时,预测头被丢弃——Vision Encoder 输出的视觉 token 直接喂给 LLM。这是一种"感知先学习、后冻结"的迁移策略。
LMDrive 选择 LLaMA 系列作为语言 backbone(与 LLaVA 等视觉语言模型一脉相承)。LLM 在整个驾驶过程中扮演"大脑":处理视觉 token 序列 + 理解语言指令 → 输出控制信号 + 指令完成判断。
直接将每帧 406 个 token 输入 LLM 不可行。LMDrive 采用 BLIP-2 风格的 Q-Former:用 M 个可学习 query 通过 cross-attention 从 406 个 token 中提取关键信息,压缩为 M 个 token。再用 2 层 MLP adapter 将 Q-Former 输出对齐到 LLM 的嵌入维度。
# Token 流转
Vision Encoder → 406 tokens/帧
↓ Q-Former (M 个 learnable queries)
M tokens/帧 → MLP adapter → 与语言 token 同维度
↓ 拼接历史帧 + 指令 token
LLM 输入:[指令 tokens] + [帧0的 M tokens] + [帧1的 M tokens] + ... + [帧T的 M tokens]
LLM 接收视觉 token 序列和指令 token 后,输出动作 token。一个 2 层 MLP adapter 将动作 token 转化为:
最终控制信号通过两个 PID 控制器(参考 LBC 方法):横向 PID 跟踪航点航向角,纵向 PID 跟踪航点速度 → 输出方向盘、油门、刹车。
为了让系统对不安全指令有拒执行能力,训练时将误导指令(如单车道要求变道)标注为"误导指令给出约 1 秒后标记为已完成"——相当于 LLM 学会了"收到危险指令后短暂忽略并继续正常行驶"。
| 阶段 | 训练什么 | 数据 | 冻结部分 |
|---|---|---|---|
| Stage 1:视觉编码器预训练 | Vision Encoder(ResNet + PointPillars + BEV Decoder + 预测头) | ~3M 原始帧(指令标注前) | — |
| Stage 2:指令微调 | Q-Former + Adapters | 64K 导航片段 + 464K 通知指令 | Vision Encoder + LLM 全部冻结 |
Stage 2 的关键设计
• 训练时固定序列长度 T_max 构建 batch
• 相邻帧高度相似(~10Hz 采集),采用固定间隔采样 + 时序增强(随机前后偏移不超过间隔)
• 训练时对每个历史帧都做预测监督(增强信号),推理时只用最新帧的预测
使用规则化专家代理(InterFuser)在 CARLA 中自动驾驶,收集约 3M 帧数据。覆盖 2500 条路线、8 个城镇、21 种环境条件(天气、时间段组合)。
第二阶段将原始帧序列切分为导航片段(clip),每个 clip 对应一条导航指令。例如:车辆从 T0 帧开始左转到 Tn 帧结束 → 标注为"Hang a left at the next crossroads"。
| 类型 | 示例 | 说明 |
|---|---|---|
| Follow | "In [x] meters, switch to left lane." | 跟随/换道类 |
| Turn | "After [x] meters, take a left." | 转弯类 |
| Others | "Slow down now." "Feel free to start driving." | 其他操作 |
| Notice | "Watch for walkers up front." "There's a bike ahead." | 即时通知(紧急情况) |
指令多样化策略
• 每种指令用 ChatGPT 生成 8 个语义相同、措辞不同的变体
• 误导指令:注入违反交通规则或不安全的指令(如单车道要求变道)
• 连续复杂指令:2~3 条连续指令组合("右转后直行到下个路口再右转")
| LLM Backbone | LangAuto DS↑ | LangAuto-Short DS↑ | LangAuto-Tiny DS↑ |
|---|---|---|---|
| Random Init. | 10.7 | 14.2 | 20.1 |
| LLaMA | 31.3 | 42.8 | 52.2 |
| LLaMA2 | 32.8 | 44.8 | 56.1 |
| Vicuna | 33.5 | 45.3 | 55.5 |
| Vicuna-v1.5 | 34.0 | 47.0 | 59.0 |
| LLaVA-v1.5 | 36.2 | 50.6 | 66.5 |
LLaVA-v1.5 在所有 benchmark 上全面领先——预训练视觉理解能力对驾驶性能有显著迁移效果。Random Init(随机初始化 LLM)DS 仅 10.7,证明 LLM 的语言先验至关重要。
| 模块设计 | DS↑ | RC↑ | IS↑ |
|---|---|---|---|
| Baseline (LLaVA-v1.5) | 36.2 | 46.5 | 0.81 |
| w/o Q-Former | 31.7 | 41.2 | 0.79 |
| w/o BEV tokens | 33.9 | 45.9 | 0.72 |
| w/o visual pre-training | 16.9 | 24.1 | 0.70 |
消融结论
• 视觉预训练最关键:去掉后 DS 暴跌 53%(36.2→16.9),验证了"感知先学习再冻结"的必要性
• Q-Former 不可或缺:去掉后 DS 下降 12%,token 压缩不仅解决上下文限制,还起到信息筛选作用
• BEV tokens 提升安全性:去掉后 IS 从 0.81 降到 0.72,BEV 特征对碰撞避免贡献显著
| Backbone | Benchmark | 车辆碰撞/km↓ | 行人碰撞/km↓ | 红灯违规/km↓ |
|---|---|---|---|---|
| LLaVA-v1.5 | LangAuto | 0.33 | 0.03 | 0.92 |
| LLaVA-v1.5 | LangAuto-Notice | 0.17 | 0.02 | 0.50 |
| Vicuna-v1.5 | LangAuto | 0.30 | 0.03 | 1.18 |
| Vicuna-v1.5 | LangAuto-Notice | 0.15 | 0.01 | 0.56 |
加入 Notice 指令后,车辆碰撞率近乎减半(0.33→0.17),红灯违规也大幅下降。这验证了"语言通知"能显著提升驾驶安全性——就像乘客提醒"小心红灯"一样有效。
| Benchmark | 说明 | 难度 |
|---|---|---|
| LangAuto | 指令自动按路线生成,导航/通知完整 | 标准 |
| LangAuto-Short | 路线较短,指令少 | 中等 |
| LangAuto-Tiny | 路线最短,场景简单 | 入门 |
| LangAuto-Notice | 含即时通知指令(行人、自行车、红灯提醒) | 安全增强 |
| LangAuto-Sequential | 连续多指令场景(2~3 条组合) | 推理密集 |
✓ 优势
• 首个将 LLM 真正放入闭环自动驾驶 loop 的系统
• 语言指令理解——支持 56 种自然语言指令 + 误导指令拒执行
• Notice 机制——乘客/导航系统可实时干预,碰撞率减半
• 模块化——Vision Encoder 可独立预训练和升级
• Q-Former 压缩——解决历史帧 token 爆炸
✗ 代价
• 推理延迟——LLM 前向传播 + Q-Former 计算,难以满足高速实时性
• 仅仿真验证——CARLA 8 城镇,未上真车
• 预训练成本——3M 帧数据收集 + Vision Encoder 训练
• PID 控制器——航点到控制的映射较简单,未学习端到端控制
| 维度 | LMDrive | 传统端到端(TCP/LAV) | Agent-Driver |
|---|---|---|---|
| 决策核心 | LLM(LLaVA-v1.5) | CNN+MLP | LLM(GPT-4o)+ 工具库 |
| 语言理解 | ✅ 原生支持 56 种指令 | ❌ 不支持 | ✅ 通过 Tool 间接支持 |
| 视觉处理 | BEV + Q-Former | 直接编码 | 感知模块 → 文本描述 |
| 经验积累 | ❌ 需重新训练 | ❌ 需重新训练 | ✅ Memory 模块 |
| 闭环驾驶 | ✅ CARLA closed-loop | 部分 | ✅ CARLA closed-loop |
| 可解释性 | 中等(动作 token) | 弱 | 强(自然语言推理链) |