3. 数据集构建与标注

说实话,很多做算法的朋友容易忽略一个事实:模型的上限,其实在标注阶段就定死了。你调参调得再好,网络结构改得再花哨,喂进去的数据是脏的、标注是错的,那结果就是白费功夫。我见过太多项目,算法团队花三个月优化模型,最后发现是标注框偏了 5 个像素,导致缺陷漏检率一直下不去。

这一章,咱们就聊聊怎么把数据集这个地基打牢。我会把我在产线上踩过的坑、总结的经验,都摊开来讲。

3.1 数据采集策略:别等上线了才发现缺样本

数据采集不是拿个相机随便拍一拍就完事了。你得想清楚几个问题:

  • 缺陷长什么样? 划痕、脏污、气泡、缺料……每种缺陷的形态、大小、对比度都不一样。
  • 产线环境稳不稳定? 光照变化、产品来料波动、相机震动,这些都会影响数据分布。
  • 正负样本比例是多少? 工业场景下,良品率往往很高,缺陷样本可能只有千分之一甚至更低。

我个人习惯,在项目启动阶段先做一次小批量试采。拿 500 到 1000 张图,快速看一下缺陷的分布情况。如果发现某种缺陷压根没出现,那就得想办法了——要么去产线蹲守,要么用人工复现的方式制造缺陷样本。

我的经验: 别指望一次采集就搞定所有数据。工业场景的数据分布是会漂移的。我建议在项目初期就建立一套持续采集机制,比如每天从产线抽检 5% 的产品图像,存到数据池里。这样即使模型上线后,也能不断补充新样本。

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 部署,需要一台服务器。
我的建议: 项目初期数据量小于 5000 张,且只有 1-2 个人标注,用 LabelImg 就够了。一旦数据量超过 1 万张,或者需要多人协作,果断上 CVAT。别犹豫,犹豫就会败北。

3.3 标注规范:框怎么画,才算合格?

这是最容易出问题的地方。我见过标注员把缺陷框画得比实际缺陷大两倍,也见过把背景上的灰尘当成缺陷标出来。所以,标注规范必须提前定死,而且要写进文档里。

3.3.1 核心标注原则

  1. 紧贴缺陷边缘: 标注框必须刚好包住缺陷区域,不能留白太多,也不能切掉缺陷边缘。误差控制在 2-3 个像素以内。
  2. 遮挡处理: 如果缺陷被其他物体遮挡,只标注可见部分。不要脑补缺陷的完整形状。
  3. 模糊边界: 对于边缘模糊的缺陷(比如渐变划痕),以人眼能清晰分辨的边界为准。
  4. 多缺陷标注: 一张图上如果有多个缺陷,每个都要单独标注。不要合并成一个框。
  5. 标签一致性: 同一类缺陷,必须用同一个标签名。比如“划痕”不能有的标“scratch”,有的标“划伤”。
避坑指南: 我曾经在一个项目中,因为标注规范没写清楚,导致两个标注员对“轻微划痕”的理解不一致。一个认为只要肉眼可见就算,另一个认为必须用指甲能感觉到才算。结果模型训练出来,对轻微划痕的检测率只有 30%。后来我们重新统一了标准,用参考图卡来定义每种缺陷的严重等级,才解决了这个问题。

3.3.2 标注质量把控流程

光有规范还不够,你得有机制来保证规范被执行。我一般会设置三级审核:

级别 执行人 检查内容 抽检比例
一级 标注员自检 框的位置、标签是否正确 100%
二级 标注组长 框的贴合度、遗漏缺陷 30%
三级 算法工程师 随机抽检,确认是否符合训练要求 5%

嗯,这里要注意:三级审核不是走过场。我每次都会亲自抽检一批数据,看看有没有系统性偏差。比如,如果发现某个标注员画的框普遍偏大,我会让他重新学习规范,并把他之前标注的数据全部打回重标。

3.4 数据集构建的核心逻辑

标注完成后,下一步就是构建训练集、验证集、测试集。这里有个常见的误区:很多人直接随机划分,结果导致验证集和测试集里出现了训练集没有的缺陷类型,或者光照条件差异太大。

我建议按照批次或时间维度来划分。比如,用前 7 天的数据做训练,第 8 天的数据做验证,第 9 天的数据做测试。这样能更好地模拟模型上线后遇到新数据的表现。

一个小技巧: 在划分数据集之前,先统计一下每种缺陷的样本数量。如果某个缺陷只有 10 张图,那就别把它分到测试集里了,全部放进训练集。测试集至少要保证每种缺陷有 20 张以上的样本,否则评估结果没有统计意义。

3.5 本章知识结构图

下面这张图,我把数据集构建与标注的核心流程梳理了一下。你可以把它当作一个检查清单,做项目时对着看,看看自己漏了哪一步。

数据集构建与标注核心流程 数据集构建与标注核心流程 数据采集策略 标注工具选择 标注规范制定 质量把控流程 数据集划分 关键要点 • 组合使用采集策略 • 小团队用LabelImg • 大团队用CVAT • 规范必须文档化 • 三级审核机制 • 按时间维度划分 • 保证缺陷样本量 常见陷阱 • 标注框偏大/偏小 • 标签命名不一致 • 忽略遮挡处理 • 随机划分数据集 • 缺乏持续采集 • 审核流于形式

说白了,数据集构建这件事,功夫在诗外。你花在数据上的时间,最终都会在模型性能上体现出来。别急着调参,先把数据搞干净。