公司动态

LMDrive数据集从零构建实战:5步告别“采集了却训不了“的困局

📅 2026/8/16 19:07:54
LMDrive数据集从零构建实战:5步告别“采集了却训不了“的困局
LMDrive数据集从零构建实战5步告别采集了却训不了的困局【免费下载链接】LMDrive[CVPR 2024] LMDrive: Closed-Loop End-to-End Driving with Large Language Models项目地址: https://gitcode.com/gh_mirrors/lm/LMDriveLMDrive 是一个 CVPR 2024 提出的闭环端到端自动驾驶框架核心思路是让大语言模型理解多视角相机、LiDAR 与人类指令并直接输出方向盘、油门、刹车等控制信号。而训练这样一套系统前提是先拥有一份格式标准、干净可用的数据集。本文用 5 个实操步骤带你从空目录一步步搭建出属于自己的 LMDrive 训练数据。上图是 LMDrive 的完整数据流水线多视角 RGB 与 LiDAR 经视觉编码器产出 token再与导航指令一起送入大语言模型生成控制信号所有中间产物都依赖一份规范化的数据集。误区拆解为什么你采集了一堆数据却无法训练很多新手的路径是这样的装好 CARLA跑通 autopilot攒下一大堆文件夹然后直接把它扔给训练脚本——结果报错、训练中断、模型不收敛。问题的根源不在采集本身而在于数据集的组织形态。LMDrive 对数据有三个硬性要求第一每个路线文件夹必须包含rgb_full、lidar、measurements等固定子目录第二根目录下必须有dataset_index.txt索引文件第三指令列表如navigation_instruction_list.txt必须由专用脚本生成手写无效。先认清这三点后面的每一步才有着落。第一步先立骨架把目标目录结构照抄出来打开dataset/init_dir.py它做的事非常简单在dataset目录下创建sub-0到sub-3四个子目录每个里面再放一个results文件夹用来承接四个 CARLA 采集服务器各自产出的数据。在项目根目录执行python dataset/init_dir.py跑完后你应该看到dataset/sub-0/results、dataset/sub-1/results这样的路径。这层骨架是后面所有批处理脚本的落盘位置千万别手动改名。更关键的是你要在脑海中记住每个路线文件夹的标准形态以routes_town06_long_w7_11_28_18_28_35为例routes_town06_long_w7_11_28_18_28_35/ ├── rgb_full/ # 多视角拼接后的全景图 ├── lidar/ # 3D 点云.npy ├── measurements/ # 自车状态、未来航点等 ├── actors_data/ # 周围车辆、红绿灯元数据 ├── affordances/ # 制动、停止线等属性 └── ...帧数是命脉每个路线文件夹的帧数会被写入索引文件训练代码靠它定位数据。采集环节采集到的帧太少会在后续预处理中被直接剔除。第二步启动采集流水线让专家驾驶员替你开车采集用的司机是leaderboard/team_code/auto_pilot.py——一个基于规则地图的专家代理它不需要模型权重只要 CARLA 世界里有路可走就能稳定地开完一整条路线。采集时的天气是随机抽取的auto_pilot.py里定义了 20 余种天气从晴天正午到暴雨深夜这正是数据集多样性的来源之一。要同时开多个采集进程先在data_collection目录下依次执行python generate_bashs.py # 为 4 个服务器端口生成采集脚本 python generate_batch_collect.py # 把脚本汇总成按路线区分的批处理脚本第一条命令会在data_collection/bashs/sub-0到sub-3下生成每个路线的采集脚本第二条命令则把同一路线在 4 个服务器上的脚本合并成data_collection/batch_run/run_route_xxx.sh。接着启动 CARLA 服务器每个服务器占用一个 GPU 与一个端口如 2000/2002/2004/2006再运行bash data_collection/batch_run/run_route_routes_town01_long.sh此时观察dataset/sub-*/results下是否出现带时间戳的路线文件夹。若想调整采集节奏例如每几帧存一次图、给航点加多少扰动可修改data_collection/auto_agent.yaml其中save_skip_frames控制抽帧频率waypoint_disturb控制专家轨迹的扰动强度扰动越大采集出的轨迹越不教科书式模型学到的泛化能力也越好。第三步七道清洗工序必须按顺序跑原始数据不能直接用于训练需要经过tools/data_preprocessing下的一组脚本加工。顺序是硬约束跳步或乱序都会让后续脚本找不到文件。把下面$DATASET_ROOT替换成你的数据集根目录python get_list_file.py $DATASET_ROOT # 1. 生成 dataset_index.txt 索引 python batch_merge_data.py $DATASET_ROOT # 2. 多视角拼接 测量数据整合 python batch_rm_rgb_data.py $DATASET_ROOT # 3. 清理拼接前的冗余原图 python batch_stat_blocked_data.py $DATASET_ROOT # 4. 找出长时间卡死的帧段 python batch_rm_blocked_data.py $DATASET_ROOT # 5. 删除这些阻塞帧 python batch_recollect_data.py $DATASET_ROOT # 6. 重排帧编号保证连续 python batch_merge_measurements.py $DATASET_ROOT # 7. 合并测量数据减少 IO 开销其中第 1 步值得一提get_list_file.py会逐路线统计measurements下的帧数不足 32 帧的路线会被自动忽略——这正是那些采集了半天却进不了训练案例的常见元凶。而第 2 步的拼接逻辑在batch_merge_data.py里写得很直白把前、左、右、后四个视角的图按(800, 2400)画布上下排列成一张全景图同时把measurements、actors_data、affordances合并为measurements_full让训练时每帧只需读一次文件。第 4、5 步则是数据质量的关键当车辆长时间静止、前方又没有红绿灯时脚本会判定为被卡住的无效数据并标记删除。这一步同时改善了样本分布和磁盘占用。第四步让数据开口说话自动生成指令标签清洗完的数据只有传感器信息还缺一个关键部分——导航指令与人类提示。LMDrive 的特色是语言驱动驾驶所以每条数据片段都要配一句指令例如前方路口左转跟车时保持安全距离。tools/data_parsing下的脚本用一组规则类完成这件事turn_rules.py处理转弯Turn-01 到 Turn-06覆盖不同路口形态与多段转弯、follow_rules.py处理跟车、other_rules.py覆盖超车等场景。运行python3 parse_instruction.py $DATASET_ROOT # 生成 navigation_instruction_list.txt python3 parse_notice.py $DATASET_ROOT # 生成 notice_instruction_list.txt python3 parse_misleading.py $DATASET_ROOT # 生成 misleading_data.txt生成的文本文件按行存储 JSON每条记录包含指令类型、指令 ID、城镇、天气、所属路线路径与帧区间。注意parse_instruction.py依赖dataset_index.txt所以它必须排在预处理完成之后执行。第五步把数据集喂进训练与评估闭环数据就绪后就进入两阶段训练。第一阶段在vision_encoder目录下预训练视觉编码器ResNet50 加多视角融合模块产出视觉 tokenbash scripts/train.sh其中DATASET_ROOT要改成你的数据路径--train-towns、--train-weathers用来按城镇和天气过滤训练数据。第二阶段在LAVIS目录下做指令微调让大语言模型学会看图 听指令 → 输出控制量bash run.sh 8 lavis/projects/lmdrive/notice_llava15_visual_encoder_r50_seq40.yaml微调配置lavis/projects/lmdrive/下的 yaml里要重点核对三项preception_model_ckpt指向上一步的编码器权重、llm_model指向所选 LLM 底座、storage指向数据集根目录。训练完成后用leaderboard/scripts/run_evaluation.sh在 LangAuto 基准上回测把TEAM_CONFIG指向leaderboard/team_code/lmdriver_config.py并填入三个权重路径即可。官方在长路线long基准上驾驶得分可到 36.2这组数字就是你的复现目标。总结与下一步回顾整条链路关键并不在于采集得多而在于格式对得上先建目录骨架再按规则采集然后严格按顺序清洗最后解析出指令标签。任何一步跳步都可能把数据变成训练代码读不懂的孤儿文件。下一步建议先不追求全量复刻用routes_town01_tiny这类小路线跑通整条流水线确认dataset_index.txt与指令列表生成无误后再逐步扩大到多城镇、多天气的全量采集——你会省下大量排错时间。【免费下载链接】LMDrive[CVPR 2024] LMDrive: Closed-Loop End-to-End Driving with Large Language Models项目地址: https://gitcode.com/gh_mirrors/lm/LMDrive创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考