news 2026/10/13 0:17:47

337张街景车辆YOLO数据集:小型车/自行车/公交车/卡车四类开箱即用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
337张街景车辆YOLO数据集:小型车/自行车/公交车/卡车四类开箱即用

简介:本资源是一套专为YOLO系列目标检测算法(支持YOLOv5/v7/v8/v9/v10/v11)定制的轻量级车辆检测数据集,面向计算机视觉初学者、模型训练实践者及边缘部署开发者,解决小规模场景下多类车辆识别的数据基础问题。压缩包共1012个文件,含337张带标注的JPG图像、对应337个YOLO格式(txt)与337个VOC格式(xml)标签文件,以及1个开箱即用的data.yaml配置文件,完整覆盖训练、验证与测试所需结构。资源包仅17.27MB,便于快速下载与本地调试,适配算力受限环境下的模型迭代。目前已有134人学习下载,用户可直接加载训练、对比不同YOLO版本性能、转换标签格式或拓展为多类别交通场景数据基线,同时支持从数据划分逻辑、坐标归一化规范到配置文件字段含义的全流程理解。

1. 337张真实街景车辆图像:小型车/自行车/公交车/卡车四类YOLO-ready数据集,开箱即训不洗图

你有没有试过在YOLO训练时卡在第一步——找不到一张能直接喂进train.py的干净数据?不是标注错位、就是类别索引越界、再不然就是坐标溢出(0.99999写成1.00000直接报nan loss)。这个337张图像的数据包,就是专治这种“数据焦虑”的止疼片:它不靠数量堆砌,而是用真实街景中高频出现的四类目标(小型车、自行车、公交车、卡车)+双格式标签(YOLO txt + VOC xml)+预划分目录结构+完整data.yaml,把从解压到启动训练的路径压缩到5分钟以内。它不是COCO那种“学术大而全”,而是面向嵌入式部署、边缘检测、课程设计、毕设验证等真实轻量场景的“够用、好用、不出错”型数据集。如果你正卡在YOLOv5/v8/v9模型训练前的数据准备环节,或者需要快速验证一个新loss、新backbone在城市交通目标上的收敛性,这份资源就是你该立刻解压的那个zip。


2. 数据结构与YOLO配置:从解压到data.yaml的完整映射逻辑

2.1 解压后目录树与文件语义解析

拿到yolo算法-车辆检测数据集-337张图像带标签-小型车-自行车-公交车-卡车.zip后,解压得到根目录vehicle_yolo_dataset/。其结构并非扁平化堆放,而是严格遵循YOLO官方推荐的训练目录规范:

vehicle_yolo_dataset/ ├── images/ │ ├── train/ # 240张训练图(含jpg) │ ├── val/ # 67张验证图(含jpg) │ └── test/ # 30张测试图(含jpg) ├── labels/ │ ├── train/ # 对应train/的txt标签(YOLO格式) │ ├── val/ # 对应val/的txt标签(YOLO格式) │ └── test/ # 对应test/的txt标签(YOLO格式) ├── annotations/ # VOC格式XML标签(独立文件夹,非YOLO训练必需但可转换复用) │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml # 核心配置文件(必须存在且路径正确)

提示:annotations/是额外赠送的VOC格式,用于跨框架迁移(如转为TensorFlow Object Detection API输入)或做人工校验。YOLO训练全程只读取images/和labels/,annotations/可忽略或删减以节省空间。

2.2 data.yaml详解:四类目标索引、路径、类别名的硬约束

data.yaml是YOLO训练的“宪法文件”,任何路径错误或类别数不匹配都会导致AssertionError: class names do not match。本数据集的data.yaml内容如下(已脱敏路径,实际文件含绝对路径占位符,需手动替换):

# vehicle_yolo_dataset/data.yaml train: ../images/train # 注意:此处是相对路径,指向同级images/train val: ../images/val test: ../images/test nc: 4 # number of classes MUST be 4 —— 小型车、自行车、公交车、卡车 names: ['car', 'bicycle', 'bus', 'truck'] # 顺序必须与label txt中class索引严格一致!

关键点说明:

  • train/val/test字段值是相对于data.yaml所在目录的相对路径。若你将整个vehicle_yolo_dataset/移到/home/user/yolov8/下,则无需修改;若移动到其他位置(如/mnt/data/),必须同步更新这三行路径。
  • nc: 4是硬性要求:YOLOv5/v8/v9均通过此参数推导模型head输出通道数。若误删某类或漏标,训练会因logits维度不匹配崩溃。
  • names列表顺序=类别索引顺序:car→0,bicycle→1,bus→2,truck→3。所有.txt标签中的第一列数字必须是0~3之间的整数,否则utils/dataloaders.py在load_image()阶段就会抛IndexError。

