简介这份资源是面向计算机视觉初学者与目标检测实践者的YOLOv5实战项目包聚焦垃圾桶满溢检测这一具体场景解决从数据准备到模型训练、推理落地的完整流程问题。包内共约2000个文件以1921个txt标签、40个Python脚本、23个yaml配置、9个sh脚本及若干md说明文档为主压缩包约450MB涵盖代码、数据集与训练好的权重参数。数据集包含满溢垃圾桶、未满溢垃圾桶和垃圾3个类别训练集2680张图片及对应标签验证集669张图片及对应标签。项目迭代100个epoch最优精度map0.5达0.91map0.5:0.95为0.73runs目录下保存了混淆矩阵、PR曲线、F1曲线及推理结果便于复盘训练过程。目前已有366人学习适合希望快速跑通YOLOv5检测流程、积累调参与评估经验的读者参考。1. 垃圾桶满溢检测数据集3 类别、3349 张图与 0.91 mAP 的落地起点垃圾桶满溢检测这个需求最早是从市政和园区物业的巡检场景里冒出来的。人工巡检效率低摄像头装了不少但没人盯着看垃圾堆到溢出来才知道。用 YOLOV5 做目标检测把「满溢的垃圾桶」「未满溢的垃圾桶」「垃圾」三类目标框出来是当前性价比最高的一条路。这份资源就是围绕这个场景打包的2680 张训练图 669 张验证图每张图配同名 txt 标签迭代 100 个 epoch最好的权重在验证集上跑出 mAP0.50.91、mAP0.5:0.950.73。项目总大小 450MB包含代码、数据集、训练好的权重和 runs 目录下的完整训练记录。适合想直接跑通一个三类别检测任务、又不想从零标数据的人。下面按「拿到手怎么用 → 参数怎么调 → 哪里容易翻车」的顺序拆一遍。2. 数据集结构与标签格式先看懂再动手2.1 目录布局与文件对应关系拿到压缩包解压后核心目录结构大致是这样datasets/ images/ train/ # 2680 张 jpg val/ # 669 张 jpg labels/ train/ # 2680 个 txt val/ # 669 个 txt runs/ train/ # 训练日志、权重、曲线 detect/ # 推理结果图片和标签是严格同名的images/train/001.jpg对应labels/train/001.txt。YOLO 格式的标签每行是class x_center y_center width height坐标全部归一化到 0~1 之间。三个类别的索引通常是0满溢的垃圾桶1未满溢的垃圾桶2垃圾。这个顺序必须和训练时 data.yaml 里的 names 列表一致否则推理出来的框会张冠李戴。常见做法是先用一段脚本核对图片和标签数量是否一一对应避免有图无标签或有标签无图。我一般会跑一遍这个检查import os img_dir datasets/images/train lbl_dir datasets/labels/train imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(.jpg)} lbls {os.path.splitext(f)[0] for f in os.listdir(lbl_dir) if f.endswith(.txt)} print(图片数:, len(imgs), 标签数:, len(lbls)) print(有图无标签:, imgs - lbls) print(有标签无图:, lbls - imgs)这段逻辑很直白用集合做差集把不匹配的文件名直接打出来。参数上只需要改img_dir和lbl_dir两个路径。如果差集非空训练时 YOLOV5 会直接跳过这些样本甚至在某些版本里报错中断所以这一步别省。2.2 标签可视化与类别分布检查光看数量不够还得确认框画得对不对。YOLOV5 自带utils/plots.py里的可视化函数也可以自己写一段用 OpenCV 把归一化坐标还原成像素坐标画出来import cv2 def draw_label(img_path, lbl_path, names): img cv2.imread(img_path) h, w img.shape[:2] with open(lbl_path) as f: for line in f: cls, xc, yc, bw, bh map(float, line.split()) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, names[int(cls)], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imwrite(check.jpg, img) draw_label(datasets/images/train/001.jpg, datasets/labels/train/001.txt, [overflow, normal, garbage])这里xc, yc是框中心点归一化坐标bw, bh是归一化宽高。还原时先减半再乘图像尺寸得到左上角加上宽高得到右下角。names列表的顺序必须和 data.yaml 一致。画几张出来肉眼扫一遍重点看「满溢」和「未满溢」两类有没有标反——这两类在视觉上差异不大标注时最容易混。类别分布也值得统计一下。如果「垃圾」这一类样本特别少训练时该类别的召回会明显偏低。可以用collections.Counter快速统计每个类别的框数量必要时在 data.yaml 里给稀有类加权或者用 YOLOV5 的--balance相关策略做重采样。3. 训练配置与参数调优从 data.yaml 到 100 epoch3.1 data.yaml 与模型选型YOLOV5 的训练入口是train.py核心配置文件是data.yaml。这份资源里应该已经带了一份内容大致如下path: ./datasets train: images/train val: images/val nc: 3 names: [overflow, normal, garbage]nc是类别数这里固定为 3。names的顺序就是标签里 0/1/2 的映射改顺序等于重新定义任务。path是数据集根目录train和val是相对路径。如果换机器跑只需要改path这一行。模型选型上YOLOV5 提供 s/m/l/x 几个规格。这份资源迭代了 100 个 epoch 达到 mAP0.50.91从 450MB 的总大小和 3349 张图的量级看大概率用的是 yolov5s 或 yolov5m。s 版本推理快、显存占用低适合边缘设备m 版本精度略高训练时间翻倍。如果只是验证流程先用 s 跑通要冲精度再换 m 或 l。启动训练的命令python train.py \ --data data.yaml \ --weights yolov5s.pt \ --epochs 100 \ --batch-size 16 \ --img-size 640 \ --device 0 \ --project runs/train \ --name exp--weights指定预训练权重从 COCO 迁移过来能明显加快收敛。--batch-size受显存限制16 是 8GB 显存下的稳妥值显存够可以上 32。--img-size640 是 YOLOV5 的默认输入尺寸数据集里如果小目标多可以提到 1280但显存和训练时间都会涨。--device 0指定第一块 GPUCPU 训练会慢到无法接受。3.2 超参调整与训练过程监控YOLOV5 的超参默认在data/hyp.scratch.yaml里。几个关键项lr0初始学习率默认 0.01小数据集可以降到 0.001 避免震荡lrf是最终学习率比例默认 0.01momentum0.937weight_decay0.0005。如果训练 loss 一直不降先查学习率是不是太大如果验证集 mAP 早早饱和然后掉多半是过拟合可以加--dropout或减少 epoch。训练过程中重点看几个输出runs/train/exp/results.csv里记录了每个 epoch 的 box_loss、obj_loss、cls_loss 和 mAP。正常情况下 box_loss 和 obj_loss 应该稳步下降mAP 稳步上升。如果 obj_loss 突然飙升检查是不是有标签文件损坏或坐标越界。runs/train/exp/下还会生成混淆矩阵、PR 曲线、F1 曲线这些是判断类别间混淆的直接依据。提示训练中断后可以用--resume从runs/train/exp/weights/last.pt继续不用从头再来。100 个 epoch 在单卡上大概跑几个小时具体取决于显卡。训练完成后最好的权重是best.pt最后一个是last.pt。推理和部署都用best.pt。4. 推理验证与效果复现detect.py 怎么跑4.1 单图与批量推理训练完不验证等于白跑。YOLOV5 的推理入口是detect.pypython detect.py \ --weights runs/train/exp/weights/best.pt \ --source datasets/images/val \ --img-size 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt \ --project runs/detect \ --name val_result--source可以是单张图、目录、视频或摄像头编号。--conf-thres是置信度阈值低于这个值的框直接丢弃默认 0.25--iou-thres是 NMS 的 IoU 阈值默认 0.45调低会减少重叠框。--save-txt会把检测结果按 YOLO 格式存下来方便后续算指标。结果图存在runs/detect/val_result/下。推理效果好不好不能只看几张图。把--save-txt的输出和验证集标签对比可以算每一类的 precision、recall。YOLOV5 的val.py直接干这事python val.py \ --weights runs/train/exp/weights/best.pt \ --data data.yaml \ --img-size 640 \ --task val输出里会打印每一类的 P、R、mAP0.5、mAP0.5:0.95。资源里给的 mAP0.50.91 就是在这个流程下得到的。如果自己复现出来差很多先查 data.yaml 的路径和类别顺序再查图片尺寸是否被意外缩放。4.2 混淆矩阵与错误分析runs/val/下会生成混淆矩阵。重点看「满溢」和「未满溢」之间的误判。这两类在垃圾桶只差一点没满的时候模型很容易摇摆。如果混淆矩阵显示这两类互相误判严重说明特征区分度不够可以考虑增加这两类的边界样本、在标签里对「临界状态」做更明确的定义、或者换更大的模型。另一个常见问题是「垃圾」类被漏检。垃圾形态多样、尺度变化大小目标居多。可以尝试提高输入分辨率到 960 或 1280或者在数据增强里加大 mosaic 的比例让模型多见小目标组合。5. 避坑与排查训练和推理里最容易翻车的几件事5.1 路径与类别顺序错位现象训练能跑但 mAP 极低或者推理出来的框类别全乱。 原因data.yaml 里的path写成了绝对路径换机器后失效或者names顺序和标签里的类别索引不一致。 解决统一用相对路径path指向数据集根目录训练前跑一遍 2.1 的核对脚本确认标签里的类别索引和 names 对得上。5.2 显存溢出与 batch-size 设置现象训练刚开始就报 CUDA out of memory。 原因--batch-size超过显存容量或者--img-size设得太大。 解决先把 batch-size 降到 8 或 4再逐步往上试也可以用--accumulate做梯度累积等效大 batch 但显存占用不变。img-size 从 640 起步确认稳定后再考虑提升。5.3 标签坐标越界或格式错误现象训练 loss 出现 NaN或者 obj_loss 异常高。 原因标签文件里有坐标超出 0~1 范围或者某行少了一个字段。 解决写一段脚本遍历所有标签检查每行是否有 5 个字段、坐标是否在 [0,1] 内。越界的行直接修正或剔除。YOLOV5 对格式错误比较敏感一个坏文件可能拖垮整个 batch。5.4 验证集指标虚高现象验证集 mAP 很高但实际场景里效果差。 原因验证集和训练集来自同一批视频或同一时段分布太接近模型只是记住了场景。 解决尽量让验证集覆盖不同光照、不同角度、不同垃圾桶样式。如果资源里的验证集和训练集同源自己复现时最好额外留一批独立数据做测试。5.5 推理速度不达预期现象模型精度够但帧率上不去。 原因用了 l 或 x 规格的模型或者输入分辨率过高。 解决换 yolov5simg-size 降到 416 或 320开启--half半精度推理。边缘设备上还可以导出 ONNX 或 TensorRT 进一步加速。6. 进阶技巧把 0.91 再往上推一推如果 0.91 的 mAP0.5 还不够有几个方向可以试。第一是数据层面对「满溢」和「未满溢」的边界样本做针对性补充这两类的混淆是拉低 mAP 的主要来源。第二是增强策略在hyp.scratch.yaml里调大mosaic和mixup的概率让模型见到更多组合场景但注意 mixup 太强会拖慢收敛。第三是模型层面换 yolov5m 或 yolov5l或者用 YOLOV5 的--evolve做超参进化自动搜一轮学习率和增强参数。验证改进是否有效不能只看最终 mAP。我一般会固定随机种子跑三次取平均避免单次波动误导判断。另外runs/train/exp/results.csv里的曲线比最终数字更有信息量——如果 mAP 在 60 epoch 后就平了说明 100 epoch 有浪费可以提前停。从那以后我每次拿到一个新的检测数据集都强制先跑一遍标签核对和可视化再开始训练。这一步花十分钟能省掉后面几个小时的排查。希望帮到你。本文还有配套的精品资源点击获取