基于 CARLA 的 YOLOv8 多类目标定位数据集生成与训练管线

本项目是一个自动化、工业级稳定的自动驾驶感知数据采集与模型训练工具链。系统基于 CARLA 模拟器(v0.9.15)构建,打通了从自动驾驶仿真场景配置、多模态传感器数据同步采集、高精度 2D 边界框自动标注,到数据集智能切分、Ultralytics YOLOv8 模型一键训练及带目标追踪(Object Tracking)推理的完整闭环。


目录


项目架构

项目采用模块化设计,核心代码及工具链结构如下:

carla-yolo-dataset-generator/
├── carla.yaml                  # YOLOv8 训练数据集配置文件(定义路径与类别映射)
├── collect_data.sh             # 地图轮询采集脚本(自动化遍历 Town01-Town05)
├── collect_data_and_train.sh   # 全自动一键流水线脚本(采集 -> 转换 -> 训练)
├── collect_yolo_data.py        # 核心数据采集程序(处理仿真生命周期与传感器同步)
├── convert_dataset.py          # 数据集质检、清洗与 Train/Val/Test 智能切分程序
├── train_yolo.py               # YOLOv8 模型训练与导出脚本
├── yolo_realtime_inference.py  # 实时推理程序(集成 YOLOv8 动态目标追踪功能)
├── environment.yml             # Conda 虚拟环境依赖配置文件
├── requirements.txt            # Pip 包管理器依赖列表
└── utils/                      # 核心工具库模块
    ├── bbox_utils.py           # 2D 边界框计算核心算法(基于多传感器几何投影)
    ├── cva_utils.py            # 视场角过滤、距离截断、遮挡剔除与图像存盘工具
    ├── img_utils.py            # 相机内参矩阵构建与 3D 点至 2D 像素平面投影计算
    ├── server_utils.py         # CARLA 服务端自动启停与多平台进程防冲突管理
    └── world_utils.py          # 仿真世界配置、NPC 车辆/行人流生成与传感器动态挂载


核心功能模块深度解析

为了实现高质量的自动驾驶数据集采集,本项目并非单纯的截图工具,而是底层深度耦合了 CARLA 物理引擎与传感器系统的复合架构。以下为本系统的 5 大核心模块机制:

模块一:仿真世界与生命周期引擎

该模块负责建立稳定的仿真环境,解决开源工具链中常见的“开局死锁”与“内存泄漏”问题。

  • 物理级同步模式约束:系统强制仿真器进入同步模式(synchronous_mode=True),以固定的时间步长(delta_seconds=0.03)推进时钟,确保客户端逻辑与服务端渲染严格对齐,彻底根除了由于时钟脱节导致的车辆撞墙和穿模。
  • 自适应交通流调优:通过 TrafficManager 自动管理全局 NPC 车辆与行人。为避免传统仿真中小地图生成的全城死锁情况,系统强制下发了 -30.0 的速度差限制(即全局提速 30%),维持了高动态的有效采样场景。
  • 无泄漏重置机制:引入了极度健壮的场景重置(reset)逻辑。在发生车辆卡死或需要重置地图时,系统会采用 DestroyActor 执行批量同步销毁,并主动推进一帧空闲物理时钟供服务端回收垃圾内存,支持脚本长期挂机运行而无显存溢出风险。

模块二:多传感器同步与数据采集

