ARTICLE DETAIL

资讯详情

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

YOLO车辆检测实战:337张数据集全流程训练与避坑指南

YOLO车辆检测实战:337张数据集全流程训练与避坑指南 简介一套面向YOLO系列目标检测算法的车辆检测数据集专为需要快速获得带标注交通车辆样本的开发者设计覆盖小型车、自行车、公交车、卡车四类常见目标。压缩包共1012个文件包含337张JPG图像、337个TXT标签、337个XML标签以及1个data.yaml配置文件整体大小约17.27MB。TXT标签采用YOLO格式记录类别索引与归一化后的中心点坐标、框宽高XML标签采用VOC格式适合使用Pascal VOC标注规范的工具链直接加载两类标签分别存放在独立文件夹中结构清晰。数据集已划分好训练集与验证集并附有配置文件可直接用于YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLO11等主流版本的训练、验证和测试省去手动标注与格式转换的额外工作。目前已有134人学习下载适合目标检测入门、模型效果对比以及交通场景相关项目快速搭建基线。1. 337 张带标签的 yolo 车辆检测数据集先确认它能不能直接喂给模型做目标检测的人最烦的往往不是调参而是找数据集下载下来发现没标签、标签格式不对、训练集验证集没切分或者类别和你完全对不上得花两三天去清洗。这个 yolo 车辆检测数据集337 张图像全部带标签四类目标——小型车、自行车、公交车、卡车同时给了 yolo 的 txt 标签和 voc 的 xml 标签两种而且已经按训练、验证、测试划分好data.yaml 配置文件也备好了。对想第一次把 yolo 训练流程完整跑通的新手或者要快速验证某个模型改动、损失函数调整效果的工程师它解决的是“从原始图片到能出 mAP 的模型”这段路上最麻烦的一环。下面我从目录结构讲起把标签格式、训练命令、验证指标和坑位一次说清楚。2. 标签文件与目录结构两种格式并存动手前先看懂这三块2.1 先看目录图像、yolo 标签、voc 标签、data.yaml 各放哪这种打包好的数据集常见组织方式是 images 下按 train / val / test 分三个子目录标签单独建文件夹和 images 保持同样的目录层级。打开压缩包后大概率看到类似下面这样的结构yolo_vehicle_337/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels_yolo/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels_voc/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml文件名是一一对应的图像img_0951_19.jpg在 labels_yolo 里有同名.txt在 labels_voc 里有同名.xml。训练、验证、测试三份数据的划分已经做好了不用你自己再去按比例切分。train 目录最多val 和 test 各几十张这个规模适合先小批量跑通流程不适合直接追求高精度。2.2 yolo 和 voc 两种格式怎么对应坐标归一化与反推yolo 格式的 txt 每行代表一个目标框格式就是摘要里写的那五列类别索引、中心点 x、中心点 y、框宽、框高。注意后四列都是相对整张图片宽高的比例值范围在 0 到 1 之间。我一般会先写个十来行的脚本把标签读出来确认一下数值是否正常from pathlib import Path label_path Path(labels_yolo/train/img_0951_19.txt) for line in label_path.read_text().strip().splitlines(): cls, cx, cy, w, h map(float, line.split()) print(f类别索引{int(cls)}, 中心({cx:.3f}, {cy:.3f}), 宽高({w:.3f}, {h:.3f}))这段代码里map(float, line.split())是把每行按空格切成五个字符串再转成浮点数。跑通之后你会看到类似类别索引0, 中心(0.512, 0.634), 宽高(0.183, 0.124)的输出中心坐标落在 0 到 1 之间就是正常。如果出现负数或大于 1 的值说明标注文件有越界问题后文避坑章节专门讲。voc 格式的 xml 则保存像素坐标也就是 xmin、ymin、xmax、ymax 这种绝对值。它和 yolo 格式之间可以互相转换转换公式很简单cx (xmin xmax) / 2 / 图片宽度w (xmax - xmin) / 图片宽度。手动转换容易出错建议直接用工具脚本或者在你读数据的时候让程序先判断目录后缀再走不同解析分支。2.3 data.yaml 配置文件names 顺序就是标签顺序不能乱改data.yaml 是这个数据集的“说明书”ultralytics 系列训练时第一个读它。里面的 path、train、val、test 告诉框架去哪找图names 告诉框架类别有哪几种。如果按四类目标来写配置内容大致是这样path: ./yolo_vehicle_337 train: images/train val: images/val test: images/test names: 0: small_car 1: bicycle 2: bus 3: truck这里最容易忽略的是names 里的索引顺序必须和 txt 标签里的class对应。比如标签里写0那就代表小型车写3就是卡车。类名叫什么没关系索引顺序千万不能动。动手训练前我建议先跑一步把整个 labels_yolo 目录里所有 txt 文件的第一列收集成集合确认最大值是3最小值是0中间没有空档。这样能挡掉一批“标签类别号和数据配置对不上”的翻车。3. 用 yolov8 和 yolov5 跑通这个数据集环境、训练命令与参数取舍3.1 环境准备装一个 ultralytics 就够了这个数据集标称适用 yolov5、yolov8、yolov9、yolov10、yolo11 这些主流系列。实际用的时候不同版本的入口有差别yolov5 需要单独拉仓库yolov8 之后的版本都在 ultralytics 这个包里。做对比实验的话先装 ultralytics 就能覆盖大部分需求conda create -n yolo python3.10 -y conda activate yolo pip install ultralytics装完可以顺手跑一句yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg测试环境能正常输出检测结果图就说明 torch 和 ultralytics 配合没问题。如果你本机有 N 卡装 torch 时要注意 CUDA 版本用 CPU 也能跑但速度会差很多337 张图的话 CPU 勉强能接受。3.2 yolov8 训练一条命令和四个关键参数环境就绪后训练命令非常短。进入数据集根目录直接执行cd yolo_vehicle_337 yolo detect train \ modelyolov8n.pt \ datadata.yaml \ epochs100 \ batch16 \ imgsz640这四个参数我解释一下。modelyolov8n.pt表示用 yolov8n 预训练权重做起点n 是 nano 最轻量显存占用小适合这台机器不确定的情况后面可以换成 yolov8s、yolov8m 或更大的体量。datadata.yaml直接指向数据集配置文件。epochs100对于 337 张图是够用的一般到 60 轮以后损失就平了。batch16看显存8G 显存跑这个规模没问题显存不够就降到 8 或 4。imgsz640是输入分辨率小型车和自行车属于中小目标640 是起步推荐值。3.3 yolov5 训练仓库单独拉参数名略有不同yolov5 和 ultralytics 新版本的命令行参数不太一样老项目里常见的是这种写法git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt python train.py \ --data ../yolo_vehicle_337/data.yaml \ --weights yolov5s.pt \ --batch-size 16 \ --epochs 100 \ --img 640注意--data指向的是上上级目录下的 data.yaml因为你现在站在 yolov5 仓库内部。--img 640和 yolov8 的--imgsz 640是同一种东西只是历史参数名不同。yolov5s 的 s 表示 small比 nano 大一点但对 337 张图来说也完全跑得动。至于 yolov9、yolov10、yolo11本质区别在网络结构和后处理yolov10 去掉了 NMS 更偏端到端yolo11 是较新的版本。数据集本身是通用的切换算法只需要换对应训练入口不需要改标签。3.4 训练产物在哪里runs/detect/train 目录下的几个关键文件训练完成后框架会在runs/detect/train/下生成结果目录里面有几个文件需要留意文件作用weights/best.pt验证集指标最优的权重后续验证、推理和部署都用它weights/last.pt最后一个 epoch 的权重断点续训用results.csv每个 epoch 的 box_loss、cls_loss、dfl_loss 和 mAP 指标confusion_matrix.png混淆矩阵图检查类别是否互相混在一起很多新手盯着终端最后的Results saved to runs/detect/train就以为结束了实际要看的是best.pt和results.csv。best 权重不一定是最后一步的权重yolov8 默认按验证集 mAP 挑最好的一版保存这个机制不用改直接用就行。4. 验证与推理从指标读到图像确认它真的能检测车辆4.1 用 val 命令看 mAP两套指标代表两个维度训练完先别急着跑测试图先在划分好的验证集上评估一下。执行yolo detect val \ modelruns/detect/train/weights/best.pt \ datadata.yaml输出里主要看两个数mAP50和mAP50-95。mAP50 是 IoU 阈值 0.5 时的平均精度这个数达到 0.8 就说明大目标基本都能框住mAP50-95 是把阈值从 0.5 到 0.95 每隔 0.05 算一次再平均更严格反映框的贴合度。对于这个数据集的规模mAP50 在 0.85 左右、mAP50-95 在 0.6 左右都是比较合理的表现。val 命令还会顺带生成混淆矩阵图同样存在 runs/detect 目录下。看这个图时注意对角线外的色块比如小型车那一行有一片颜色偏到了自行车列那就说明这两类在某些角度下容易混需要更多这类样本。4.2 用 predict 跑推理单张图、目录、视频三种输入验证指标只能说明“平均水平”真要确认模型可用还得亲眼看几张检测结果。这个数据集自带 test 目录正好用来做最终测试yolo detect predict \ modelruns/detect/train/weights/best.pt \ sourceimages/test \ conf0.25 \ saveTruesourceimages/test把整个测试目录都跑一遍conf0.25表示置信度低于 0.25 的预测框会被过滤掉saveTrue是把结果图保存到runs/detect/predict目录。打开结果图重点看三类错误漏检的车辆、两个框叠在同一个目标上、把背景当成了车。看到漏检不要急着加 epoch先调 confidence 阈值再看是不是某些角度在训练集里压根没见过。4.3 损失曲线怎么读欠拟合和数据问题一眼分辨训练过程中终端会实时刷 loss结束后 results.csv 里也存了完整记录。yolo 损失主要看三块这张表可以直接截图留着对照损失全称含义box_loss边框回归损失预测框与真实框的坐标偏差cls_loss分类损失类别判断错误程度dfl_loss分布焦点损失框边界的分布精度正常训练里三个 loss 应该都在前 20 个 epoch 快速下降之后变得平缓。如果 cls_loss 一直横着不降常见原因是类别分布极不均衡比如公交车只有十来个样本模型学不动如果 box_loss 降到某个值后开始反弹那更可能是学习率偏大后期在最优解附近来回震荡。337 张图规模下损失曲线偶尔抖动是正常的别一看到抖动就停训练。5. 数据集避坑指南五个我翻过车的细节每条都有补救办法5.1 换机器后 data.yaml 路径失效训练一启动就报错现象在 A 机器上训练一切正常把数据集拷到 B 机器后运行终端直接报FileNotFoundError提示找不到 images 下的图片。原因data.yaml 里的path写的是压缩包作者本机的绝对路径换环境后路径自然失效。解决把 data.yaml 的path改成相对路径比如数据集根目录下的./train、val、test 保持相对路径写法。我拿到任何数据集的第一件事就是把 path 改成相对路径这个习惯帮我躲过了至少三次这类报错。5.2 类别索引和数据配置对不上检测结果张冠李戴现象训练时 loss 正常下降验证时 mAP 也有模有样但打开推理图一看小型车被标成卡车自行车被标成公交车而且所有预测都偏到后几个类别上。原因标签 txt 里class的索引顺序和 data.yaml 里 names 的索引顺序没对齐模型把 0 号类别学了但输出映射到错误的类名上。解决训练前跑一遍标签检查脚本把整个 labels_yolo 目录所有 txt 的第一列去重打印出来和 data.yaml 里 names 的索引逐行对照。混淆矩阵在“对角线颜色明显偏淡、某一列特别深”时基本就是这个问题。5.3 小型车和自行车漏检严重mAP 却不低现象验证集 mAP50 到了 0.85 以上可实际测试时画面里的小型车和自行车经常被漏掉只有公交车、卡车这类大目标框得准。原因337 张图里大目标占多数小目标样本量少而且imgsz640对小型车和自行车来说分辨率不够目标只有二三十个像素特征根本提不出来。解决显存允许的情况下把imgsz提到 960训练时开启更强的数据增强特别是mosaic1.0和scale0.8让模型多见识不同尺度的目标。如果还不行需要给小型车类目单独补数据单纯调参救不回来。5.4 训练到一半 loss 变成 NaN甚至 BN 层直接崩现象前几十个 epoch 都正常某个 epoch 开始 loss 突变成 nan后面所有指标全部作废重启训练也复现。原因学习率偏大优化器一步迈过头或者数据集里存在全黑、全白的极端图像导致 BN 层统计量异常。这就是常说的 yolo 训练中 bn 崩溃。解决先把学习率调到常规值的 1/5 重试同时检查 images 里有没有纯色图。把损失曲线画出来如果 NaN 总是出现在同一个 epoch 附近优先怀疑学习率 scheduler 在那个点把 lr 推到了一个临界值。5.5 标签坐标越界或过小预测框跑到图像外面现象训练能跑完但推理时某些框直接超出图像边界或者出现一个只有几个像素宽的小框乱跳。原因标签文件里坐标被四舍五入或者原始标注时框就已经超出画面边界归一化后出现大于 1 或小于 0 的数值。解决写个脚本把标签里所有坐标值强制 clamp 到 [0, 1] 区间并删除宽或高小于 0.001 的无效框。这类数据量通常不大直接过滤掉比留着更省事。6. 从 337 张延伸到更多数据迁移学习、数据增强与坏标签排查6.1 用预训练权重接力收敛速度翻倍不要每次都用随机初始化从头训。yolo 官方提供了一批在 COCO 上训好的权重车辆、行人这些通用类别已经在里面。这个数据集的 337 张图通常几百张图就能在预训练权重基础上把四类车辆学会。实际操作就是换 model 参数并且冻结浅层yolo detect train \ datadata.yaml \ modelyolov8m.pt \ freeze10 \ epochs80 \ imgsz640freeze10表示冻结前 10 层参数浅层学的是边缘、纹理这类通用特征冻结之后训练压力小得多而且不容易在小数据集上过拟合。等这一轮训完再解冻全部层用更小学习率微调 20 个 epoch效果往往比一次性训 100 个 epoch 更好。如果内存和显存都吃紧yolov8n 的预训练权重也值得一试352 层参数少对 337 张图来说反而没那么容易过拟合。6.2 数据增强参数一表看懂别把增强开到最大小数据集最缺的是多样性yolo 训练时通过增强参数可以模拟出更多形态的目标。我常用的增强参数组合是这样参数作用我的常用值mosaic四张图拼接让模型见更多小目标1.0hsv_h色相扰动适应不同车漆颜色0.02hsv_s饱和度扰动0.8hsv_v明度扰动模拟阴影0.5fliplr水平翻转车辆左右对称可用0.5scale缩放扰动模拟远近0.8追求极限精度时有人会把增强拉满但增强过头会让模型学到“假样本”的分布验证集指标不错实测一测就翻车。我的习惯是先从常规值开始跑完一轮看验证集表现如果过拟合迹象明显再逐步加大 scale 和 mosaic 的比例每次只动一个参数这样才能定位到是谁在起作用。顺带一提337 张图里难免藏着坏标签比如类别标错或框没框准。训练前用可视化脚本把带标签的图批量画出来抽查一遍比训练完再回来看混淆矩阵省时间。从那以后我每次拿到别人切好的数据集都会强制走一遍标签可视化和类别索引校验再花三分钟把 data.yaml 里的路径改成相对路径最后才启动训练。希望帮到你。本文还有配套的精品资源点击获取
返回列表