☰
基于YOLO系列的生活垃圾智能检测与分类系统实践复盘
2026/10/20 3:43:57 网站建设 项目流程

接手这个项目时,客户那边的原始诉求其实很朴素:小区配套的智能分类箱识别率不稳定,督导员人力成本压不下去,希望能有一套“扔进去就知道对不对”的视觉方案。但真正从头搭完这套“基于YOLO系列的生活垃圾智能检测与分类系统”之后,我发现它远比想象中复杂——数据怎么定类、标注标到多细、模型选哪个版本、部署在什么硬件上、误检漏检怎么兜底,每一个环节都是坑。这篇文章从方案选型到落地部署,把整个过程中的关键决策、参数配置和排障经验完整梳理一遍,给准备做类似视觉检测项目的朋友一份可以直接参考的实操记录。

1. 项目核心思路与方案选型

1.1 场景需求拆解:先搞清楚“分类”到底要分到什么粒度

做检测项目最忌讳一上来就找模型,先得把需求里的每个词拆透。这个项目名字叫“生活垃圾智能检测与分类系统”,但“分类”这两个字在不同场景下含义完全不同:是只分四分类(可回收、厨余、有害、其他),还是要细分到具体物品种类(塑料瓶、易拉罐、纸箱、果皮、电池)?是识别桶内垃圾,还是识别居民手里准备投放的垃圾?是单帧图片识别,还是连续视频流识别?

我最终和客户确认的需求是:在垃圾投放点的摄像头画面中,对居民投放的垃圾包或散落垃圾进行实时检测,输出具体的垃圾类别,同时联动分类箱的对应投递口。如果出现混投(比如可回收桶里出现厨余垃圾),系统需要给出告警提示。这就决定了检测粒度必须细化到具体物品层级,至少覆盖小区垃圾中最常见的十几类,而不是只给一个粗粒度的大类标签——因为只有知道“具体是什么”,才能判断“放对位置没有”。

这个细化带来的直接后果是标注成本翻倍、类别不平衡问题更突出。比如“其他垃圾”里的污损塑料袋和“可回收物”里的干净塑料袋,在图像上几乎无法区分,只能靠人为规则去兜底。所以方案选型的第一步,不是选YOLO哪个版本,而是建立一套可执行、可标注、可验收的类别体系。

1.2 为什么选YOLO系列:检测框架对比与版本取舍

目标检测领域可选方案不少,两阶段的有Faster R-CNN系列,单阶段的有YOLO、SSD,还有基于Transformer的DETR等。我在这个项目里选YOLO系列,原因很直接:实时性要求高、边缘设备部署受限、项目周期短,需要一个工程成熟度高、生态完善、踩坑成本低的方案。

具体到版本取舍,我对比过当时主流的几个版本,列个表更清楚:

版本优势劣势适用判断
YOLOv5生态最成熟,资料多,部署方案齐全官方维护节奏后期放缓适合快速落地,踩坑成本最低
YOLOv7精度不错,推理速度优秀结构相对复杂,部分 trick 依赖训练技巧适合对精度有更高要求的场景
YOLOv8支持实例分割,训练代码一体化早期版本部分算子对边缘设备不友好适合需要mask分割、且硬件算力充足的场景
YOLOX解耦头+anchor-free,精度好工程化资料相对少一些适合算法团队自研为主

最终我选了YOLOv5作为基线模型。原因很务实:客户现场既有GPU服务器也有NVIDIA边缘设备,YOLOv5的TensorRT部署方案已经被验证过很多次,网上能查到的坑基本都有人趟过了。加上项目交付周期只有两个月,选最稳的比选最新的重要。如果你想尝试更新的版本,完全可以从YOLOv8起步,但对于一个以“稳定交付”为第一目标的项目,我个人的建议是:用熟不用新。

1.3 系统总体架构与工作流

整个系统的架构可以拆成三层:数据层、模型层、应用层。

数据层负责采集和标注图像,包括摄像头抓拍、历史监控视频抽帧、现场补拍,以及公开的垃圾分类数据集补充。模型层完成训练、验证、转换和推理,包括YOLOv5模型的训练调优、ONNX导出、推理加速引擎转换,以及分类置信度阈值的设定。应用层对接业务:检测结果叠加到实时视频流、混投告警推送、投递口联动控制、数据统计看板等。

