YOLO车辆检测数据集:1254张真实交通图像+五类精细标注
简介本资源是一套开箱即用的YOLO格式车辆目标检测数据集面向计算机、电子信息工程及数学等专业的本科生与研究生适用于课程设计、期末大作业及毕业设计中的目标检测模型训练任务。数据集共1254张真实场景车辆图像jpg每张图均配有对应YOLO标签文件txt涵盖Ambulance、Bus、Car、Motorcycle、Truck五类常见车辆另含数据集配置yaml文件与labels.cache索引文件结构规范、标注准确可直接导入YOLOv5/v8等主流框架开展训练与验证。资源包总计2513个文件大小为38.48MB轻量易下载适配教学与实验环境。目前已有9181人学习下载配套作者为具备十年算法仿真经验的大厂资深工程师所整理数据集经过实际项目验证省去数据采集、标注与格式转换环节显著降低入门门槛提升模型训练效率与复现可靠性。1. 这不是“拿来就能训”的数据集而是1254张真实交通场景图像YOLO格式全标注的车辆检测开箱即用包Ambulance/Bus/Car/Motorcycle/Truck五类精细划分专为课程设计、毕设和快速验证YOLOv5/v8/v10模型而生你可能已经试过从网上爬图、用LabelImg手动标了三天三夜最后发现漏标了37辆停在树荫下的摩托车也可能刚跑完YOLOv8训练mAP卡在0.42死活上不去回头一查——标注文件里把“Truck”错写成“Truk”类别ID映射全乱了。这个资源不是“又一个数据集”它是经过工业级清洗的真实交通图像集合1254张来自城市主干道、高速匝道、停车场、夜间低照度路段的原始JPG每张都配有一个严格遵循YOLOv5规范的.txt标注文件非XML或JSON中转五类车辆标签Ambulance、Bus、Car、Motorcycle、Truck全部按0~4顺序编号classes.txt明确定义train/val/test划分已预置80%/10%/10%连dataset.yaml都帮你写好了。它不解决“如何从零构建数据集”的学术问题但能让你在2小时内完成从解压到验证推理的全流程闭环——对电子信息工程课设要交Demo、数学系毕设需可视化结果、计算机专业赶DDL调参的同学来说省下的不是时间是避免因数据环节翻车导致答辩被问“你这框怎么飘得比救护车还快”的后悔药。2. 解压即用从RAR包到YOLO训练目录结构的标准化重建含自动校验脚本2.1 文件结构还原为什么不能直接解压就扔进YOLO训练器原始RAR包内文件名看似杂乱如676c200e4e2eb0d3_jpg.rf.hhzXrQrPncANw7KFWlnN.jpg实则暗含工程化命名逻辑前缀676c200e4e2eb0d3为MD5哈希去重标识rf.后为随机扰动字符串防缓存冲突。若直接解压到datasets/vehicles/下YOLO训练器会因路径层级缺失报错FileNotFoundError: No such file or directory: datasets/vehicles/images/train/xxx.jpg。必须重建标准YOLO目录树# 创建标准YOLO目录结构 mkdir -p datasets/vehicles/{images/{train,val,test},labels/{train,val,test},classes} # 将原始RAR解压出的所有.jpg和.txt文件分类移动 # 假设解压到 ./raw_vehicle_data/ 目录 find ./raw_vehicle_data -name *.jpg | head -n 1000 | xargs -I {} cp {} datasets/vehicles/images/train/ find ./raw_vehicle_data -name *.jpg | tail -n 125 | xargs -I {} cp {} datasets/vehicles/images/val/ find ./raw_vehicle_data -name *.jpg | tail -n 125 | xargs -I {} cp {} datasets/vehicles/images/test/ # 同步移动对应.txt标注文件关键文件名必须完全一致仅扩展名不同 for img in datasets/vehicles/images/train/*.jpg; do base$(basename $img .jpg) cp ./raw_vehicle_data/${base}.txt datasets/vehicles/labels/train/${base}.txt 2/dev/null || echo Missing label for $base done # 对val/test同理操作此处省略重复命令实际需执行提示cp命令后加2/dev/null是为了屏蔽“文件不存在”的报错因为原始包中部分图像可能无对应标注实际该数据集1254张图全部有标注此为通用健壮性写法。真正关键的是base$(basename $img .jpg)——它确保.txt文件名与.jpg严格匹配YOLO读取时才不会因大小写或空格错位导致label not found。2.2 classes.txt与dataset.yaml五类车辆的ID映射必须零误差YOLO系列模型依赖classes.txt定义类别顺序dataset.yaml声明路径与类别数。该数据集已提供classes.txt内容为Ambulance Bus Car Motorcycle Truck对应ID为0,1,2,3,4。若你自行修改类别顺序如把Car提到第一行模型输出的pred[0]将误判为Ambulance而非Car——这是毕设答辩时最常被导师揪住的硬伤。dataset.yaml标准模板如下train: ../datasets/vehicles/images/train val: ../datasets/vehicles/images/val test: ../datasets/vehicles/images/test nc: 5 names: [Ambulance, Bus, Car, Motorcycle, Truck]参数说明nc: 5必须与classes.txt行数严格一致names列表顺序必须与classes.txt逐行对应路径使用../相对引用适配YOLO官方仓库默认结构如yolov8/train.py所在目录为根。若你用Ultralytics官方库此文件必须放在datasets/vehicles/同级目录否则--data datasets/vehicles/dataset.yaml会找不到配置。2.3 自动校验脚本3分钟确认数据集完整性避免训练中途崩溃训练到第50个epoch突然报错IndexError: list index out of range大概率是某张图的.txt里写了5超出0~4范围或坐标值为负。我写了一个校验脚本运行后直接输出问题文件清单# validate_dataset.py import os import numpy as np def check_label_file(txt_path, img_width1920, img_height1080): try: with open(txt_path, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) 5: return f{txt_path}: line {i1} has less than 5 values try: cls_id int(parts[0]) if cls_id 0 or cls_id 4: return f{txt_path}: class ID {cls_id} out of [0-4] at line {i1} x, y, w, h map(float, parts[1:5]) if x 0 or y 0 or w 0 or h 0 or x 1 or y 1 or w 1 or h 1: return f{txt_path}: invalid normalized coord at line {i1} except ValueError: return f{txt_path}: non-numeric value at line {i1} except Exception as e: return f{txt_path}: read error - {str(e)} return None # 遍历所有labels目录 label_dirs [datasets/vehicles/labels/train, datasets/vehicles/labels/val, datasets/vehicles/labels/test] errors [] for d in label_dirs: for f in os.listdir(d): if f.endswith(.txt): err check_label_file(os.path.join(d, f)) if err: errors.append(err) if errors: print(❌ 发现以下标注错误) for e in errors[:10]: # 只显示前10个避免刷屏 print(e) print(f\n共发现{len(errors)}处错误请修正后重试) else: print(✅ 所有标注文件通过校验)运行python validate_dataset.py若输出✅ 所有标注文件通过校验说明数据集可直接喂给YOLO训练器——这是比盲目启动训练更省时间的必做动作。3. 训练实操YOLOv8/v10双版本命令与关键参数调优附mAP提升3.2%的实测技巧3.1 YOLOv8训练命令从零开始的最小可行配置Ultralytics YOLOv8是当前课程设计最友好的版本安装后一行命令即可启动# 安装若未安装 pip install ultralytics # 启动训练GPU可用时自动启用 yolo train datadatasets/vehicles/dataset.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namevehicles_v8n \ exist_okTrue参数说明modelyolov8n.pt选用nano轻量级预训练模型适合学生机GTX1650/RTX3050若显存≥8GB可换yolov8s.ptsmall提升精度imgsz640输入尺寸该数据集原始图像多为1920×1080缩放至640×360后仍保留足够车辆细节batch16根据显存调整1650建议用83060可用164090可用32exist_okTrue避免每次训练新建文件夹便于覆盖调试。训练完成后权重保存在runs/detect/vehicles_v8n/weights/best.pt可直接用于推理yolo predict modelruns/detect/vehicles_v8n/weights/best.pt \ sourcedatasets/vehicles/images/val/ \ conf0.25 \ save_txtTrue \ save_confTrue3.2 YOLOv10训练命令新架构下的精度跃迁需手动适配YOLOv102024年CVPR提出取消NMS后处理速度提升23%但官方尚未集成到Ultralytics。需克隆原作者仓库并修改数据加载器git clone https://github.com/THU-MIG/yolov10.git cd yolov10 # 修改 yolov10/data/datasets.py 中的类别数 # 将 nc80 改为 nc5并同步更新类别名列表 sed -i s/nc80/nc5/g yolov10/data/datasets.py # 替换类别名此处需手动编辑不能用sed一键替换 # 在 datasets.py 中找到 names [...] 行改为 names [Ambulance,Bus,Car,Motorcycle,Truck]训练命令变为python train.py --data datasets/vehicles/dataset.yaml \ --weights yolov10n.pt \ --cfg models/yolov10n.yaml \ --epochs 100 \ --batch-size 16 \ --img 640 \ --name vehicles_v10n关键差异YOLOv10的--cfg必须指定模型结构文件yolov10n.yaml且dataset.yaml中nc字段必须与代码中nc严格一致否则报错AssertionError: nc mismatch。实测在相同硬件下YOLOv10n比YOLOv8n的val mAP0.5:0.95高3.2个百分点0.612 → 0.644但训练时间增加18%。3.3 提升mAP的三个血泪经验非玄学可复现学习率冷启动Learning Rate WarmupYOLOv8默认lr00.01但小数据集易震荡。在train.py中添加warmup# 在optimizer定义后插入 lf lambda x: (1 - x / epochs) * (1.0 - 0.01) 0.01 # linear scheduler lr_scheduler.LambdaLR(optimizer, lr_lambdalf)效果mAP提升0.8%收敛更稳。Mosaic增强强度调低原始Mosaic将4图拼接但在车辆密集场景如公交站易造成边界模糊。将mosaic0.5默认1.0改为mosaic0.3减少伪影。类别权重平衡统计发现Car样本占62%Ambulance仅占3.1%。在dataset.yaml中添加class_weights: [1.0, 1.0, 0.6, 1.5, 1.0] # Car权重降低Motorcycle权重提高实测使Motorcycle召回率从0.53→0.67整体mAP1.1%。4. 避坑指南五个让课程设计当场翻车的标注与训练陷阱现象→原因→解决4.1 现象训练loss降为0但验证mAP始终为0原因dataset.yaml中train路径写成绝对路径如/home/user/datasets/...而服务器环境路径不同YOLO读取为空数据集训练在空数据上拟合出loss0假象。解决全部使用相对路径且dataset.yaml与训练脚本在同一父目录下用ls -l $(cat dataset.yaml | grep train | awk {print $2})验证路径是否真实存在。4.2 现象推理结果框全是虚线且坐标超出图像边界原因标注文件.txt中坐标未归一化应为0~1之间的小数而是用了像素绝对值如x850 y420 w320 h210。YOLO要求x,y,w,h为相对于图像宽高的比例。解决用脚本批量转换以640x640为例for f in labels/train/*.txt; do sed -i s/^0 \(.*\) \(.*\) \(.*\) \(.*\)$/0 \1\/640 \2\/640 \3\/640 \4\/640/ $f # 实际需用awk计算此处为示意 done更稳妥做法用labelImg重新导出YOLO格式勾选“Normalize coordinates”。4.3 现象训练报错CUDA out of memory即使batch1原因图像中存在超大分辨率图如3840×2160YOLO自动缩放时显存暴涨。检查datasets/vehicles/images/train/中最大尺寸identify -format %wx%h\n datasets/vehicles/images/train/*.jpg | sort -tx -k1,1nr -k2,2nr | head -n1解决用ImageMagick批量压缩mogrify -resize 1920x1080\ datasets/vehicles/images/train/*.jpg # \ 表示只缩放超限图不缩小已达标图4.4 现象val集mAP远高于test集怀疑过拟合原因val和test划分未打乱test集中恰好包含大量夜间图像该数据集夜间图集中在文件名含night的批次而val集全是白天图。解决重划数据集用Python脚本按文件名哈希均匀分配import hashlib files sorted(glob(images/*.jpg)) test_files [f for f in files if int(hashlib.md5(f.encode()).hexdigest()[:4], 16) % 10 1] # 10% test4.5 现象confusion_matrix.png中Motorcycle列全黑原因classes.txt里写的是motorcycle小写但标注文件中写的是Motorcycle首字母大写YOLO加载时将两类视为不同ID导致ID3的预测全部失败。解决统一文本编码格式用iconv -f GBK -t UTF-8转码并用sed -i s/motorcycle/Motorcycle/g classes.txt全局修正。5. 模型部署与跨平台验证从PyTorch权重到ONNX再到树莓派实时检测含FPS实测对比表5.1 导出ONNX模型为嵌入式部署铺路YOLOv8训练出的.pt权重需转ONNX才能部署到Jetson或树莓派。注意两个致命细节# 正确导出命令关键--dynamic, --simplify yolo export modelruns/detect/vehicles_v8n/weights/best.pt \ formatonnx \ imgsz640 \ dynamicTrue \ simplifyTrue \ opset12避坑点dynamicTrue否则ONNX输入尺寸固定无法适配不同分辨率摄像头opset12树莓派OpenCV 4.5仅支持ONNX opset 11~12用13会报错Unsupported opset versionsimplifyTrue否则ONNX文件含冗余算子树莓派解析失败。导出后得到best.onnx用Netron打开可验证输入节点名为images输出为output01,25200,6——252003×(80×8040×4020×20)为YOLOv8的anchor-free输出头。5.2 树莓派4B部署实测OpenCV DNN模块加载ONNX树莓派需安装OpenCV 4.5.5系统源版本太低# 卸载旧版 sudo apt remove python3-opencv # 编译安装耗时约2小时 wget https://github.com/opencv/opencv/archive/4.5.5.tar.gz tar -xzf 4.5.5.tar.gz cd opencv-4.5.5 mkdir build cd build cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D OPENCV_DNNON \ -D WITH_V4LON .. make -j4 sudo make install推理代码pi_detect.pyimport cv2 import numpy as np net cv2.dnn.readNetFromONNX(best.onnx) cap cv2.VideoCapture(0) # USB摄像头 while True: ret, frame cap.read() if not ret: break # 预处理BGR→RGB→归一化→NHWC→NCHW blob cv2.dnn.blobFromImage(frame, 1/255.0, (640,640), swapRBTrue, cropFalse) net.setInput(blob) outputs net.forward() # shape: (1, 25200, 6) # 后处理过滤置信度0.5的框 boxes, confs, classes [], [], [] for detection in outputs[0]: conf detection[4] if conf 0.5: x, y, w, h detection[0:4] * np.array([frame.shape[1], frame.shape[0], frame.shape[1], frame.shape[0]]) x1, y1 int(x-w/2), int(y-h/2) boxes.append([x1,y1,int(w),int(h)]) confs.append(float(conf)) classes.append(int(detection[5])) # NMS去重 indices cv2.dnn.NMSBoxes(boxes, confs, 0.5, 0.4) for i in indices: x,y,w,h boxes[i] cv2.rectangle(frame, (x,y), (xw,yh), (0,255,0), 2) cv2.putText(frame, f{[Ambulance,Bus,Car,Motorcycle,Truck][classes[i]]}:{confs[i]:.2f}, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imshow(Vehicle Detection, frame) if cv2.waitKey(1) ord(q): break cap.release() cv2.destroyAllWindows()5.3 FPS实测对比表不同平台与模型的性能边界平台模型输入尺寸平均FPS备注RTX3060笔记本YOLOv8n.pt640×640128GPU满载功耗75WJetson OrinYOLOv10n640×64042INT8量化后达61FPS树莓派4B 4Gbest.onnx640×6403.7OpenCV DNNCPU占用92%树莓派5 8Gbest.onnx640×6408.2同配置下性能提升120%关键结论树莓派4B跑YOLOv8 ONNX是可行的3FPS满足基础监控但必须关闭桌面环境sudo systemctl set-default multi-user.target否则GUI抢占CPU导致FPS跌至1.2。树莓派5的PCIe Gen2带宽提升是FPS翻倍的主因而非CPU频率。从那以后我每次给学生调试毕设都会先让他们跑一遍validate_dataset.py再强制用yolo train --dry-run干运行检查数据加载是否成功——这两步花不了5分钟却能避开80%的“训练不动”问题。希望帮到你。本文还有配套的精品资源点击获取