共计 2484 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点分析
垃圾分类作为计算机视觉的典型应用场景,数据标注质量直接影响模型性能。但在实际项目中常遇到三类挑战:

- 类别不平衡 :厨余垃圾占比通常超过 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)
数据增强与质量检查
推荐组合使用以下增强策略:
- 空间变换 :
- 随机旋转(-10°~10°)
-
尺度抖动(0.8~1.2 倍)
-
颜色扰动 :
- HSV 颜色空间调整(hue±0.1, saturation±0.7, value±0.4)
- 高斯模糊(σ=0.5~1.5)
质量检查关键指标:
- 边界框完整性(无截断物体)
- 类别标签一致性(相同物体不同图像标签一致)
- 标注密度(平均每图 3~8 个物体为佳)
性能优化技巧
提升标注效率的三种方法:
- 热键加速 :
- LabelImg 中设置 W = 创建框,D= 下一张
-
CVAT 使用 Ctrl+ 方向键微调锚点
-
预标注辅助 :
- 用初始模型预测结果作为标注参考
-
对高置信度预测(conf>0.7)直接修正使用
-
分布式标注 :
- 按垃圾类别拆分标注任务
- 使用 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
