YOLOv5垃圾分类识别检测实战:从环境搭建到边缘部署
2026/9/9 10:32:43 网站建设 项目流程

简介:基于YOLOv5的垃圾分类识别与检测项目,面向想上手目标检测的深度学习者与机器视觉开发者,提供了一套从数据准备到模型评估的完整可运行方案。包内共9158个文件,包含8193张JPG/JPEG垃圾图片、635个TXT和192个XML标注文件,对应训练验证所需的数据与标注;另有30个YAML/yml环境配置、26个Python/PYc代码文件,覆盖数据集格式转换、EDA分析、训练集/测试集划分、中文标签支持修改、模型训练与测试等环节;同时有3个PT权重文件、Dockerfile、Shell脚本及Jupyter Notebook,便于复现环境和直接调用预训练结果。压缩包整体约503.39MB,已有2264人浏览学习。通过该资料,读者可获得完整可运行工程与权重模型,系统掌握YOLOv5在垃圾分类场景中的落地流程,含修改代码支持中文标签、接入Weights&Biases可视化、性能统计等关键细节。 垃圾分类识别是个比较经典的检测任务,这几年做毕业设计、参加竞赛、甚至做产品原型的人特别多。用 YOLOv5 来做这件事,算是目前性价比最高的一条路线:模型成熟、社区资料多、训练和部署的工具链都非常顺畅。这篇文我会从方案选型、环境搭建、数据集处理、模型训练、推理部署再到问题排查,完整拆一遍基于 YOLOv5 的垃圾分类识别检测项目,希望看完你能直接照着落地。

1. 为什么选 YOLOv5 做垃圾分类识别

1.1 垃圾分类检测到底难在哪

很多人一开始会把垃圾分类识别想象成一个“图像分类”问题——拿个 ResNet 或者 MobileNet,输入一张照片,输出“可回收垃圾”“厨余垃圾”之类的标签。实际做下来你会发现,这个思路根本撑不住真实场景。原因很简单:一张图片里往往同时存在好几种垃圾,比如桌面上有个矿泉水瓶、一团用过的纸巾、一个易拉罐。分类模型只能给整张图一个标签,但检测模型能把这些目标全部框出来,各自给出类别。所以这本质上是一个目标检测任务,不是图像分类任务。

另外垃圾检测有几个特有的坑。一是目标尺寸差异大,矿泉水瓶可能很大,烟头可能很小,模型需要能同时抓住大小目标;二是类别之间外观相似,比如纸盒和塑料袋、玻璃瓶和塑料瓶,颜色形态接近,容易误判;三是遮挡和堆叠严重,垃圾桶里或者桌面上垃圾常常叠在一起。这些都对模型的特征提取能力有比较高的要求,选一个特征提取能力强、多尺度检测表现好的模型就很关键。

1.2 YOLOv5 在这些任务上的优势

YOLOv5 是单阶段检测器,速度和精度平衡得非常好。在垃圾识别这种对实时性有要求的场景下,单阶段检测器几乎是唯一选择。它天生就是多尺度检测的设计——三个检测头分别在 80x80、40x40、20x20 的特征图上做预测,分别负责小、中、大目标。这个结构对于前面提到的“矿泉水瓶和烟头共存”的场景,匹配度极高。

还有一个很实际的原因:YOLOv5 的工具链极其完善。官方仓库里训练、验证、导出、部署脚本全是现成的,换数据集训练只需要准备好标注好的图片,改一个 yaml 配置文件,跑一条命令。对于做毕设或者短期项目的人来说,这能省下大量跟“造轮子”斗争的时间。

当然 YOLOv8 甚至 YOLOv11 现在也都发布了,但 YOLOv5 仍然是非常稳妥的选择。它的资料最多,踩坑记录最全,部署方案也最成熟,尤其是你要跑在树莓派或者嵌入式设备上,v5 的轻量版本有大量参考案例。如果你只是想把垃圾分类识别这个业务逻辑跑通,而不是追新,v5 足够。

2. 环境搭建与工程准备

2.1 软硬件版本搭配建议

先别急着 clone 仓库,环境搭不对后面全白费。我建议的软件组合是:

  • 系统:Ubuntu 20.04 或 22.04,Windows 也行但坑更多
  • Python:3.8 或 3.10
  • PyTorch:1.12 或 2.0
  • CUDA:11.6 或 11.8
  • YOLOv5 代码版本:官方仓库 v6.0 或 v7.0

这个组合是一个比较“稳”的配方。PyTorch 2.0 之后编译机制变化比较大,虽然能跑,但如果你照着老教程来容易报编译错误。新手别追新,PyTorch 1.12 + CUDA 11.6 是全网资料最丰富的组合。

