基于YOLOv5的6类生活垃圾检测数据集标注实战指南

1次阅读
没有评论

共计 1887 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景痛点

垃圾分类场景下的目标检测具有几个显著特点:

基于 YOLOv5 的 6 类生活垃圾检测数据集标注实战指南

  • 透明物体检测困难 :许多塑料瓶、玻璃制品在图像中呈现透明或半透明状态,边界轮廓难以辨识
  • 小目标密集 :烟蒂、瓶盖等小型垃圾常以密集形式出现,常规检测方法易漏检
  • 形态多变 :同一类垃圾因变形、折叠等会产生巨大外观差异(如压扁的易拉罐)

现有公开数据集的主要问题:

  • 类别覆盖不全 :多数数据集仅包含 4 类基础分类(可回收 / 有害 / 厨余 / 其他),缺少细粒度划分
  • 标注质量不一 :部分数据集存在边界框不精确、遮挡处理不当的问题
  • 场景单一 :多为摆拍图像,缺少真实垃圾投放点的复杂背景

技术方案

YOLO 标注格式详解

YOLO 标注采用文本文件存储,每行代表一个物体标注,格式为:

< 类别 ID> <x_center> <y_center> <width> <height>

其中坐标值均为归一化后的相对值(0- 1 之间),计算方式:

  1. x_center = (框左边界 + 框右边界) / 2 / 图像宽度
  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 配置修改

  1. 修改 data/custom.yaml

    nc: 6  # 类别数
    names: ['plastic', 'glass', 'metal', 'paper', 'organic', 'hazardous']

  2. 调整 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 切片推理方案:

  1. 将大图分割为重叠小图
  2. 对各切片独立检测
  3. 合并检测结果并应用 NMS

部署陷阱

  • 类别 ID 与部署环境的映射必须一致
  • OpenCV 的 BGR 通道顺序可能影响预处理

开放问题

随着垃圾分类政策调整,如何在不重新训练整个模型的情况下,增量学习新出现的垃圾类别(如新型复合材料)?现有方案如:

  1. 知识蒸馏:用原模型指导新模型
  2. 分类头扩展:保留原特征提取器
  3. 持续学习:防止灾难性遗忘

期待与各位同行探讨更优解决方案。

正文完
 0
评论(没有评论)