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

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

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

【免费下载链接】LMDrive[CVPR 2024] LMDrive: Closed-Loop End-to-End Driving with Large Language Models项目地址: https://gitcode.com/gh_mirrors/lm/LMDrive

LMDrive 是一个 CVPR 2024 提出的闭环端到端自动驾驶框架,核心思路是让大语言模型理解多视角相机、LiDAR 与人类指令,并直接输出方向盘、油门、刹车等控制信号。而训练这样一套系统,前提是先拥有一份"格式标准、干净可用"的数据集。本文用 5 个实操步骤,带你从空目录一步步搭建出属于自己的 LMDrive 训练数据。

上图是 LMDrive 的完整数据流水线:多视角 RGB 与 LiDAR 经视觉编码器产出 token,再与导航指令一起送入大语言模型生成控制信号,所有中间产物都依赖一份规范化的数据集。

误区拆解:为什么你采集了一堆数据却无法训练?

很多新手的路径是这样的:装好 CARLA,跑通 autopilot,攒下一大堆文件夹,然后直接把它扔给训练脚本——结果报错、训练中断、模型不收敛。问题的根源不在采集本身,而在于数据集的组织形态

LMDrive 对数据有三个硬性要求:第一,每个路线文件夹必须包含rgb_fulllidarmeasurements等固定子目录;第二,根目录下必须有dataset_index.txt索引文件;第三,指令列表(如navigation_instruction_list.txt)必须由专用脚本生成,手写无效。先认清这三点,后面的每一步才有着落。

第一步:先立"骨架",把目标目录结构照抄出来

打开dataset/init_dir.py,它做的事非常简单:在dataset目录下创建sub-0sub-3四个子目录,每个里面再放一个results文件夹,用来承接四个 CARLA 采集服务器各自产出的数据。在项目根目录执行:

python dataset/init_dir.py

跑完后你应该看到dataset/sub-0/resultsdataset/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-0sub-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)画布上下排列成一张全景图,同时把measurementsactors_dataaffordances合并为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 加多视角融合模块,产出视觉 token):

bash 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),仅供参考