这三层之间通过接口衔接,核心流程是:摄像头采集图像,边缘设备上的推理服务对画面做检测,输出每个目标的类别、置信度和位置框,然后根据预设的规则(比如某个区域是否出现厨余垃圾、是否出现在可回收桶投递时段)判断是否需要告警,最后把结果写入数据库,供前端展示和后台分析。

这套流程本身不复杂,真正花时间的不是写推理代码,而是让模型在复杂光线、遮挡、形变下的检测结果稳定可靠。这个目标80%靠数据,20%靠调参。

2. 数据集构建与标注规范

2.1 生活垃圾数据集的特殊难点

用过公开检测数据集的人都知道,COCO、VOC这类数据干净、类别清晰、拍摄角度规整。但生活垃圾完全不是这样。我踩过最深的坑之一,是以为公开数据集能满足需求,结果模型在测试集上跑得很漂亮,一到现场就“翻车”。

生活垃圾检测难在哪?我总结为五个字:脏、乱、杂、变、遮。

  • 脏:垃圾表面污损严重,很多关键视觉特征被污染,塑料瓶外面套个脏袋子就认不出来了。
  • 乱:垃圾是堆叠的、缠绕的、压扁的,目标形状和标准物体差异巨大,一个易拉罐可能被踩成一张铝皮。
  • 杂:类别之间视觉相似度极高,比如矿泉水瓶和洗衣液瓶、外卖盒和泡沫饭盒,在普通摄像头视角下很难区分。
  • 变:光照变化剧烈,白天阳光直射、晚上灯光昏暗、反光的塑料袋表面过曝,同一类物体在不同时段外观差异很大。
  • 遮:目标相互遮挡、被垃圾袋半遮、被督导员身体挡住,完整目标比例很低。

这意味着单纯套用通用目标检测的数据处理方式是不够的,必须针对这些难点做专门的采集和标注设计。

2.2 数据采集与类目体系设计

类目体系是整个算法效果的“天花板”。我一开始拟定的是十八类,后来在实际标注中发现有些类别人工都难以区分,硬着头皮给模型学只会带来大量误检,最终砍到了十二类:纸板箱、报纸书本、塑料瓶、易拉罐、玻璃瓶、厨余垃圾(含果皮菜叶等混合)、塑料袋、一次性餐盒、电池、烟蒂、织物、泡沫塑料。

这个类目设计有一个关键原则:类别之间必须存在相对稳定的视觉边界。比如“厨余垃圾”是混合类目,因为单独的果皮、菜叶、剩饭在视觉上差异巨大但投放类别相同,我从检测任务的角度把它们合为一个类;而“塑料瓶”必须从“塑料制品”里单独拆出来,因为塑料瓶的回收价值远高于其他塑料,投放要求不同。

数据采集的策略也很有讲究。现场摄像头是固定视角俯拍,数据集里就必须以这个视角为主,通用数据集里的平视图片只能做辅助。我让采集人员在多个点位、多个时段(早中晚、晴天雨天、灯光开关状态)拍摄,保证覆盖真实环境的变化。最终自采数据约1.6万张,加上公开数据和视频抽帧,总计2.3万张。按十二类计算,每类平均约1900张,头部类目如塑料袋、塑料瓶超过3000张,尾部类目如电池、烟蒂约800张。

2.3 标注实操规范与数据增强策略

标注规范直接决定了模型能学到什么。我给标注团队立了几条硬规矩:

  • 完整目标优先标注,被遮挡超过70%的目标不标;
  • 同一张图里小目标只要清晰可辨就必须标,不允许漏标;
  • 模糊目标不标,宁可少标不可错标;
  • 框体紧贴目标边界,不要留大量背景,也不要切掉目标边缘。

这四条规则看起来简单,实际执行时最容易被突破的是第二条。人眼会习惯性忽略小目标,但小目标恰恰是现场检测的难点——远处的塑料瓶、画面角落的烟蒂,模型就是靠这些标注学出来的。

数据增强方面,我除了使用YOLOv5自带的马赛克增强、随机仿射变换、HSV色域扰动之外,还额外加了三种针对性的增强策略:随机亮度和对比度扰动,模拟一天中不同时段的光照变化;高斯模糊和运动模糊模拟摄像头抖动和塑料反光过曝;随机遮挡模拟垃圾堆叠时目标被部分覆盖的场景。

三倍增强之后,实际参与训练的样本量等效约7万张。这个量级对于十二类检测任务来说不算大,但配合合理的增强策略,已经足够把模型的基础能力打扎实。

3. 模型训练与调优实操

