三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从零搭建自动驾驶训练数据:跟着 LMDrive 走通 7 个环节

从零搭建自动驾驶训练数据:跟着 LMDrive 走通 7 个环节

从零搭建自动驾驶训练数据:跟着 LMDrive 走通 7 个环节

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

想训练一辆由大语言模型驱动的自动驾驶汽车,第一道坎往往不在模型本身,而在"自动驾驶训练数据"从哪里来。LMDrive 是 CVPR 2024 的开源项目,它把大语言模型装进了端到端驾驶系统,同时还自带一条从采集到训练的全自动数据生产线。这篇文章不堆理论,只讲实操——我带你以"跑通一次完整的数据生产"为目标,从环境搭建一路走到模型训练,把 7 个环节挨个过一遍。

先看全景:这条数据生产线为什么一环都不能少

动手之前,先花一分钟看懂上图这条流水线。LMDrive 工作时拿到两样输入:一句人类能读懂的导航指令(比如"下一个路口左转"),以及车身四周的多视角 RGB 图像和 LiDAR 点云。指令被分词器翻译成序列,画面被视觉编码器抽成特征,两者汇合后交给大语言模型做推理,最终通过适配器输出转向、油门这类控制信号。

看到这里你应该明白了:模型要学的东西,就是"指令 + 感知 → 控制"这三者之间的对应关系。所以你要产出的训练数据,也必须以同样的结构成对出现。而 CARLA 模拟器恰好能帮你批量制造这种"带剧本"的驾驶场景——这正是整个数据集构建流程的起点。

环节一:三分钟备齐工具,把采集环境搭起来

老规矩,先把项目拿到手:

git clone https://gitcode.com/gh_mirrors/lm/LMDrive cd LMDrive pip install -r requirements.txt

紧接着执行一行初始化命令:

python dataset/init_dir.py

它的作用其实特别朴素,就是帮你提前建好存放数据的目录骨架:

for i in range(4): os.mkdir("sub-%d" % i) # 建 4 个批次目录:sub-0 ~ sub-3 os.mkdir("sub-%d/results" % i) # 每个批次里再放一个 results

相当于在硬盘上挖好了 8 个"收纳格",后面采集的原始数据会按批次丢进去,不会混在一起。

💡 小贴士:建议用虚拟环境装依赖,避免和系统里的其他 Python 包打架。装完之后可以先python dataset/init_dir.py再检查一下目录是否真的建出来了,确认无误再往下走。

环节二:圈定路线和场景,让 CARLA 按"剧本"出车

数据不是随便跑出来的,得先定好"去哪条路、遇见什么状况"。项目用两个文件来定义采集计划:

  • 路线文件.xml格式,描述车辆在某个城镇里怎么走,比如routes_town01_short.xml
  • 场景文件.json格式,描述路上会插入什么突发情况,比如行人穿行、前车急刹,对应town01_all_scenarios.json

这两个文件的配对关系写在data_collection/generate_bashs.py里。表格里列出的就是项目预置的几组"套餐":

路线(怎么走)场景(遇什么)适用城镇
routes_town01_short.xmltown01_all_scenarios.json城镇 01
routes_town05_tiny.xmltown05_all_scenarios.json城镇 05
routes_town06_long.xmltown06_all_scenarios.json城镇 06

想自定义?直接改这个脚本,往字典里加一组"路线 → 场景"的映射就行,完全不用碰采集主程序。

环节三:一键生成批量脚本,多城镇并行开跑

采集计划定好后,下一步是把它们批量变成可执行的 shell 脚本:

python data_collection/generate_batch_collect.py

运行后会在batch_run目录下自动生成一堆脚本,比如run_route_routes_town01_short.sh,一个路线对应一个脚本。想采集哪条路线,就执行哪个:

bash batch_run/run_route_routes_town01_short.sh

采集开始后,CARLA 里的虚拟车会按既定路线行驶,沿途把以下数据一帧一帧地记录下来:

  1. 前、左、右、后四个视角的 RGB 图像;
  2. LiDAR 点云数据;
  3. 车辆自身的位姿、速度等测量值(measurements);
  4. 周围交通参与者的位置信息(actors_data);
  5. 红绿灯、停车标志等环境属性(affordances)。

💡 小贴士:第一次跑,强烈建议先只选一两条 tiny 路线试水,确认整条链路通畅后再放开批量采集,否则很容易攒下一堆"路径错了才发现"的废数据。

环节四:把四路相机画面缝成一张全景图

