资讯动态

基于YOLOv8的垃圾分类检测系统:从数据标注到边缘部署实战

发布时间:2026/10/21 22:53:17 来源:尧图企业网站定制
我们小区的垃圾分类房刚投入使用时督导员阿姨每天翻垃圾袋翻得手套都黑了。志愿者站在桶边反复提醒贝壳是其他垃圾大棒骨不是厨余垃圾嗓子哑得说不出话。那会儿我就在想这类依赖人力盯桶的督导模式瓶颈太明显了——干预效率低、居民体验差、人力成本又高。如果有一套能自动识别垃圾类别、给出正确投放指示的视觉系统挂在垃圾房门口就能实时判定是不是就能把督导员从嘴皮子活里解放出来我花了三个多月用深度学习做了一套生活垃圾分类检测系统实测下来对常见家庭垃圾的识别准确率能稳定在90%以上单帧推理速度在边缘设备上也能跑到实时。这篇就把整个项目的完整思路、数据怎么拼、模型怎么选、训练踩过哪些坑、落地到摄像头上有哪些坑一条条掰开讲清楚。1. 为什么垃圾分类检测不能只靠分类模型很多人一听垃圾分类检测第一反应是拿个图像分类网络把图片分成四类就完事。真去现场看一次就知道完全不是那么回事。1.1 摄像头画面不会只给你一个物体垃圾房门口的画面是动态的居民拎着整袋垃圾过来督导员把它摊开或居民自己解开袋口画面里可能出现七八种垃圾混在一起有重叠、有遮挡、还有塑料袋的反光。你用图像分类网络去整图打标模型看到的是一堆东西的混合体根本没法判断哪个区域是什么垃圾。而且督导员真正需要的是指着某一样东西告诉你这个扔哪个桶这就要求系统必须给出物体级别的定位信息而不是整图一个标签。所以项目一开始我就把技术路线定为目标检测Object Detection而不是图像分类Classification。目标检测的回归头会同时输出每个物体的边界框坐标和类别概率相当于告诉系统画面右上角那个粉色盒子是纸箱属于可回收物这样后端逻辑才能做后续判定和引导。1.2 四分类扑克牌式标签体系够用吗国内多数城市执行的是可回收物、有害垃圾、厨余垃圾、其他垃圾四分类但这四分类对视觉模型来说太粗了。举个例子同样被归入可回收物的纸箱和洗发水塑料瓶视觉特征截然不同而其他垃圾里既有脏纸巾又有破陶罐又有大棒骨特征空间分散得离谱。如果模型只有四个输出类别它要在一个巨大的类内差异中找共性训练难度极高而且一旦预测错一个二级类别用户看到的引导就会变得很荒谬。我最后的做法是采用二级标签体系底层检测粒度细到纸箱、报纸、塑料瓶、玻璃瓶、易拉罐、电池、灯管、剩饭、菜叶、果皮、骨头、烟蒂、一次性餐具、旧衣物等二十多个细类再由后端的映射规则把细类归并到四分类。模型只做它擅长的事——视觉特征区分规则引擎负责处理这个细类属于哪个投递桶的逻辑映射。1.3 硬件环境决定了算法复杂度上限垃圾分类房一般设在小区角落条件谈不上好。现场就一台普通工控机或者一块边缘计算板卡没有机房级别的GPU阵列。这意味着模型参数量不能失控单帧推理不能磨叽。我最早试过用高精度的两阶段检测器做实验精度确实好但一测速度只有个位数FPS放在刷卡开门、投递确认这种实际场景里根本没有实用价值。后来的所有选型都被实时较高精度可装在普通设备上这三个条件框住了。2. 数据集从零拼装公开数据、自采图像和标注工程三管齐下深度学习项目里最耗时最枯燥但最关键的就是数据。垃圾这个类目的公开数据集其实不少但质量参差不齐类别体系也乱。2.1 数据来源怎么掺着用我调研了两类公开数据一类是学术机构发布的常见物体检测数据集里面包含纸箱、瓶子、易拉罐等类别另一类是面向垃圾分类比赛或社区项目整理的垃圾图片集。从数据总量看公开部分能做到约三万张但里面细类分布严重偏斜——果皮剩饭多是正常场景而灯管、电池、陶瓷这类样本量少得可怜。如果只靠公开数据训练模型很容易对高频类过拟合、对低频类睁眼瞎。我补了两个来源一是自己跑去垃圾房附近拍摄真实投放场景注意避开隐私问题只拍垃圾桶和摊开的垃圾袋二是在标注平台上做了人工翻拍和合成增强。三部分加起来最终数据集膨胀到约五万张图覆盖了二十四个细类。我的原则是真实场景图至少占六成公开数据做迁移学习的底子合成增强永远只做补充不做主力。2.2 框标注的精确度决定了模型上限目标检测的标注工作远比分类标注繁琐每一张图都要把每个目标物用矩形框框住框大了模型学到垃圾袋边缘的背景纹理框小了模型丢失物体关键部分。我实验下来框的标注误差如果超过目标尺寸的百分之五mAP至少掉两三个点。推荐用图像标注工具圈框速度比纯手工画快太多先跑一个预训练模型的自动标注结果人工只需修正置信度低的框和新出现的漏检目标。一个负责数据处理的同学帮我统计过用这种方式熟练标注一单张图平均只要二十秒左右而纯手绘大约要一分钟。不过自动标注只能用来做初筛关键类别的框我一定人工过一遍。2.3 最难标的三类垃圾餐厨垃圾、透明玻璃和软塑料标注过程中最让人抓狂的是三个特殊类目。餐厨垃圾食材混杂剩菜里半根胡萝卜半块土豆沾着汤汁标注时边界极其模糊我最后按可见主体食材可识别即单独成框的标准统一处理。透明玻璃瓶在浅色背景下几乎隐形只靠轮廓反光识别必须依靠边缘高光标框且要求标注员放大到百分之百倍来标。软塑料比如塑料袋、保鲜膜因为反光和形变经常被模型漏检这类样本的标注原则是宁可框大、不可框漏。这几类样本量我比常规类别多凑了至少三成因为根据经验它们就是模型后续漏检率最高的来源。3. 模型选型YOLOv8是权衡之后的稳妥答案而不是唯一答案选型阶段我对比过三类方案传统图像处理方案、两阶段检测器Faster R-CNN系列、单阶段YOLO系列。3.1 传统图像处理和两阶段检测器为什么被排除传统方案比如颜色直方图加纹理特征加分类器在固定背景下测某些单一垃圾比如白纸、透明瓶效果还行但垃圾房现场背景杂乱、光照多变特征描述子根本照顾不过来稍微换个光线角度鲁棒性立刻崩。这类方案只适合实验桌场景。Faster R-CNN系列精度是好尤其是双重采样加ROI Align的设计对特征定位很细。但它的推理链路长对算力要求高在低算力设备上跑实时场景不现实。我手头又没有高端GPU可以专门带它果断放弃。关于两阶段和单阶段的取舍业界共识就是追求小目标高精度选两阶段追求边缘实时部署选单阶段。3.2 我在各个YOLO版本里怎么切我最早试过YOLOv5和小目标检测优化版YOLOv5YOLOv5算是工程成熟度很高的选择部署工具链齐全。后来换到YOLOv8主要看中几件事官方把训练和导出流程整合得更顺Anchor-Free的检测头少了一堆调Anchor的麻烦而且自带了一系列不同规模的模型配置。为了在边缘设备上达到实时效果我用的是YOLOv8n和YOLOv8s两个规格做对比实验。YOLOv8n参数量三百万出头单帧推理能跑很快但精度略弱YOLOv8s参数量约一千一百万mAP比n版本高接近四个点推理速度在我测试的设备上还是能满足实时需求。综合看得准和跑得快最终定了YOLOv8s。3.3 类别数量对模型结构的影响模型要识别的细类二十四个加上背景共二十五个输出通道这个量级对YOLOv8s来说不构成压力。但我发现一个有意思的现象把分辨率和模型参数提上去之后细类混淆整体减少但类别之间的视觉相似带来的混淆并不会被模型容量抹平比如报纸和纸箱颜色都是黄褐色、纹理都是纸纤维模型老把它们搞混。这类问题后来靠数据层面专门补了差异样本才明显缓解。4. 训练细节从Backbone预训练到损失函数变化数据集和模型结构定了以后训练阶段的工程实验反而是最容易出现看似正常但结果很烂的坑。4.1 预训练权重与冻结策略垃圾分类数据虽然有几万张但对于模型要学到的细粒度纹理特征而言仍然不够。我采用了在大型数据集上预训练好的Backbone权重做迁移学习先用预训练权重初始化整个网络前十个epoch只训练检测头和颈部特征融合层冻结Backbone等loss稳定下降后再解冻全部层用更低的学习率微调。这种两段式训练很有必要。如果一开始就让Backbone参与大学习率更新预训练学到的通用视觉特征会被垃圾图像的分布干扰模型收敛慢而且最终精度经常比冻结训练更差。我自己做过对比冻结方案最终的验证集mAP高了两点多。学习率方面冻结阶段用三乘十的负四次方起步解冻后降到三乘十的负五次方优化器用带动量的SGD。4.2 数据增强策略启发性很强但别贪心目标检测训练绕不开数据增强我用了Mosaic、仿射变换、颜色抖动、随机遮挡几种手段。Mosaic四图拼接是YOLO系训练的标配用四张不同场景的图拼在一起能有效模拟垃圾房内物体混叠、遮挡的情况。但我走了弯路——最开始把Mosaic的启用概率拉到百分之一百结果模型学到了很多拼接缝的伪特征验证集loss纹丝不动。后来我把Mosaic概率下调到百分之五十其余时候用正常缩放和平移效果立刻正常。颜色抖动需要注意一个特殊点垃圾识别非常依赖物体本来的颜色比如香蕉皮是黄的、苹果核偏褐过度调整饱和度会导致模型把色相信息当成噪声忽略。我把饱和度和色调扰动幅度设得比常规分类项目小了一半。4.3 Loss与收敛判断的关键经验YOLOv8自带分类和回归联合损失训练时主要盯验证集的mAP和各类别平均精度。训练到后期我发现总loss在下降但个别低频类别的AP极低典型原因就是样本量不足。解决手段是给低频类别提高损失贡献权重做法并不复杂在损失计算阶段给每个类别的分类损失乘一个权重系数系数与该类样本数量的倒数挂钩再归一化到合理范围。另外一定要把训练过程的批次大小控制在八到十六之间。我在单卡上试过凑更大的批次但垃圾图分辨率高显存吃紧强行减半分辨率反而让细节纹理丢失小物体的AP跌得很厉害。5. 推理加速与模型压缩从ONNX到TensorRT的实战路线训练只是前半程真正的战场在部署。系统如果二十秒才出一次结果那和没有一样。5.1 部署链路选择和加速流程我从PyTorch导出到ONNX再用推理加速引擎转换成TensorRT的engine格式。经过FP16量化以后模型推理速度比原始PyTorch快了接近三倍精度损失控制在可接受范围。要注意的是TensorRT对不同硬件和不同版本的算子支持有差异导出的engine并不是跨设备通用的换一台工控机就得重新转换一次。转换完成后我还做了一次动态尺寸处理把输入尺寸设成416乘416的整数倍。这个操作有点技巧性模型在三种输入尺度之间切换时TensorRT会重算网络布局如果业务场景就是固定机位摄像头建议直接固定一个分辨率。5.2 为什么FP16够用而不直接上INT8INT8量化能进一步提速但垃圾分类检测对边界框回归的精度很敏感尤其是透明玻璃瓶和浅色塑料这类低对比度目标一旦用INT8经常出现框漂移也就是明明看到的是一整只瓶子模型给出的框只框住了一半。FP16虽然加速幅度不如INT8但可以保持边界框精度风险小很多。如果你的部署设备性能更紧张可以尝试量化感知训练在训练阶段就模拟INT8的精度损失但代价是训练周期拉长。我的经验是先跑FP16等整个系统的瓶颈确实不在推理速度而在成本时再考虑是否折腾INT8。5.3 摄像头输入到结果返回的完整链路现场摄像头用IP网络摄像头接入视频流通过OpenCV拉流每帧图像先等比缩放到目标尺寸再进模型推理。模型输出经过NMS去掉重叠框后后端逻辑把同一个目标物体的检测框和置信度整理成JSON格式再通过WebSocket推给前端屏幕显示。我还给系统加了一个多帧投票机制同一目标连续三帧都被识别为同一类别才判定结果有效单帧偶尔的抖动误判不会导致居民投错桶的引导信息乱变。这个设计在实测中非常实用极大避免了因为某个瞬间弯腰动作造成的遮挡误判。6. 实测效果与三个最典型的翻车场景系统是在一个模拟垃圾分类投放点做的现场实测摄像头架在约一点五米高的可调支架上正对投放口镜头俯视角约三十度。测了大约一千次真实投放动作整体识别准确率约百分之九十二单帧推理延迟约五十毫秒满足实时要求。6.1 翻车场景一塑袋反光让模型集体失明湿垃圾普遍是装袋投放的居民解开袋口画面里常常出现塑料袋在灯光下大面积反光。反光区域会严重干扰检测框导致袋内脏物轮廓淹没在高光里。我尝试了两种缓解方案一是摄像头安装位置改为略偏侧面的角度减少正对强光源的反光二是在训练数据里专门增加了拉高曝光模拟反光的图像样本。组合下来漏检率降低了不少但要完全根除还需要配合现场补光灯的角度调整。6.2 翻车场景二透明的玻璃瓶几乎隐身透明玻璃瓶罐的视觉特征完全依赖边缘高光和背景透出的形状在深色背景下表现尚可一旦放在浅色理石台面或白色垃圾袋上就极易漏检。我最后的处理思路是训练阶段给玻璃类单独增加较暗背景的负样本同时在后端逻辑中降低该类别的置信度阈值——模型对自己有把握却说不太准的情况稍微放开阈值反而能提高召回率代价是偶尔会把透明塑料瓶误判为玻璃瓶。这个代价可以接受毕竟两者最终都进可回收物桶。6.3 翻车场景三大棒骨和椰子壳到底算哪类大棒骨和椰子壳的外观看上去坚硬厚重模型很容易按照硬的像其他垃圾来归类但按本地管理条例它们是厨余垃圾。这类样本的误判说明一个道理有些分类规则并不完全由视觉特征决定模型可以靠猜测规则必须靠人工维护映射表。我给这类特殊样本建了一个语义修正名单后端逻辑检测到高置信度的某细类时会强制映射到指定桶不会再走到常规归类分支。7. 项目可以再怎么往前走一步这套系统已经能支撑识别一句引导一个桶的基础功能但从实际体验出发还有几个很有价值的方向可以做。一个是质量感知。现在模型只知道这是什么类别不知道它是否属于合格的可回收物。同一张纸箱干净和沾了油污的回收价值完全不同。后续可以派生出子分类头让模型同时预测该物体是否清洁可回收这个功能对智能回收箱的运营方有直接的商业价值。一个是交互方式升级。现在结果推给屏幕显示但多数居民投递垃圾时目光是盯着桶口的屏幕在侧边很难注意到。改成语音播报引导才能让信息真正被接收代价是得处理噪声环境下的语音合成音量和多目标并发喊话的逻辑。还有一个更长远的方向是把检测结果连续记录形成一个小区的垃圾投放热力数据。比如哪个时段湿垃圾投放集中、哪类垃圾经常投错桶这些数据可以反哺社区宣传和桶位调度让系统从一个识别工具变成管理工具。回头看我做的这套东西技术栈并不玄乎就是公开数据集加自采数据、YOLOv8s加TensorRT、再加一层业务映射逻辑。真正花时间的地方全在细节点上标注怎么定标准、损失权重怎么调、特殊类别怎么修正。每个人手里能拿到的公开数据都差不多拉开差距的永远是这些看起来不起眼、实际起大作用的工程细节。如果看文章的人正准备做类似的识别系统建议先把数据标准和业务映射表想清楚再开模型那笔账比多调几次参划算得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