1. 从零开始:为什么需要半自动数据集构建?
在目标检测任务中,数据集的规模和质量直接决定了模型的性能上限。但传统的人工标注方式存在两个致命痛点:一是标注效率低下,标注1000张图片可能需要数周时间;二是标注成本高昂,专业标注团队的报价通常在每张0.5-2元不等。以一次性筷子计数项目为例,当每张图片包含上百个目标时,纯人工标注几乎不可行。
我在实际项目中验证过,使用YOLOv5+imgaug的半自动流程,可以将标注效率提升5-8倍。具体操作分为三步走:
- 人工标注10-20张代表性图片
- 使用imgaug进行数据增强生成100-200张训练样本
- 用YOLOv5模型进行预测标注,人工仅需修正错误
这种方法特别适合小目标密集场景。比如在筷子计数项目中,原始图片经过旋转、裁剪等增强后,模型对角度变化的鲁棒性显著提升。实测显示,经过3轮迭代后,模型辅助标注的准确率能达到85%以上,人工修正时间比纯人工标注节省70%。
2. 数据准备:如何选择种子样本?
2.1 采集代表性图片
建议使用手机或相机拍摄原始素材时注意:
- 覆盖不同光照条件(顺光、逆光、阴影)
- 包含目标物体的多种姿态(如筷子散落、捆扎等状态)
- 背景复杂度要有差异(简单纯色背景和复杂场景混合)
我通常会建立如下目录结构:
dataset/ ├── raw_images/ # 原始图片 ├── labeled/ # 已标注图片 │ ├── images/ # 图片文件 │ └── labels/ # XML标注文件 └── augmented/ # 增强后数据2.2 使用LabelImg进行初始标注
安装LabelImg只需一行命令:
pip install labelImg labelImg [图片路径] [预定义类别文件]标注时要注意:
- 对密集小目标适当放大图片再标注
- 保持标注一致性(如筷子统一标注为"chopstick")
- 使用快捷键提升效率:
- W:创建标注框
- A/D:切换上一张/下一张
- Ctrl+S:快速保存
提示:建议将标注保存为PASCAL VOC格式的XML文件,这种格式兼容性最好,后续转换也方便。
3. 数据增强:imgaug实战技巧
3.1 基础增强策略
以下是一个针对筷子计数的增强配置示例:
import imgaug.augmenters as iaa seq = iaa.Sequential([ iaa.Fliplr(0.5), # 50%概率水平翻转 iaa.Affine( rotate=(-45, 45), # 随机旋转-45到45度 translate_percent=(-0.1, 0.1) # 随机平移 ), iaa.Multiply((0.8, 1.2)), # 调整亮度 iaa.LinearContrast((0.8, 1.2)), # 调整对比度 iaa.AdditiveGaussianNoise(scale=(0, 0.05*255)) # 添加高斯噪声 ])3.2 小目标增强专项优化
对于筷子这类细长型小目标,需要特殊处理:
special_aug = iaa.Sometimes(0.7, # 70%概率应用 iaa.OneOf([ iaa.Dropout([0.05, 0.2]), # 随机遮挡 iaa.CoarseDropout(0.02, size_percent=0.3), # 块状遮挡 iaa.AddToHueAndSaturation((-20, 20)) # 色相调整 ]) )3.3 增强效果可视化
使用Jupyter Notebook实时查看增强效果:
import matplotlib.pyplot as plt augmented_images = seq(images=[image]) # 单图增强 plt.imshow(augmented_images[0]) plt.show()我常用的增强组合是:每张原始图片生成9-15个变体,包含旋转、亮度变化、小范围裁剪等。注意要避免过度增强导致图像失真,特别是对于需要精确计数的场景。
4. YOLOv5模型训练与迭代标注
4.1 初始模型训练
使用增强后的100-200张图片进行第一轮训练:
python train.py --img 640 --batch 16 --epochs 50 --data chopstick.yaml --weights yolov5s.pt关键参数说明:
--img 640:输入图像尺寸--batch 16:根据GPU显存调整--epochs 50:对小数据集足够--data:数据集配置文件,示例内容如下:
# chopstick.yaml train: ../dataset/augmented/images/ val: ../dataset/augmented/images/ nc: 1 # 类别数 names: ['chopstick'] # 类别名称4.2 模型辅助标注
训练完成后,使用模型批量预测:
python detect.py --weights runs/train/exp/weights/best.pt --source ../dataset/raw_images/ --save-txt建议添加--conf 0.5参数过滤低置信度预测。生成的标注文件会自动保存在runs/detect/exp/labels/目录下。
4.3 人工修正技巧
使用LabelImg修正时:
- 按F键自动加载预测标注
- 对漏检目标手动添加标注框
- 对错误标注直接删除或调整框位置
- 使用方向键微调框体位置
实测发现,第二轮迭代时人工修正时间通常比第一轮减少60%以上。
5. 进阶优化:提升小目标检测精度
5.1 模型架构选择
对于密集小目标,建议使用YOLOv5l或YOLOv5x:
python train.py --weights yolov5l.pt --img 1280 # 使用更大输入尺寸5.2 自适应锚框计算
YOLOv5支持自动计算锚框:
from utils.autoanchor import check_anchors check_anchors(dataset='chopstick.yaml', model='yolov5s.yaml')5.3 损失函数调优
修改utils/loss.py中的超参数:
# 增加小目标权重 self.gr = 1.0 # giou loss ratio self.box_weight = 0.05 # 调高定位损失权重 self.cls_weight = 0.5 # 分类损失权重在筷子计数项目中,经过3轮迭代后,我们最终获得了包含1500张图片的数据集,其中人工标注时间总计不到20小时,模型在测试集上的mAP@0.5达到0.92。整个过程最关键的发现是:数据增强时保持目标的几何特性(如筷子的长宽比)对最终计数准确率影响很大。