新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv8改进实战:垃圾分类识别系统从训练到部署

发布时间:2026/9/30 12:48:36来源:尧图网络
YOLOv8改进实战:垃圾分类识别系统从训练到部署
这几年垃圾分类从口号变成了很多小区实实在在的硬指标但真正站到垃圾桶前干垃圾、湿垃圾、可回收物和有害垃圾的边界依然让人犯难。人眼尚且容易搞混机器识别就更考验模型的细粒度分辨能力。我做这个基于深度学习的目标检测项目核心就是拿YOLOv8开刀针对生活垃圾图像识别的实际场景做针对性改进最终落地成一套能实时识别、可交互使用的垃圾分类系统。这套方案覆盖了数据集构建、网络结构改进、训练调参、推理部署的完整链路适合正在做毕业设计、竞赛项目或者想把自己的YOLO应用从“能跑通”提升到“能实用”的同学参考。整个项目做完我最大的感受是垃圾分类识别不是一个单纯的分类问题而是典型的细粒度目标检测问题。像塑料瓶和玻璃瓶外形相似烟头和瓜子壳又都又小又碎加上垃圾在真实场景里往往相互遮挡、堆叠这就导致模型的改进方向不能盲目跟风必须围绕“小目标”“相似类间差异”“遮挡干扰”这三个痛点来设计。1. 项目整体设计与思路拆解1.1 从需求倒推方案为什么选了YOLOv8还非要改进先说说选题的出发点。垃圾分类识别系统要解决的真实问题不是“给一张干净的白底照片分个类”而是“对着桶里一堆混杂垃圾快速给出分类指引”。这要求模型具备三个能力一是要快终端设备或摄像头场景下不能有明显的卡顿二是要准尤其对易混淆物品要有区分能力三是要能扛住真实环境的干扰光线变化、物品重叠、袋子遮挡都是常态。对比主流目标检测方案两阶段模型里Faster R-CNN精度虽然不差但速度在实时场景下始终是短板SSD、EfficientDet这类单阶段模型部署倒是方便但小目标检测能力一般。YOLOv8在这个基础上做得比较均衡它延续了YOLO系列的anchor-free设计在网络结构上采用了C2f模块和Decoupled Head训练和部署的生态都很成熟。所以基座选择YOLOv8没有悬念。但直接用原版YOLOv8跑垃圾分类效果其实不太行。我最初用原版YOLOv8s在自建数据集上训练mAP50能到0.82左右听起来还行但看细分类别的结果就露馅了——烟头、纽扣电池这类小目标的AP往往只有0.4上下玻璃碎片和透明塑料瓶之间还频繁误报。这说明原版模型对大目标、常规尺寸物体有效但对垃圾分类里大量存在的小目标和相似物特征提取和融合能力都不够用。这就是“改进”的出发点不是堆模块而是针对痛点做减法。1.2 系统架构与模块划分整体系统按功能可以拆成四层数据层、模型层、服务层、应用层。数据层负责图像采集和数据集构建包括标注格式转换、清洗、增强等这层决定了模型能力的天花板。模型层是核心基于YOLOv8改进的检测网络包含注意力机制增强的Backbone、加权双向融合的Neck、增加小目标检测头的Head以及适配任务的损失函数。服务层做的是模型导出、推理封装和接口设计让训练好的模型能被上层调用。应用层就是用户能直接看到的部分包括命令行推理脚本、摄像头实时检测、GUI识别工具等。这四层的设计原则是“低耦合”。我在实际开发中刻意把模型训练代码和推理部署代码分开训练脚本只管产出权重部署脚本只负责加载权重和做推理这样后续要换backbone或者换部署平台都不会牵一发动全身。另外所有的配置项都集中在YAML文件里数据路径、类别名、训练参数、改进模块开关都在配置文件里改哪怕是新手同学拿到项目也能在不碰代码逻辑的情况下跑通全流程。2. 数据集构建与预处理2.1 垃圾分类数据集的来源与类别体系设计数据集是这次项目里我花时间最多、也最有体会的一块。垃圾分类领域有几个公开数据集可以参考比如TrashNet和华为云的垃圾分类数据集但直接用会有一个问题公开数据集的类别体系和国内实际分类标准不完全一致而且某些类别的图片量偏少背景也相对干净。我最终的做法是“公开数据集自采数据”混合。公开数据负责提供基础样本量自采数据负责覆盖真实场景。类别体系并没有一上来就搞几十个细类而是先按生活常识分成可回收物、有害垃圾、厨余垃圾、其他垃圾四个大类再在大类下面细分具体物品类别。这里有一点要提醒类别粒度太粗模型学不到区分能力太细则标注成本和训练难度都会上升。权衡下来我用了12个细类塑料瓶、玻璃瓶、易拉罐、纸板、金属、电池、灯管、果皮、剩饭、烟头、织物、陶瓷碎片。每个类别的图片量我控制在800到1500张之间总数接近13000张。这个量级对YOLO系列来说属于中等偏少但配合数据增强可以训练出可用的模型。建议各位在做数据集时优先保证每个类别至少有600张图否则在后面训练时会出现严重的类别不均衡问题。2.2 标注格式转换与数据清洗标注工具我用的是LabelImg和X-AnyLabeling前者老朋友了后者支持半自动标注效率高不少。标注规范上统一输出为YOLO格式的txt文件每行对应一个目标类别id、归一化后的中心点x坐标、中心点y坐标、目标宽度w、目标高度h。坐标归一化是必须的因为YOLO系列内部处理图像时会缩放归一化坐标可以避免因输入尺寸变化导致的标注偏移。数据清洗这个环节很容易被忽略但直接影响训练效果。我做清洗时主要干三件事一是删除标注框明显错误的图片比如框的大小和物体实际尺寸差距悬殊二是处理EXIF旋转问题手机拍的照片经常带方向信息如果不统一转换成标准方向训练时模型会看到大量横竖颠倒的物体三是剔除模糊严重、完全看不清类别的图。清洗之后整个数据集的噪声水平明显下降训练曲线也平滑了很多。2.3 数据增强策略与样本均衡垃圾分类场景有个特点同类物品的外观差异很大。同样是塑料瓶有透明的矿泉水瓶、绿色的雪碧瓶、不透明的洗衣液瓶如果模型没见过足够多样的样本很容易overfitting到颜色和纹理上。所以我在数据增强上做了几个重点组合Mosaic增强把4张图拼成一张增加单张图里的目标数量和场景多样性对小目标检测也有帮助。这个在YOLOv8里默认开启但我在最后30个epoch关掉了让模型在接近真实分布的数据上做微调收敛。MixUp增强按一定比例混合两张图及其标签可以有效缓解类别边界模糊的问题尤其适合玻璃碎片和透明塑料这类易混淆物体。HSV扰动随机调整色相、饱和度、亮度。垃圾分类的物品颜色往往是重要特征比如绿色玻璃瓶、红色易拉罐但真实场景光线复杂所以颜色扰动要适中我控制在±15%以内避免把类别关键颜色信息洗掉。随机旋转和仿射变换模拟物品在垃圾袋里的随意姿态同时增强模型对尺度和角度的鲁棒性。样本均衡方面针对烟头、电池这类小目标且样本量偏少的类别我额外做了复制粘贴增强从该类别的图中裁剪出目标实例随机粘贴到其他背景图上。这个操作能显著提升小目标类别的召回率实测烟头这个类别的AP从0.45提升到了0.63。3. YOLOv8改进方案拆解3.1 注意力机制引入让模型学会看“重点”垃圾分类识别里很多类别之间的差异集中在局部细节。比如电芯和普通金属块远看都是亮闪闪的一坨只有靠近正极附近的结构不同透明玻璃瓶和透明塑料瓶形状几乎一样但瓶口螺纹和底部标识能区分。模型如果对整张图一视同仁地提取特征很容易被背景和相似纹理干扰。我在Backbone部分引入了注意力机制来强化关键区域的特征表达。对比了几种方案之后选了Coordinate Attention就是热搜词里常说的协调注意力机制。它和普通的SE注意力不一样SE只学习通道之间的关系而CA在通道注意力基础上额外对宽度和高度两个方向做了位置信息编码。打个比方SE知道“这个图里应该有瓶子的特征”但CA还知道“瓶子的特征主要出现在画面的中间偏下位置”这就让模型在遇到遮挡和堆叠场景时能更准确地聚焦到目标区域。实现上我在C2f模块的每个分支后面并联了一个CA模块不改变原有结构的输出维度。这里要特别注意改进backbone时不要破坏原模型的预训练权重加载逻辑否则前面的训练时间会白白浪费掉。我选择CA是因为它的参数量增加非常有限对于YOLOv8s这种规模来说整体推理速度几乎没有下降。3.2 Neck层改进加权双向特征融合与小目标检测层原版YOLOv8的Neck采用的是PANet结构自顶向下和自底向上两条路径传递特征。这种结构对常规目标够用但对垃圾堆里大量存在的小目标就不太够看了。我的改进思路是引入加权双向特征融合也就是常说的BiFPN思路。原版PANet在特征融合时每一层特征的贡献权重是固定的但在真实场景里不同尺度特征的重要性是动态变化的。比如在垃圾分类中烟头这种小目标主要依赖浅层高分辨率特征而纸板、织物这类大目标需要深层语义特征。BiFPN的做法是给每条融合路径学习一个可训练的权重让网络自己决定“哪个尺度的特征更重要”。我在Neck部分用轻量的加权融合替换了原始的add融合方式改动不大但小目标的定位精度提升明显。另外一个关键操作是增加了P2检测层也就是针对小目标的更高分辨率特征层。原版YOLOv8检测头通常从P3开始也就是输入图像经过8倍下采样后的特征图对16x16像素以下的小目标响应很弱。我额外从backbone中引出2倍下采样的特征图接入Neck让模型能直接看到更精细的纹理和边缘信息。这样做付出的代价是计算量增加P2特征图分辨率大训练速度会下降一些但对烟头、瓜子壳这类目标的召回率提升非常可观。3.3 Head检测头优化与损失函数调整YOLOv8的Head部分采用了解耦结构分类和回归分支分开这个设计本身比较合理一般不需要大改。我在实际测试中发现解耦头里的分类分支使用的是BCE损失回归分支使用的是CIoU损失。CIoU虽然考虑了重叠面积、中心点距离和宽高比但对于小目标来说宽高比的惩罚项有时候不够精确。经过实验对比我把回归损失替换成了Shape-IoU这套损失对边框形状差异更敏感。用生活化类比来解释CIoU像是一个只看“你框得差不差”的粗心裁判而Shape-IoU会仔细检查“你的框和真实框的形状像不像”这对玻璃碎片、碎陶瓷这类不规则外形的目标非常关键。替换损失函数不需要动网络结构只改损失函数计算逻辑即可训练时关注一下loss曲线是否正常下降就好。Head部分我还在推理策略上做了个小改动将分类置信度和IOU预测相乘改为加权融合的方式在略微牺牲一点精确率的前提下把召回率提升了3个百分点左右。对于垃圾分类这种场景漏一个有害垃圾电池比多报一个可回收物更危险所以这个权衡是值得的。3.4 改进后模型与YOLOv8原版的对比效果改进不是玄学最终要看数字说话。我在相同数据集、相同训练配置下做了严格对比实验结果如下表模型mAP50mAP50-95烟头AP电池AP参数量(M)YOLOv8s原版0.8210.5620.4320.47111.2YOLOv8sCA0.8350.5790.4610.50211.4YOLOv8sCABiFPN0.8420.5910.4880.51711.7完整改进版0.8610.6120.5650.58412.3完整改进版相比原版mAP50提升了约4个百分点mAP50-95提升了5个百分点小目标类别提升尤为显著。参数量的增加在可接受范围内推理速度在GPU上基本持平在CPU上大概有10%的下降。这个对比结果说明针对小目标和相似类别的改进方向是有效的而不是简单的模型堆砌。4. 模型训练与调参实操4.1 训练环境配置与关键参数含义训练环境这块我直接说配置Ubuntu 22.04 Python 3.9 PyTorch 2.0 CUDA 11.8显卡是RTX 4090 24GB。如果只有6GB显存的GTX 1660 Ti也能跑但batch size要降到8以下开启AMP混合精度。这里我建议新手一定要搞清楚几个核心参数的含义而不是照着别人的配置抄imgsz训练输入尺寸。我用的640YOLO系列默认值。虽然增大到960能提升小目标检测精度但训练和推理时间都会显著增加综合考虑后640是性价比最高的选择。batch每次迭代喂给模型的图片数。batch越大梯度估计越稳定但显存占用越高。24GB显存可以跑到32但实测batch从16增加到32对最终精度的提升有限反而需要更多学习率调整来适配所以我最终保留16。epochs训练轮数。我设置了300配合早停机制实际训练在220轮左右就收敛了。optimizer优化器。我对比过SGD和AdamWSGD配合warmup和余弦退火在最终精度上略胜一筹AdamW前期收敛更快。如果追求省事可以用AdamW如果想冲精度建议SGD。lr0初始学习率。0.01是YOLO系列的常用值过大会导致loss爆炸过小则收敛太慢。cos_lr余弦退火调度。开启后学习率先升后降有助于在训练后期精细收敛。amp混合精度训练。开启后显存占用下降约30%训练速度提升20%精度几乎不受影响强烈建议开启。4.2 损失曲线怎么看训练过程中的关键信号训练过程中很多人只盯着mAP看但实际上loss曲线的变化能提供更早的诊断信号。我训练时会同时关注train和val的box_loss、cls_loss、dfl_loss三条曲线。常见的几种曲线形态和对应问题train loss持续下降而val loss先降后升这是过拟合信号解决办法是增加数据增强强度或早停train和val loss都下不去卡在某个平台期说明模型容量或者学习率有问题可以尝试把learning rate调低、把模型从n换成s版本box_loss波动剧烈往往是标注质量有问题比如框的位置不准确需要反向检查数据。在前200轮的训练里我的box_loss从初始的1.8左右一路降到0.35左右cls_loss从2.5降到0.6左右曲线平滑没有出现明显的震荡。最后20轮关闭Mosaic增强后loss有轻微上升再回落这是正常现象说明模型正在适应无增强的真实分布。4.3 评价指标解读与模型选型模型训练完不能只看一张mAP表就完事。我需要把每个类别的AP、AR列出来逐一看。有些类别mAP高可能只是简单样本多mAP整体高但个别类别AP极低说明模型有盲区。比如我的模型在织物和陶瓷碎片上的AP偏低分析后发现是因为这两个类别外观变化太大——织物有衣服、毛巾、玩偶陶瓷碎片更是形状各异。针对这种情况单纯调模型没用得回数据层面补样本。模型选型方面YOLOv8n/s/m/l/x这几个规模要按部署场景来选。如果是手机端或嵌入式设备n或s是唯一选择配合模型量化如果GPU服务器或PC端推理m或l可以换取更高精度。我最终选了s作为主模型配合TensorRT FP16推理在Jetson和PC上都能达到实时要求。5. 系统实现与部署体验5.1 模型导出与推理流程搭建训练完成后模型的权重文件是PyTorch格式的.pt文件这种格式适合继续训练和验证但不适合直接部署。我的导出路径是.pt转ONNX再转TensorRT引擎。ONNX相当于一个中间格式只要语言和框架支持ONNX就能加载TensorRT是英伟达的推理加速引擎能对模型做算子融合和显存优化。实测同一个模型PyTorch直接推理一张图大约12msTensorRT FP16推理只需要4ms提速非常明显。在部署代码的设计上我做了标准化推理流程读图、预处理、推理、NMS后处理、结果绘制。预处理包括resize到640x640、归一化、通道转换后处理包括置信度过滤和NMS去重。这段代码是所有上层应用的公共底座所以我特意封装成了单独的类GUI工具和摄像头程序共用一套推理逻辑。5.2 边缘设备部署经验RK3588上的坑与解决办法这项目做完后我尝试在瑞芯微RK3588开发板上做了部署。RK3588这类边缘设备是垃圾分类终端设备很常见的载体比如智能回收箱就经常用这类方案。但部署过程踩了不少坑有必要分享一下。首先要明确RK3588的NPU只支持部分算子原版YOLOv8导出ONNX后直接转RKNN十有八九会报算子不支持。我的解决思路是在导出阶段就做算子兼容性处理把一些特殊算子替换成NPU支持的等效算子比如把上采样算子换成resize算子把部分激活函数替换为支持的版本。另外RK3588的NPU对动态shape支持不好所以导出时输入尺寸要固定为640。推理速度方面RKNN的官方工具链优化完成后YOLOv8s单张图片推理大约在40到60ms基本能达到实时要求但和GPU还是有差距。如果要做量产级产品可以考虑把模型剪枝量化或者换用更小规模的YOLOv8n。5.3 交互界面与实时识别展示系统总得有用户能操作的界面。我做了两个入口一个是命令行工具适合批量识别和调试另一个是PyQt5搭建的简单GUI适合演示和落地使用。GUI的核心功能有三个图片选择识别、摄像头实时识别、分类结果统计。摄像头实时识别是亮点也是坑最多的环节。主要问题在cv2读取摄像头帧的频率和模型推理速度的匹配上。如果推理慢画面会卡顿如果推理快但显示帧率跟不上画面会撕裂。我最终用队列做缓冲摄像头线程只负责读帧放入队列推理线程从队列取帧处理显示线程负责绘制结果。三个线程各干各的互不阻塞界面帧率稳定在25fps以上。GUI界面上的分类结果显示也做了优化识别出目标后在框上标注类别名和置信度同时在侧边栏统计当前画面里各类垃圾的数量。这样用户一眼就能看出结果不用去分析检测框的标签。6. 常见问题与排查技巧实录6.1 六大高频问题速查表项目过程中积累了不少问题排查经验我直接整理成速查表方便读者对照自查问题现象可能原因解决方案训练loss不降或下降极慢学习率过大或过小、数据标注错误先用0.001的小学习率热身检查标注框是否有错位某一类AP明显低于其他类该类样本量不足或样本多样性差回数据层补图、用复制粘贴增强、检查类别是否不均衡小目标漏检严重特征层分辨率不够、P2层未加入加入更高分辨率检测层或增大输入尺寸推理速度慢模型过大、未启用TensorRT/RKNN加速换小模型或量化剪枝确认加速引擎是否生效检测框尺寸严重偏移标注格式问题或损失函数不合适检查txt标注内容尝试更换IoU损失类型摄像头画面卡顿推理线程和采集线程阻塞使用生产者-消费者模式分离采集和推理6.2 训练调参的独家避坑心得这里分享一些不太会写在论文里的经验。第一点训练时一定要固定随机种子否则每次实验的结果都不同想对比改进是否有效就无从谈起。我在代码里统一设置了seed42这样模型初始化和数据增强的顺序都是确定性的。第二点早停机制要配合保存最优权重来用。我在训练时每隔10个epoch在验证集上跑一次mAP同时保存当前最优权重最后得到的模型不是最后一个epoch的权重而是整个训练过程中mAP最高的那一份。这个技巧能有效避免过拟合回退导致的性能损失。第三点部分小数据集上不要盲目追求高batch size。我做个对比测试在相同epoch下batch32训练出的模型和batch8训练出的大差不差但后者每个epoch时间短得多能更快迭代实验。如果是做实验探索建议先小batch快速跑通最后再用大batch精调。6.3 从训练到落地的其他细节提醒还有一些看似不起眼但很影响体验的细节。比如类别名在代码里、配置文件里、GUI界面上要保持完全一致大小写和空格都不能差否则运行时会报KeyError。这个问题我在早期开发时遇到过排查半天才发现是类名后多了一个空格。推理时的置信度阈值要分开设置显示阈值建议设低一些比如0.35让界面能看到更多候选框但最终统计分类结果时建议设0.6以上防止误报导致用户对系统失去信任。垃圾分类场景里用户对“识别错了”的容忍度很低宁可不识别也不能给错误的分类建议。模型产物的命名规范也要养成好习惯。我的命名格式是“模型名称输入尺寸类目数量训练日期指标值.pt”比如yolov8s_640_12cls_0912_mAP861.pt。这样回看实验记录时任何一个权重文件的来源和性能都一目了然不用翻训练日志。写在最后这个垃圾分类识别系统的实现过程让我对目标检测的理解上升了一个台阶。模型改进不是越高深的模块越有效而是越贴合数据和场景越有效。针对垃圾识别里小目标多、类间差异小、遮挡严重这几个痛点做的注意力机制、小目标检测层和损失函数优化让我真正体会到了“以终为始”的工程化思维。如果你也在做类似的项目我建议先花大量时间把数据整理干净再谈模型改进。数据层面每个类别多补50张图往往比在网络结构里多加一个模块效果更明显。整个项目的代码、训练脚本和部署工具我都做了模块化设计后续要接入新的垃圾类别只需要增加数据、修改类别配置、重新训练即可扩展。希望这篇文章能帮你少走一些弯路也欢迎和我交流更多细节。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【NLP】大模型长文本处理技术与GLM-4-Plus评测:从上下文窗口到TaoToken统一调用 2026/9/30 13:51:19

