1. 垃圾分类识别项目为什么值得用YOLOv8来做
垃圾分类这件事,说起来简单,做起来头疼。我在社区做过几次垃圾分类的志愿活动,最大的感受就是:居民不是不想分,是真分不清楚。一个用完的外卖餐盒,到底是可回收还是其他垃圾?沾了油的塑料袋算哪一类?这些问题连成年人都要犹豫半天,更别说让机器自动识别了。但恰恰是这种“人眼都要犹豫”的场景,才是深度学习目标检测最能发挥价值的地方。
这个项目的核心目标很明确:给定一张生活垃圾的照片,系统要能自动框出画面中的各个垃圾物体,并且判断它属于哪一类——可回收物、厨余垃圾、有害垃圾还是其他垃圾。听起来像是一个普通的图像分类任务,但实际做起来,它更接近目标检测的范畴。因为一张照片里往往不止一个物体,可能有塑料瓶、纸盒、果皮混在一起,你需要先把每个物体定位出来,再分别分类。这就是为什么选择YOLOv8作为基线模型,而不是简单的CNN分类网络。
YOLOv8是Ultralytics在2023年推出的目标检测框架,相比YOLOv5,它在骨干网络、特征融合和检测头部分都做了调整。最直观的变化是它采用了C2f模块替代C3模块,梯度分流更充分,小目标的检测效果有提升。对于垃圾分类这种“小目标多、类别间差异细微”的场景,这个改进方向是对路的。另外YOLOv8的Anchor-Free设计也降低了调参门槛,你不需要再去聚类计算Anchor Box的尺寸,对新手友好很多。
这个项目适合谁呢?如果你正在做毕业设计、课程项目,或者想找一个完整的深度学习实战案例来练手,垃圾分类识别是一个非常好的切入点。它的数据集相对容易获取,标注成本可控,而且应用场景直观,答辩或演示的时候很容易讲清楚价值。如果你已经有一定的基础,想进一步研究YOLOv8的改进策略,这个项目也提供了足够的优化空间——比如注意力机制引入、损失函数调整、轻量化部署等。
我接下来会从整体设计思路、核心细节解析、完整实操流程、常见问题排查这几个维度,把这个项目从头到尾拆一遍。不是那种“跑通就行”的教程,而是把每个环节为什么这么做、踩过哪些坑、怎么调效果更好,都讲清楚。
2. 整体方案设计与技术选型拆解
2.1 为什么选YOLOv8而不是Faster R-CNN或SSD
目标检测的算法路线大致分两派:两阶段检测器和单阶段检测器。Faster R-CNN是典型的两阶段方案,先通过RPN生成候选区域,再对每个区域做分类和回归。它的精度通常更高,但推理速度慢,不适合需要实时响应的场景。SSD是早期的单阶段检测器,速度上去了,但对小目标的检测效果一直不太理想,因为它的浅层特征图语义信息不够丰富。
YOLOv8属于单阶段检测器,它的设计哲学是“一次前向传播就出结果”。你输入一张640×640的图片,网络直接输出所有检测框的坐标、置信度和类别概率。这种端到端的方式让它在速度和精度之间取得了很好的平衡。我实测下来,在GTX 1660 Ti上,YOLOv8n(nano版本)推理一张图片大概只需要几毫秒,即使是YOLOv8m(medium版本),也能做到实时检测。
对于垃圾分类这个场景,我建议从YOLOv8n或YOLOv8s开始。原因很简单:你的数据集规模不会特别大,通常几千张图片就算不错了。用太大的模型容易过拟合,而且训练时间长,调参成本高。YOLOv8n的参数量只有3.2M左右,YOLOv8s大概11.2M,这两个版本在自定义数据集上的表现通常已经足够好。如果你后续要部署到RK3588这类边缘设备上,轻量模型更是必须的。
2.2 垃圾分类的类别定义与数据集构建思路
类别定义是整个项目的地基。我见过很多项目一上来就急着跑模型,结果类别定义得模棱两可,后面怎么调都上不去。垃圾分类的类别划分,我建议参考你所在城市的实际分类标准,但不要照搬。比如上海的“干垃圾、湿垃圾、可回收物、有害垃圾”和北京的“厨余垃圾、可回收物、有害垃圾、其他垃圾”叫法不同,但本质逻辑一致。
我的做法是:先确定四个大类,然后在每个大类下面列出常见的具体物品。比如可回收物下面包括塑料瓶、易拉罐、纸箱、玻璃瓶、旧衣服等;厨余垃圾包括果皮、菜叶、剩饭、蛋壳等;有害垃圾包括电池、灯管、药品、油漆桶等;其他垃圾包括烟头、纸巾、陶瓷碎片、一次性餐具等。这样做的目的是让标注人员在标注时有明确的参照,减少类别混淆。
数据集来源主要有三个渠道:一是公开数据集,比如TrashNet、TACO等,但这些数据集的质量参差不齐,类别定义和你的需求可能不一致;二是自己拍摄,这是最靠谱的方式,你可以控制拍摄角度、光照条件、背景复杂度,让数据更贴近实际应用场景;三是网络爬取,但要注意版权和标注质量。我通常建议自己拍摄至少60%的数据,剩下的用公开数据集补充。
标注工具我用的是LabelImg,简单直接,输出YOLO格式的txt文件。标注的时候有几个细节要注意:第一,框要尽量贴紧物体边缘,不要留太多空白;第二,对于遮挡严重的物体,如果肉眼能判断类别,就标出来,如果完全看不清,就忽略;第三,同一张图片里如果有多个同类物体,每个都要单独标注,不要合并成一个框。
2.3 数据增强策略的取舍
数据增强是提升模型泛化能力的廉价手段,但不是越多越好。YOLOv8默认开启了Mosaic增强、HSV色彩空间变换、随机翻转等。Mosaic增强是把四张图片拼成一张,让模型在一张图里看到更多上下文,对小目标检测有帮助。但Mosaic也有副作用:如果拼接的图片来自不同场景,可能会引入不合理的上下文关系,导致模型学到错误的关联。
我的经验是:对于垃圾分类数据集,Mosaic可以保留,但要把概率调低一点,默认是1.0,我通常调到0.5到0.7之间。另外,HSV增强的色调变化范围不要太大,因为垃圾类别的颜色是有区分度的——比如香蕉皮是黄色的,如果色调变化太大,可能变成蓝色,反而干扰模型学习。我一般把hsv_h设为0.015,hsv_s设为0.7,hsv_v设为0.4,这是比较温和的设置。
还有一个容易被忽略的点:随机旋转。垃圾分类的物体在现实中出现的方向是多样的,但如果你用随机旋转增强,可能会让模型对方向变得过于敏感。我建议只做小角度的旋转,比如-10度到10度,或者干脆不做旋转,用随机翻转代替。翻转是安全的,因为垃圾物体翻转后仍然是同一类物体。
3. 核心细节解析与实操要点
3.1 YOLOv8网络结构的关键改进点
YOLOv8的网络结构可以分成三部分:Backbone、Neck和Head。Backbone负责提取特征,Neck负责多尺度特征融合,Head负责最终预测。YOLOv8的Backbone里用了C2f模块,这个模块的设计思路是:把输入特征分成两部分,一部分直接往后传,另一部分经过多个Bottleneck处理后再拼接。这样做的好处是梯度流更丰富,浅层特征和深层特征都能得到充分利用。
Neck部分用的是PAN-FPN结构,自顶向下和自底向上两条路径结合,让不同尺度的特征图都能获得语义信息和定位信息。对于垃圾分类来说,这个设计很重要,因为垃圾物体的大小差异很大——一个易拉罐和一个纸箱在同一个画面里,尺度可能差好几倍。PAN-FPN能让小物体在大特征图上被检测到,大物体在小特征图上被检测到。
Head部分是YOLOv8变化最大的地方。它从Anchor-Based变成了Anchor-Free,直接预测物体中心点到边界框四条边的距离。这个改变减少了超参数的数量,你不需要再根据数据集去调整Anchor的尺寸。但Anchor-Free也有代价:它对小目标的定位精度可能不如精心调参的Anchor-Based方案。不过对于垃圾分类这种类别间差异明显的任务,Anchor-Free的精度损失是可以接受的。
3.2 损失函数的选择与调参逻辑
YOLOv8的损失函数由三部分组成:分类损失、回归损失和DFL损失。分类损失用的是BCE Loss,回归损失用的是CIoU Loss,DFL是Distribution Focal Loss,用来让边界框回归更稳定。这三个损失的权重在默认配置里是平衡好的,但你可以根据任务特点微调。
如果你的数据集里小目标特别多,比如有很多瓶盖、电池这类小物体,可以适当提高回归损失的权重,让模型更关注定位精度。如果你的类别不平衡很严重,比如其他垃圾的样本量远大于有害垃圾,可以给分类损失加一个类别权重,让稀有类别获得更大的梯度。我试过在YOLOv8的配置里修改cls和box的权重,效果是有,但不要调得太激进,否则容易导致训练不稳定。
还有一个技巧是使用Focal Loss替代BCE Loss。Focal Loss通过降低易分类样本的权重,让模型更关注难分类样本。在垃圾分类里,塑料瓶和玻璃瓶容易混淆,Focal Loss可以帮助模型把注意力放在这些边界样本上。不过Focal Loss的超参数需要调,我一般把gamma设为1.5到2.0之间,alpha设为0.25。
3.3 学习率与优化器的实操设置
YOLOv8默认用的是SGD优化器,初始学习率是0.01,动量是0.937,权重衰减是0.0005。这套配置在COCO数据集上表现很好,但在自定义小数据集上,我建议做调整。小数据集容易过拟合,学习率太大可能导致loss震荡,太小又收敛太慢。
我的做法是:先用默认配置跑一轮,观察loss曲线。如果loss在前几个epoch下降很快,然后开始震荡,说明学习率偏大,可以降到0.005或0.001。如果loss下降很慢,几乎是一条平线,说明学习率偏小,可以适当提高。另外,YOLOv8默认开启了余弦退火学习率调度,学习率会从初始值逐渐降到接近0,这个策略对最终收敛有帮助,建议保留。
还有一个细节是warmup。YOLOv8默认有3个epoch的warmup,学习率从0逐渐升到初始值。这个设计是为了避免训练初期梯度太大导致模型发散。如果你的数据集很小,比如只有几百张图片,可以把warmup的epoch数增加到5,让模型更平稳地进入训练状态。
3.4 评价指标的理解与使用
目标检测的评价指标主要有mAP、Precision、Recall和F1 Score。mAP是综合指标,mAP@0.5表示IoU阈值为0.5时的平均精度,mAP@0.5:0.95表示IoU从0.5到0.95每隔0.05取一个阈值,然后取平均。对于垃圾分类,我主要看mAP@0.5,因为这个阈值下模型的表现更贴近实际使用场景。
Precision和Recall是一对矛盾指标。Precision高说明模型预测的框大部分是对的,Recall高说明模型把大部分真实物体都找出来了。在垃圾分类里,我更看重Recall,因为漏检一个有害垃圾(比如电池)的代价比误检一个可回收物要大。你可以通过调整置信度阈值来平衡这两个指标:阈值调高,Precision上升,Recall下降;阈值调低,反之。
还有一个指标是混淆矩阵,它能直观地告诉你哪些类别容易被混淆。我跑完模型后一定会看混淆矩阵,如果发现“厨余垃圾”和“其他垃圾”之间混淆严重,说明这两类的特征区分度不够,可能需要补充更多训练数据,或者调整类别定义。
4. 完整实操流程与关键环节实现
4.1 环境配置的详细步骤
环境配置是新手最容易卡住的地方。我推荐用Anaconda创建虚拟环境,避免和系统Python冲突。以下是具体步骤:
conda create -n yolov8 python=3.9 conda activate yolov8 pip install ultralyticsUltralytics的包会自动安装PyTorch和相关的依赖。但要注意,如果你的显卡是NVIDIA的,需要确保CUDA版本和PyTorch版本匹配。我用的组合是CUDA 11.8 + PyTorch 2.0.1,这个组合在GTX 1660 Ti上跑得很稳。安装完以后,可以用以下命令验证:
import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果输出True和你的显卡型号,说明环境没问题。如果输出False,检查一下CUDA驱动是否安装正确,或者PyTorch是否装成了CPU版本。
还有一个常见问题是内存不足。YOLOv8训练时会占用大量显存,如果显存不够,可以减小batch size,或者用YOLOv8n这种轻量模型。我试过在6GB显存的显卡上跑YOLOv8s,batch size设为8,imgsz设为640,刚好能跑起来。如果还是不够,可以把imgsz降到416或320。
4.2 数据集准备与配置文件编写
数据集目录结构要按YOLO的格式来组织:
dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamltrain、val、test的比例我一般按7:2:1来分。如果数据量少,可以按8:1:1,保证训练集足够大。data.yaml文件的内容如下:
path: ./dataset train: images/train val: images/val test: images/test nc: 4 names: ['recyclable', 'kitchen', 'hazardous', 'other']nc是类别数,names是类别名称。注意names的顺序要和标注时的类别索引一致,否则训练出来的模型会张冠李戴。
标注文件是txt格式,每行表示一个物体,格式是:类别索引 中心x 中心y 宽度 高度。这些值都是归一化到0到1之间的。如果你用LabelImg标注,选择YOLO格式导出,它会自动生成这些txt文件。
4.3 模型训练的参数配置与启动
YOLOv8的训练可以通过命令行或Python脚本启动。我习惯用Python脚本,方便记录参数和做实验对比。以下是一个典型的训练配置:
from ultralytics import YOLO model = YOLO('yolov8s.pt') results = model.train( data='data.yaml', epochs=100, imgsz=640, batch=16, workers=4, device=0, optimizer='SGD', lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3, warmup_momentum=0.8, box=7.5, cls=0.5, dfl=1.5, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=0.5, mixup=0.0, copy_paste=0.0, patience=50, save=True, save_period=10, project='runs/train', name='garbage_yolov8s' )这里有几个参数值得说明。epochs设为100是保守估计,如果loss在50个epoch后不再下降,patience会触发早停。batch size根据显存来定,16是一个比较安全的数值。imgsz设为640是YOLOv8的默认输入尺寸,如果你的物体普遍偏小,可以提高到1280,但训练时间会显著增加。
box、cls、dfl是损失函数的权重,默认值是7.5、0.5、1.5。我试过调整这些值,但效果不如调整数据增强和学习率明显,所以建议先用默认值。mosaic设为0.5,比默认的1.0温和一些。fliplr设为0.5,表示50%的概率做水平翻转,这个增强对垃圾分类是安全的。
4.4 训练过程监控与损失曲线分析
训练启动后,Ultralytics会在runs/train/garbage_yolov8s目录下生成结果文件,包括loss曲线、mAP曲线、混淆矩阵等。我重点看三个图:train_loss、val_loss和mAP@0.5。
train_loss持续下降,val_loss先下降后上升,这是过拟合的典型信号。解决办法是增加数据增强、减小模型规模、或者加正则化。如果train_loss和val_loss都下降但下降很慢,说明学习率偏小或者模型容量不够。
mAP@0.5的曲线应该是先快速上升,然后趋于平缓。如果mAP在某个值附近震荡,说明模型已经接近它的能力上限,继续训练收益不大。如果mAP一直很低,比如低于0.3,可能是数据集有问题——类别标注错误、图片质量太差、或者类别定义太模糊。
我还会看混淆矩阵,它能告诉我哪些类别容易被混淆。比如“可回收物”和“其他垃圾”之间如果有大量误判,说明这两类的视觉特征重叠太多,需要补充更多区分度高的样本。
4.5 模型推理与效果验证
训练完成后,用以下代码做推理:
from ultralytics import YOLO model = YOLO('runs/train/garbage_yolov8s/weights/best.pt') results = model.predict( source='test_images/', conf=0.25, iou=0.45, imgsz=640, save=True, save_txt=True )conf是置信度阈值,iou是NMS的IoU阈值。conf设为0.25是一个比较宽松的设置,能召回更多物体,但也会引入一些误检。如果你更看重精度,可以调到0.5。iou设为0.45是默认值,如果同一类物体重叠严重,可以适当提高。
推理结果会保存在runs/detect目录下,包括标注了检测框的图片和对应的txt文件。我建议手动检查一些图片,看看检测框是否准确,类别是否正确。特别是那些模型置信度在0.3到0.5之间的检测结果,这些是模型的“犹豫”区域,往往能暴露问题。
5. 常见问题与排查技巧实录
5.1 训练不收敛或loss震荡怎么办
这是最常见的问题。首先检查数据标注是否正确,我遇到过标注文件里类别索引超出nc范围的情况,导致训练直接报错。其次检查学习率,如果loss在前几个epoch就爆炸,说明学习率太大,降到0.001试试。如果loss下降极慢,可以适当提高学习率,或者换用Adam优化器。
还有一个容易被忽略的原因是batch size太小。Batch size太小会导致梯度估计噪声大,loss曲线抖动明显。如果显存允许,尽量把batch size提到16以上。如果显存不够,可以用梯度累积来模拟大batch的效果。
5.2 mAP很低但loss正常是什么原因
这种情况通常说明模型在训练集上表现不错,但在验证集上泛化能力差。原因可能是:数据集太小、数据分布不均衡、或者验证集和训练集的场景差异太大。解决办法是增加数据量、做更激进的数据增强、或者用交叉验证来评估模型。
另一个可能是评价指标的计算方式有问题。YOLOv8默认用mAP@0.5:0.95,这个指标对小目标很敏感。如果你的数据集里小目标多,mAP@0.5:0.95会偏低,但mAP@0.5可能还不错。你可以分别看这两个指标,判断模型的真实水平。
5.3 类别不平衡导致某些类别检测效果差
垃圾分类数据集里,其他垃圾的样本量往往远大于有害垃圾。这会导致模型偏向于预测样本多的类别。解决办法有几种:一是对稀有类别做过采样,在数据加载时增加它们的出现频率;二是在损失函数里给稀有类别更高的权重;三是用Focal Loss替代BCE Loss。
我试过在YOLOv8的配置里加类别权重,但Ultralytics的接口没有直接暴露这个参数,需要修改源码。一个更简单的做法是:在数据集层面做平衡,把稀有类别的图片复制几份,或者用数据增强生成更多稀有类别的样本。
5.4 推理速度慢怎么优化
推理速度取决于模型大小、输入尺寸和硬件。如果你在GPU上跑,YOLOv8s在640尺寸下大概能到100FPS以上,足够实时。如果在CPU上跑,速度会慢很多,可能需要降到320尺寸,或者换YOLOv8n。
如果要在RK3588这类边缘设备上部署,需要把模型转成ONNX或RKNN格式。转换过程中要注意算子兼容性,YOLOv8的一些自定义算子可能不被支持。我建议先用ONNX Runtime验证模型,再转RKNN。转换后精度可能会有轻微下降,需要重新评估。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 训练报错,提示类别索引越界 | 标注文件类别索引大于nc-1 | 检查data.yaml的nc和标注文件 | 修正标注文件或调整nc |
| loss震荡剧烈 | 学习率过大或batch size过小 | 观察loss曲线前10个epoch | 降低学习率或增大batch size |
| mAP@0.5低于0.3 | 数据集质量差或类别定义模糊 | 检查标注质量和混淆矩阵 | 重新标注或合并混淆类别 |
| 验证集loss上升 | 过拟合 | 对比train_loss和val_loss | 增加数据增强或减小模型 |
| 推理结果框重叠严重 | NMS的IoU阈值过低 | 观察检测框重叠情况 | 提高iou阈值到0.5-0.6 |
| 某些类别完全检测不到 | 类别样本太少 | 统计各类别样本数量 | 过采样或增加该类数据 |
| 训练速度极慢 | 用了CPU或imgsz过大 | 检查device和imgsz参数 | 改用GPU或降低imgsz |
| 模型转ONNX失败 | 算子不兼容 | 查看转换报错信息 | 简化模型或换转换工具 |
5.6 几个我踩过的坑和实操心得
第一个坑是标注文件的路径问题。YOLOv8默认假设images和labels在同一级目录下,且文件名一一对应。如果你的目录结构不对,训练时会找不到标注文件,但报错信息不明显,容易误以为是数据问题。我建议在训练前先用一个小脚本检查images和labels的对应关系。
第二个坑是验证集的选择。很多人随便从训练集里抽一部分做验证集,但如果训练集和验证集的场景差异太大,验证结果会失真。我的做法是:确保验证集里每个类别都有足够的样本,而且场景分布和训练集一致。如果某个类别在验证集里只有一两个样本,那这个类别的mAP就没有参考价值。
第三个坑是模型保存策略。YOLOv8默认只保存最好的模型和最后一个模型。但“最好”是根据验证集mAP判断的,如果你的验证集不够有代表性,可能会保存一个过拟合的模型。我建议同时保存多个checkpoint,训练结束后在独立的测试集上评估,选泛化能力最好的那个。
第四个坑是推理时的预处理。YOLOv8在推理时会自动做letterbox缩放,但如果你自己写推理脚本,要注意保持和训练时一致的预处理方式。我见过有人训练时用640×640,推理时直接resize到640×640,导致长宽比失真,检测框位置偏移。
6. 改进方向与扩展思路
6.1 注意力机制的引入位置与效果
YOLOv8的改进空间很大,注意力机制是最常见的改进方向。我试过在Backbone的C2f模块后面加SE注意力,在Neck的PAN-FPN里加CBAM,效果都有提升,但提升幅度不同。SE注意力对通道特征做重标定,适合类别间颜色差异明显的场景;CBAM同时考虑通道和空间注意力,适合物体位置分布有规律的场景。
对于垃圾分类,我推荐在Neck部分加CBAM。因为垃圾分类的物体在画面中的位置往往有规律——比如厨余垃圾通常集中在某个区域,可回收物可能散落各处。CBAM的空间注意力能帮助模型关注这些区域特征。但要注意,加注意力模块会增加参数量和计算量,如果部署在边缘设备上,需要权衡精度和速度。
6.2 轻量化部署的考量
如果你要把模型部署到RK3588或类似的边缘设备上,轻量化是必须的。除了用YOLOv8n之外,还可以考虑剪枝和量化。剪枝是去掉模型中不重要的通道,量化是把浮点参数转成整数。这两种方法都能显著减小模型体积和推理时间,但会带来精度损失。
我的经验是:先用量化,因为量化对精度的损失通常比剪枝小。YOLOv8支持PTQ(训练后量化),你只需要提供一个校准数据集,就能把模型转成INT8。校准数据集要从训练集里随机抽几百张图片,覆盖所有类别。量化后的模型在RK3588上跑,速度能提升2到3倍,精度损失大概在1到2个百分点。
6.3 多模态融合的可能性
垃圾分类识别目前主要依赖视觉信息,但有些类别单靠视觉很难区分。比如一个透明的塑料杯和玻璃杯,在照片里看起来几乎一样。这时候如果能结合材质信息(比如通过近红外光谱),识别准确率会大幅提升。多模态融合是一个有前景的方向,但实现复杂度高,需要额外的传感器和数据采集设备。
对于大多数项目来说,我建议先把视觉方案做扎实,再考虑多模态。视觉方案的优化空间还很大——更好的数据增强、更精细的类别定义、更合理的网络结构,这些都能带来明显的提升。
6.4 从检测到分拣的完整闭环
检测只是第一步,真正的应用场景是自动分拣。你需要把检测结果传给机械臂或传送带控制系统,让它们根据类别把垃圾分到不同的桶里。这个闭环涉及硬件控制、通信协议、实时性保证等问题,比纯软件复杂得多。
如果你只是做算法研究,检测这一步做到mAP@0.5在0.85以上就足够了。如果你要做完整的系统,还需要考虑检测延迟、机械臂的运动规划、异常处理等问题。我建议先在一个小规模的实验平台上验证,比如用一个小型传送带和几个分类桶,跑通了再扩大规模。
6.5 数据集持续迭代的策略
模型上线后,你会遇到训练集里没有的物体。这时候需要建立一个反馈机制:把模型置信度低或者误检的图片收集起来,人工标注后加入训练集,重新训练模型。这个过程叫主动学习,能让模型持续进化。
我的做法是:在推理脚本里加一个逻辑,把置信度在0.2到0.4之间的检测结果保存下来,定期人工审核。这些是模型的“盲区”,补充这些数据对提升模型效果最明显。另外,如果发现某个类别频繁误检,可以针对性地采集该类别的负样本,让模型学会区分。
我个人在实际操作中的体会是,垃圾分类识别这个项目,算法本身的门槛并不高,YOLOv8已经把很多复杂的东西封装好了。真正的难点在于数据——数据的质量、数据的多样性、数据的标注一致性。我见过太多人把时间花在调模型上,却忽略了数据才是决定上限的因素。如果你能把数据这一关做好,用YOLOv8n都能跑出不错的效果;如果数据有问题,用再大的模型也是白搭。所以我的建议是:先把至少70%的精力放在数据采集和标注上,剩下的30%再用来调模型和做改进。这个比例听起来夸张,但实际做下来,你会发现它是合理的。