4. 标注工具与数据集构建

数据标注这件事,说白了就是给图像打标签。很多初学者觉得这是纯体力活,随便找几个人画画框就行。我刚开始带项目时也这么想,结果模型训练出来,漏检率居高不下。后来排查才发现——标注质量太差了。嗯,从那以后我再也不敢轻视标注环节。

这一章,我们聊聊怎么用工具、怎么定规范、怎么把原始图像变成能喂给模型的高质量数据集。

4.1 标注工具选型:LabelImg vs Labelme

工业缺陷检测里,最常用的两个工具就是 LabelImg 和 Labelme。它们各有侧重,我一般这样选:

对比维度 LabelImg Labelme
标注类型 矩形框(YOLO、VOC 格式) 多边形、矩形、分割、关键点
输出格式 XML(Pascal VOC)、TXT(YOLO) JSON(COCO 风格)
适用场景 目标检测(缺陷定位) 实例分割、语义分割
安装难度 pip 一键安装 pip 安装,依赖稍多
批量操作 支持自动保存、下一张 支持,但多边形标注较慢

我的建议:如果只做矩形框检测(比如划痕、脏污的定位),用 LabelImg 就够了。如果缺陷形状不规则(比如裂纹、气泡),需要多边形标注,那就上 Labelme。我个人习惯是两种工具都装,根据项目灵活切换。

4.2 标注规范:矩形框、多边形与分割

标注规范是数据质量的命门。我在项目中遇到过最头疼的事——同一个缺陷,不同标注员画出来的框大小差一倍。模型学到的全是标注偏差,不是真实特征。

4.2.1 矩形框标注规范

  • 紧贴目标:框的四边必须紧贴缺陷边缘,不要留白太多,也不要切掉缺陷。
  • 包含完整:如果缺陷延伸到图像边缘,框必须包含可见部分,不要人为截断。
  • 避免重叠:两个缺陷挨得很近时,分别画框,不要合并成一个。
  • 类别一致:同一类缺陷的框大小比例尽量一致,不要忽大忽小。
小技巧:我一般会先让标注员标 50 张图,我来审核一遍。把常见问题整理成「标注规范手册」,再让全员培训。这样能省掉后期大量返工时间。

4.2.2 多边形标注规范

多边形标注主要用于不规则缺陷。你想想看,一条弯曲的裂纹,用矩形框会框进大量背景,模型很容易学偏。

  • 顶点数量:一般 8-16 个点就够了,太多反而增加噪声。
  • 贴合轮廓:每个顶点落在缺陷边缘上,不要为了省事用直线代替曲线。
  • 闭合区域:最后一个点必须与第一个点闭合,形成封闭多边形。

4.2.3 分割标注

分割标注是像素级的,每个像素都要指定类别。工业场景里,分割标注常用于:

  • 缺陷面积测量(比如气泡占比)
  • 缺陷形状分析(比如裂纹长度、宽度)
  • 多类别重叠区域(比如划痕+脏污同时存在)
注意:分割标注的工作量是矩形框的 5-10 倍。我曾经为了一个半导体晶圆项目,三个人标了整整两周。如果项目周期紧,优先用矩形框或多边形,别轻易上分割。

4.3 数据集划分:训练/验证/测试

数据标完了,怎么分?很多教程说「三七分」或「八二开」,但工业场景里不能这么简单粗暴。

我一般遵循这个原则:

数据集 比例 用途 注意事项
训练集 70% 模型学习参数 必须包含所有缺陷类型
验证集 15% 调参、早停、模型选择 与训练集分布一致
测试集 15% 最终性能评估 不能参与训练过程

关键点:划分前一定要先打乱数据。我见过有人按文件夹顺序直接切,结果训练集全是白天拍的,测试集全是晚上拍的——模型直接崩了。

另外,分层采样很重要。如果缺陷 A 有 1000 张,缺陷 B 只有 50 张,随机划分可能导致测试集里没有缺陷 B。我习惯用 sklearn 的 train_test_split 加 stratify 参数,保证每个子集里各类比例一致。

from sklearn.model_selection import train_test_split

# 假设 images 是图像路径列表,labels 是类别标签
train_imgs, temp_imgs, train_labels, temp_labels = train_test_split(
    images, labels, test_size=0.3, stratify=labels, random_state=42
)

val_imgs, test_imgs, val_labels, test_labels = train_test_split(
    temp_imgs, temp_labels, test_size=0.5, stratify=temp_labels, random_state=42
)

4.4 数据增强:让模型见多识广

工业场景里,缺陷样本往往很少。一个产线可能一天才出几片次品,根本不够训练。怎么办?数据增强。

数据增强不是乱变,要符合物理规律。我总结了几类常用增强方法:

4.4.1 几何变换

  • 水平翻转:工业场景中,缺陷左右对称出现时很有效。比如 PCB 板上的划痕,左右都可能出现。
  • 旋转:0°、90°、180°、270° 是安全的。任意角度旋转要注意,会引入黑边,需要配合裁剪。
  • 缩放:0.8x-1.2x 之间,模拟不同拍摄距离。

4.4.2 色彩与噪声

  • 亮度调整:模拟产线光照波动。我一般调 ±20%。
  • 对比度调整:模拟不同材质表面的反光差异。
  • 高斯噪声:模拟传感器噪声。注意不要加太多,否则缺陷特征会被淹没。
  • 模糊:模拟运动模糊或对焦不准。用高斯模糊,核大小 3x3 或 5x5 就够了。

4.4.3 高级增强(慎用)

  • Cutout / Random Erasing:随机遮挡部分区域,强迫模型关注局部特征。我在金属表面缺陷检测中用过,效果不错。
  • Mixup:两张图按比例混合。工业场景里要小心,混合后的缺陷可能不符合物理规律。
核心原则:数据增强必须模拟真实产线中可能出现的变异,而不是为了增加数量而随意变换。我曾经见过有人把缺陷图旋转 45° 后,缺陷形状完全失真,模型反而学坏了。

4.5 知识体系总览

下面这张图,把本章的核心逻辑串起来了。从原始图像开始,经过标注工具、标注规范、数据集划分、数据增强,最终得到可用的训练数据。

标注工具与数据集构建流程 标注工具与数据集构建流程 原始图像采集 标注工具选择:LabelImg / Labelme 标注规范 矩形框 | 多边形 | 分割 数据集划分 训练集 70% | 验证集 15% | 测试集 15% 数据增强 翻转 | 旋转 | 噪声 | 亮度 | 模糊 高质量训练数据集 关键原则 标注质量 > 标注数量 增强要模拟真实变异 分层采样保分布一致

4.6 避坑指南

最后,分享几个我踩过的坑:

  • 标注不一致:同一个缺陷,不同标注员画法不同。解决方案:制定详细规范,定期交叉审核。
  • 数据泄露:增强后的图像混入测试集。我见过有人把原图和增强图一起划分,结果测试集里包含原图的翻转版本,性能虚高。
  • 过度增强:旋转 45° 后缺陷形状失真,模型学到的全是伪特征。记住:增强要模拟真实产线变异,不是艺术创作。
  • 类别不平衡:正常样本占 99%,缺陷样本占 1%。我一般会先对缺陷样本做过采样,再配合增强,把比例拉到 1:5 左右。
我的习惯:每次做完数据增强,我都会随机抽 100 张图,肉眼过一遍。看看增强后的图像是否合理,标注是否对齐。这一步虽然费时,但能避免很多后期问题。