高质量非机动车检测数据集构建与优化实践
1. 为什么你需要一个高质量的非机动车检测数据集做目标检测的朋友都知道数据集的质量直接决定了模型的上限。我在实际项目中遇到过太多次这样的情况模型训练了半天测试集上的指标就是上不去最后发现问题出在数据集上——要么标注不准确要么类别混乱甚至有些数据集直接用模型预标注的。非机动车检测这个细分领域尤其如此。市面上现成的数据集往往存在几个典型问题一是自行车、电动车、摩托车混为一谈二是标注框不够精确三是场景单一缺乏多样性。这些问题会导致模型在实际应用中表现不佳比如把电动车识别成摩托车或者在复杂场景下漏检。我去年接手过一个共享单车管理项目最初使用的公开数据集在测试环境下准确率能达到90%但实际部署时直接掉到60%以下。后来花了三周时间重建数据集模型效果才真正达到商用标准。这个经历让我深刻认识到高质量的数据集不是可选项而是必选项。2. 数据采集的实战技巧2.1 数据来源的选择我通常建议从多个渠道获取原始数据公开数据集中的可用部分但要严格筛选实际场景拍摄的街景视频交通监控视频的截图合作伙伴提供的业务数据最近做的一个电动车检测项目我就是用这种混合采集法先从公开数据集中筛选出2000张合格图片再通过路采获取3000张不同时段、不同角度的照片最后从合作方拿到1500张特定场景下的监控截图。这种组合保证了数据的多样性。2.2 拍摄时的注意事项如果你需要自己采集数据这几个参数要特别注意分辨率建议不低于1920×1080太低会影响小目标检测光照条件涵盖白天、夜晚、阴天等多种情况拍摄角度平视、俯视、斜视都要有遮挡情况适当包含部分遮挡的样本有个实用技巧是使用行车记录仪采集数据它能自动记录各种光照条件下的街景而且视角很接近实际应用场景。我通常会开车在不同时段绕城区转几圈这样半天就能收集到丰富的素材。3. 数据标注的黄金标准3.1 标注工具的选择试过多种标注工具后我总结出一个选择标准LabelImg适合小规模标注上手简单CVAT适合团队协作支持视频标注Prodigy适合主动学习场景最近我在用改进版的LabelImg它增加了几个实用功能# 标注工具的自定义配置示例 { auto_save: true, # 自动保存 display_label: false, # 不显示标签名避免遮挡 label_format: YOLO, # 直接输出YOLO格式 default_label: bike # 设置默认标签 }3.2 标注质量的把控标注质量是数据集的核心我们团队制定了严格的标注规范边界框要紧贴物体边缘但不要截断任何部分对于部分遮挡的物体要标注可见部分的完整轮廓每个物体的标注类别必须明确不允许出现不确定的标签对于难以判断的小目标至少要经过两名标注员确认我们开发了一个简单的标注校验脚本可以快速检查常见问题import os from PIL import Image def validate_annotation(img_path, label_path): img Image.open(img_path) width, height img.size with open(label_path) as f: lines f.readlines() for line in lines: _, x, y, w, h map(float, line.strip().split()) if not (0 x 1 and 0 y 1 and 0 w 1 and 0 h 1): return False if w 0.01 or h 0.01: # 过滤过小的目标 return False return True4. 数据增强的进阶策略4.1 基础增强方法基础的增强方法包括随机旋转-15°到15°亮度调整±30%添加高斯噪声随机裁剪我常用的Albumentations配置如下import albumentations as A transform A.Compose([ A.RandomRotate90(), A.Flip(p0.5), A.RandomBrightnessContrast(p0.2), A.HueSaturationValue(p0.2), A.RandomShadow(p0.1), A.RandomSnow(p0.1), A.RandomFog(p0.1), ], bbox_paramsA.BboxParams(formatyolo))4.2 针对非机动车的特殊增强非机动车有几个特点需要考虑经常出现在复杂背景中形状变化较大自行车vs三轮车常有部分遮挡我设计了一套专门的增强方案背景混合将非机动车抠出来放到不同背景中部分遮挡模拟随机添加遮挡条多车组合将多辆车的图像合成到一张图中这个方案使我们的模型在遮挡场景下的识别率提升了15%。5. 数据集优化的关键步骤5.1 数据清洗拿到原始数据后我通常会进行三轮清洗自动过滤用脚本去除损坏的图片和空标签人工检查抽样检查标注质量模型辅助用预训练模型检测明显错误清洗前后数据质量对比指标清洗前清洗后空标签率3.2%0%标注错误率5.7%0.8%图片损坏率1.1%0%5.2 类别平衡非机动车数据集中常见的类别不平衡问题电动车样本远多于三轮车正样本与负样本比例失调我的解决方法对少数类过采样使用focal loss人工补充拍摄稀缺类别最近一个项目通过这种调整将三轮车的召回率从62%提升到了89%。6. 实战中的经验分享在实际项目中我总结出几个关键点数据版本控制像管理代码一样管理数据集版本元数据记录记录每张图片的采集时间、地点、天气等信息测试集划分确保测试集覆盖所有场景我们团队现在使用DVC来做数据版本管理配置大概是这样# 初始化DVC dvc init # 添加数据集 dvc add data/train/images dvc add data/train/labels # 设置远程存储 dvc remote add -d myremote /path/to/remote最后提醒一点数据集构建是个迭代过程。我们通常会在模型训练过程中发现新的数据需求比如某些角度的样本不足或者特定场景的识别效果不好。这时候就需要回到数据采集阶段进行补充。好的数据集往往需要3-5个迭代周期才能达到理想状态。