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 矩形框标注规范
- 紧贴目标:框的四边必须紧贴缺陷边缘,不要留白太多,也不要切掉缺陷。
- 包含完整:如果缺陷延伸到图像边缘,框必须包含可见部分,不要人为截断。
- 避免重叠:两个缺陷挨得很近时,分别画框,不要合并成一个。
- 类别一致:同一类缺陷的框大小比例尽量一致,不要忽大忽小。
4.2.2 多边形标注规范
多边形标注主要用于不规则缺陷。你想想看,一条弯曲的裂纹,用矩形框会框进大量背景,模型很容易学偏。
- 顶点数量:一般 8-16 个点就够了,太多反而增加噪声。
- 贴合轮廓:每个顶点落在缺陷边缘上,不要为了省事用直线代替曲线。
- 闭合区域:最后一个点必须与第一个点闭合,形成封闭多边形。
4.2.3 分割标注
分割标注是像素级的,每个像素都要指定类别。工业场景里,分割标注常用于:
- 缺陷面积测量(比如气泡占比)
- 缺陷形状分析(比如裂纹长度、宽度)
- 多类别重叠区域(比如划痕+脏污同时存在)
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:两张图按比例混合。工业场景里要小心,混合后的缺陷可能不符合物理规律。
4.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。从原始图像开始,经过标注工具、标注规范、数据集划分、数据增强,最终得到可用的训练数据。
4.6 避坑指南
最后,分享几个我踩过的坑:
- 标注不一致:同一个缺陷,不同标注员画法不同。解决方案:制定详细规范,定期交叉审核。
- 数据泄露:增强后的图像混入测试集。我见过有人把原图和增强图一起划分,结果测试集里包含原图的翻转版本,性能虚高。
- 过度增强:旋转 45° 后缺陷形状失真,模型学到的全是伪特征。记住:增强要模拟真实产线变异,不是艺术创作。
- 类别不平衡:正常样本占 99%,缺陷样本占 1%。我一般会先对缺陷样本做过采样,再配合增强,把比例拉到 1:5 左右。