ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

自动驾驶多类别交通物体检测数据集:28类标注与YOLO训练实战

自动驾驶多类别交通物体检测数据集:28类标注与YOLO训练实战 简介这份自动驾驶多类别交通物体检测数据集面向从事目标检测算法研发的工程师、学生与科研人员尤其适合使用YOLO系列含YOLOv12进行模型训练与验证的场景。数据集覆盖28类交通与道路相关目标从行人、车辆、交通灯到盲道、检票闸机、坑洞等无障碍与道路缺陷类别均有收录可支撑自动驾驶感知、城市交通监控等方向的实验。压缩包共2000个文件以1154个txt标注文件、844张jpg图像为主另含1个yaml配置文件与1份docx说明文档整体约72.82MB标注采用YOLO格式包含边界框坐标与类别标签可直接投入训练流程。目前已有86人学习下载。读者可获得一套类别丰富、开箱即用的检测数据省去自行采集与标注成本便于快速验证模型在多类别复杂道路场景下的表现并借助yaml与说明文档理清数据组织方式。1. 自动驾驶多类别交通物体检测数据集28 类标注、1154 张训练图能直接喂给 YOLO 吗如果你正在做自动驾驶感知模块或者想拿一份真实道路场景的多类别数据集跑通 YOLO 训练链路这份「自动驾驶多类别交通物体检测数据集」值得先拆开看看。它包含 1154 张训练图片全部采用 YOLO 格式标注覆盖 28 个交通相关类别——从常见的 Car、Person、Bus到容易被忽略的 Pothole坑洞、Tactilepaving盲道、Ticketbarrier检票闸机都有独立标签。这意味着你不需要自己从零标注拿到手就能直接接入 YOLOv8、YOLOv12 等检测框架的训练流程。适合谁一是想验证自定义数据集训练流程的算法工程师二是做自动驾驶场景感知原型的学生和研究者三是需要快速搭建交通物体检测 demo 的从业者。但 1154 张图、28 个类别的组合也意味着类别分布和场景覆盖有它自己的脾气直接开训之前有几件事得先弄清楚。2. 拆开数据包目录结构、标注格式与类别体系2.1 从文件名看数据组织方式拿到压缩包解压后你会看到图片文件命名有两种风格一种是IMG_0201_jpg.rf.e78bc8017dc0581c1b666a46022b43ac.jpg另一种是000000190015_jpg.rf.e5e5a236b892898ed92e93e39fe65d23.jpg。文件名里的.rf.后面跟一长串哈希这是 Roboflow 导出数据集时的典型命名规则——说明这份数据大概率经过 Roboflow 平台做过格式转换和增强处理。IMG_前缀通常来自手机或车载摄像头直接拍摄000000xxxxxx这种纯数字前缀则更像从视频帧中抽出的连续帧。目录结构上YOLO 格式数据集的标准布局是dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml图片和标注文件一一对应images/train/下的IMG_0201_jpg.rf.e78bc8017dc0581c1b666a46022b43ac.jpg对应labels/train/IMG_0201_jpg.rf.e78bc8017dc0581c1b666a46022b43ac.txt。标注文件是纯文本每行一个目标格式为class_id x_center y_center width height其中坐标全部归一化到 0~1 之间。这是 YOLO 系列的标准输入格式YOLOv5、YOLOv8、YOLOv12 都能直接读取不需要额外转换。2.2 28 个类别怎么映射到模型输出数据集文档里列出的 28 个类别在data.yaml里会以列表形式出现。常见做法是# data.yaml path: ./dataset train: images/train val: images/val nc: 28 names: 0: Animal 1: Ashcan 2: Bicycle 3: Bus 4: Car 5: Closedoor 6: Escalato 7: Firehydrant 8: Humantrafficlights 9: Motorbike 10: Obstacle 11: Opendoor 12: Person 13: Pole 14: Pothole 15: Railing 16: Reflectivecone 17: Sphericalroadblock 18: Stairs 19: Stopsign 20: Streetsigns 21: Tactilepaving 22: Ticketbarrier 23: Trafficlights 24: Tricycle 25: Truck 26: Warningcolumn 27: Zebracrossing这里有几个参数需要留意。nc: 28是类别数必须和names列表长度一致否则训练时分类头维度对不上会直接报错。path建议写绝对路径或相对于训练脚本的路径YOLOv8 对相对路径的解析依赖当前工作目录容易翻车。train和val指向图片目录YOLO 会自动在同级labels/下找对应标注。类别命名里有两个值得注意的点Escalato看起来是Escalator的截断Humantrafficlights指的是交通指挥人员而非信号灯。这些命名不影响训练但如果你后续要做类别映射或可视化得按data.yaml里的实际字符串来别自己脑补全称。2.3 类别分布与场景覆盖的初步判断1154 张图、28 个类别平均每类约 41 张。但实际分布肯定不均匀——Car、Person、Trafficlights 这类常见目标会占大头Pothole、Tactilepaving、Ticketbarrier 这类长尾类别可能只有几十甚至十几个实例。训练前建议先跑一遍统计脚本import os from collections import Counter label_dir dataset/labels/train counter Counter() for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: cls_id int(line.strip().split()[0]) counter[cls_id] 1 for cls_id in sorted(counter.keys()): print(fclass {cls_id}: {counter[cls_id]} instances)这段代码遍历所有标注文件统计每个类别的实例数。跑完之后你会对哪些类需要过采样、哪些类可以适当降权有个底。如果某些类别实例数低于 50训练时建议开copy_paste或mosaic增强否则模型大概率学不动。3. 用 YOLOv8 跑通训练从 data.yaml 到第一轮推理3.1 环境准备与依赖安装YOLOv8 通过ultralytics包提供训练接口安装命令很直接pip install ultralytics如果你要用 GPU 训练确保 CUDA 版本和 PyTorch 匹配。常见做法是先装 PyTorch 再装 ultralyticspip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralyticscu118对应 CUDA 11.8如果你用的是 CUDA 12.x换成cu121。装完之后用yolo checks验证环境重点看 GPU 是否被识别、版本号是否匹配。3.2 训练脚本与关键参数下面是一个可以直接抄的训练脚本from ultralytics import YOLO # 加载预训练权重n 表示 nano 版本速度快适合快速验证 model YOLO(yolov8n.pt) # 开始训练 results model.train( datadataset/data.yaml, # 数据集配置文件路径 epochs100, # 训练轮数小数据集建议 100~200 imgsz640, # 输入分辨率YOLOv8 默认 640 batch16, # 批大小根据显存调整 device0, # GPU 编号CPU 训练写 cpu workers4, # 数据加载线程数 patience20, # 早停耐心值20 轮无提升则停止 saveTrue, # 保存 checkpoint projectruns/train, # 输出目录 nameauto_traffic, # 实验名称 pretrainedTrue, # 使用预训练权重 optimizerauto, # 自动选择优化器 lr00.01, # 初始学习率 lrf0.01, # 最终学习率因子 mosaic1.0, # mosaic 增强概率 mixup0.1, # mixup 增强概率 copy_paste0.1 # copy-paste 增强概率 )参数说明几个关键点。imgsz640是 YOLOv8 的标准输入尺寸如果你的图片分辨率远大于 640建议先缩放到 640 再训练否则显存占用会飙升。batch16在 8GB 显存上跑 YOLOv8n 基本够用如果 OOM 就降到 8。patience20对小数据集很重要——1154 张图很容易过拟合早停能帮你省时间。mosaic1.0和copy_paste0.1是针对小数据集的增强策略能显著提升长尾类别的召回。3.3 训练过程监控与日志解读训练启动后控制台会输出每轮的 loss 和 mAP。重点看三个指标box_loss是否稳定下降、cls_loss是否收敛、mAP50是否在涨。如果box_loss震荡剧烈通常是学习率太大或 batch 太小如果cls_loss不降可能是类别标注有问题或类别数配置错误。训练完成后runs/train/auto_traffic/weights/下会有best.pt和last.pt。best.pt是验证集 mAP 最高的 checkpoint推理时优先用它。验证集评估命令yolo val modelruns/train/auto_traffic/weights/best.pt datadataset/data.yaml这条命令会输出每个类别的 precision、recall 和 mAP。如果某些类别 mAP 为 0回去检查标注文件里有没有该类实例以及data.yaml的类别索引是否对得上。3.4 推理与结果可视化训练完之后拿几张验证集图片跑推理from ultralytics import YOLO model YOLO(runs/train/auto_traffic/weights/best.pt) results model.predict( sourcedataset/images/val, conf0.25, # 置信度阈值 iou0.45, # NMS IoU 阈值 saveTrue, # 保存可视化结果 projectruns/detect, nameval_results )conf0.25是默认值如果发现漏检多就降到 0.1误检多就升到 0.4。iou0.45控制 NMS 的合并力度密集场景可以适当调低。推理结果会保存在runs/detect/val_results/下直接看图片就能判断模型有没有学到东西。4. 避坑与排查28 类数据集训练时最容易翻车的五个地方4.1 类别索引错位导致 mAP 全零现象训练 loss 正常下降但验证集 mAP 始终为 0 或极低。原因data.yaml里的names列表顺序和标注文件里的class_id对不上。比如标注文件里Car是 4但data.yaml里第 4 个位置写的是Closedoor。解决用脚本统计标注文件里出现的所有class_id和data.yaml的names逐一对齐。如果发现标注里的最大class_id超过nc-1说明类别数配少了。4.2 图片和标注文件名不匹配现象训练时报No labels found或大量图片被跳过。原因YOLO 要求图片和标注文件同名扩展名不同。如果图片是IMG_0201_jpg.rf.xxx.jpg标注必须是IMG_0201_jpg.rf.xxx.txt。有些解压工具会改文件名或者标注文件被放在了错误的子目录。解决写个脚本检查images/train/下每张图是否在labels/train/下有同名.txt文件。缺失的要么补标注要么从训练集里剔除。4.3 长尾类别实例太少导致模型完全忽略现象训练完发现Pothole、Tactilepaving等类别的 mAP 为 0但Car、Person正常。原因这些类别在 1154 张图里可能只有十几个实例模型在损失函数里被常见类别主导直接学会了“不预测这些类”。解决开copy_paste增强或者手动对这些类别做过采样。另一个办法是先用全部数据训一版然后冻结 backbone只对长尾类别做微调。4.4 输入分辨率不匹配导致小目标漏检现象Trafficlights、Stopsign等小目标召回率很低。原因原图分辨率可能很高但训练时统一缩放到 640小目标在缩放后只剩几个像素特征提取器根本抓不到。解决把imgsz提到 1024 或 1280代价是显存占用和训练时间增加。如果显存不够可以用imgsz640但开multi_scale增强让模型见过不同尺度的目标。4.5 验证集泄露导致指标虚高现象验证集 mAP 很高但拿新图片推理效果很差。原因如果images/val/里的图片和images/train/有重叠或者验证集图片来自同一段视频的相邻帧模型相当于在“背答案”。解决检查训练集和验证集的图片哈希确保没有重复。如果数据来自视频抽帧按视频片段划分训练/验证集而不是随机划分。5. 进阶技巧用冻结训练和类别权重把 28 类小数据集榨干1154 张图、28 个类别这个数据量在目标检测里属于“刚够用”的级别。直接从头训容易过拟合我一般会走两阶段策略先冻结 backbone 训分类头再解冻全网络微调。第一阶段加载预训练权重后冻结前 10 层from ultralytics import YOLO model YOLO(yolov8n.pt) # 冻结 backbone 的前 10 层 for i, (name, param) in enumerate(model.model.named_parameters()): if i 10: param.requires_grad False model.train( datadataset/data.yaml, epochs30, imgsz640, batch16, lr00.001, # 冻结阶段学习率小一点 freeze10, # 显式告诉 YOLO 冻结前 10 层 projectruns/train, namestage1_freeze )冻结训练的目的是让分类头先适应 28 个新类别避免随机初始化的分类层在反向传播时把预训练好的特征提取器带偏。30 轮之后解冻全网络用更小的学习率微调model YOLO(runs/train/stage1_freeze/weights/best.pt) model.train( datadataset/data.yaml, epochs100, imgsz640, batch16, lr00.0005, # 微调阶段学习率减半 freeze0, # 解冻全部层 projectruns/train, namestage2_finetune )第二阶段的学习率要小因为预训练权重已经比较好了大步长容易破坏特征。freeze0表示不冻结任何层全网络参与更新。另一个技巧是给长尾类别加权重。YOLOv8 默认的分类损失是交叉熵常见类别会主导梯度。可以在data.yaml同级目录下放一个class_weights.txt每行一个权重值然后修改训练脚本里的损失计算。不过更简单的做法是直接用copy_paste增强让长尾类别在训练时出现频率更高。验证阶段除了看 mAP我还会单独统计每个类别的召回率from ultralytics import YOLO model YOLO(runs/train/stage2_finetune/weights/best.pt) metrics model.val(datadataset/data.yaml) # 打印每个类别的召回率 for i, name in enumerate(metrics.names): print(f{name}: recall{metrics.box.r[i]:.3f}, map50{metrics.box.ap50[i]:.3f})如果某个类别 recall 低于 0.3基本可以判定模型没学会要么补数据要么检查标注质量。我一般会把这个统计结果和训练日志放在一起看避免只看总体 mAP 被常见类别“平均”掉。从那以后我每次拿到新数据集都强制先跑一遍类别分布统计和文件名匹配检查再开始训练。这两步花不了十分钟但能省掉后面几小时的无效训练。希望帮到你。本文还有配套的精品资源点击获取
返回列表