系统支持高维度的多模态传感器组合采集与时空对齐。

  • 多模态传感器阵列:动态挂载包括 RGB 相机、深度相机(Depth)、语义分割相机(Semantic Segmentation)和光线投射雷达(LiDAR)在内的传感器矩阵。
  • 时序队列绝对对齐:由于 CARLA 传感器数据的回传存在网络延迟差异,模块使用 Queueretrieve_data 函数对帧号(frame)进行严格校验。任何一帧内若缺失任意一种传感器数据,整帧将被直接丢弃,确保入库数据的绝对多模态一致性。
  • 前沿视角支持(BEV):内置 --camera_mode 控制器。通过计算动态变换矩阵,不仅支持传统的行车前视(Dashcam)坐标挂载,还支持一键切换至位于车顶 15 米正上方的无人机俯视(Bird's-Eye View, BEV)视角。

模块三:高精度目标标注与遮挡剔除算法

这是本项目的核心算法模块。通过将 3D 世界坐标投影至 2D 像素平面,并解决复杂的“遮挡误判”问题,系统目前支持四大目标类别标注:vehicle, pedestrian, traffic_light, traffic_sign

  • 基于相机内参的几何投影:通过提取虚拟相机的 FOV 和分辨率参数构建内参矩阵($K$),提取 3D Bounding Box 的 8 个顶点,计算从世界坐标系到传感器坐标系再到 2D 像素坐标系的严格矩阵乘法投影,得出精确的 2D 检测框。
  • 多维度遮挡剔除(Occlusion Culling)技术
  • 视场与距离截断:通过最大探测距离(如车辆 40 米,标志牌 25 米)和点积方向计算,剔除相机背后的目标。
  • 深度与语义双重校验:对于投影在画面内的目标,算法会提取目标框内对应的深度图(Depth Map)语义分割图(Semantic Map)像素。只有当目标框内满足预设的语义阈值(semantic_threshold,即目标没有被墙壁或其他大型车辆完全遮挡)和深度距离约束时,该边界框才会被判定为有效标注。

模块四:数据集自动化构建与模型管线

该模块实现了从原始仿真截图到标准深度学习框架的自动化转换。

  • 智能质检与切分convert_dataset.py 会自动扫描采集目录,剔除不包含任何有效目标的无效图片。随后按照 80/20 等灵活比例,结合具体的地图名称(如将 Town05 专门隔离为测试集),将数据重构为标准的 Ultralytics YOLO 数据集目录格式。
  • 原生训练引擎接入:提供标准的 carla.yaml 映射文件,通过 train_yolo.py 脚本零延迟拉起 PyTorch 深度学习引擎,以最优配置启动模型训练与权重导出。

模块五:闭环推理与动态目标追踪

验证模型效果的端到端推理模块,强化了时间序列维度的分析能力。

  • 动态目标追踪:代码层面集成了 YOLOv8 的原生追踪器特性(model.track())。系统不仅在单帧内执行目标检测,还会利用 ByteTrack 或 BoT-SORT 等关联算法,为视频流中连续出现的物体分配跨帧稳定的唯一 ID,实现自动驾驶场景下的行为追踪模拟。
  • 动态进度与视频渲染:摒弃传统终端刷屏输出,采用专业 tqdm 进度条监控实时推理性能。支持在弹出窗口中实时绘制高亮边界框和分类标签,并在推理结束时自动合成导出高清预测视频(MP4)。

环境搭配说明

本工具链需要配置两个核心组件:CARLA 仿真器服务端Python 深度学习运行环境

配置 CARLA 仿真环境

  1. 前往 CARLA GitHub Releases 下载官方编译好的 CARLA 0.9.15 压缩包。
  2. 解压到本地非中文路径下(例如 Windows 下解压至 D:\Carla0915\,Linux 下解压至 ~/carla/)。
  3. 测试运行:进入解压目录,运行 CarlaUE4.exe (Windows) 或 ./CarlaUE4.sh (Linux)。若能成功进入 Unreal 仿真世界大厅,说明服务端正常。

Python 依赖环境安装

推荐使用 Conda 虚拟环境配置,项目提供了完整的依赖配置文件 environment.yml,可自动处理 Python 3.10 基础包及复杂的 CUDA 工具链映射:

# 基于配置文件创建名为 carla 的专属虚拟环境
conda env create -f environment.yml

# 激活该环境
conda activate carla

如果您习惯使用原生环境,可直接基于 requirements.txt 进行全自动安装:

pip install -r requirements.txt

本地关联配置

  1. 打开项目根目录下的 utils/server_utils.py 文件。
  2. 定位到顶部的 LAUNCH_STRING 变量。
  3. 将其修改为您本地仿真器可执行文件的绝对物理路径
  4. Windows 示例: LAUNCH_STRING = r"D:\Carla0915\WindowsNoEditor\CarlaUE4.exe"
  5. Linux 示例: LAUNCH_STRING = "/home/user/carla/CarlaUE4.sh"

运行说明

本工具链支持“一键闭环运行”与“分步定制运行”两种执行模式。

模式一:全自动一键流水线

如果您想直接查看最终的训练效果,可以直接运行封装好的单条 Shell 脚本。该脚本会自动轮询 5 张不同的地图,采集 1250 张高质量样本,清洗并切分数据集,最后自动拉起 PyTorch 深度学习引擎训练 YOLOv8 模型:

bash collect_data_and_train.sh

模式二:分步独立控制

步骤 1:自定义数据集采集

启动 collect_yolo_data.py 脚本,传入定制化参数进行精细化采集:

python collect_yolo_data.py \
    --map Town03 \                 # 指定在 Town03 地图上运行
    --camera_mode bev \            # 采集视角:可选 'front' (前视) 或 'bev' (俯视)
    --save \                       # 允许将图像与 labels 文本保存至磁盘
    --num_save 300 \               # 当前地图达到保存 300 张合格样本后自动停止退出
    --num_detections_save 3 \      # 质检过滤:单张图至少包含 3 个有效标注框才被保留
    --num_vehicles 40 \            # 设置该场景生成的交通工具总数
    --num_walkers 80               # 设置该场景生成的行人总数

步骤 2:数据集质检与格式转换

采集完成后,原始数据将暂存在 carla_data 文件夹内。运行转换脚本,对其进行智能切分并搬运到 datasets 统一目录:

python convert_dataset.py --val_split 0.8 --test_town Town05

步骤 3:启动 YOLOv8 模型训练

运行训练脚本,系统将基于标准 YOLO 格式的 carla.yaml 读取数据集,默认迭代 200 轮并在结束后自动导出权重:

python train_yolo.py

步骤 4:运行带目标追踪的实时推理

使用训练好的最优模型权重进行动态闭环感知测试。脚本将触发 YOLOv8 追踪模型,并在弹出的窗口中展示实时检测效果与跨帧追踪 ID:

python yolo_realtime_inference.py \
    --model runs/detect/train/weights/best.pt \  # 模型权重路径
    --map Town05 \                                # 执行实时测试的地图
    --num_steps 800 \                             # 推理物理帧数 (-1 为无限期挂机)
    --show \                                      # 激活屏幕实时弹窗渲染
    --save_video                                  # 追踪与推理的可视化过程保存为 mp4


鸣谢

本项目的几何投影算子及边界框数据清洗逻辑,深受开源社区以下优秀工作的启发,在此表示诚挚的谢意:

  • CARLA-2DDBBox
  • CARLA-Automatic-Dataset-Collector
  • CARLA 官方三维边界框投影与传感器队列对齐教程