ARTICLE DETAIL

资讯详情

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

自动驾驶多类交通车辆检测数据集:YOLO格式1251张图训练与调参实战

自动驾驶多类交通车辆检测数据集:YOLO格式1251张图训练与调参实战 简介这份自动驾驶多类交通车辆检测数据集面向自动驾驶感知、智能交通与计算机视觉方向的学习者和开发者提供可直接用于目标检测训练的道路场景样本。数据集共1251张图片按训练集1129张、验证集114张、测试集8张划分覆盖Bicycle、Bus、Car、Motorcycle、Truck五类交通参与者标注为YOLO格式含归一化中心坐标与边界框尺寸可无缝接入YOLO系列主流检测框架。资源包共2000个文件以1251个txt标注、747张jpg图像为主另含1个yaml配置与1份docx说明文档压缩包约68.64MB目录结构清晰便于按类别与划分快速检索。目前已有98人学习下载。借助该数据集读者可完成多类别车辆检测模型的训练与评估用于碰撞预警、盲区监测、交通流量统计等场景验证也可作为算法对比研究的标准化基准节省数据采集与标注成本。1. 拆开这份自动驾驶多类交通车辆检测数据集1251 张图能跑出什么如果你正在找一份能直接丢进 YOLO 训练、不用自己清洗标注、类别又刚好覆盖道路常见参与者的数据集这份自动驾驶多类交通车辆检测数据集值得先看一眼。它的核心价值不在于图片数量有多夸张而在于 1251 张道路场景图全部按 YOLO 格式标注完毕训练集 1129 张、验证集 114 张、测试集 8 张五类目标——Bicycle、Bus、Car、Motorcycle、Truck——正好卡在自动驾驶感知和智能交通管理最常落地的范围内。换句话说你拿到手就能开始跑 baseline而不是先花两天写脚本转格式。这份资源适合三类人一是做目标检测课程设计或毕设、需要快速出 mAP 曲线的学生二是想验证 YOLOv8/v11 乃至 v12 新结构在交通场景下表现的算法工程师三是做车载安全预警、交通流量统计这类应用、需要一个小规模但标注干净的验证集的开发者。它不解决“数据量够不够撑起量产模型”的问题但解决“我今晚就想看到检测框画在车上的效果”的问题。2. 从压缩包到训练入口目录结构、格式解析与最小可跑流程2.1 先看清压缩包里到底有什么拿到自动驾驶多类交通车辆检测数据集.zip之后别急着解压完就train。先确认目录层级因为 YOLO 格式对路径结构有硬性要求路径错一层训练脚本就会报No labels found。从项目正文给出的文件命名看图片是535_jpg.rf.638508aabd4df6c8057bd5bc3035ab9b.jpg这种“数字_jpg.rf.哈希.jpg”的形式这是典型的标注平台导出命名说明每张图都有对应的.txt标注文件且文件名主体一致。常见做法是解压后得到images和labels两个平级目录或者train/val/test下各自再分images、labels。我一般会先跑一条命令确认图片和标注数量是否对得上# 统计图片数量 find . -name *.jpg | wc -l # 统计标注数量 find . -name *.txt | wc -l # 检查是否有图片缺失对应标注以 images 目录为基准 for f in $(find images -name *.jpg); do base$(basename $f .jpg) if [ ! -f labels/${base}.txt ]; then echo 缺失标注: $f fi done逻辑说明前两条命令分别统计.jpg和.txt数量正常情况应该相等或标注略少背景图可以没有标注。第三条循环逐个检查图片是否有同名标注文件输出为空才说明配对完整。参数上注意如果你的目录是train/images结构把images和labels换成实际路径即可。这一步花两分钟能省掉后面半小时的排查。2.2 YOLO 标注格式到底怎么读这份数据集用的是 YOLO 格式每行一个目标格式为class_id x_center y_center width height后四个值都是归一化到 0~1 的相对坐标。类别索引从 0 开始按摘要里的顺序0 对应 Bicycle1 对应 Bus2 对应 Car3 对应 Motorcycle4 对应 Truck。这个映射关系必须写进你的data.yaml写错顺序模型学出来的类别就是乱的。我一般会抽一个标注文件看一眼确认坐标没有越界、类别没有超范围import os label_dir labels/train class_names [Bicycle, Bus, Car, Motorcycle, Truck] for txt in os.listdir(label_dir)[:5]: with open(os.path.join(label_dir, txt)) as f: for line in f: parts line.strip().split() cls_id int(parts[0]) coords list(map(float, parts[1:])) # 检查类别是否在范围内 assert 0 cls_id len(class_names), f类别越界: {txt} # 检查坐标是否归一化 assert all(0 c 1 for c in coords), f坐标越界: {txt} print(f{txt} - {class_names[cls_id]}: {coords})逻辑说明这段脚本遍历前 5 个标注文件逐行解析类别和坐标用assert做两项校验——类别索引不能超过 5 类坐标必须在 0 到 1 之间。如果报错说明标注文件有问题需要回头找数据源确认。参数上label_dir换成你的实际路径class_names的顺序必须和data.yaml里一致。这个检查跑一遍心里就有底了。2.3 写对 data.yaml 并跑通第一次训练YOLO 系列训练的第一步永远是data.yaml。这份数据集的五类目标、三个划分对应配置如下# data.yaml path: ./autodrive_dataset # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集图片相对路径 nc: 5 # 类别数 names: # 类别名称顺序必须与标注索引一致 0: Bicycle 1: Bus 2: Car 3: Motorcycle 4: Truck逻辑说明path是根目录train/val/test是相对于根目录的图片路径YOLO 会自动把images替换成labels去找标注。nc和names必须和标注文件里的类别索引严格对应这是最容易翻车的地方——很多人直接从别的项目复制data.yaml忘了改names结果训练 loss 正常下降但推理时类别全错。参数上如果你的目录结构是train/images而不是images/train把train的值改成train/images即可。配置写好后用 YOLOv8 跑一次最小训练yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs50 \ imgsz640 \ batch16 \ projectruns/train \ nameautodrive_baseline逻辑说明modelyolov8n.pt用预训练权重做迁移学习小数据集上比从头训收敛快得多。epochs50是起步值1251 张图的数据量50 轮大概十几分钟就能跑完取决于显卡。imgsz640是 YOLO 默认输入尺寸和大多数预训练权重匹配。batch16在 8GB 显存上比较稳显存不够就降到 8。跑完之后看runs/train/autodrive_baseline/results.csv重点看metrics/mAP50有没有到 0.5 以上到了说明数据管线和标注没问题可以往下调参。3. 五类目标检测的调参逻辑为什么 Car 好训、Bicycle 难训3.1 类别不平衡在交通场景里的真实表现这份数据集五类目标的分布大概率是不均匀的——Car 作为“最常见的乘用车辆”数量肯定远超 Bus 和 Truck。这种长尾分布直接导致模型对 Car 的检测精度很高但对 Bicycle、Motorcycle 这类小目标且样本少的类别召回率上不去。这不是数据集的质量问题而是真实道路场景的统计规律BDD100K 这类大型数据集也有同样的偏斜。应对思路有三条一是训练时用cls损失加权YOLOv8 支持通过cls_pw参数调整类别权重二是对少数类做过采样复制 Bicycle 和 Motorcycle 的图片到训练集三是用数据增强里的mixup和copy_paste让少数类目标出现在更多组合场景里。我一般先跑一版 baseline看results.csv里各类的instances和mAP再决定要不要动这些参数。import pandas as pd # 读取训练结果 df pd.read_csv(runs/train/autodrive_baseline/results.csv) # 查看最后 5 轮的各类 mAP cols [c for c in df.columns if mAP in c or instances in c] print(df[cols].tail())逻辑说明这段脚本读取 YOLO 训练输出的results.csv筛选出包含mAP和instances的列看最后几轮各类的表现。如果 Bicycle 的instances只有几十而 Car 有上千那类别不平衡就是主要矛盾。参数上tail()默认看最后 5 行也可以改成tail(10)看更多轮次。3.2 小目标检测Bicycle 和 Motorcycle 的边界框为什么容易丢Bicycle 和 Motorcycle 在道路场景里往往只占几十个像素尤其是远景或遮挡情况下。YOLO 的 640 输入尺寸下这些目标经过多次下采样后特征几乎消失漏检是常态。常见做法是把imgsz提到 1280或者用 YOLOv8 的 P2 检测头增加一个更高分辨率的特征层。但imgsz1280会让显存翻倍batch得降到 4 或 8。另一个容易被忽略的点是锚框尺寸。YOLOv8 是 anchor-free 的不需要手动设锚框但它的正样本匹配策略对小目标不够友好。如果 Bicycle 的 mAP 一直上不去可以试试在data.yaml里加overlap_maskFalse或者换用 YOLOv11 的small变体它在小目标上的改进比较明显。# 用更高分辨率训练针对小目标 yolo detect train \ datadata.yaml \ modelyolov8s.pt \ epochs100 \ imgsz1280 \ batch8 \ patience20 \ projectruns/train \ nameautodrive_1280逻辑说明imgsz1280让输入分辨率翻倍小目标保留更多像素信息。modelyolov8s.pt比n版容量大特征提取能力更强。batch8是因为 1280 分辨率下显存占用高8GB 卡上 8 比较稳。patience20表示 20 轮没有提升就早停避免过拟合。这版训练时间会比 640 长不少但 Bicycle 和 Motorcycle 的召回率通常有肉眼可见的提升。3.3 数据增强参数的取舍别把 Bus 增强成 TruckYOLOv8 默认开启mosaic、hsv、flip等增强。mosaic把四张图拼成一张能显著提升小目标检测但在这份数据集上有个坑如果拼进来的四张图里 Bus 和 Truck 混在一起模型可能学到“大车就是 Bus”这种错误关联。我一般会在训练后期关掉mosaic用close_mosaic10让最后 10 轮用原始图片微调。hsv_h、hsv_s、hsv_v控制色调、饱和度、亮度扰动默认值 0.015/0.7/0.4 对交通场景基本够用。但如果你发现模型在夜间或逆光图片上表现差可以把hsv_v提到 0.5增强亮度变化的鲁棒性。flipud垂直翻转默认关闭这是对的——道路场景里车不会倒着开开了反而引入噪声。yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ hsv_v0.5 \ close_mosaic10 \ projectruns/train \ nameautodrive_aug逻辑说明hsv_v0.5加大亮度扰动提升光照变化下的鲁棒性。close_mosaic10在最后 10 轮关闭 mosaic 增强让模型在真实分布上做最终收敛。这两个参数改动不大但在小数据集上往往能带来 1~2 个点的 mAP 提升。参数调整没有银弹跑完对比results.csv里的metrics/mAP50-95才知道有没有用。4. 避坑与排查标注、路径、显存这三处最容易翻车4.1 训练报 No labels found路径层级错位现象启动训练后立刻报No labels found in ...或者WARNING: No labels found训练 loss 一直是nan。原因YOLO 找标注的逻辑是“把图片路径里的images替换成labels后缀换成.txt”。如果你的目录是train/images/xxx.jpg它就会去找train/labels/xxx.txt。但很多人解压后目录是images/train/xxx.jpgYOLO 替换后变成labels/train/xxx.txt而实际标注在labels/train/下——路径对不上。解决先确认实际目录结构然后要么调整data.yaml里的train路径要么把目录改成 YOLO 期望的images/train和labels/train结构。我一般直接用ln -s建软链接不动原始文件# 假设原始结构是 images/train 和 labels/train # YOLO 期望 train/images 和 train/labels mkdir -p train ln -s ../images/train train/images ln -s ../labels/train train/labels4.2 类别索引错位mAP 正常但推理全错现象训练时mAP50能到 0.7 以上但推理时画出来的框类别标签全是乱的Car 被标成 Bus。原因data.yaml里的names顺序和标注文件里的class_id不对应。比如标注里 0 是 Bicycle但data.yaml里 0 写成了 Car。训练时模型学的是“索引 0 的特征”推理时按names映射自然全错。解决打开任意一个标注.txt看第一列的数字分布再对照data.yaml的names。这份数据集按摘要顺序是 0Bicycle、1Bus、2Car、3Motorcycle、4Truck。如果拿到的标注顺序不同以标注文件为准改data.yaml。改完重新训练别指望微调能救回来。4.3 显存溢出CUDA out of memory 的三种降级路径现象训练启动几秒后报CUDA out of memory或者跑到某个 batch 突然崩。原因batch或imgsz设太大超出显卡显存。1251 张图虽然不大但imgsz1280加batch16在 8GB 卡上必炸。解决按优先级降级——先把batch减半16→8→4再把imgsz从 1280 降到 640最后换更小的模型yolov8n代替yolov8s。还有一个隐藏选项是ampFalse关闭混合精度训练能省一点显存但速度会慢。我一般先用n版加batch8跑通确认流程没问题再往上加。4.4 验证集 mAP 波动大114 张图统计噪声现象训练过程中mAP50上下跳动这轮 0.65 下轮 0.58没有稳定上升趋势。原因验证集只有 114 张图样本量太小单张图的检测结果对整体 mAP 影响很大。这不是模型的问题是统计噪声。解决别盯着单轮 mAP 做决策看mAP50-95的滑动平均或者用patience让训练自己等。另外可以把验证集和训练集合并后重新划分用train_test_split做分层抽样保证每类在验证集里都有足够样本。但这份数据集的测试集只有 8 张建议只用来做最终 sanity check别用来调参。from sklearn.model_selection import train_test_split import os # 收集所有图片路径和类别标签以主类别为准 all_imgs [] all_labels [] for txt in os.listdir(labels/all): with open(flabels/all/{txt}) as f: classes [int(line.split()[0]) for line in f] all_imgs.append(txt.replace(.txt, .jpg)) all_labels.append(classes[0] if classes else -1) # 分层划分保证每类比例一致 train_imgs, val_imgs train_test_split( all_imgs, test_size0.15, stratifyall_labels, random_state42 ) print(f训练集: {len(train_imgs)}, 验证集: {len(val_imgs)})逻辑说明这段脚本用stratify按主类别分层抽样保证划分后每类在验证集里的比例和整体一致。test_size0.15对应约 187 张验证图比原来的 114 张更稳。random_state42固定随机种子保证可复现。跑完之后把新的文件列表写进data.yaml对应的.txt里即可。5. 用 8 张测试图做最终验证从预测可视化到部署前检查训练跑完、mAP 看着还行不代表模型能直接用。这份数据集的测试集只有 8 张正好拿来做过拟合检查和可视化验证。我一般会跑一遍yolo detect predict把预测结果和原图叠在一起看重点检查三类问题漏检的 Bicycle、误检成 Car 的 Truck、以及边界框明显偏移的情况。yolo detect predict \ modelruns/train/autodrive_baseline/weights/best.pt \ sourceimages/test \ conf0.25 \ saveTrue \ projectruns/predict \ nametest_vis逻辑说明conf0.25是置信度阈值低于这个值的框不显示。测试集上可以调低到 0.1 看召回调高到 0.5 看精度。saveTrue把画框后的图片存到runs/predict/test_vis。跑完打开图片如果 Bus 和 Truck 的框经常互换说明这两类在特征上区分度不够需要回头检查标注里有没有把 Truck 标成 Bus 的情况。还有一个部署前的习惯用model.val()在测试集上跑一次完整评估看mAP50-95和混淆矩阵。混淆矩阵能直接告诉你哪两类最容易混。如果 Bicycle 和 Motorcycle 的混淆严重考虑在推理后处理里加一个基于宽高比的规则过滤——Bicycle 的宽高比通常接近 1:2Motorcycle 更接近 1:1.5这个先验能救回一些错分。from ultralytics import YOLO model YOLO(runs/train/autodrive_baseline/weights/best.pt) metrics model.val(datadata.yaml, splittest) print(f测试集 mAP50: {metrics.box.map50:.4f}) print(f测试集 mAP50-95: {metrics.box.map:.4f}) # 打印混淆矩阵 print(metrics.confusion_matrix)逻辑说明model.val()加载最佳权重在data.yaml指定的测试集上跑评估。metrics.box.map50是 IoU0.5 时的 mAPmap是 0.5 到 0.95 的平均。confusion_matrix是一个 6x6 矩阵5 类加背景对角线是正确分类非对角线是混淆。如果 Truck 那一行在 Bus 列有高值说明模型把 Truck 误判成 Bus需要针对性补充 Truck 的难例。从那以后我每次拿到新数据集都强制走一遍“数量配对检查 → 标注格式校验 → data.yaml 类别对齐 → baseline 训练 → 测试集可视化”这五步少一步后面就可能多花两小时排查。这份自动驾驶多类交通车辆检测数据集的结构清晰、标注规范五类目标的划分也贴合实际道路场景作为目标检测的入门到进阶练手资源是够用的。希望帮到你。本文还有配套的精品资源点击获取
返回列表