4、数据集构建与标注:数据采集策略、标注规范与质量审核

做工业视觉这么多年,我越来越觉得一个道理:模型的上限,其实在数据采集阶段就定死了。你算法调得再好,如果训练数据跟产线实际工况差着十万八千里,那落地的时候一定会摔跟头。今天咱们就聊聊数据集构建这件事,从采集策略到标注规范,再到质量审核,把这条链路捋清楚。

4.1 数据采集策略:别让模型「没见过」

数据采集不是简单拿相机拍几张照片就完事。我见过太多项目,实验室里跑得飞起,一上产线就崩——为什么?因为采集的数据太「干净」了。

4.1.1 覆盖真实工况的多样性

工业场景下,光照、角度、产品批次、设备振动都会影响图像。你想想看,如果训练集里全是正光、静态、完美产品,模型怎么可能处理得了产线上那些「刁钻」情况?

我个人习惯,在制定采集方案时至少考虑以下维度:

维度 典型变化 采集建议
光照条件 亮度、色温、角度 不同时段、不同光源组合下采集
产品姿态 旋转、平移、倾斜 模拟传送带抖动、人工放置偏差
缺陷类型 划痕、脏污、变形、缺料 每种缺陷至少采集 200+ 样本
背景干扰 反光、阴影、油污 保留产线真实背景,不要抠图
我曾经踩过的坑: 有个项目做手机中框划痕检测,训练集全是实验室标准光源下拍的。结果产线上一跑,因为车间顶灯频闪,模型把正常反光全判成了缺陷。后来补采了 3 天产线数据才搞定。所以记住——采集环境越接近真实产线越好。

4.1.2 正负样本比例的把控

工业检测里,良品(负样本)往往占绝大多数,缺陷品(正样本)少得可怜。如果直接拿原始比例训练,模型会学成「永远判良品」的懒汉。

我建议的采集比例:

  • 良品样本:覆盖正常工艺波动即可,不用太多
  • 缺陷样本:每种缺陷类型至少 300-500 张,复杂缺陷要更多
  • 难例样本:边界模糊、光照异常、遮挡等「擦边球」情况,专门采集一批

说白了,缺陷样本才是模型真正要学的知识。如果现场缺陷不够,可以考虑用数据增强或仿真生成来补充,但一定要保证生成的缺陷足够真实。

4.2 标注规范:三种标注方式的选型

标注这件事,直接决定了模型能学到什么。工业视觉里常用的标注方式有三种:矩形框、多边形、分割掩码。选哪个?看任务需求。

4.2.1 矩形框标注

最基础、最快速的方式。用 (x_min, y_min, x_max, y_max) 框出目标区域。

  • 适用场景:目标检测、简单缺陷定位(如螺丝缺失、标签歪斜)
  • 优点:标注效率高,一个熟练工每天能标 1000+ 张
  • 缺点:框内包含大量背景,对不规则缺陷不够精确
# 矩形框标注格式示例(COCO格式)
{
    "bbox": [120, 45, 80, 60],  # x, y, width, height
    "category_id": 1,            # 缺陷类别
    "area": 4800,
    "iscrowd": 0
}
我的经验: 矩形框标注时,框的边界要离目标边缘留 2-3 个像素的余量,不要紧贴着切。这样模型学到的特征更鲁棒,不容易过拟合。

4.2.2 多边形标注

用一系列顶点勾勒出目标的精确轮廓。标注量比矩形框大,但精度更高。

  • 适用场景:不规则缺陷(划痕、裂纹、崩边)、精密零件轮廓检测
  • 优点:背景干扰少,模型定位更准
  • 缺点:标注耗时,复杂形状可能需要 20+ 个顶点
# 多边形标注格式示例
{
    "segmentation": [[
        120, 45, 140, 50, 160, 55, 
        180, 60, 200, 50, 190, 30
    ]],  # 顶点坐标列表
    "category_id": 2
}

嗯,这里要注意:多边形顶点数量不是越多越好。我见过有人把一条划痕标了 50 个点,结果模型反而学歪了。一般来说,10-15 个顶点就能描述大多数工业缺陷。

4.2.3 分割掩码

像素级别的标注,每个像素都打上类别标签。这是最精确、也是最费力的方式。

  • 适用场景:语义分割、实例分割、精密测量(如划痕长度、面积计算)
  • 优点:信息最完整,可以精确计算缺陷面积、形状
  • 缺点:标注成本极高,一张复杂图像可能标 30 分钟
