共计 1887 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
垃圾分类场景下的目标检测具有几个显著特点:

- 透明物体检测困难 :许多塑料瓶、玻璃制品在图像中呈现透明或半透明状态,边界轮廓难以辨识
- 小目标密集 :烟蒂、瓶盖等小型垃圾常以密集形式出现,常规检测方法易漏检
- 形态多变 :同一类垃圾因变形、折叠等会产生巨大外观差异(如压扁的易拉罐)
现有公开数据集的主要问题:
- 类别覆盖不全 :多数数据集仅包含 4 类基础分类(可回收 / 有害 / 厨余 / 其他),缺少细粒度划分
- 标注质量不一 :部分数据集存在边界框不精确、遮挡处理不当的问题
- 场景单一 :多为摆拍图像,缺少真实垃圾投放点的复杂背景
技术方案
YOLO 标注格式详解
YOLO 标注采用文本文件存储,每行代表一个物体标注,格式为:
< 类别 ID> <x_center> <y_center> <width> <height>
其中坐标值均为归一化后的相对值(0- 1 之间),计算方式:
- x_center = (框左边界 + 框右边界) / 2 / 图像宽度
- width = (框右边界 – 框左边界) / 图像宽度
标注工具选型对比
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| LabelImg | 简单易用 | 不支持视频标注 | 小规模标注 |
| CVAT | 支持多人协作 | 部署复杂 | 企业级项目 |
| Roboflow | 云端自动标注 | 需要付费 | 快速原型开发 |
垃圾检测专项标注规范
- 遮挡处理 :被遮挡超过 50% 的物体不标注
- 复合物体 :粘连带包装的垃圾(如未拆封的饮料)按主要材质标注
- 边界模糊 :透明物体以可见边缘为基准标注
代码实现
YOLO 格式验证脚本
import numpy as np
def validate_yolo_label(label_path: str, img_size: tuple):
"""验证 YOLO 标注文件有效性"""
with open(label_path) as f:
for line in f:
cls_id, x, y, w, h = map(float, line.strip().split())
# 检查坐标是否越界
assert 0 <= x <= 1, f"x_center {x} 越界"
assert 0 <= y <= 1, f"y_center {y} 越界"
assert 0 < w <= 1, f"宽度 {w} 无效"
assert 0 < h <= 1, f"高度 {h} 无效"
# 检查类别 ID
assert cls_id.is_integer(), "类别 ID 必须为整数"
assert 0 <= cls_id < 6, "类别 ID 超出范围"
数据集自动划分
import os
import random
from sklearn.model_selection import train_test_split
# 固定随机种子保证可复现
random.seed(42)
# 获取所有图像路径
image_files = [f for f in os.listdir('images') if f.endswith('.jpg')]
# 按 7:2:1 比例划分
train, test = train_test_split(image_files, test_size=0.3)
val, test = train_test_split(test, test_size=0.33)
# 写入划分文件
with open('train.txt', 'w') as f:
f.writelines([f"images/{name}\n" for name in train])
模型训练
YOLOv5 配置修改
-
修改
data/custom.yaml:nc: 6 # 类别数 names: ['plastic', 'glass', 'metal', 'paper', 'organic', 'hazardous'] -
调整 anchors(针对小目标):
anchors: - [4,5, 8,10, 13,16] # 小目标专用 anchor - [23,29, 43,55, 73,105]
关键训练参数
--img-size 640:垃圾检测建议使用较大分辨率--batch-size 16:根据 GPU 显存调整--hyp data/hyps/hyp.scratch-low.yaml:小数据集使用低强度数据增强
避坑指南
标注常见错误
- 类别混淆 :铝箔包装易误标为 plastic 而非 metal
- 部分遮挡 :只露出局部的垃圾(如垃圾桶边缘的瓶子)容易漏标
- 阴影误判 :垃圾投递点的阴影常被误标为物体
小目标检测优化
使用 SAHI 切片推理方案:
- 将大图分割为重叠小图
- 对各切片独立检测
- 合并检测结果并应用 NMS
部署陷阱
- 类别 ID 与部署环境的映射必须一致
- OpenCV 的 BGR 通道顺序可能影响预处理
开放问题
随着垃圾分类政策调整,如何在不重新训练整个模型的情况下,增量学习新出现的垃圾类别(如新型复合材料)?现有方案如:
- 知识蒸馏:用原模型指导新模型
- 分类头扩展:保留原特征提取器
- 持续学习:防止灾难性遗忘
期待与各位同行探讨更优解决方案。
正文完
发表至: 未分类
近两天内