3.1 训练环境配置与基础参数

训练用的机器是单张专业显卡,显存24GB。对于YOLOv5这种规模的模型,这个配置完全够用,不需要多卡并行。环境方面,Python版本用3.9,深度学习框架用的官方推荐的版本组合,依赖库按官方 requirements 安装即可,没有遇到什么版本地狱问题。

基础参数我按以下配置起步:

参数配置值说明
输入尺寸640x640速度和精度的平衡点,首次尝试不建议直接上1280
批次大小1624GB显存下的安全值
训练轮数300早停机制开启,防止过拟合
优化器SGD动量0.937,初始学习率0.01
学习率策略余弦退火比固定步长下降更平稳
权重初始化COCO预训练权重迁移学习显著加速收敛

这里要特意说一句:输入尺寸不要贪大。640x640在多数场景下够用,升到1280x1280虽然对小目标检测有提升,但推理耗时几乎翻倍。对于垃圾检测这种需要实时输出的业务场景,640是性价比最高的选择。

训练过程我记录了详细的日志,包括每个类别的精确率、召回率和平均精度均值。前50轮loss下降很快,到150轮左右开始趋于平缓,300轮时在验证集上的mAP@0.5达到了0.86,mAP@0.5:0.95约0.58。从曲线看,类别之间的差异比较大,头部类目(塑料瓶、纸板箱)AP值超过了0.9,而小目标占比高的类别(烟蒂、电池)AP值只有0.6左右。

3.2 关键超参数调优与实验记录

训练完成之后,我做了几轮针对性调优。第一轮调的是anchor尺寸。YOLOv5默认会基于数据集自动计算anchor,但如果类别中小目标占比高,自动计算的结果可能偏向中大型目标,导致小目标检测率上不去。我单独分析了标注框的尺寸分布,发现烟蒂、电池这类目标在640分辨率下只有不到30x30像素,于是手动调整了anchor的档位,让小尺寸anchor的IoU匹配阈值更宽松。

这一改动带来的收益很明显:烟蒂的召回率从0.55提升到0.68,AP从0.58提升到0.72。代价是可回收类大目标的精确率稍微降了1.5个百分点,但整体利大于弊。做检测项目要习惯这种“按下葫芦浮起瓢”的取舍。

第二轮调的是类别损失权重。数据集中塑料袋、塑料瓶这类样本多,模型天然学得好;电池、烟蒂样本少,模型容易偷懒把它们预测成背景或其他类。我通过调整类别损失权重,给尾部类目更高的惩罚系数,同时配合过采样策略,把尾部类目的AP普遍拉高了5到8个百分点。

第三轮是测试时增强和模型集成,但这两种方法我都没有用到最终方案里,原因后面部署部分会说。单独跑离线评测时,测试时增强能把mAP再拉1.5个点,但推理帧率下跌严重,对实时系统来说不划算。

3.3 评估指标解读与模型选型

评估模型不能只看总mAP,那会掩盖很多问题。我整理了一张按类别区分的验证集结果,很有参考价值:

类别精确率召回率AP@0.5备注
纸板箱0.940.920.95形状规整,效果好
塑料瓶0.910.900.93样本充足
易拉罐0.890.870.91反光场景偶尔漏检
厨余垃圾0.870.850.89形态杂,依赖上下文
塑料袋0.820.800.85透明袋是难点
电池0.720.650.74小目标+镜面反光
烟蒂0.700.620.72尺寸太小,密集场景漏检多
其他类平均——0.81细节略去

从这组数据可以明显看出,模型能力的瓶颈完全集中在“小目标”和“半透明/反光目标”上。也就是说,数据层面必须再针对这两个痛点补强,而不是盲目换更大的模型。我试过用YOLOv5l替代YOLOv5s,mAP提升约3个点,但推理帧率降了40%,在边缘设备上已经达不到实时要求,最终还是保留在YOLOv5s级别。

如果你对精度有更高要求,建议先尝试增加输入分辨率而不是换大模型。把输入尺寸从640提升到960,mAP提升的效果往往比模型参数翻倍更明显。

4. 部署落地与推理优化

4.1 硬件选型与模型转换

部署方案在项目规划阶段就要定下来,不能等训练完了再想。这个项目的现场设备是NVIDIA边缘计算设备,我们同时测试了纯CPU方案的可行性。结论是:只做单路视频流检测时,CPU使用量接近满载,帧率刚刚到8到10帧,只能勉强用;而边缘计算设备在同样的模型和输入尺寸下能跑到25到30帧,当然后者成本也更高。