硬件方面,训练最好有一张 NVIDIA 显卡。显存 6G 以上(GTX 1660 或 RTX 2060 级别)就能 train 得动 YOLOv5s,8G 以上会更舒服。如果完全没有 GPU,也不是不能做:用 YOLOv5s 配小分辨率(320x320)+ 小 batch size,CPU 也能硬跑,但训练时间会让人绝望,建议用 Google Colab 免费 GPU 做替代。

2.2 环境安装实操记录

先是装 PyTorch,如果配了 NVIDIA 显卡要装 CUDA 版,一行命令:

pip install torch==1.12.1 torchvision==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116

然后拉代码装依赖:

git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt

这里提醒一点:我不建议创建新的 conda 环境,直接用现用 Python 环境也没太大问题,但最好用 conda 单独建一个虚拟环境,避免依赖冲突:

conda create -n yolo python=3.8 conda activate yolo

依赖装好后,先跑一下官方检测 demo 验证环境是否正常:

python detect.py --source data/images/bus.jpg --weights yolov5s.pt

如果能正常识别出 bus 和 person 并把结果输出到 runs/detect/ 目录下,说明环境已经通了,这一步一定要做,能排除至少一半的环境疑难杂症。

3. 数据集构建与增强

3.1 数据集来源:“白拿”的公开数据集也要做清洗

垃圾分类目前比较常见的公开数据集有两个方向。一个是华为云的垃圾分类数据集,有几十个类别,但背景偏单一,室内场景多;另一个是 TrashNet,大概 6 类垃圾图片,量级在几千张,适合快速跑通流程。

不过我的建议是:不要直接拿来做训练,先做一轮清洗。公开数据集的标注质量参差不齐,常见问题包括:标注框画得过大(把背景也框进去了)、类别标错、图片模糊或者光照极差。用一张脏数据训练的负面影响远大于你想象的,因为它会让模型学到错误的特征。清洗流程如下:

  • 剔除分辨率过低的图片(小于 320x320)
  • 剔除标注框小于图片面积 1% 的目标(太小,训练价值有限)
  • 人工抽查每一类至少 50 张图,确认标注框贴合目标

清洗完再看看各类别分布。如果某类图片特别多(比如瓶子 5000 张)而另一类特别少(比如电池 100 张),要做欠采样或过采样。最简单的办法:把多类别的图片随机删一部分,少的类别做复制或者用数据增强来补。分类别数量差距不要超过 4 倍,否则训练出来的模型会对大类严重过拟合。

3.2 标注格式与工具选择

YOLOv5 要求的是 txt 格式标注文件,每行一个目标,格式是:class_id x_center y_center width height,而且全部是归一化后的数值(0~1)。注意,这个格式和 LabelImg 默认生产的格式不一样,需要做一次转换。

我自己常用 X-AnyLabeling 或者 LabelImg。LabelImg 老牌稳定,内置了 YOLO 格式输出选项,新手友好。操作要点:

  • 标注时贴着目标边缘框,宁小勿大,太大容易让模型学到背景
  • 遮挡严重的目标也尽量标出来,只标可见部分
  • 每个类别保持统一的框注标准,比如瓶子从瓶口标到瓶底

做自动化辅助标注的话可以用 X-AnyLabeling,它支持加载 YOLOv5 模型预标注,标注效率能提升很多。

3.3 数据集目录组织与划分

最终目录结构建议如下:

garbage_data/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ └── labels/ ├── train/ ├── val/ └── test/

划分比例按 train : val : test = 8 : 1 : 1。划分时注意:同一个场景的连续帧图片不要拆散到 train 和 val 里,不然会数据泄露,val 的指标会虚高。最后写一个 dataset.yaml 文件,内容大致是:

path: /path/to/garbage_data train: images/train val: images/val test: images/test names: 0: plastic_bottle 1: paper 2: can 3: glass 4: battery 5: food_waste

类别名称建议用英文小写加下划线,不要用中文。后面可视化的时候可以用代码把中文映射回去,但文件名和 yaml 里的 class name 用英文,能避免一整套编码问题的连锁报错。

4. 模型训练与关键参数调优

4.1 训练命令与基础参数理解

YOLOv5 训练一行命令搞定:

python train.py --data garbage_data.yaml --weights yolov5s.pt --epochs 100 --img 640 --batch 16