【NLP】大模型长文本处理技术与GLM-4-Plus评测:从上下文窗口到TaoToken统一调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
【Linux指南】动静态库系列(九):动态库如何进入进程地址空间:从磁盘 .so 到共享内存映射 2026/9/30 13:51:06

【Linux指南】动静态库系列(九):动态库如何进入进程地址空间:从磁盘 .so 到共享内存映射

文章目录一、动态库为什么比静态库更常用二、动态库也是文件三、动态库加载的整体流程四、从磁盘 .so 到物理内存五、从物理内存到进程虚拟地址空间六、多个进程如何共享同一个动态库七、共享的是代码,不是什么都共享八、为什么动态库加载地址不固定九、使用 /proc …

阅读更多 →
PSE认证证书有效期多久,产品改款后是否需要重新做认证? 2026/9/30 13:50:59

PSE认证证书有效期多久,产品改款后是否需要重新做认证?

PSE并不是一张所有产品都按统一年限有效的“永久证书”。需要先区分产品是否属于特定电气用品,以及企业持有的是符合性检查证书、检测报告还是其他合规文件。产品改款后,也不能仅凭外观变化判断是否需要重新认证,关键要看改动是否影响安全结构…

阅读更多 →
企业级AI知识库建设实战:从RAG架构到混合检索与元数据治理 2026/9/30 13:50:45