如果客户的预算紧张,CPU方案也不是不能用,但必须接受两个妥协:降低输入分辨率到480,同时把检测频率从实时降为每2秒一帧。对于垃圾投放点这种目标移动慢的场景,2秒一帧完全够用,没必要追求电影级帧率。

模型转换流程是标准的:PyTorch训练权重导出为通用交换格式,再转换为推理加速引擎格式。转换过程中最容易出问题的是自定义算子和动态形状。YOLOv5的模型结构比较干净,常规导出一条命令就能通过。但如果不修改代码直接用,容易遇到两个坑:一个是导出时固定了批大小,导致推理时无法动态调整;另一个是某些图层在转换时精度下降,尤其在FP16模式下,小目标检测的置信度会集体变低。

我的处理方案是:导出时设置动态批大小,允许1到4之间变化;转换推理引擎时先用FP32做精度验证,确认检测结果与原模型一致后,再对比FP16模式,如果精度的下降在可接受范围内(我定的标准是mAP下降不超过2%)就启用FP16,否则退回FP32。实测下来这个项目FP16模式mAP下降约1.5%,可以接受,且推理速度比FP32快约1.8倍。

4.2 推理性能优化手段

除了模型本身就够轻量之外,我还用了三个工程层面的优化手段。

第一个是图像预处理的前移。原始视频流是1080P,如果直接把整帧送到模型里,640x640的输入只覆盖画面中心区域,目标小的问题会更严重。我的做法是先在CPU上用OpenCV对画面做一次轻量缩放,把感兴趣区域裁剪出来再送推理,同时保留全图的检测结果映射关系。这样一来,模型实际上专注在看“投放口和垃圾箱附近的区域”,远处误检率明显下降。

第二个是推理结果的后处理优化。YOLO系模型的非极大值抑制过程在目标密集时比较耗时。我根据垃圾场景的目标密度特点,把置信度阈值从默认的0.25提到0.4,IoU阈值从0.45微调到0.3。这样做的效果是:预测框数量大幅减少,NMS耗时从平均4毫秒降到1.5毫秒;误检率降低,画面里垃圾分类督导员的背影不再被打上“纸板箱”的框。

第三个是推理服务的异步化。我把采集、推理、业务上报拆成三个线程,采集线程只负责取帧,推理线程消费最新帧,业务线程处理结果。这样即使偶发卡顿,系统也会自动丢弃旧帧,不会因为积压造成延迟越来越大。实测在持续运行两天后,内存占用稳定,没有出现泄漏问题。

4.3 异常兜底与工程化设计

模型永远会有犯错的时候,工程化要做的是把错误后果控制在可接受范围内。这个项目里我做了一个“置信度分级”机制:当检测置信度高于0.75时直接执行联动开箱;置信度在0.5到0.75之间时推送到管理端由人工确认;低于0.5但有目标存在时只记录日志,不触发动作。这个机制避免了很多误开箱,也降低了居民投诉的概率。

针对“不可回收物混投”的告警逻辑,我加了一个防抖机制:模型连续5帧检测到同一区域存在特定类别时才判定为混投,避免摄像头前有人经过造成单帧误判。同时设置了一个短暂的“投放缓冲期”,居民在投放动作结束后才进入判定阶段,减少动态模糊带来的影响。

另外,现场设备经常面临断网的情况,所以推理服务必须在本地完整运行,业务数据先写本地队列,网络恢复后再批量同步到服务器。这个细节如果没做好,一旦断网整个系统就瘫痪了,在运维层面是灾难性的。

5. 常见问题与排查技巧实录

5.1 问题速查表

把项目实施过程中高频出现的问题整理成速查表,希望对后面做类似项目的人有帮助:

问题现象排查思路解决办法
模型在测试集很好,现场误检多训练集与现场分布差异大补充现场真实数据,占比不低于70%
小目标(烟蒂、电池)几乎检测不到输入尺寸太小或anchor不匹配提高输入分辨率,手动调整anchor档位
透明塑料袋检测率低特征弱,目标边界不清加边缘增强,利用袋子里的内容物作为上下文特征
夜间灯光下检测率骤降训练集缺夜间数据增加夜间补拍,使用亮度扰动增强
推理速度慢,CPU占用高使用了过重模型或整帧输入降低分辨率,裁剪感兴趣区域,开启FP16
同一目标被反复标注成不同类别类别定义模糊重标不可靠样本,给标注团队补充示例图库
运行几天后内存持续上涨推理服务存在资源泄漏检查图像队列是否积压,给推理线程加丢帧策略

