1. 从零开始为什么需要半自动数据集构建在目标检测任务中数据集的规模和质量直接决定了模型的性能上限。但传统的人工标注方式存在两个致命痛点一是标注效率低下标注1000张图片可能需要数周时间二是标注成本高昂专业标注团队的报价通常在每张0.5-2元不等。以一次性筷子计数项目为例当每张图片包含上百个目标时纯人工标注几乎不可行。我在实际项目中验证过使用YOLOv5imgaug的半自动流程可以将标注效率提升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切换上一张/下一张CtrlS快速保存提示建议将标注保存为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_percent0.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或YOLOv5xpython train.py --weights yolov5l.pt --img 1280 # 使用更大输入尺寸5.2 自适应锚框计算YOLOv5支持自动计算锚框from utils.autoanchor import check_anchors check_anchors(datasetchopstick.yaml, modelyolov5s.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小时模型在测试集上的mAP0.5达到0.92。整个过程最关键的发现是数据增强时保持目标的几何特性如筷子的长宽比对最终计数准确率影响很大。