ARTICLE DETAIL

资讯详情

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

垃圾分类识别实战:基于YOLOv8的改进与RK3588部署全记录

垃圾分类识别实战:基于YOLOv8的改进与RK3588部署全记录 开题时我以为这个题目很简单——无非是拿YOLOv8套一个垃圾数据集train一会儿出个mAP数字再写两章创新点就完事。真做进去才发现垃圾分类识别这四个字几乎踩遍了目标检测领域的所有坑目标尺度方差极大、透明和半透明物体常驻、遮挡堆叠严重、类别边界模糊还有大量低光照场景下的近色目标。前前后后改了backbone、动了head、换了损失函数、又重调了数据增强才把一个能稳定跑在边缘盒子上的生活垃圾识别模型交付出去。这篇文章我会把整个设计过程、改哪些地方有效、哪些是无用功、训练和部署的真实参数都摊开讲给准备做同类项目的同学一个可以直接参考的落地路径。先说最终方案的轮廓方便你对项目整体有个把握以YOLOv8n为基线用一份合并了公开数据和自采数据的生活垃圾数据集6大类、28小类训练改进点集中在注意力机制、检测层输出和损失函数上配合定制数据增强。训练完的模型在自测集上mAP0.5约0.842mAP0.5:0.95约0.593INT8量化后部署到RK3588上单帧推理大约12ms。下面每一个结论我都会讲清楚为什么是它。1. 垃圾分类识别难在哪这不是普通的目标检测任务我接手这个项目的第一反应是去翻COCO上的检测指标觉得垃圾再复杂也就是80类之一。但实际把垃圾桶里的东西拆开看任务特性和COCO类检测完全不同。1.1 垃圾不是标准工业品常见的目标检测训练集比如COCO里面的物体形态相对规整一个杯子有杯口、杯身、把手一辆车有清晰的轮廓边界。垃圾完全不是这样。一个被踩扁的易拉罐在图像里可能是一个不规则的银色多边形一个揉成团的塑料袋轮廓线是断裂且高度自遮挡的一个碎了一半的玻璃瓶只有瓶颈和底部能看出结构中间区域几乎透明和背景混在一起。这意味着模型不能靠整体形状模板去匹配目标而必须学到局部的、纹理级的线索比如瓶盖的螺纹、烟蒂的滤嘴颜色、纸箱的瓦楞纹理。这类特征对特征图的分辨率非常敏感下采样次数太多细节直接没了。1.2 目标尺度方差极大生活垃圾里最小的是烟头、瓶盖、碎玻璃渣可能只有十几个像素最大的是纸箱、矿泉水桶、编织袋能占满画面三分之一。一份来自实际垃圾桶场景的统计数据里宽度小于32像素的目标能占到全部目标的21%以上。YOLOv8默认的检测头在P3、P4、P5三个尺度输出即下采样8、16、32倍。对一张640x640的输入P3层特征图是80x80一个16像素的烟头在P3上只有2个像素点而且经过C2f和注意力模块后这些特征会和周围背景强烈混合。后面我会展开讲增加P2输出层和裁剪下采样路径是这次改进里收益第二大的动作第一大的后续会说。1.3 类别定义有灰色地带这不是简单的区分玻璃瓶和塑料瓶的问题。生活垃圾按回收类别分时经常有歧义一个纸杯内侧有塑料淋膜算纸类还是塑料类一个泡沫饭盒沾满油污该归入其他垃圾还是可回收物同一张图不同标注员给出的边界框和类别都可能不一致。我最初用公开数据集训练时模型把纸盒和纸杯经常互相误判后来仔细翻标注发现公开数据里这两个类本身就有相当比例的混淆样本。这部分必须靠人工清洗规则处理不能指望模型自己学会容忍脏数据。实际工程里这类边界模糊问题比算法瓶颈更难解决。1.4 光照和背景的干扰也比常规检测更极端垃圾桶场景的拍摄环境很少是理想的。室外垃圾桶在太阳直射下会有强烈的明暗对比室内垃圾房是荧光灯偏色夜间红外摄像头下塑料瓶、玻璃瓶和金属罐的反光特性完全变了。模型在白天数据上训练得再好到夜视摄像头下精度直接掉十多个点。训练阶段我把曝光增强、HSV抖动、随机光照偏移的力度加到了YOLOv8默认增强的1.8倍左右这个改动对night-view场景的泛化帮助很大代价是白天正常光照下mAP掉了0.5个点左右总体可接受。2. 数据集构建比模型设计更值得花时间很多同学做这个题上来就调网络结构但我们实验中近70%的效果提升来自数据侧。模型结构是上限数据决定你能不能接近那个上限。2.1 公开数据集的选择与组合使用目前能拿到手的垃圾检测公开数据集主要有四个我踩过一圈后建议这么用数据集内容特点标注质量适合用途Huawei/Driverless数据集40类含大量单类单目标图像中等预训练、类别迁移Trash-ICRA室内垃圾金属、纸张、塑料等较好与自采数据混合TACO野外场景遮挡和多目标密集较差但真实验证模型鲁棒性Typical Garbage小规模常见生活垃圾一般补充不常见类别样本需要注意的是这些数据集的类别体系互不兼容。有的把玻璃作为单个类有的拆成玻璃瓶和碎玻璃合并时必须建一套自己的类别映射表。我最后定成6个一级类可回收物、厨余垃圾、有害垃圾、其他垃圾、塑料瓶、易拉罐其中前四类是投放端的用户语义后两类是回收机器人抓取端要的精细类别。这样评估指标既符合垃圾分类任务的社会语义又能对接机械臂抓取。2.2 自采数据的标注规范只靠公开数据训练出来的模型在真实垃圾桶前基本不能用因为公开数据大多是干净的物体摆拍而现场是垃圾桶里的堆叠状态。我们补采了大约4700张现场图像覆盖三个不同场景小区垃圾桶、校园路边垃圾桶、垃圾中转站传送带。标注时我定了几条硬规则这些规则直接决定了训练效率和模型上限被遮挡面积超过60%的目标不标因为强行标注会把模型带偏类别归属有争议的目标标成二级类大类不做细分远小于10x10像素且无纹理特征的目标不标同一张图的所有目标必须由同一个人标完避免不同人对遮挡的判断不一致。2.3 类别平衡怎么做才合理垃圾场景天然是长尾分布塑料瓶、纸盒样本量大灯泡、电池、药品这类有害垃圾样本很少。但有害垃圾恰恰是识别优先级最高的类别之一。我的做法不是简单复制粘贴小类样本而是对所有框做Copy-Paste增强把有害垃圾的目标框剪下来随机粘贴到场景图像里同时保证不覆盖已有小目标。这个操作让有害垃圾各类别的平均召回率提升了约11个百分点。大类的样本量匹配如下保证最大类样本数是最小类的8倍以内超过这个值模型会明显偏向多数类。操作上就是给少数类做离线增广把它们的框数量补到目标范围内。2.4 数据增强不是越多越好YOLOv8自带Mosaic、MixUp、HSV、随机仿射等增强。我把实验跑了一遍之后发现Mosaic对垃圾场景非常有效因为它把不同来源的目标拼在一起模拟了堆叠状态但MixUp效果不稳定——垃圾目标边界本来就模糊混合后会让特征更糊轻微有助于整体mAP但对小目标有害。最后保留的增强组合是Mosaic、随机仿射、HSV变化增强、Copy-Paste、随机灰度化。关闭了MixUp和90度旋转。90度旋转对瓶子类目标太致命竖着的瓶子旋转后变成横着语义上已经换了一个类。3. YOLOv8结构改进的具体方案与取舍YOLOv8的基线设计已经很强强改它的backbone不一定能获得正向收益我试过换更深的轻量backbone效果平平。真正带来提升的改动集中在三个方面。3.1 在C2f模块后嵌入EMA注意力机制第一个有效改动是在C2f模块的输出之后嵌入EMAEfficient Multi-Scale Attention模块。EMA的特点是跨空间维度和通道维度同时建模计算量小于SE但对遮挡目标有帮助。我们把EMA加在Backbone的最后一层C2f之后以及Neck的上采样融合之前参数量只增加了约1.2MmAP0.5涨了1.6个点。这个位置的选择是有讲究的。加在深层特征图上能强化全局语义加在Neck融合前能让不同尺度的特征在进入检测头之前就完成注意力增强。如果你也想试建议先只加这两个位置不要每个C2f后面都塞一个注意力模块我试过全切片加mAP反而降了0.4个点——过拟合和计算冗余同时来了。3.2 新增P2小目标检测层前面说过垃圾场景小目标占比高。YOLOv8默认从P3开始检测我想让模型直接看到高分辨率的P2层特征。做法是在SPPF之后额外引一条下采样2倍相对原图是4倍的分支把C2f的浅层特征引入FPN再融进PAN。这个改动会在Neck里增加一个分支训练显存占用增加约1.8GBbatch size 16输入640。如果你的显卡显存不够可以先把输入分辨率降到480或者把P2层的通道数减半。增加P2层之后烟头、瓶盖这类极小目标的AP0.5从0.51提升到0.67效果立竿见影。缺点是大目标纸箱、编织袋AP降了约1.1个点原因是大目标在P2层上占据了巨大感受野反而分散了注意力。最后折中方案是保留P2层同时把大目标类别在损失函数里的权重调低整体mAP还是净增长。3.3 损失函数从CIoU换到Wise-IoU标签分配保持不变YOLOv8默认的框回归损失是CIoU。在垃圾分类场景里大量目标被遮挡、边界框只能标出一部分CIoU的宽高比惩罚项在这种标注下会放大不准确的惩罚导致模型在遮挡样本上收敛变慢。我们换成Wise-IoU v3它根据训练动态调整IoU损失的梯度权重对低质量标注更宽容。实验中mAP0.5涨了0.9个点特别是对遮挡超过40%的目标召回率提升明显。标签分配没有动还是用TaskAlignedAssigner。最初想自己写一个对遮挡更友好的分配策略实验后效果没有显著提升反而增加了调参成本。在目标检测改进上我学到的经验是先动最确定能改善的因素不要同时动多个耦合的部分。3.4 任意朝向瓶罐的旋转框改进尝试这是这次项目中一个比较前沿的尝试。塑料瓶、易拉罐在垃圾桶里常常是横躺斜卧的水平框会把大量背景包进去检测头在分类时受到背景干扰。我试过一个方案给主干加角度预测分支角度标签用CSLCircular Smooth Label做环形平滑编码。CSL的核心思想是把角度回归问题变成分类问题并对周期边界做平滑处理。这个改进对瓶子和易拉罐这两个类别单独评估时AP0.5分别提升了4.2和5.1个点但整体mAP反而下降——因为垃圾里非刚体目标塑料袋、碎纸不具备稳定的角度定义把它们硬归到旋转框体系里只会增加回归难度。最终这个分支只在推理时对瓶子类启用其他类别走水平框路径。如果你做的是回收机器人抓取瓶罐的垂直场景这个方向会很值得继续深挖。4. 训练过程与关键实验复盘4.1 算力约束下的训练配置我手头只有一张GTX 1660 Ti6GB显存属于这个课题的最低配级别。为了把模型跑起来我把输入分辨率从默认的640降到训练时的512batch size设定为16开启AMP混合精度。注意YOLOv8在AMP下有一个已知问题前几个epoch loss会剧烈波动解决方法是先用FP32跑10个epoch热身再切AMP。优化器我用了SGDmomentum0.937初始lr0.01。很多教程推荐AdamW但在检测任务上SGD的稳定性更好尤其是训练后期mAP曲线更平滑不容易出现突然掉点。EMA指数移动平均对最终的模型权重做了平滑大约能稳定贡献0.3个点的mAP。4.2 超参数调试顺序这个顺序是我反复实验排出来的按此推进能少走弯路先固定lr和batch size扫增强强度看哪些增强在验证集上有正向收益再固定增强扫backbone和Neck的改进点组合然后调损失函数权重重点看回归损失的贡献最后才是微调lr schedule、warmup epoch、anchor相关的参数。顺序不对的典型例子我先调了很长一段时间的anchor size最后发现改动损失函数之后anchor分布几乎不需要动前面白费了大量训练时间。垃圾目标的尺度范围虽然大但YOLOv8的anchor-free机制本身对尺度适应就不差anchor那边可调空间远小于损失函数。4.3 评价指标的选择标准垃圾分类系统的实际要求是能保证不漏掉有害垃圾所以评价指标里我优先看每个类别的Recall而不是整体mAP。mAP0.5:0.95是学术上区分模型优劣的指标但对实际部署意义没有mAP0.5大因为工程上IOU阈值通常取0.5。我在报告里同时给出两组指标但项目验收和部署决策只看两个值一是全类别的平均Recall0.5二是有害垃圾各类别的AP。千万不要只看一个mAP就收敛有些模型mAP高是因为多数类做得好有害垃圾类召回率则一塌糊涂这种模型在现实中是不可用的。最终模型的具体指标全类别mAP0.50.842mAP0.5:0.950.593有害垃圾召回率0.81。4.4 用特征热力图定位模型的视觉盲区训练到中期我发现模型对透明玻璃瓶的召回率极低怎么调都上不去。为了定位原因我输出了一层检测头输入前的特征热力图。结果很直观透明瓶的特征在热力图上是散的尤其是瓶身部分被背景完全掩盖模型只看得到瓶口的反光。这让我意识到透明物体的特征主要来自边缘折射和反光而不是灰度/颜色。于是我在数据增强里增加了随机玻璃化模拟操作——用高斯模糊亮度扰动在瓶身区域制造半透明效果。这个操作做完了玻璃瓶类的AP从0.58升到0.71比任何结构改动都有效。这也启发了一个更通用的原则目标检测模型对透明材质的理解能力天然薄弱数据层面模拟材质特性往往比加更复杂的网络更有效。5. 模型部署到RK3588边缘设备的完整链路项目不能只停留在训练阶段垃圾分类识别的落地场景在垃圾桶投放点、回收柜、移动回收车上这些地方通常没有GPU服务器所以部署是绕不开的一步。我最常用且最稳的组合是RK3588 RKNN Toolkit下面列出来的都是实际跑通过的主干路径。5.1 从PyTorch到ONNX再到RKNN流程说起来就三步把训练好的权重转成ONNX再用RKNN Toolkit转成.rknn格式最后写推理脚本。但每一步都有暗坑。转ONNX时最容易出问题的是EMA权重和自定义的注意力模块。EMA里有跨尺度的reshape和pooling操作某些算子onnx导出不支持。解决方法是把注意力模块重构成更朴素的算子组合比如用全局平均池化加两个1x1卷积替代效果几乎不变。转RKNN时最大的坑是量化。默认的全INT8量化后我的模型mAP0.5从0.842掉到0.79掉了5个点。原因是垃圾图像里透明物体和低照度区域的数值范围很敏感。解决办法准备300张覆盖所有类别和光线条件的真实场景图作为量化校准集对输入做归一化时要保持和训练时一致的通道顺序和scale混合量化把检测头的关键层保持FP16只量化backbone和neck部分精度损失降到1个点以内。5.2 部署推理性能实测设备是RK3588开启NPU3TOPs算力模型输入640x640INT8混合量化后单帧推理大约12ms对应80FPS。如果只用CPU跑大约是120ms一帧勉强够交互但不够实时。内存占用方面RKNN模型本体约9.6MB加上前处理和后处理缓冲峰值内存大约180MB在RK3588上非常宽裕。如果目标是更低成本的设备比如RK3566建议把输入分辨率降到416同时关闭P2层输出推理可以跑到50ms左右精度掉5到6个点。到底怎么选取决于你的业务是识别垃圾桶前的人还是机械臂前的物体。5.3 真实场景部署后被打脸的三个case训练时指标漂亮部署到现场第一个周末我就收到了三个意料之外的bad case第一类是双胞胎干扰。一个绿色垃圾桶旁边放着一盆绿色植物植物的叶片在热成像和RGB下都和垃圾袋特征接近模型把植物的一部分框成了厨余垃圾。这个只能在业务逻辑层加ROI限制比如固定摄像头视角情况下排除非垃圾桶区域模型本身解决不了。第二类是镜头污损。垃圾房长期落灰后镜头前面有一层半透明污渍整个画面的纹理和颜色都偏灰模型在低光夜晚把黑色垃圾袋误判为其他垃圾的概率升高。处理办法是加一个部署端的图像质量检测逻辑检测到psnr降低或者色偏增大时直接触发清洗提醒比训练分支靠谱得多。第三类是训练数据里的标签蔓延问题。因为Copy-Paste增强用多了模型对粘贴痕迹产生了依赖当我在真实场景里把一个干净的目标放在白纸上拍模型反而不识别了因为它的训练数据里所有目标旁边都有其他垃圾。这类问题只能靠调整增强时的混合比例来缓解我最后把Copy-Paste的粘贴背景从纯色改为随机噪声纹理这个现象基本消失了。5.4 后续可扩展的两个方向如果是课题需要继续深入我会往这两个方向上走一是增量学习。实际投放场景每周都会出现新垃圾比如节日限定包装、新型饮料瓶。传统做法是定期合并旧数据重新训练但代价很高。用增量学习让模型只在新数据上做参数微调同时用经验重放保持旧类别不遗忘是这个项目的自然延伸方向。二是结合开放词汇检测。现在开放词汇目标检测模型已经在零样本分类上表现出很强的跨类别迁移能力比如可以对没见过的铝箔袋没见过的奶茶杯直接识别。作为一个垃圾分类类别会持续变化的任务我认为下一步不是继续堆类别而是让模型理解这是可回收物而不是具体哪种瓶子这会从根本上解决类别体系不断膨胀的问题。这个项目做下来我最大的体会是目标检测的精度不完全是网络结构决定的数据含义的准确界定、材质特性模拟、评估指标的选择和部署端的现实约束往往比在结构上找一个更花哨的模块重要得多。如果你也在做类似的识别系统建议你先花时间把类别的定义边界和现场的bad case来源搞清楚再回头看看网络该改哪里你会发现很多所谓模型不行的问题其实并不在模型身上。
返回列表