这里面有几个关键参数值得展开讲:

  • --weights:加载预训练权重,YOLOv5s 是在 COCO 数据集上预训练的。使用预训练权重而不是从零训练,迁移学习的优势非常明显,尤其当你的数据集量级不大时,收敛更快,准确率更高。
  • --img:训练时把图片 resize 到多少像素。640 是 YOLOv5 的默认值,效果均衡。垃圾中小目标多,可以考虑 960,显存不够就降到 416。
  • --batch:batch size 需要根据显存调。一个经验关系是:batch size x 图片分辨率 越大,显存占用越高。8G 显存跑 640 分辨率,batch 16 基本是极限。
  • --epochs:100 个 epoch 够起步。我见过很多人一上来就 300 甚至 500 个 epoch,你会发现 100 个 epoch 之后 loss 基本不再显著下降,纯粹浪费时间。

4.2 超参数文件手动调节

YOLOv5 官方仓库的 data/hyps/ 目录下有超参数配置文件,常用的是 hyp.scratch-low.yaml。挑几个影响大的说:

lr0: 0.01 # 初始学习率 lrf: 0.01 # 最终学习率系数 momentum: 0.937 weight_decay: 0.0005 warmup_epochs: 3.0 fl_gamma: 0.0 # focal loss 系数 anchor_t: 4.0 # anchor 匹配阈值
  • 学习率:0.01 是官方默认值,如果你从零训练可以适当调高到 0.02,但如果用预训练权重,0.01 就很合适,太高会破坏已学到的特征。
  • anchor_t:控制锚框匹配的正样本比例。垃圾检测中小目标多、形状不规则,如果把 anchor_t 从 4.0 调大到 5.0 或 6.0,能让更多预测框参与训练,提升对小目标的召回率。代价是训练时间变长,loss 收敛变慢,需要多做几次实验比较。
  • fl_gamma:focal loss 的 γ 参数,默认是 0 表示关闭。如果你的类别不平衡问题非常严重,可以设为 0.5~1.0,让模型更多地关注难分样本;如果数据集已经做过均衡处理,不需要开。

这些参数不需要全部调。我的建议是:先默认真跑一版,看结果再针对性调。不要一开始就陷入超参数调优的无底洞,先出一个 baseline 比什么都重要。

4.3 模型选择:s 还是 m 还是 l

YOLOv5 官方提供了 n/s/m/l/x 五个尺寸的模型,体现在 --weights 和 --cfg 里选不同的版本。垃圾分类这类任务,我建议从 YOLOv5s 开始:

  • n 太小,精度不够,垃圾类别相似度又不低
  • s 精度和速度均衡,是大多数项目的甜点区
  • m 和 l 精度更高,但训练和推理更慢,若是要部署到边缘设备通常不划算

如果 baseline 训练完发现 mAP 卡在 80% 以下上不去,可以试试换成 m 或 l,同时看看是不是数据集质量问题。注意,模型变大并不一定就能解决精度问题,大部分时候瓶颈在数据和标注。

训练过程中要盯住三个东西:train loss 曲线是否平稳下降,val loss 是否同步下降(val loss 回升就是过拟合信号),以及 P、R、mAP 曲线是否单调上升。我用过一段时间的建议是每 10 个 epoch 看一下 runs/train/exp*/ 目录下的 results.png,一次性生成的曲线图能让你快速判断训练是否健康。

5. 模型评估与推理部署

5.1 评估指标的判读方式

训练完跑验证集看指标:

python val.py --data garbage_data.yaml --weights runs/train/exp/weights/best.pt --img 640

主要看这几个:

  • mAP@0.5:IoU 阈值为 0.5 时的平均精度,这是最主要的参考指标,垃圾检测做到 90% 以上算是优秀。
  • mAP@0.5:0.95:更严格,对框的位置精度要求很高。垃圾检测不像自动驾驶那样对定位要求苛刻,这个指标 70% 以上就够用。
  • Precision/Recall:看两者的平衡。如果 Precision 高 Recall 低,说明漏检多;反过来说明误检多,需要根据自己的应用场景取舍。比如做垃圾桶自动分拣,宁可误检也不能漏检,就偏向高 Recall 的模型。

同时看 val 生成的混淆矩阵(confusion_matrix.png)。垃圾分类里最容易混淆的就是塑料瓶和玻璃瓶、纸盒和纸袋。如果混淆矩阵里这两类互相误检严重,大概率是标注数据不够典型,补充这两类更具代表性的图片,比换模型更有效。

5.2 快速局部推理验证

用训练好的模型跑几张真实场景图片,不要只跑验证集:

python detect.py --source test_pics/ --weights runs/train/exp/weights/best.pt --conf-thres 0.5