2.3 YOLO标签格式验证:手撕一个txt样本看懂坐标归一化逻辑

取labels/train/img_0951_19.txt为例(实际文件名以数据集中为准),内容为:

0 0.423 0.618 0.182 0.294 1 0.765 0.532 0.124 0.217 2 0.211 0.345 0.256 0.412

逐字段解析(对照摘要描述):

  • 0→ 类别索引:car(小型车)
  • 0.423→ x_center / image_width:图像宽方向中心点横坐标占比(非像素值!)
  • 0.618→ y_center / image_height:图像高方向中心点纵坐标占比
  • 0.182→ width / image_width:边界框宽度占图宽比例
  • 0.294→ height / image_height:边界框高度占图高比例

为什么必须归一化?YOLO系列模型的neck(如PANet)和head(如Detect层)内部计算全部基于[0,1]区间,若输入0~640像素值,网络权重会因尺度爆炸而无法收敛。本数据集所有337张图均已用OpenCVcv2.imread()读取并计算真实宽高后完成归一化,无需二次处理。

2.4 VOC XML标签结构:当需要人工核验或跨框架迁移时怎么用

annotations/train/img_0951_19.xml片段如下:

<annotation> <folder>train</folder> <filename>img_0951_19.jpg</filename> <size> <width>1280</width> <height>720</height> <depth>3</depth> </size> <object> <name>car</name> <bndbox> <xmin>420</xmin> <!-- 像素值 --> <ymin>310</ymin> <xmax>650</xmax> <ymax>520</ymax> </bndbox> </object> <object> <name>bicycle</name> <bndbox> <xmin>850</xmin> <ymin>290</ymin> <xmax>1010</xmax> <ymax>450</ymax> </bndbox> </object> </annotation>

对比YOLO txt可知:car框像素坐标(420,310,650,520)→ 宽=230, 高=210 → 归一化后x_center=(420+650)/2/1280≈0.423, y_center=(310+520)/2/720≈0.618,完全吻合。这意味着:当你发现某个YOLO txt预测框严重偏移时,可立即打开同名XML用LabelImg加载比对,快速定位是标注错误还是模型问题。


3. 训练启动实操:YOLOv5/v8/v9三版本命令与关键参数调优

3.1 YOLOv5训练命令:兼容PyTorch 1.7+,适合CUDA 10.2/11.3

假设环境已安装ultralytics==8.0.200(YOLOv5最新维护版),进入YOLOv5项目根目录后执行:

# 命令1:基础训练(推荐新手) python train.py \ --data /path/to/vehicle_yolo_dataset/data.yaml \ --cfg models/yolov5s.yaml \ --weights '' \ --batch-size 16 \ --epochs 100 \ --name vehicle_yolov5s_v1 # 命令2:加载COCO预训练权重(收敛更快,推荐) python train.py \ --data /path/to/vehicle_yolo_dataset/data.yaml \ --cfg models/yolov5s.yaml \ --weights yolov5s.pt \ # 自动下载至weights/目录 --batch-size 16 \ --epochs 50 \ --name vehicle_yolov5s_coco_pretrain

参数说明:

  • --weights '':空字符串表示从零初始化(scratch training),适合研究初始化敏感性;yolov5s.pt为官方COCO预训练权重,对车辆类泛化强。
  • --batch-size 16:337张图按240:67:30划分后,train集仅240张,故batch不宜过大。16是显存占用与梯度稳定性的平衡点(RTX 3060 12G实测无OOM)。
  • --epochs 50:小数据集易过拟合,50轮足够收敛。观察results.csv中metrics/mAP_0.5在40轮后趋稳即可停训。

3.2 YOLOv8训练命令:ultralytics原生API,语法更简洁

YOLOv8使用ultralytics库的train()函数封装,命令行更短:

# 单行启动(推荐) yolo detect train \ data=/path/to/vehicle_yolo_dataset/data.yaml \ model=yolov8n.pt \ epochs=50 \ imgsz=640 \ batch=16 \ name=vehicle_yolov8n_v1 \ device=0

关键差异点:

  • model=yolov8n.pt:n/s/m/l/x对应不同参数量,n(nano)在337张图上收敛最快,s(small)精度略高但需更多epoch。
  • imgsz=640:YOLOv8默认输入尺寸,本数据集图像原始分辨率多为1280×720,缩放后信息损失可控;若想保留更多细节,可设imgsz=1280,但batch需降至8。
  • device=0:指定GPU编号,多卡环境可写device=0,1启用DDP。

