3. 数据集构建与标注:数据采集策略、标注工具选择与质量把控
说实话,很多做算法的朋友容易忽略一个事实:模型的上限,其实在标注阶段就定死了。你调参调得再好,网络结构改得再花哨,喂进去的数据是脏的、标注是错的,那结果就是白费功夫。我见过太多项目,算法团队花三个月优化模型,最后发现是标注框偏了 5 个像素,导致缺陷漏检率一直下不去。
这一章,咱们就聊聊怎么把数据集这个地基打牢。我会把我在产线上踩过的坑、总结的经验,都摊开来讲。
3.1 数据采集策略:别等上线了才发现缺样本
数据采集不是拿个相机随便拍一拍就完事了。你得想清楚几个问题:
- 缺陷长什么样? 划痕、脏污、气泡、缺料……每种缺陷的形态、大小、对比度都不一样。
- 产线环境稳不稳定? 光照变化、产品来料波动、相机震动,这些都会影响数据分布。
- 正负样本比例是多少? 工业场景下,良品率往往很高,缺陷样本可能只有千分之一甚至更低。
我个人习惯,在项目启动阶段先做一次小批量试采。拿 500 到 1000 张图,快速看一下缺陷的分布情况。如果发现某种缺陷压根没出现,那就得想办法了——要么去产线蹲守,要么用人工复现的方式制造缺陷样本。
3.1.1 采集策略对比
| 策略 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 全量采集 | 产线速度慢、产品种类少 | 数据覆盖全面 | 存储成本高、冗余数据多 |
| 触发式采集 | 缺陷出现频率低、需要精准捕获 | 节省存储、目标明确 | 依赖触发信号、可能漏采 |
| 周期性抽检 | 产线稳定、缺陷率低 | 平衡成本与覆盖 | 可能错过偶发缺陷 |
| 人工复现 | 缺陷样本极度匮乏 | 快速补充稀缺样本 | 与真实缺陷有差异 |
你看,没有一种策略是万能的。我通常的做法是组合使用:用触发式采集抓取已知缺陷,用周期性抽检覆盖未知异常,再配合人工复现补充极端情况。
3.2 标注工具选择:LabelImg 还是 CVAT?
工具选对了,效率翻倍;选错了,标注员能把你骂死。目前工业界用得最多的就是 LabelImg 和 CVAT。我两个都用过,说说我的感受。
3.2.1 LabelImg:轻量、离线、够用
LabelImg 是个老牌工具了。它最大的优点就是简单——下载就能用,不需要配置服务器,也不需要联网。适合小团队、小项目,或者个人做实验。
- 格式支持: Pascal VOC (XML)、YOLO (TXT)、CreateML (JSON)。
- 操作方式: 鼠标画框,快捷键切换标签。
- 痛点: 不支持多人协同,没有自动保存功能(我吃过这个亏,标注到一半软件崩了……)。
3.2.2 CVAT:团队协作、功能强大
CVAT 是 Intel 开源的在线标注平台。如果你要管理一个标注团队,或者项目数据量很大,我强烈推荐用 CVAT。
- 核心优势: 支持多人同时标注、自动标注(基于预训练模型)、标签审核流程。
- 格式支持: COCO JSON、Pascal VOC、YOLO、TFRecord 等。
- 部署方式: Docker 部署,需要一台服务器。
3.3 标注规范:框怎么画,才算合格?
这是最容易出问题的地方。我见过标注员把缺陷框画得比实际缺陷大两倍,也见过把背景上的灰尘当成缺陷标出来。所以,标注规范必须提前定死,而且要写进文档里。
3.3.1 核心标注原则
- 紧贴缺陷边缘: 标注框必须刚好包住缺陷区域,不能留白太多,也不能切掉缺陷边缘。误差控制在 2-3 个像素以内。
- 遮挡处理: 如果缺陷被其他物体遮挡,只标注可见部分。不要脑补缺陷的完整形状。
- 模糊边界: 对于边缘模糊的缺陷(比如渐变划痕),以人眼能清晰分辨的边界为准。
- 多缺陷标注: 一张图上如果有多个缺陷,每个都要单独标注。不要合并成一个框。
- 标签一致性: 同一类缺陷,必须用同一个标签名。比如“划痕”不能有的标“scratch”,有的标“划伤”。
3.3.2 标注质量把控流程
光有规范还不够,你得有机制来保证规范被执行。我一般会设置三级审核:
| 级别 | 执行人 | 检查内容 | 抽检比例 |
|---|---|---|---|
| 一级 | 标注员自检 | 框的位置、标签是否正确 | 100% |
| 二级 | 标注组长 | 框的贴合度、遗漏缺陷 | 30% |
| 三级 | 算法工程师 | 随机抽检,确认是否符合训练要求 | 5% |
嗯,这里要注意:三级审核不是走过场。我每次都会亲自抽检一批数据,看看有没有系统性偏差。比如,如果发现某个标注员画的框普遍偏大,我会让他重新学习规范,并把他之前标注的数据全部打回重标。
3.4 数据集构建的核心逻辑
标注完成后,下一步就是构建训练集、验证集、测试集。这里有个常见的误区:很多人直接随机划分,结果导致验证集和测试集里出现了训练集没有的缺陷类型,或者光照条件差异太大。
我建议按照批次或时间维度来划分。比如,用前 7 天的数据做训练,第 8 天的数据做验证,第 9 天的数据做测试。这样能更好地模拟模型上线后遇到新数据的表现。
3.5 本章知识结构图
下面这张图,我把数据集构建与标注的核心流程梳理了一下。你可以把它当作一个检查清单,做项目时对着看,看看自己漏了哪一步。
说白了,数据集构建这件事,功夫在诗外。你花在数据上的时间,最终都会在模型性能上体现出来。别急着调参,先把数据搞干净。