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

1次阅读
没有评论

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

image.webp

背景与痛点分析

垃圾分类作为计算机视觉的典型应用场景,数据标注质量直接影响模型性能。但在实际项目中常遇到三类挑战:

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

  • 类别不平衡 :厨余垃圾占比通常超过 60%,而有害垃圾可能不足 5%,直接训练会导致模型偏见
  • 标注一致性 :不同标注人员对 ” 可回收塑料瓶 ” 与 ” 其他塑料制品 ” 的边界判断差异显著
  • 复杂背景干扰 :垃圾袋半透明、物体堆叠等情况增加标注难度

工具选型对比

针对 YOLOv8 项目特点,主流标注工具核心差异如下:

工具 优点 缺点 适用场景
LabelImg 轻量易用 缺乏团队协作功能 个人小规模项目
CVAT 支持视频标注 部署复杂 企业级持续标注需求
Roboflow 内置数据增强 免费版功能受限 云端协作团队

推荐选择标准:50GB 以下数据集建议 LabelImg,超过 100GB 考虑 CVAT 服务器部署。

YOLOv8 标注格式详解

官方要求的 txt 标注文件格式为:

< 类别索引 > <x_center> <y_center> <width> <height>

其中坐标值为归一化后的相对值(0- 1 之间),示例:

0 0.435 0.512 0.12 0.23
1 0.712 0.334 0.08 0.15

格式转换实战代码

以下 Python 脚本实现 VOC XML 到 YOLOv8 格式的转换,包含异常处理:

import xml.etree.ElementTree as ET
from pathlib import Path
import argparse

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--xml_dir', type=str, required=True)
    parser.add_argument('--output_dir', type=str, required=True)
    parser.add_argument('--class_list', nargs='+', required=True)
    return parser.parse_args()

def convert_box(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)

def convert_annotation(xml_file, output_dir, classes):
    try:
        tree = ET.parse(xml_file)
        root = tree.getroot()
        size = root.find('size')
        w = int(size.find('width').text)
        h = int(size.find('height').text)

        output_path = output_dir / (xml_file.stem + '.txt')
        with open(output_path, 'w') as f:
            for obj in root.iter('object'):
                cls = obj.find('name').text
                if cls not in classes:
                    continue
                cls_id = classes.index(cls)
                xmlbox = obj.find('bndbox')
                b = (float(xmlbox.find('xmin').text), 
                     float(xmlbox.find('xmax').text), 
                     float(xmlbox.find('ymin').text), 
                     float(xmlbox.find('ymax').text))
                bb = convert_box((w,h), b)
                f.write(f"{cls_id} {' '.join([str(a) for a in bb])}\n")
    except Exception as e:
        print(f"Error processing {xml_file}: {str(e)}")

if __name__ == '__main__':
    args = parse_args()
    xml_dir = Path(args.xml_dir)
    output_dir = Path(args.output_dir)
    output_dir.mkdir(exist_ok=True)

    for xml_file in xml_dir.glob('*.xml'):
        convert_annotation(xml_file, output_dir, args.class_list)

数据增强与质量检查

推荐组合使用以下增强策略:

  1. 空间变换
  2. 随机旋转(-10°~10°)
  3. 尺度抖动(0.8~1.2 倍)

  4. 颜色扰动

  5. HSV 颜色空间调整(hue±0.1, saturation±0.7, value±0.4)
  6. 高斯模糊(σ=0.5~1.5)

质量检查关键指标:

  • 边界框完整性(无截断物体)
  • 类别标签一致性(相同物体不同图像标签一致)
  • 标注密度(平均每图 3~8 个物体为佳)

性能优化技巧

提升标注效率的三种方法:

  1. 热键加速
  2. LabelImg 中设置 W = 创建框,D= 下一张
  3. CVAT 使用 Ctrl+ 方向键微调锚点

  4. 预标注辅助

  5. 用初始模型预测结果作为标注参考
  6. 对高置信度预测(conf>0.7)直接修正使用

  7. 分布式标注

  8. 按垃圾类别拆分标注任务
  9. 使用 Redis 队列分配标注任务

常见问题解决方案

错误类型 1:部分标注缺失
– 现象:测试时发现未标注的明显物体
– 修正:通过脚本统计每类标注数量,对少于 50 实例的类别重点复查

错误类型 2:边界框不精确
– 现象:IoU 在 0.5~0.7 区间波动大
– 修正:启用 CVAT 的 ” 调整相邻帧 ” 功能统一修正

小样本处理策略
– 对稀有类别(如电池、药品)采用过采样
– 使用 copy-paste augmentation 人工增加样本

延伸思考

主动学习的实现路径:
1. 训练初始模型预测未标注数据
2. 选择预测不确定性高的样本(如熵值最大 top100)
3. 人工标注后加入训练集
4. 迭代优化直至 mAP 稳定

完整项目代码已开源:github.com/username/garbage-detection-yolov8

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