3.3 YOLOv9训练命令:适配最新架构,需注意依赖版本

YOLOv9(2024年3月发布)引入了PGI(Programmable Gradient Information)和GELAN(Generalized ELAN)模块,对小数据集更鲁棒。需安装ultralytics>=8.2.0:

# 先克隆YOLOv9官方仓库(非ultralytics主库) git clone https://github.com/WongKinYiu/yolov9.git cd yolov9 # 启动训练(注意:v9使用自定义train.py) python train.py \ --weights '' \ --cfg models/yolov9-tiny.yaml \ # tiny版专为小数据优化 --data /path/to/vehicle_yolo_dataset/data.yaml \ --hyp data/hyps/hyp.scratch-high.yaml \ # 高学习率策略适配小数据 --epochs 80 \ --batch-size 8 \ # v9对batch更敏感,8更稳 --name vehicle_yolov9_tiny_v1

血泪经验:YOLOv9的hyp.scratch-high.yaml中lr0: 0.01比v5/v8默认的0.001高10倍,若用v5的hyp会导致loss震荡。务必用配套超参文件!

3.4 训练过程监控:三个必须盯住的关键指标

启动训练后,不要只刷Epoch X/Y,重点看以下三项:

指标正常范围异常信号应对动作
BoxLoss0.03~0.15(v5/v8)
0.05~0.2(v9)
>0.3持续5轮检查标签是否坐标溢出(>1.0)、类别索引越界
cls_loss0.02~0.08>0.15且不降names顺序与txt索引不一致,或某类样本极少(如卡车仅12张)
mAP50-95val集最终值≥0.65<0.55且波动大增加--augment(v5/v8)或换hyp.scratch-low.yaml(v9)

提示:用tensorboard --logdir runs/detect/实时查看曲线。若BoxLoss在10轮内不跌破0.1,大概率是data.yaml路径写错,模型在读空目录!


4. 避坑指南:337张图数据集最常踩的5个坑及现场急救方案

4.1 现象:AssertionError: Error loading data from .../data.yaml: 'train'

原因:data.yaml中train:路径指向不存在的目录,常见于解压后未将vehicle_yolo_dataset/整体移入YOLO项目,而是只复制了images/和labels/子目录。
解决:

  1. 进入/path/to/vehicle_yolo_dataset/目录,执行ls -l images/train确认存在;
  2. 打开data.yaml,检查train:行末尾是否有空格(YAML对空格敏感);
  3. 若路径含中文或空格,改用train: "../images/train"(加引号)。

4.2 现象:训练启动后立即报IndexError: list index out of range,定位到dataloader.py第xxx行

原因:labels/train/下某txt文件为空,或仅含空行,或首行有BOM头(Windows记事本保存导致)。
解决:

# 批量清理空文件(Linux/macOS) find /path/to/vehicle_yolo_dataset/labels/train -type f -empty -delete # 批量去除BOM(需安装dos2unix) dos2unix /path/to/vehicle_yolo_dataset/labels/train/*.txt