# 分割掩码标注(RLE格式,更节省存储)
{
    "segmentation": {
        "size": [480, 640],
        "counts": "a1b2c3d4e5..."  # 游程编码
    },
    "category_id": 3
}
三种标注方式怎么选? 我一般这样判断:如果任务只需要「有没有缺陷」,矩形框就够了;如果需要知道「缺陷长什么样」,用多边形;如果要做精确的尺寸测量或缺陷分级,那就得上分割掩码。说白了,标注精度要跟业务需求匹配,别为了追求「高大上」而浪费人力。

4.3 数据清洗与质量审核:别让垃圾数据毁了模型

数据标完了,是不是就能直接训练了?别急。我见过太多团队,标注数据里错误百出——漏标、错标、边界不准……用这种数据训练,模型能好才怪。

4.3.1 常见的数据质量问题

问题类型 具体表现 影响
漏标 图像中存在缺陷但未标注 模型学到「缺陷=正常」,漏检率飙升
错标 类别标错(如划痕标成脏污) 类别混淆,模型分不清
边界不准 标注框/多边形偏离实际目标 定位精度下降,IoU 指标虚高
重复标注 同一缺陷被标了多次 模型对重复区域过度关注

4.3.2 我的清洗流程

我习惯用「三遍审核法」来保证数据质量:

  1. 第一遍:自动清洗
    • 检查标注格式是否正确(坐标是否越界、类别 ID 是否合法)
    • 过滤掉模糊、过暗、过曝的图像
    • 剔除标注面积过小(< 10 像素)的缺陷
  2. 第二遍:人工抽检
    • 随机抽取 10%-20% 的数据,逐张检查标注质量
    • 重点关注难例样本和边界样本
    • 记录错误类型,反馈给标注团队
  3. 第三遍:交叉验证
    • 让两个标注员独立标注同一批数据
    • 计算标注一致性(如 IoU、类别一致性)
    • 不一致的样本由专家仲裁
我曾经踩过的坑: 有个项目赶工期,数据标完直接训练。结果模型在验证集上 mAP 高达 0.95,一上产线就崩。后来排查发现,标注员把「正常纹理」标成了「划痕」,模型学了一堆假特征。从那以后,我坚持每批数据必须过三遍审核,宁可晚一周上线,也不能用脏数据。

4.3.3 标注一致性评估

怎么量化标注质量?我常用两个指标:

  • IoU(交并比):两个标注框的重叠程度,一般要求 > 0.7
  • Cohen's Kappa:类别标注的一致性,> 0.8 算合格
# 计算两个标注框的 IoU
def compute_iou(box1, box2):
    x1 = max(box1[0], box2[0])
    y1 = max(box1[1], box2[1])
    x2 = min(box1[2], box2[2])
    y2 = min(box1[3], box2[3])
    
    inter = max(0, x2 - x1) * max(0, y2 - y1)
    area1 = (box1[2] - box1[0]) * (box1[3] - box1[1])
    area2 = (box2[2] - box2[0]) * (box2[3] - box2[1])
    union = area1 + area2 - inter
    
    return inter / union if union > 0 else 0

4.4 本章知识体系

下面这张图把数据集构建与标注的核心流程串起来了,你可以对照着梳理自己的项目:

数据集构建与标注核心流程 数据采集 覆盖工况多样性 标注方式选择 矩形框/多边形/掩码 质量审核 三遍审核法 光照/姿态/缺陷覆盖 正负样本比例控制 产线真实环境模拟 难例样本专门采集 矩形框:快速定位 多边形:精确轮廓 分割掩码:像素级 顶点数量控制 自动清洗:格式/模糊/过小 人工抽检:10%-20% 逐张检查 交叉验证:双人独立标注 一致性评估:IoU / Kappa 高质量标注数据集 覆盖全面 · 标注精确 · 质量可控 核心原则 数据质量决定模型上限,标注规范决定落地效果 宁可多花一周做数据清洗,也不要花一个月调模型

你看,整个流程环环相扣。数据采集是源头,标注规范是骨架,质量审核是最后一道防线。任何一个环节出问题,都会传导到下游,最终影响模型在产线上的表现。

最后说一句: 数据集构建这件事,没有捷径可走。我见过太多团队花 80% 的时间调模型,却只花 20% 的时间搞数据。结果呢?模型越调越差,最后回过头来重新搞数据。所以我的建议是——把数据当成产品来做,制定标准、建立流程、持续迭代。这样你的模型才能稳稳落地。