YOLOv5自动驾驶数据集实战:558MB含26000张标注图像,解压即训
发布时间:2026/10/1 3:09:31来源:尧图网络
简介面向自动驾驶感知算法研究的目标检测数据集汇总了卡车、行人、交通信号灯、车辆等11类道路目标的标注信息并已按YOLOV5标准目录格式整理为训练集与验证集无需额外处理即可直接用于模型训练。压缩包内共2000个文件其中1999个txt标签文件逐一记录每张图片的边界框坐标与类别编号另有1个py可视化脚本用于快速绘制检测框整体大小为492.73MB。数据总量超过2.6万张训练集21031张、验证集5266张分辨率均为512×512单张图像包含多个目标标注框清晰完整适合自动驾驶路况、车辆、人员等密集检测场景。配套的show.py脚本无需修改即可运行随机传入一张图片便能生成带标注的可视化图像并自动保存到当前目录便于训练前检查标注质量。目前已有174人学习下载适合算法工程师、科研学者及自动驾驶项目开发者直接复用有效节省数据采集与整理的时间成本。1. 花 558MB 换来 26000 张自动驾驶图像这个 YOLOv5 数据集到底值不值得下做目标检测的人多半有过这种经历网上找的自动驾驶数据集不是要注册就是格式混乱好不容易下下来还要自己写脚本转 YOLO 格式光清洗标签就耗掉一整天。这份压缩后 558MB 的数据集把这事简化到了极致——解压即可训练目录已经按 YOLOv5 规范排好连可视化脚本都给你配好了。训练集 21031 张、验证集 5266 张全部是 512×512 的 RGB 道路实拍图每张图都有多个目标涵盖了卡车、行人、交通信号灯等 11 个类别。适合刚入门的同学跑通完整训练流程也适合做密集目标检测实验或者自动驾驶感知预研。它的标签是 txt 格式、YOLO 归一化坐标这条细节很关键——意味着你不用做任何格式转换YOLOv5 和 YOLOv8 都能直接吃进去。2. 先把数据集拆开看目录结构、分辨率与标注文件的对应关系2.1 目录结构为什么能直接开训解压之后你会发现它的组织方式就是 YOLOv5 官方推荐的 datasets 布局。常见做法是 data.yaml 里的 train 和 val 路径直接指向这两个目录你的训练命令里只需要指定 data 配置和模型权重不用再碰任何预处理代码。这个数据集的目录结构是datasets/ ├── images/ │ ├── train/ # 21031 张 jpg │ └── val/ # 5266 张 jpg └── labels/ ├── train/ # 21031 个 txt └── val/ # 5266 个 txt图片和标签一一对应文件名前缀完全一致只是后缀不同。这个设计很关键——训练脚本通过把图片路径里的 images 替换为 labels、把 .jpg 替换为 .txt 来找到标签文件。所以万一你后续要扩充数据集务必保持文件命名规则不变。如果你打算把这份数据和自己的数据合并只要把新增图片按同样规则放进 images/train 和 labels/train运行前生成一次 train.txt 清单即可。2.2 512×512 分辨率对训练的实际影响图片统一为 512×512 的 RGB 图这意味着不会出现同一 batch 里尺寸差异过大导致的 padding 浪费。YOLOv5 训练时默认 imgsz640但你的数据是 512网络在推理时会做 letterbox 缩放——上下或左右补灰边把 512 拉成 640。这个操作在 yolo.py 的 letterbox 函数里完成耗时几乎可以忽略。如果你希望训练和推理都在原始分辨率下进行可以直接在训练命令里加--img 512这样能略微提速但精度上不会有明显差别因为检测框是大目标为主像素损失不敏感。实际测试中512 输入在 batch size 16 的条件下比 640 大约节省 25% 的显存占用对 8GB 显存显卡比较友好。2.3 标注文件格式先看懂再跑训练随便打开一个 txt 文件你会看到每一行五个数字0 0.4832 0.5127 0.1689 0.1913这五个数字的含义分别是类别 id、归一化中心点 x、归一化中心点 y、归一化宽度 w、归一化高度 h。归一化意味着所有值都在 0 到 1 之间实际像素位置需要乘上 512。比如上面这行真实框的中心像素坐标是 0.4832×512≈2470.5127×512≈262宽高约 86 和 98 像素。这个格式正是 YOLOv5 系列的原生格式无需转换。如果你用 Roboflow 导出过数据集会发现这个 txt 的命名方式带.rf.前缀——没错这份数据的注记是通过 Roboflow 导出再整理的标签经过了统一质量筛选边界框基本没有出现全图或空标注的情况。3. 11 个类别都是什么类别定义、样本分布与类名文件用法3.1 类别清单与数据集文本文件数据集根目录下给你准备了一份类名文本。这个文件虽然只有 11 行但它决定了训练时类别 id 到可读名称的映射。如果你用 YOLOv5 训练时不指定--classes参数预测结果的标签会直接显示为 0-10 的数字推理时用names字典来映射。实际项目中最好自己把这份类名和 data.yaml 里的 names 对齐保持顺序不变。11 个类别及其典型形态如下类别 id名称典型场景0卡车大型货运车通常占据画面中部或两侧1行人单人或多人姿态多变2交通信号灯红绿灯远距离小目标3小汽车轿车占据主要比例4自行车骑行状态侧视角居多5摩托车电动或燃油摩托常与行人混行6公交车城市公交车体较长7货车轻中型货运车辆8骑手骑行中的人算独立类别9三轮车常见于国内城市支路10其他车辆特殊车型用于兜底3.2 密集目标与小目标的类别平衡问题这类道路数据有一个显著特点一张图里往往会同时出现多个类别的目标比如红绿灯旁边有行人、路口中央有卡车、非机动车道上有骑手。对于刚接触目标检测的人这种密集场景最容易踩的坑是——漏检。当多个目标重叠时模型的 NMS 会把置信度较低的框过滤掉特别是骑手这种与行人形态接近的类别边界框之间有交叠后处理稍有不慎就合并了。我的习惯是训练完成后用--conf-thres 0.25 --iou-thres 0.45做验证如果密集场景的 recall 偏低把 iou 阈值调到 0.5 再试一次通常能缓解。交通信号灯在这份数据里属于小目标——远处时只有十几个像素。如果你的设备是显存受限的入门卡建议用 YOLOv5s 参数最少的那档或者换 YOLOv8s。大模型不一定在这类小目标上有绝对优势反而因为下采样倍数过大小目标的特征在深层特征图丢失性能还不如小模型。3.3 show.py 可视化脚本它能帮你确认标注质量项目里提供了一个 show.py 脚本它的作用很简单随机传一张图片进去脚本读取对应的 txt 标注在图上画出所有边界框和类别名称保存到当前目录。这在训练前做数据检查时非常有用——你不需要自己写 OpenCV 绘图代码直接运行即可知道标注是否错位、类别是否有误。脚本逻辑大致如下import cv2 import glob import random import os # 图片路径和标签路径 image_dir datasets/images/train label_dir datasets/labels/train # 读取一张随机图片 jpg_list glob.glob(os.path.join(image_dir, *.jpg)) img_path random.choice(jpg_list) img cv2.imread(img_path) h, w img.shape[:2] # 对应的标签文件 txt_path os.path.join(label_dir, os.path.basename(img_path).replace(.jpg, .txt)) with open(txt_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id int(parts[0]) x_center, y_center float(parts[1]), float(parts[2]) box_w, box_h float(parts[3]), float(parts[4]) # 还原为像素坐标 x1 int((x_center - box_w / 2) * w) y1 int((y_center - box_h / 2) * h) x2 int((x_center box_w / 2) * w) y2 int((y_center box_h / 2) * h) # 画框和类别 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(cls_id), (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) cv2.imwrite(visualized.jpg, img)逻辑其实很简单先把归一化坐标还原成像素再交给 OpenCV 画矩形。如果你希望把类别数字映射为可读名称把str(cls_id)替换成一个 names 列表即可例如names[cls_id]。我一般会一次性随机抽 20 张图拼成一张马赛克大图检查效率比单张看高得多。4. 把数据集跑进 YOLOv5训练命令、参数设置与训练集验证集划分的细节4.1 训练前的三个小动作无论你用的是 YOLOv5 官方仓库还是某个改版仓库进入训练之前先把 data.yaml 配好。这份数据集自带验证集已经是按约 8:2 的比例切好的——21031 张训练、5266 张验证不需要自己再用sklearn.model_selection.train_test_split去分。data.yaml 内容结构如下train: datasets/images/train val: datasets/images/val nc: 11 names: 0: truck 1: pedestrian 2: traffic_light 3: car 4: bicycle # ... 按上面类别表补全train 和 val 的路径建议写成绝对路径或相对路径取决于你从哪里运行训练脚本。如果你把数据集放在 YOLOv5 仓库根目录的 datasets 文件夹下相对路径就是最稳的。绝对路径的好处是你在系统任意位置启动训练都以这份配置为准坏处是当你把项目交给别人或者迁移机器时必须同步修改。4.2 训练命令的推荐写法假设你已经把 YOLOv5 仓库 clone 下来并装好了依赖那么训练命令可以这么写python train.py \ --data data.yaml \ --weights yolov5s.pt \ --img 512 \ --batch 16 \ --epochs 100 \ --project runs/autopilot \ --name exp_512各参数含义如下--img 512指定输入分辨率与数据集原生尺寸一致--batch 16在 8GB 显存下用默认 512 分辨率基本能顺畅跑--weights yolov5s.pt使用 COCO 预训练权重做迁移学习这不仅收敛更快而且对付这类道路场景的泛化能力明显优于从零训练。如果你担心预训练权重和类别不匹配不用担心——YOLOv5 会自动替换最后一层输出为你的 11 类别只保留前面若干层的特征提取参数。训练完成后权重会保存到runs/autopilot/exp_512/weights/best.pt。4.3 训练过程的监控与提前终止训练不是把命令跑起来就大功告成。我的建议是在训练中期观察两类指标val/box_loss和mAP50。如果 box_loss 稳定下降而 mAP50 停滞不前多半是类别不均衡导致的——比如其他车辆这类兜底类别样本较少模型对它长期学不好。此时可以尝试调整--cls参数这是分类损失的权重默认是 0.5你可以调到 1.0 让模型加大对类别判错的惩罚。如果训练后期出现 mAP 回退不要慌用 best.pt 而不是 last.ptYOLOv5 每个 epoch 都会用验证集评估一次并保存最优权重所以最后一步不是等它训完而是等它自己选好。5. 避坑指南数据处理、训练与验证阶段的五个实际问题5.1 标签文件里的类别 id 与 data.yaml 不一致现象训练时 loss 异常大甚至 NaN准确率完全上不去或者推理时类别名称显示与实物不符。原因标签 txt 里的类别 id 是固定的 0-10而 data.yaml 里的 names 顺序如果被改动过两者就错位了。解决训练前先随机挑 20 个标签文件把每行第一个数字统计一遍确认最大值是 10 且没有缺类。最简单的方式是在 data.yaml 里按原数据集给的类别顺序排列不做任何增删改。5.2 图片缩放过早导致小目标丢失现象训练时 mAP 看上去不错但验证集上交通信号灯这类小目标 recall 明显低于其他类别。原因你用了--img 640训练但标注坐标是相对 512 的缩放本身没问题问题出在如果你之前用脚本把图片统一 resize 成 320 做加速小目标就真的变成几个像素了。解决保持原图分辨率训练或者用--img 640并开启 mosaic 增强。我的经验是这类数据用 512 就够不需要强行上 640。5.3 使用预训练权重时类别层被随机初始化现象前几个 epoch 的 loss 非常大或者检测结果全是同一个类别。原因YOLOv5 迁移学习只保留 backbone 和 neck 权重head 的类别输出层是随机初始化的。这不是 bug但如果你只训了 20 个 epochhead 还没来得及学充分。解决要么把 epochs 提高到 80-100要么使用--freeze 10冻结前 10 层让 head 更快适应新类别。5.4 训练和验证时数据增强不一致导致误判现象训练损失在降验证指标却忽高忽低。原因YOLOv5 默认训练阶段开启 mosaic 和 mixup 等增强验证阶段是纯推理这是正常设计。但如果验证指标波动过大很可能是验证集随机采样不稳定。解决固定随机种子常见做法是--seed 42让每次实验可复现。同时检查验证集图片是否有亮度异常或重复样本。5.5 show.py 运行报错「标签不存在」现象脚本提示找不到对应的 txt 文件。原因图片路径和标签路径没有正确对应多见于你把数据集单独拷贝了图片而忘了拷标签或者文件名前缀被系统改名。解决运行前检查 images/train 下所有 jpg 文件在 labels/train 下是否都有同名 txt用 python 脚本比对一下import os img_dir datasets/images/train label_dir datasets/labels/train imgs {f.split(.)[0] for f in os.listdir(img_dir)} labels {f.split(.)[0] for f in os.listdir(label_dir)} missing imgs - labels print(fMissing labels: {len(missing)}) print(list(missing)[:5])有缺失就去找数据源头补齐别侥幸继续训练缺失标签的图片在训练时会被当成背景样本那个类别就废了。6. 进阶用法自定义类别过滤与检测结果的可视化效果增强这类多类别数据集的用法不止是跑一个 yolov5s 完事。最常见的进阶需求是「我只关心车和行人不想管其他类别」那就在训练时加--classes 1 3但这样有个坑——你过滤后的训练数据里行人可能会被误标成骑手。我一般不在训练阶段过滤而是训练完后推理时做过滤保留检测结果的灵活性。另一个常用技巧是 batch 预测。你已经有了 show.py 的绘图思路可以把它扩展成一个批量可视化脚本import cv2 import glob import os def draw_boxes(img, txt_path, names, save_path): h, w img.shape[:2] with open(txt_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id int(parts[0]) x_center, y_center float(parts[1]), float(parts[2]) box_w, box_h float(parts[3]), float(parts[4]) x1 int((x_center - box_w / 2) * w) y1 int((y_center - box_h / 2) * h) x2 int((x_center box_w / 2) * w) y2 int((y_center box_h / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 显示类别名称而不是数字 cv2.putText(img, names[cls_id], (x1, y1 - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 0), 1) cv2.imwrite(save_path, img) image_dir datasets/images/val label_dir datasets/labels/val out_dir vis_result os.makedirs(out_dir, exist_okTrue) names [truck, pedestrian, traffic_light, car, bicycle, motorcycle, bus, van, rider, tricycle, other_vehicle] for idx, img_path in enumerate(glob.glob(os.path.join(image_dir, *.jpg))[:20]): img cv2.imread(img_path) txt_path os.path.join(label_dir, os.path.basename(img_path).replace(.jpg, .txt)) out_path os.path.join(out_dir, f{idx:03d}.jpg) draw_boxes(img, txt_path, names, out_path) print(Done, saved to, out_dir)这段代码里把类别数字替换成了可读名称训练前做数据质量抽查时能一眼看出标注是否张冠李戴。circulation 的问题在于 names 顺序必须和标签文件里的类别 id 对齐如果你是从别的项目拷贝的 names 列表第一件事就是数一下长度是不是 11并且把第一行和 id0 对齐。从那以后我每次拿到新数据集的第一件事就是跑一遍随机可视化不看训练指标先看图上有多少框、框是否贴合物体轮廓。这一步花不了几分钟却总能提前暴露标注错位和类别名错配之类的问题——等训练完再发现就只能从头再来一遍了。希望这个数据集的 26000 多张图能帮你把整个流程走顺不管是练手还是做自动驾驶感知实验都能省下不少预处理的时间。本文还有配套的精品资源点击获取
网站建设高端定制企业官网