这些问题里,前三个是算法层面的,后四个更多是工程和运维层面的。如果项目上线前没有做足够的灰度测试,最容易暴露的反而是后几个,因为现场环境比实验室“脏”得多。

5.2 两个印象最深的坑

第一个坑发生在第一轮现场测试。模型在自采验证集上mAP高达0.88,但到了现场,第一天就出现大量把黑色垃圾袋识别成“织物”的误报。排查发现,自采数据里的织物类图像大多是纯色衣物、毛巾,而现场出现的织物多半是黑色的、与垃圾袋混在一起的一团东西。问题根源是训练数据里“黑色缠绕状物体”的样本不足,模型只能用颜色和纹理特征做推断,自然就分不清了。解决方法是专门补采了300多张黑色垃圾袋和相关混合垃圾的图片,并把织物类的标注标准调整成“能明显看出衣物/织物形态才标”,模型误报率立刻降下来了。

第二个坑更隐蔽。训练过程中我为了追求mAP,在一开始就开了自动均衡类别权重的功能。结果发现整体mAP确实高了,但具体看每个类别时,塑料瓶的AP从0.92掉到了0.88,因为权重均衡让头部类目“让渡”了一部分学习能力给尾部类目。后来我改成只在训练后半程开启类别权重,前半程让模型先充分学习头部类目的特征,后半程再强化尾部类目,两者都有提升。

5.3 一些值得坚持的工程习惯

复盘整个项目,有一个习惯我觉得特别值得推荐:从第一天就建立数据版本管理意识。每一轮新增数据、每一次标注规范调整、每一个模型权重的对应关系都要记录下来。垃圾检测这种持续迭代的项目,数据会不断增加,类目可能调整,模型会反复训练,如果没有清晰的版本记录,两个月后你根本说不清当前这个模型是用哪些数据训出来的。

我在项目里维护了一张记录表,每一行对应一个训练版本,包含:数据快照时间、标注规范版本、训练脚本参数、验证集结果、部署灰度范围。这张表在后续客户要求“为什么电池识别率比上次低了”的时候发挥了决定性作用——一查不是模型退化了,而是新增了一类外观相似的数据把原有类别“稀释”了。

另外,建议给每个类目保存一个“标准示例库”和“边界示例库”。标准示例是这类物体最典型的样子,边界示例是容易和其他类混淆的样子。标注团队新成员进场时,先看这两个库比看十页标注规则文档都管用。

6. 体验与展望:这个系统还能往哪里扩展

项目交付后,客户又提了两个扩展方向,虽然没列入当期合同,但确实能看到这类视觉检测系统的演进路径。

一个是把单帧检测升级为“行为序列检测”,即不只看居民投放时手里的垃圾类别,还追踪完整的投放动作,自动判断居民是否在拿出垃圾后犹豫、是否仔细查看了桶上的标识,这些行为特征对垃圾分类习惯的养成分析非常有价值。技术上需要在YOLO检测的基础上加一个轻量级的动作识别分支,当前边缘设备的算力基本能够支撑。

另一个是把静态检测延伸到“溯源与统计”。目前系统能够识别垃圾类别,但对于“这一袋厨余垃圾来自哪个楼栋”还无法自动判断。结合小区出入口的人脸或门禁信息是可以做关联的,但涉及到居民隐私保护的问题,需要谨慎推进。我个人的观点是,技术能力上可以预留接口,但产品设计上要非常克制,先做匿名化的数据统计,再决定是否做个体行为分析。

从成本角度看,实时视觉检测的硬件成本逐年下降,边缘推理设备的算力在同等价位下已经翻了一倍。垃圾分类投放点、环卫中转站、再生资源回收驿站这些场景,未来两三年大概率会大面积部署类似的检测系统。算法的竞争点也会从“能不能检测”转向“数据够不够细、服务够不够稳”,前期的数据积累和工程化打磨会变成真正的壁垒。

做这个项目的过程中,我最大的体会是:模型本身不是项目的核心,数据质量、工程化兜底、客户需求的理解才是。YOLO系列提前帮我们解决了很多检测框架层的问题,剩下的全是“场景理解”的活。你花在数据上的每一天,都会在模型上线后的稳定性上得到回报。

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

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

立即咨询