企业级AI知识库建设实战:从RAG架构到混合检索与元数据治理

开头今年上半年,我们海博团队在推进 AI-Native 研发体系的时候,发现一个特别扎心的事实:模型能力早就不是瓶颈了,真正卡住团队进度的是知识底座。代码仓库里那些散落的决策文档、写了没人看的架构说明、只有某个老员工脑子里的业务…

阅读更多 →
渲染书籍目录汇总:六大分支与学习路径全解析 2026/9/30 13:50:45

渲染书籍目录汇总:六大分支与学习路径全解析

作为常年跟渲染打交道的人,我书架上的这份“渲染书籍目录汇总”已经维护了一年多,标题里的“不断更新中”不是客套话,是真实状态。之所以维护这个目录,是因为每年都要被问同一个问题:想学渲染,到底该看哪些…

阅读更多 →
渲染书籍目录汇总:从实时渲染到引擎源码的系统学习路径 2026/9/30 13:50:45

渲染书籍目录汇总:从实时渲染到引擎源码的系统学习路径

做渲染相关工作这些年,陆陆续续收了不下五十本相关的书,真正从头翻到尾的却没几本。这次给自己定了个小目标,按照“实时渲染、离线渲染、引擎源码、工程实践”四个方向,把值得读的书和它们的目录结构重新整理了一遍,顺…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