玄学排查:用head -n 1 labels/train/*.txt | grep -v "^[0-9]"找出首行非数字的文件,手动删除。

4.3 现象:mAP50在验证集上始终为0.000,但BoxLoss正常下降

原因:data.yaml中names顺序与labels/中类别索引不一致。例如names: ['bicycle','car','bus','truck']但txt里全是0 car。
解决:

  1. 取labels/train/中任意3个txt,用awk '{print $1}' *.txt | sort | uniq -c统计各类索引出现频次;
  2. 对照data.yaml的names顺序,确保索引0对应最高频类别(本数据集应为car);
  3. 若顺序颠倒,在data.yaml中调整names顺序,切勿修改txt文件(会破坏VOC XML一致性)。

4.4 现象:推理时检测框全部偏右上角,或密集重叠在图像中心

原因:YOLO标签中x_center/y_center值全部>0.9,说明归一化时用了错误的图像宽高(如用1920×1080算1280×720图)。
解决:

# 快速验证脚本:检查前10张图的标签是否合理 import cv2 for img_name in ["img_0951_19.jpg", "img_0951_18.jpg"]: # 列出实际存在的图名 img = cv2.imread(f"images/train/{img_name}") h, w = img.shape[:2] txt_path = f"labels/train/{img_name.replace('.jpg','.txt')}" with open(txt_path) as f: for i, line in enumerate(f): cls, xc, yc, bw, bh = map(float, line.strip().split()) print(f"{img_name} obj{i}: xc={xc:.3f} (max {w}), yc={yc:.3f} (max {h})") assert 0 <= xc <= 1 and 0 <= yc <= 1, f"coord overflow in {txt_path}"

若断言失败,需重新生成标签(本数据集已验证无此问题,此脚本供你自查其他数据集)。

4.5 现象:val集mAP50达0.72,但test集推理结果几乎全漏检

原因:test/目录下图像未被YOLO自动识别为测试集——YOLOv5/v8默认不运行test评估,需手动指定。
解决:

  • YOLOv5:训练完后单独运行python test.py --data data.yaml --weights runs/train/vehicle_yolov5s_v1/weights/best.pt --task test;
  • YOLOv8:yolo detect val data=/path/data.yaml model=runs/detect/vehicle_yolov8n_v1/weights/best.pt split=test;
  • 关键:split=test参数必须显式声明,否则默认用val。

5. 推理与部署实战:从单图检测到TensorRT加速的端到端链路

5.1 单图检测:验证模型是否真正学会“认车”

训练完成后,用best.pt权重对任意测试图做推理:

# YOLOv8示例(最简命令) yolo detect predict \ model=runs/detect/vehicle_yolov8n_v1/weights/best.pt \ source=/path/to/vehicle_yolo_dataset/images/test/img_0951_288.jpg \ conf=0.25 \ save_txt=True \ save_conf=True

输出解读:

  • 生成runs/detect/predict/目录,含带框图img_0951_288.jpg和img_0951_288.txt;
  • img_0951_288.txt每行格式:class_id center_x center_y width height confidence(归一化坐标+置信度);
  • conf=0.25:过滤低置信度框,避免自行车被误检为小型车(二者外观相似)。

技巧:若想看模型对“难例”的判断,专门挑test/中含遮挡、小目标(如远处自行车)、模糊图像的样本,观察confidence值分布。本数据集实测:清晰小型车conf≈0.92,远距离自行车conf≈0.35~0.45,低于0.3的多为误检。

5.2 批量推理与结果结构化:生成CSV报表供业务系统调用

将test/所有图批量推理并导出结构化结果:

# export_results.py from ultralytics import YOLO import pandas as pd import glob import os model = YOLO("runs/detect/vehicle_yolov8n_v1/weights/best.pt") test_imgs = glob.glob("/path/to/vehicle_yolo_dataset/images/test/*.jpg") results_list = [] for img_path in test_imgs: results = model.predict(img_path, conf=0.3, verbose=False) boxes = results[0].boxes.xywhn.cpu().numpy() # 归一化坐标 confs = results[0].boxes.conf.cpu().numpy() classes = results[0].boxes.cls.cpu().numpy() for i, (box, conf, cls) in enumerate(zip(boxes, confs, classes)): results_list.append({ "image": os.path.basename(img_path), "class_id": int(cls), "class_name": ["car","bicycle","bus","truck"][int(cls)], "x_center": float(box[0]), "y_center": float(box[1]), "width": float(box[2]), "height": float(box[3]), "confidence": float(conf) }) df = pd.DataFrame(results_list) df.to_csv("test_detection_results.csv", index=False) print(f"Exported {len(df)} detections to test_detection_results.csv")

生成的CSV可直接导入BI工具,统计“各路段自行车通行量”、“公交车辆密度热力图”等业务指标。

5.3 TensorRT部署:在Jetson Nano上跑通640×640实时检测

针对边缘设备,将YOLOv8n转为TensorRT引擎(需CUDA 11.4+,TensorRT 8.5+):

# Step 1: 导出ONNX(固定输入尺寸) yolo export \ model=runs/detect/vehicle_yolov8n_v1/weights/best.pt \ format=onnx \ imgsz=640 \ dynamic=False \ simplify=True # Step 2: 使用trtexec编译(需NVIDIA TensorRT) trtexec --onnx=yolov8n.onnx \ --saveEngine=yolov8n.engine \ --fp16 \ --workspace=2048 \ --shapes=input:1x3x640x640 # Step 3: Python推理(需安装pycuda+tensorrt) import tensorrt as trt import pycuda.autoinit import numpy as np # 加载engine并分配内存(代码略,标准TRT流程) # 关键点:输入必须是CHW格式、float32、归一化到[0,1] # 输出解析:YOLOv8输出为1×84×8400,需reshape为(8400,84),再按class_id取top-k

实测性能(Jetson Nano):

  • 输入640×640,FP16精度,平均延迟42ms/帧(≈23.8 FPS);
  • 内存占用峰值1.2GB,未触发swap;
  • 对比PyTorch原生推理(110ms/帧),提速2.6倍,满足路口实时计数需求。

5.4 模型轻量化技巧:用Pruning+Quantization再压30%体积

337张图训练的小模型仍有压缩空间。对best.pt做通道剪枝:

# 使用torch-pruning库(pip install torch-pruning) import torch_pruning as tp from ultralytics import YOLO model = YOLO("best.pt").model pruner = tp.pruner.MagnitudePruner( model, example_inputs=torch.randn(1,3,640,640), importance=tp.importance.MagnitudeImportance(p=2) ) # 剪掉30%通道(保留70%) pruner.step(interactive=False, pruning_ratio=0.3) torch.save(model.state_dict(), "best_pruned.pt")

再用torch.quantization做INT8量化:

model_int8 = torch.quantization.quantize_dynamic( model, {torch.nn.Linear, torch.nn.Conv2d}, dtype=torch.qint8 ) torch.save(model_int8.state_dict(), "best_quantized.pt")

体积对比:
best.pt(FP32):13.2 MB
best_pruned.pt(FP32剪枝):9.8 MB(-25.8%)
best_quantized.pt(INT8):3.6 MB(-72.7%)
量化后在Nano上推理速度提升至28 FPS,且精度损失<0.02 mAP50。

从那以后我每次拿到新数据集,都强制走一遍find labels/ -name "*.txt" | xargs head -n 1 | awk '{print $1}' | sort | uniq -c统计类别分布,再对照data.yaml的names顺序——哪怕只有4类,也怕手抖调错序。337张图虽小,但每一张都带着真实街景的噪声和标注者的思考痕迹,尊重数据,就是尊重自己调试时少花的两小时。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 0:17:11

Python机器学习人脸识别系统:从源码到报告,期末大作业实战指南

简介&#xff1a;这份资源是面向高校学生与Python初学者的机器学习人脸识别系统完整项目包&#xff0c;可直接用于期末大作业、课程设计或自学练手。项目以Python实现人脸检测与识别核心流程&#xff0c;并附带一份完整报告文档&#xff0c;帮助读者理解算法思路与工程结构。压…

作者头像 李华
网站建设 2026/10/13 0:17:01

Android音乐播放器开发:MediaPlayer状态机与Scoped Storage实战

简介&#xff1a;本资源是一套基于Android Studio开发的完整音乐播放器App源码工程&#xff0c;面向Android初学者与进阶开发者&#xff0c;聚焦多媒体应用开发核心能力训练&#xff0c;涵盖用户认证、本地音乐管理、UI交互与后台播放服务等典型场景。压缩包共57个文件&#xf…

作者头像 李华
网站建设 2026/10/13 0:07:05

Sign in with Apple技术实现与合规落地全解析

1. 项目概述&#xff1a;为什么“Sign in with Apple”不是又一个登录按钮&#xff0c;而是开发者绕不开的合规分水岭 “Sign in with Apple”——这行字出现在App Store审核指南第4.0章节、iOS系统设置页、甚至某高校数字校园平台的登录界面上时&#xff0c;它早已不是苹果生…

作者头像 李华
网站建设 2026/10/13 0:01:23

度假村安保定岗定编:岗位梳理、编制测算与排班设计

1. 度假村安保部为什么卡在“人不够又人不少”的怪圈里接到这个项目需求时&#xff0c;客户给我的反馈是两句完全矛盾的话。总经理说&#xff1a;安保部人不少了&#xff0c;夜班有人在睡觉&#xff0c;工资一分不少发&#xff1b;安保队长说&#xff1a;旺季一到&#xff0c;客…

作者头像 李华
网站建设 2026/10/12 23:57:16

VSCode 接入 GPT-5.3-codex 大模型配置指南:把 settings.json 改到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 23:49:40

大湾区街镇SHP数据处理指南:清洗、坐标统一与避坑

简介&#xff1a;粤港澳大湾区各街道各镇shp文件是一套精确到乡镇街道级别的行政区划矢量数据&#xff0c;覆盖广州、深圳、珠海、佛山、惠州、东莞、中山、江门、肇庆9个内地城市及香港、澳门&#xff0c;面向GIS开发者、规划分析师与科研人员&#xff0c;可用于地图绘制、空间…

作者头像 李华