Vision-Language-Action:LMDrive项目架构与核心算法组件
LMDrive 项目架构与核心算法组件一、项目概述LMDrive 是一个基于大型语言模型LLM和多模态视觉编码器的端到端自动驾驶系统。它能够理解自然语言指令并从多视角摄像头和 LiDAR 传感器输入中生成驾驶控制信号。核心特性自然语言指令理解多模态传感器数据融合RGB LiDAR端到端闭环驾驶CARLA 模拟器集成二、文件夹与文件目录架构2.1 项目根目录LMDrive/ ├── LAVIS/ # 视觉-语言模型库基于 BLIP2/LLaVA ├── vision_encoder/ # 视觉特征提取与多模态融合模块 ├── leaderboard/ # CARLA Leaderboard 评估框架 ├── scenario_runner/ # 场景管理与交通事件模拟 ├── data_collection/ # 自动化数据收集脚本 ├── dataset/ # 数据集初始化与管理 ├── langauto/ # 语言指令基准测试 ├── assets/ # 资源文件架构图等 ├── environment.yml # Conda 环境配置 ├── LICENSE └── README.md2.2 LAVIS/ - 视觉-语言模型库LAVIS/ ├── app/ # 应用程序推理演示 │ ├── caption.py # 图像描述 │ ├── vqa.py # 视觉问答 │ ├── classification.py # 分类任务 │ └── main.py # 主入口 ├── lavis/ # 核心库代码 │ ├── common/ # 通用工具 │ │ ├── config.py # 配置管理 │ │ ├── dist_utils.py # 分布式训练工具 │ │ ├── registry.py # 注册机制 │ │ └── utils.py # 工具函数 │ ├── configs/ # 配置文件 │ │ ├── datasets/ # 数据集配置 │ │ │ └── carla/ # CARLA 数据集配置 │ │ └── models/ # 模型配置 │ ├── datasets/ # 数据集定义 │ │ ├── builders/ # 数据集构建器 │ │ └── datasets/ # 具体数据集实现 │ └── models/ # 模型定义 │ ├── albef_models/ # ALBEF 模型 │ ├── alpro_models/ # ALPRO 模型 │ └── blip2_models/ # BLIP2 模型 │ ├── blip2.py # BLIP2 基础模型 │ ├── Qformer.py # Q-Former 编码器 │ ├── memfuser.py # Memfuser 融合模型 │ └── modeling_llama.py # LLaMA 模型封装 ├── examples/ # Jupyter 示例 ├── docs/ # 文档 └── evaluate.py # 评估脚本2.3 vision_encoder/ - 视觉特征提取模块vision_encoder/ ├── timm/ # 视觉模型库基于 PyTorch Image Models │ ├── data/ # 数据处理 │ │ ├── carla_dataset.py # CARLA 数据集 │ │ ├── carla_loader.py # CARLA 数据加载器 │ │ └── parsers/ # 数据解析器 │ └── models/ # 视觉模型定义 │ ├── layers/ # 基础层 │ │ ├── activations.py # 激活函数 │ │ ├── attention.py # 注意力机制 │ │ ├── mlp.py # MLP 层 │ │ ├── norm.py # 归一化层 │ │ └── patch_embed.py # Patch Embedding │ ├── memfuser.py # Memfuser 多模态融合模型核心 │ ├── interfuser.py # Interfuser 多模态融合模型 │ ├── pointpillar.py # PointPillar LiDAR 处理 │ ├── resnet.py # ResNet 骨干网络 │ ├── vision_transformer.py # Vision Transformer │ └── factory.py # 模型创建工厂 ├── scripts/ # 训练脚本 ├── distributed_pretrain.sh # 分布式预训练脚本 └── hubconf.py # PyTorch Hub 配置2.4 leaderboard/ - CARLA 评估框架leaderboard/ ├── leaderboard/ # 评估核心代码 │ ├── autoagents/ # 代理接口 │ │ ├── autonomous_agent.py # 自主代理基类 │ │ └── dummy_agent.py # 示例代理 │ ├── envs/ # 环境接口 │ │ ├── sensor_interface.py # 传感器接口 │ │ └── instruction_dict.json # 指令字典 │ ├── scenarios/ # 场景管理 │ │ ├── scenario_manager.py # 场景管理器 │ │ └── route_scenario.py # 路线场景 │ ├── utils/ # 工具函数 │ │ ├── route_parser.py # 路线解析 │ │ ├── result_writer.py # 结果写入 │ │ └── statistics_manager.py # 统计管理 │ └── leaderboard_evaluator.py # 评估器 ├── team_code/ # 参赛队伍代码LMDrive 核心 │ ├── lmdriver_agent.py # LMDrive 代理实现核心 │ ├── lmdriver_config.py # 配置文件 │ ├── planner.py # 路线规划器 │ ├── pid_controller.py # PID 控制器 │ ├── controller.py # 控制器基类 │ ├── auto_pilot.py # 自动驾驶控制 │ └── utils.py # 工具函数 ├── data/ # 评估数据 │ ├── 42routes/ # 42 条评估路线 │ ├── training_routes/ # 训练路线 │ ├── validation_routes/ # 验证路线 │ ├── scenarios/ # 场景配置 │ └── official/ # 官方数据 ├── scripts/ # 评估脚本 │ ├── run_evaluation.sh # 运行评估 │ └── eval.sh # 评估命令 └── requirements.txt # 依赖列表2.5 scenario_runner/ - 场景运行器scenario_runner/ ├── srunner/ # 场景运行器核心 │ ├── autoagents/ # 代理接口 │ ├── scenarioconfigs/ # 场景配置 │ ├── scenariomanager/ # 场景管理器 │ │ ├── scenario_manager.py # 场景管理核心 │ │ ├── actorcontrols/ # 角色控制 │ │ ├── scenarioatomics/ # 原子行为/条件 │ │ └── traffic_events.py # 交通事件 │ ├── scenarios/ # 场景定义 │ │ ├── follow_leading_vehicle.py # 跟车场景 │ │ ├── change_lane.py # 变道场景 │ │ ├── junction_crossing_route.py # 路口穿越 │ │ └── signalized_junction_left_turn.py # 信号灯左转 │ ├── tools/ # 工具函数 │ └── metrics/ # 指标计算 ├── examples/ # 场景示例 ├── Docs/ # 文档 └── scenario_runner.py # 主入口三、框架架构3.1 整体架构图┌─────────────────────────────────────────────────────────────────────┐ │ CARLA Simulator │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │ │ │ RGB Front │ │ RGB Left │ │ RGB Right │ │ RGB Rear │ │ │ │ (1200x900) │ │ (400x300) │ │ (400x300) │ │ (400x300) │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └─────┬─────┘ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ LiDAR │ │ GPS/IMU/Speed│ │ │ │ (Ray-Cast) │ │ Sensors │ │ │ └──────┬──────┘ └──────┬──────┘ │ └─────────┼────────────────┼───────────────────────────────────────┘ │ │ ▼ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ LMDrive Agent │ │ │ │ ┌────────────────── 传感器数据预处理 ───────────────────┐ │ │ │ 图像变换 → CenterCrop → Normalize → Tensor │ │ │ │ LiDAR → PointPillar → BEV Feature Map │ │ │ └───────────────────────┬──────────────────────────────┘ │ │ │ │ │ ┌─────────────────── 视觉编码器 ──────────────────────┐ │ │ │ ┌───────────────────────────────────────────────┐ │ │ │ │ │ ResNet Backbone (r26/r50) → HybridEmbed │ │ │ │ │ │ → PositionEmbeddingSine → View Embedding │ │ │ │ │ └───────────────────┬───────────────────────────┘ │ │ │ │ │ │ │ │ │ ┌───────────────────▼───────────────────────────┐ │ │ │ │ │ Transformer Encoder (enc_depth layers) │ │ │ │ │ │ - Multi-View Feature Fusion │ │ │ │ │ │ - Cross-Modal Attention │ │ │ │ │ └───────────────────┬───────────────────────────┘ │ │ │ └───────────────────────┼──────────────────────────────┘ │ │ │ │ │ ┌─────────────────── LLM 融合 ───────────────────────┐ │ │ │ ┌───────────────────────────────────────────────┐ │ │ │ │ │ Q-Former → LLaVA/Vicuna LLM │ │ │ │ │ │ - Instruction Understanding │ │ │ │ │ │ - Visual-Language Alignment │ │ │ │ │ └───────────────────┬───────────────────────────┘ │ │ │ └───────────────────────┼──────────────────────────────┘ │ │ │ │ │ ┌─────────────────── 决策输出 ───────────────────────┐ │ │ │ ┌───────────────────────────────────────────────┐ │ │ │ │ │ Transformer Decoder → Waypoints Predictor │ │ │ │ │ │ - GRUWaypointsPredictor │ │ │ │ │ │ - 5 waypoints (x, y) │ │ │ │ │ └───────────────────┬───────────────────────────┘ │ │ │ │ │ │ │ │ │ ┌───────────────────▼───────────────────────────┐ │ │ │ │ │ PID Controller → Steering/Throttle/Brake │ │ │ │ │ └───────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────┘3.2 数据流传感器输入CARLA 模拟器提供多视角图像、LiDAR 点云、GPS、IMU 和速度数据数据预处理图像裁剪、归一化LiDAR 点云转换为 BEV 特征图视觉编码ResNet 提取特征 → Transformer Encoder 融合多视图特征语言理解Q-Former 将视觉特征与 LLM 对齐理解自然语言指令决策生成Transformer Decoder 生成轨迹点waypoints控制输出PID 控制器将轨迹点转换为驾驶控制信号四、核心算法组件4.1 Memfuser 多模态融合模型文件路径vision_encoder/timm/models/memfuser.pyMemfuser 是 LMDrive 的核心多模态融合模型采用 Transformer Encoder-Decoder 架构。4.1.1 模型结构classMemfuser(nn.Module):def__init__(self,img_size224,# 主视角图像尺寸multi_view_img_size112,# 侧视角图像尺寸embed_dim768,# 嵌入维度enc_depth6,# Encoder 层数dec_depth6,# Decoder 层数num_heads8,# 注意力头数rgb_backbone_namer26,# RGB 骨干网络with_lidarTrue,# 是否使用 LiDARwith_right_left_sensorsTrue,# 是否使用左右摄像头with_rear_sensorTrue,# 是否使用后摄像头waypoints_pred_headgru,# 轨迹预测头类型):4.1.2 关键组件组件功能HybridEmbed将 ResNet 特征转换为 Transformer 可处理的 tokenPositionEmbeddingSine正弦位置编码View Embedding区分不同视角的嵌入向量LidarModel基于 PointPillar 的 LiDAR 处理TransformerEncoder融合多视图视觉特征TransformerDecoder生成轨迹点和交通预测GRUWaypointsPredictorGRU 轨迹点预测器TrafficPredHead交通参与者预测头4.1.3 前向传播流程defforward_features(self,front_image,left_image,right_image,rear_image,front_center_image,lidar,num_points):# 1. 多视角图像特征提取front_image_token,front_image_token_globalself.rgb_patch_embed(front_image)left_image_token,left_image_token_globalself.rgb_patch_embed(left_image)right_image_token,right_image_token_globalself.rgb_patch_embed(right_image)rear_image_token,rear_image_token_globalself.rgb_patch_embed(rear_image)front_center_image_token,front_center_image_token_globalself.rgb_patch_embed(front_center_image)# 2. LiDAR 特征提取lidar_tokenself.lidar_backbone(lidar,num_points)# 3. 拼接所有特征featurestorch.cat([front_image_token,front_image_token_global,...],0)returnfeatures,lidar_tokendefforward(self,x):# 1. 提取特征features,lidar_tokenself.forward_features(...)# 2. Encoder 编码memoryself.encoder(features,maskself.attn_mask)# 3. Decoder 解码querytorch.cat([lidar_token,query_embed],0)hsself.decoder(query,memory,query_postgt)[0]# 4. 输出预测waypointsself.waypoints_generator(waypoints_feature,target_point)trafficself.traffic_pred_head(traffic_feature_with_vel)traffic_light_stateself.traffic_light_pred_head(traffic_light_state_feature)stop_signself.stop_sign_head(stop_sign_feature)returntraffic,waypoints,traffic_light_state,stop_sign,traffic_feature4.2 Interfuser 多模态融合模型文件路径vision_encoder/timm/models/interfuser.pyInterfuser 是另一种多模态融合模型与 Memfuser 类似但采用不同的注意力机制策略。4.2.1 主要区别特性MemfuserInterfuserLiDAR 处理PointPillarResNet 骨干注意力掩码None支持分离视图注意力轨迹预测头GRU多种GRU/Linear/Heatmap额外输出交通灯/停车标志路口检测/交通灯/停车标志4.2.2 支持的轨迹预测头gruGRU 序列预测gru-command带指令的 GRU 预测linear线性预测linear-sum线性累加预测heatmap热力图预测MultiPath4.3 LMDrive Agent文件路径leaderboard/team_code/lmdriver_agent.pyLMDriveAgent 是 CARLA Leaderboard 的代理实现负责与模拟器交互并执行驾驶决策。4.3.1 传感器配置defsensors(self):return[{type:sensor.camera.rgb,id:rgb_front,...},# 前视摄像头{type:sensor.camera.rgb,id:rgb_left,...},# 左视摄像头{type:sensor.camera.rgb,id:rgb_right,...},# 右视摄像头{type:sensor.camera.rgb,id:rgb_rear,...},# 后视摄像头{type:sensor.lidar.ray_cast,id:lidar,...},# LiDAR{type:sensor.other.imu,id:imu,...},# IMU{type:sensor.other.gnss,id:gps,...},# GPS{type:sensor.speedometer,id:speed,...},# 速度计]4.3.2 核心方法方法功能setup()初始化模型、控制器和传感器变换tick()处理传感器数据计算车辆状态run_step()执行单步驾驶决策核心control_pid()PID 控制器生成控制信号4.3.3 驾驶决策流程torch.no_grad()defrun_step(self,input_data,timestamp):# 1. 数据预处理tick_dataself.tick(input_data)# 2. 图像变换rgb_frontself.rgb_front_transform(Image.fromarray(tick_data[rgb_front])).cuda()rgb_leftself.rgb_left_transform(Image.fromarray(tick_data[rgb_left])).cuda()rgb_rightself.rgb_right_transform(Image.fromarray(tick_data[rgb_right])).cuda()rgb_rearself.rgb_right_transform(Image.fromarray(tick_data[rgb_rear])).cuda()rgb_centerself.rgb_center_transform(Image.fromarray(cv2.resize(...))).cuda()# 3. 获取自然语言指令last_instructionself._instruction_planner.command2instruct(...)# 4. 视觉编码image_embedsself.net.visual_encoder(input_data)# 5. LLM 推理生成轨迹点waypoints,is_endself.net(input_data,inference_modeTrue,image_embedsimage_embeds)# 6. PID 控制生成驾驶信号steer,throttle,brake,metadataself.control_pid(waypoints,velocity)# 7. 返回控制指令controlcarla.VehicleControl()control.steerfloat(steer)*0.8control.throttlefloat(throttle)control.brakefloat(brake)returncontrol4.4 PID 控制器文件路径leaderboard/team_code/pid_controller.pyPID 控制器将预测的轨迹点转换为车辆控制信号。defcontrol_pid(self,waypoints,velocity):# 计算期望速度desired_speednp.linalg.norm(waypoints[0]-waypoints[1])*2.0# 计算转向角aim(waypoints[1]waypoints[0])/2.0anglenp.degrees(np.pi/2-np.arctan2(aim[1],aim[0]))/90# PID 控制steerself.turn_controller.step(angle)throttleself.speed_controller.step(desired_speed-speed)# 刹车判断brakedesired_speedself.config.brake_speedor(speed/desired_speed)self.config.brake_ratioreturnsteer,throttle,brake,metadata4.5 路线规划器文件路径leaderboard/team_code/planner.py包含两个规划器规划器功能RoutePlanner基于 GPS 的路线规划生成下一个目标点和命令InstructionPlanner将驾驶命令转换为自然语言指令4.6 视觉-语言模型集成文件路径LAVIS/lavis/models/blip2_models/memfuser.py将 Memfuser 视觉编码器与 LLMLLaVA/Vicuna集成。classMemfuser(nn.Module):def__init__(self,preception_model,llm_model,...):self.visual_encodercreate_model(preception_model)# 视觉编码器self.llmload_llm_model(llm_model)# LLM 模型self.qformerQformer(...)# Q-Former 桥接层五、关键技术点5.1 多模态特征融合图像特征ResNet HybridEmbed → 图像 TokenLiDAR 特征PointPillar → BEV 特征图 → LiDAR Token位置编码正弦位置编码PositionEmbeddingSine视图编码可学习的 View Embedding 区分不同视角5.2 指令理解使用 LLaVA/Vicuna 作为语言模型Q-Former 作为视觉-语言桥接支持自然语言指令如“Turn left at the next intersection”5.3 端到端闭环从传感器输入直接到控制输出无需手工设计的感知模块支持实时推理约 20Hz5.4 分布式训练使用 PyTorch Distributed Data Parallel支持多 GPU 训练预训练 指令微调两阶段六、数据流程总结CARLA Simulator │ ▼ ┌─────────────────┐ │ 传感器数据采集 │ RGB(5视角) LiDAR GPS/IMU/Speed └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 数据预处理 │ 图像裁剪/归一化 LiDAR点云处理 └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 视觉特征提取 │ ResNet HybridEmbed Position Encoding └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 多模态特征融合 │ Transformer Encoder (多视图注意力) └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 语言指令理解 │ Q-Former LLaVA/Vicuna └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 轨迹点预测 │ Transformer Decoder GRU └────────┬────────┘ │ ▼ ┌─────────────────┐ │ 控制信号生成 │ PID Controller → Steering/Throttle/Brake └────────┬────────┘ │ ▼ CARLA Simulator (执行控制)七、模型配置与变体7.1 Memfuser 模型变体模型名称Encoder DepthDecoder DepthBackbone用途memfuser_baseline24ResNet50基础版本memfuser_baseline_e3d333ResNet50平衡版本memfuser_baseline_e1d313ResNet50轻量版本memfuser_baseline_e1d3_r2613ResNet26更轻量版本memfuser_baseline_return_feature24ResNet50返回中间特征7.2 Interfuser 模型变体模型名称Encoder DepthDecoder Depth注意力策略interfuser_baseline33全注意力interfuser_baseline_seperate_all66分离视图注意力interfuser_baseline_wolidar66无 LiDAR八、评估与数据集8.1 评估路线42routes官方评估路线training_routes训练路线Town01-Town10validation_routes验证路线Town05evaluation_routes评估路线8.2 场景配置交通场景红绿灯、停车标志路口场景左转、右转、直行变道场景跟车场景8.3 评估指标路线完成率时间效率安全性碰撞次数交通规则遵守九、部署与运行9.1 环境依赖conda env create-f environment.yml conda activate lmdrive9.2 模型训练# 视觉编码器预训练cdvision_encoderbashdistributed_pretrain.sh# 指令微调cdLAVIS python train.py --cfg-path configs/models/blip2/blip2_coco.yaml9.3 评估运行cdleaderboardbashscripts/run_evaluation.sh9.4 关键环境变量变量说明CARLA_ROOTCARLA 模拟器路径ROUTES评估路线文件SCENARIOS场景配置文件TEAM_AGENT代理代码路径TEAM_CONFIG代理配置文件SAVE_PATH结果保存路径十、核心文件清单文件路径功能描述vision_encoder/timm/models/memfuser.pyMemfuser 多模态融合模型vision_encoder/timm/models/interfuser.pyInterfuser 多模态融合模型vision_encoder/timm/models/pointpillar.pyPointPillar LiDAR 处理leaderboard/team_code/lmdriver_agent.pyLMDrive CARLA 代理leaderboard/team_code/pid_controller.pyPID 控制器leaderboard/team_code/planner.py路线规划器leaderboard/team_code/lmdriver_config.py代理配置LAVIS/lavis/models/blip2_models/memfuser.pyBLIP2 Memfuser 集成LAVIS/lavis/models/blip2_models/Qformer.pyQ-Former 编码器vision_encoder/timm/data/carla_dataset.pyCARLA 数据集vision_encoder/timm/data/carla_loader.pyCARLA 数据加载器