YOLO多版本垃圾检测项目详解:源码结构、技术路线、训练指标与PyQt5功能
大家好,我是孔一学长。
这篇文章完整拆解一套YOLO多版本垃圾检测识别项目。项目包含YOLOv8、YOLO11、YOLO26、YOLO11+CBAM四个版本,训练目标为37类生活垃圾与常见废弃物,并使用PyQt5实现单图、批量图片、视频、摄像头检测以及CSV结果保存。
先看运行效果
鸡蛋壳测试中,左侧具体类别为“鸡蛋壳”,垃圾类别为“厨余垃圾”,下方两条记录也都带有厨余垃圾字段。
换成香蕉皮后,两处显示会一起更新。先看这两张图,可以直接确认细分类、垃圾大类和表格记录已经同步,而不只是检测框能正常绘制。
完整运行演示:
https://www.bilibili.com/video/BV1n3YM6CEVo/视频使用YOLO11界面,展示单图、批量、视频、摄像头、四分类字段和结果保存。YOLOv8、YOLO26、YOLO11+CBAM保留同样的主要界面流程,各自加载对应权重。
这组结果来自37类检测之后新增的厨余、有害、可回收、其他垃圾映射。下面再展开项目功能、源码文件、技术路线、数据训练、验证指标和版本边界;四分类是本次重点,但不是全文唯一主题。
1. 项目概览与系统功能
完整处理链路是:输入图片、文件夹、视频或摄像头画面,完成预处理与YOLO推理,输出目标框、具体类别、置信度和坐标,再把类别ID映射为垃圾大类,最后同步写入结果栏、明细表与CSV。
四个模型版本使用相同的数据划分和主要界面流程,但各自保留代码、权重、训练记录与独立验证指标。这样既可以直接运行某个版本,也能做多版本比较或注意力机制改进分析。
2. 技术路线先定义两层分类的边界
模型的类别空间仍是37类细分类。四分类属于业务层,不能直接覆盖模型输出,否则会丢失目标的具体名称。
| 层级 | 数据来源 | 示例 | 写入位置 |
|---|---|---|---|
| 细分类 | 模型类别ID与名称 | 鸡蛋壳、香蕉皮、温度计 | 检测框、结果栏、表格 |
| 垃圾大类 | waste_category.py映射 | 厨余、有害、可回收、其他 | 结果栏、表格、CSV |
映射表以类别ID为键,查询函数先把输入转换为整数;转换失败或键不存在时,回退为“其他垃圾”。核心形式如下:
CLASS_TO_WASTE_CATEGORY={1:"厨余垃圾",# 鸡蛋壳12:"有害垃圾",# 温度计17:"可回收物",# 报纸36:"其他垃圾",# 口罩}defget_waste_category(class_id):try:normalized_id=int(class_id)except(TypeError,ValueError):return"其他垃圾"returnCLASS_TO_WASTE_CATEGORY.get(normalized_id,"其他垃圾")实际文件保存了37个类别的完整映射,这里只保留四个代表项说明结构。
3. 在结果记录生成时加入垃圾大类
main.py导入统一函数:
fromwaste_categoryimportget_waste_category程序解析每个检测框时,结果记录由“序号、文件路径、识别结果、置信度、坐标”扩展为:
[序号, 文件路径, 识别结果, 垃圾类别, 置信度, 坐标位置]其中垃圾类别直接由get_waste_category(cl)计算。这个位置很关键:单图、批量图片、视频和摄像头最终都汇总到同一种记录结构,所以只需要维护一套映射逻辑。
数据流图中可以重点观察“模型解析”与“界面展示”之间的分类转换。它不改变权重,也不改变模型的37类输出。
4. PyQt5功能怎样与结果记录同步
仅在结果卡片上增加一个Label还不够。用户点击表格中的历史记录时,结果栏也要恢复该行对应的垃圾类别。因此界面改造包含两部分:
self.tableWidget.setHorizontalHeaderLabels(["序号","文件路径","识别结果","垃圾类别","置信度","坐标位置"])一部分是ui.py新增label_waste_category_title和label_waste_category;另一部分是main.py在清空、写入当前检测、点击表格行时同步维护这个字段。CSV直接导出同一份表格数据,不需要额外从字符串二次推断。
这里的关键不是单独增加一个显示控件,而是让四种输入路径、表格回看和CSV保存都复用同一份结果记录,避免不同功能分支出现字段不一致。
5. 运行效果与功能验证
我会分三层验证。
第一层检查映射覆盖:从厨余、有害、可回收、其他垃圾各取至少一个类别ID,确认函数返回值正确,同时测试非法ID的回退。
第二层检查状态同步:打开图片后查看结果栏和表格;点击不同表格行,确认垃圾类别随当前行变化;清空结果后,新增字段也必须被清空。
第三层检查四类输入路径:单图和批量图片先验证离散结果,再测试视频和摄像头连续帧,避免某个分支仍在构造旧长度的记录列表。
| 验证点 | 预期结果 |
|---|---|
| 鸡蛋壳、香蕉皮 | 厨余垃圾 |
| 温度计、灯泡、药 | 有害垃圾 |
| 水杯、报纸、易拉罐 | 可回收物 |
| 口罩、餐巾纸 | 其他垃圾 |
| 点击表格行 | 结果栏垃圾类别与当前行一致 |
| 保存CSV | 独立保留“识别结果”和“垃圾类别”两列 |
6. 数据集、训练参数与四版本指标
四分类改造发生在业务层,因此没有拿界面功能替代模型验证。项目仍保留37类数据、训练记录和四版最佳权重的独立结果。
训练端从myvoc.yaml读取类别和数据路径,图像进入模型前完成缩放、Letterbox补边、颜色转换与归一化;训练集还使用翻转、颜色扰动等增强扩展场景变化。YOLO主干与检测头负责提取和融合特征,train.py完成训练,val.py和runs中的结果文件负责独立验证,之后才由main.py加载权重进入PyQt5推理链路。
清洗后原始图像为3462张,增强后为4720张,划分为4024张训练图、348张验证图、348张测试图。输入尺寸640,batch 16,优化器SGD,初始学习率0.01,四个版本都完成100轮训练。
| 版本 | Precision | Recall | mAP50 | mAP50-95 |
|---|---|---|---|---|
| YOLOv8 | 0.9297 | 0.8873 | 0.9348 | 0.6773 |
| YOLO11 | 0.8900 | 0.9023 | 0.9254 | 0.6927 |
| YOLO26 | 0.9003 | 0.9046 | 0.9325 | 0.7151 |
| YOLO11+CBAM | 0.8871 | 0.8922 | 0.9419 | 0.7046 |
YOLO26的mAP50-95最高,YOLO11+CBAM的mAP50最高,YOLOv8的Precision最高。CBAM版相对YOLO11的mAP50-95增加约0.01191,参数量增加610。上述差异只针对当前数据与训练配置。
7. 项目文件、运行入口与适用边界
理解四分类功能建议先看waste_category.py、main.py和ui.py;复核训练则看myvoc.yaml、train.py、val.py和runs。
conda create-ngarbage-yolopython=3.11-yconda activate garbage-yolo pipinstall-rrequirements.txt python main.py加载现成权重可在普通电脑演示,重新训练更适合使用NVIDIA GPU。若新增或重排模型类别,必须同步检查类别ID与四分类映射,不能只改中文名称。
项目代码获取
当前项目已整理四个版本的源码、4720张增强后数据、训练权重、完整runs、PyQt5界面、测试素材和使用说明。项目资料入口:
https://smallerkong.com/s/cs-yolo-garbage-416814