我习惯把置信度阈值先设置低一点(0.25),先看哪些区域经常被误报,再逐步调到能接受的平衡点。如果发现小目标物体频繁漏检,可以把 detect 时的--img调大(比如 960),相当于让模型在更大分辨率下找小目标,效果比盲目改训练参数更直接。

5.3 模型导出与边缘端部署

YOLOv5 的模型导出到 ONNX 非常简单:

python export.py --weights runs/train/exp/weights/best.pt --include onnx

导出 ONNX 之后可以做推理、做 TensorRT 加速,也可以转到其他平台。我自己把垃圾识别模型部署到过树莓派 5 上,CPU 推理 YOLOv5s,640 分辨率大概每帧 1~2 秒;换成 ONNX Runtime 加动态量化后能提升 20%~30%。如果是部署到 Jetson Nano 这类带 GPU 的设备,还能进一步用 TensorRT 做 fp16 推理,速度能提升好几倍。

部署层面还有一条路:把模型转成 NCNN 格式,跑在手机或者嵌入式 ARM 芯片上。这个流程对毕设里常见的“树莓派 + 摄像头实时识别”甚至“STM32 + 摄像头先传图再识别”的场景都能覆盖。需要注意,边缘端部署时模型精度会有所下降,尽量在导出后用边缘端同样的推理引擎做一次评测对比,确保精度损失在可接受范围内。

一个拓展思路是:垃圾分类检测往往不是终点。比如做一个“检测 + 机械臂分拣”的完整系统,树莓派做识别,通过串口或 GPIO 把分类结果发给 STM32 来控制舵机/电机完成分拣动作,这是很多优秀毕设的架构形态,也把算法和硬件串成了一个完整闭环。

6. 实战踩坑与优化清单

6.1 高频问题速查表

下面这些是我周围的朋友和项目里反复遇到的典型问题,整理成了一张表,方便你对症下药。

现象原因解决办法
Loss 一开始就是 nan学习率过高,或标注文件有非法值降低 lr0,检查 label 是否越界(cx/cy 是否大于1)
训练正常但 mAP 低数据集太小或标注质量差扩数据,清洗标注框,检查类别不均衡
小目标全部漏检训练分辨率低,anchor 不适合调大 --img 到 960,anchor_t 调大
塑料瓶和玻璃瓶混淆严重外观相似,训练数据中特征区分度不够补充这两类的不同角度/光照样本,或增加这两个类的标注数量
验证集指标高但实际场景效果差数据分布和真实场景差异大采集真实场景图片混入训练集,做背景增强
图表里的 label 中文乱码matplotlib 无法渲染中文字体设置 plt.rcParams 指定中文字体,或全部使用英文标签
边缘设备推理速度太慢模型太大没有优化换轻量模型,导出 ONNX/TensorRT,做量化

6.2 提升精度的几个“偏方”

第一,关于数据增强,YOLOv5 训练的--augment参数默认开着,Mosaic 增强会在训练时把 4 张图拼接成一张,对小目标检测特别有帮助,因为拼图之后目标变得更“小”了。但要注意,验证或测试时一定不要开增强,否则指标会失真。

第二,尝试给同一张图片做多种预处理版本加入训练集:亮度变化、旋转 90 度到 180 度的角度变化、上下翻转,这些对垃圾桶视角下“物品可能是倒着塞进去”的真实情况很有帮助。

第三,如果某个类别就是辨识度极低,可以考虑语义上位问题。比如“纸”这个大类如果包含纸巾、纸盒、纸袋、报纸,它们的形态差异太大,模型通常学不好。拆分成多个子类,分别标注,模型准确率会好很多,推理时再合并成一个大类输出。

6.3 从训练到落地的三个核心认知

做了一段时间的项目后,我个人最大的体会是:垃圾分类识别这类视觉检测项目,模型反而是最不卡脖子的部分。真正的工程量集中在数据清洗、类别体系设计和边缘端部署适配。数据决定了模型精度的天花板,部署的算力约束决定了模型的上限,YOLOv5 只是让这两件事的衔接变得足够顺滑。

如果你是一场毕设做下来,我建议把节奏控制好:第一周跑通环境加训练 baseline,第二周做好数据集清洗和第一轮调参,第三周导出模型并做好部署验证,剩下时间全部用来打磨细节、做可视化展示和跑更多真实场景测试。不要一开始就埋头调超参数,先把整条链路跑通,再回来精细化。

最后再分享一个小技巧:一定要定期备份你的最佳权重文件。训练过程可能会中断,runs 目录也可能被清理,把 best.pt 复制到几个不同的位置是稳赚不赔的习惯。做工程不是比谁跑得快,是比谁少返工。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询