采集出来的画面是四个独立视角,但模型更习惯"一张图看全局"。tools/data_preprocessing/batch_merge_data.py就是干这个的——把四张图拼成一张 800×2400 的竖版全景图:

new = Image.new(img_front.mode, (800, 2400)) new.paste(img_front, (0, 0)) # 前视:第一块 new.paste(img_left, (0, 600)) # 左视:第二块 new.paste(img_right, (0, 1200)) # 右视:第三块 new.paste(img_rear, (0, 1800)) # 后视:第四块

看到没有,其实就是"新建一张大画布,四张图依次贴上去"。与此同时,脚本还会把actors_data和停车标志信息合并进measurements,生成一份内容更完整的measurements_full,让每一帧的数据都"一次配齐"。

💡 小贴士:这个脚本会读取dataset_index.txt来定位所有路线目录。拼接前先抽查几帧原始图,确认四路相机没装反、没黑屏,再批量跑,能省下不少返工时间。

环节五:让脚本自动给数据"批改作业"打标签

原始数据只有"图像 + 传感器读数",模型还看不懂。它需要知道"这一帧我在执行什么指令、该守什么规则"。tools/data_parsing目录下的一组脚本就是干这件事的"批改老师":

  • parse_instruction.py:解析导航指令,比如把"下个路口左转"拆成结构化指令;
  • follow_rules.py/turn_rules.py:识别跟车、转弯场景下的驾驶规则;
  • parse_notice.py/parse_misleading.py:处理提示信息与容易误导驾驶员的场景。

最终产出的标注数据大致长这样(已精简):

{ "timestamp": 1620000000, "position": {"x": 100.0, "y": 200.0, "z": 0.0}, "velocity": {"x": 10.0, "y": 0.0, "z": 0.0}, "stop_sign": true }

💡 小贴士:标注脚本是规则驱动的,跑完记得抽样对比"人工判断 vs 脚本结果",确认它对特殊场景(环岛、无信号灯路口)的判断也靠谱,再整批应用。

环节六:用统计脚本筛出垃圾数据,守住质量底线

数据量大不代表数据好。采集过程中难免混入被前车完全挡住视野的帧、传感器异常的数据,这些"垃圾"如果不筛掉,会直接污染训练。tools/data_preprocessing下有两兄弟专门管这事:

  • batch_stat_blocked_data.py:先做体检,统计哪些路线、哪些帧存在被遮挡等异常情况;
  • batch_rm_blocked_data.py:根据体检结果,批量移除有问题的数据。

推荐顺序是"先统计、后删除":先跑统计脚本拿到一份问题清单,人工确认无误,再执行删除。删完之后,还可以配合LAVIS/app/dataset_browser.py这类可视化工具,像翻相册一样逐帧抽查拼接图和标注是否正常。

💡 小贴士:删除是不可逆操作,动手前务必先备份一份dataset_index.txt。养成"先统计、后删除、再抽查"的习惯,你的数据集质量会稳定很多。

环节七:把数据集喂进模型,跑通训练与评估

数据准备妥当,终于到了收获时刻。训练的入口配置文件在lavis/projects/lmdrive/drivegpt.yaml,你只需要在文件里把数据集路径、模型参数改成自己的实际值:

python train.py --cfg lavis/projects/lmdrive/drivegpt.yaml

训练完成后再用评估脚本看看模型的闭环表现:

python evaluate.py --cfg lavis/projects/lmdrive/drivegpt.yaml

💡 小贴士:第一次训练先把 batch size 调小、只加载一小部分数据,目的是验证数据加载、模型前向、loss 计算这条链路能正常跑通。确认没问题再调大配置正式训练,能帮你省下排查"数据格式错误"的大量时间。

写在最后:下一步你可以做什么

回到开头那句话:自动驾驶训练数据这道坎,LMDrive 已经帮你铺好了路。它把"采集 → 拼接 → 标注 → 清洗 → 训练"串成了一条可以反复跑通的流水线,你要做的只是理解每个环节在干什么,然后按自己的需求去调整。

下一步的玩法其实很多:在generate_bashs.py里扩充更多城镇和长路线,让数据覆盖更多路况;调整场景配置引入雨天、夜间等天气变化;或者基于已清洗的数据做一次消融实验,看看不同数据量对模型闭环表现的影响。每多走一步,你对"数据如何决定模型上限"的理解就会深一层——现在,先从跑通一条 tiny 路线开始吧。

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

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表