3. 数据集准备
做工业质检,说白了就是教模型看懂「什么是不好的」。但模型很笨,你得先给它看成千上万张带缺陷的图,还得告诉它「缺陷长什么样」。这一步没做好,后面调参调得再好也是白搭。我见过太多项目,算法选得挺先进,结果因为数据集质量太差,上线就崩。
这一章,我们就来聊聊工业缺陷数据集怎么来、怎么标、怎么扩。全是实战里踩过的坑和总结出的经验。
3.1 工业缺陷数据集的采集:从产线到硬盘
数据采集是第一步,也是最容易被低估的一步。很多人觉得「不就是拍照片吗?」——嗯,还真不是那么简单。
核心原则:采集的数据必须覆盖产线上所有可能出现的缺陷类型、光照条件、产品角度和背景干扰。宁可多拍,不要漏拍。
我在一个手机中框检测项目里就吃过亏。当时只拍了正常产线光照下的样本,结果模型一上线,遇到夜班换了一批灯管,误检率直接飙到30%。后来我们不得不重新采集了不同光照、不同角度的数据,才把误检压下来。
工业数据采集通常有几种方式:
| 采集方式 | 适用场景 | 优缺点 |
|---|---|---|
| 在线采集(产线相机) | 大批量、固定工位 | 数据真实,但缺陷样本少 |
| 离线采集(实验室搭建) | 小批量、多品种 | 可控性强,但成本高 |
| 半自动采集(人工+机械臂) | 缺陷样本极少的场景 | 灵活,但效率低 |
我个人习惯是:优先用在线采集,因为数据最贴近真实工况。但缺陷样本太少时,我会在实验室里用离线方式「复现」缺陷,比如用刻刀划痕、用滴管制造污渍。你想想看,模型没见过某种缺陷,它怎么可能学会检测?
小技巧:采集时记得记录元数据——产品批次、相机参数、光照强度、缺陷类型。这些信息在后续分析模型失败案例时,能帮你快速定位问题。
3.2 标注工具:LabelImg vs LabelMe,怎么选?
数据有了,接下来就是标注。工业质检里最常用的两个标注工具就是 LabelImg 和 LabelMe。很多人问我哪个好,我的回答是:看你的检测任务类型。
3.2.1 LabelImg:矩形框的王者
LabelImg 是 YOLO 系列最经典的标注工具。它生成的标注格式直接就是 YOLO 的 txt 格式,几乎不用转换。如果你做的是目标检测(比如检测划痕、脏污的位置),用 LabelImg 最省事。
# LabelImg 生成的 YOLO 格式标注示例
# 每行:class_id x_center y_center width height
# 坐标都是归一化到 [0,1] 的
0 0.523 0.412 0.156 0.089
1 0.234 0.678 0.098 0.123
我曾经在一个 PCB 缺陷检测项目里,用 LabelImg 标了 5000 张图。它的快捷键很顺手,W 键画框、A/D 键切换图片,标起来效率很高。但要注意:LabelImg 只支持矩形框,如果你的缺陷形状不规则(比如裂纹、气泡),矩形框会框进大量背景,干扰模型学习。
3.2.2 LabelMe:多边形标注的利器
LabelMe 支持多边形标注,可以精确勾勒出缺陷的轮廓。它生成的标注是 JSON 格式,需要转换成 YOLO 的格式才能用。虽然多了一步转换,但对于不规则缺陷,效果比矩形框好太多。
避坑指南:我曾经在一个玻璃划痕检测项目里,用 LabelImg 标矩形框,模型训练完精度死活上不去。后来换成 LabelMe 标多边形,mAP 直接提升了 12 个点。为什么?因为划痕是细长条,矩形框里大部分是背景,模型学了一堆「背景特征」,反而把真正的划痕特征淹没了。
两个工具怎么选?我列了个对比表:
| 对比维度 | LabelImg | LabelMe |
|---|---|---|
| 标注形状 | 仅矩形框 | 多边形、矩形、圆形等 |
| 输出格式 | YOLO txt / Pascal VOC XML | JSON(需转换) |
| 标注效率 | 高(快捷键多) | 中等(多边形点选较慢) |
| 适用场景 | 规则形状缺陷、通用目标检测 | 不规则缺陷、实例分割 |
| 学习成本 | 低 | 中等 |
我的建议是:如果缺陷形状接近矩形(比如缺角、脏污块),用 LabelImg;如果缺陷形状不规则(比如裂纹、划痕、气泡),用 LabelMe。 别嫌麻烦,标注质量直接决定模型上限。
3.3 数据增强策略:让有限的数据发挥无限的价值
工业场景里,缺陷样本往往很少。一条产线一天可能只产出几十个缺陷品,但模型训练需要几千张。怎么办?数据增强。
数据增强不是随便翻翻转转就完事了。工业质检有它的特殊性——增强策略必须模拟真实产线的变化,而不是为了增强而增强。
核心原则:数据增强后的样本,必须仍然「像」真实产线上可能出现的图像。不要做那些现实中不可能出现的变换。
3.3.1 几何变换:模拟产品位置和角度的变化
产线上产品的位置不可能每次都完全居中,角度也会有微小偏差。所以几何变换是必须的。
- 随机旋转: ±15° 以内,太大就不像了
- 随机平移: 水平和垂直方向 ±10%
- 随机缩放: 0.8~1.2 倍
- 水平翻转: 注意!有些产品有方向性(比如文字、logo),不能翻转
我记得在一个手机外壳检测项目里,客户要求不能做水平翻转,因为外壳上的 logo 方向是固定的。如果强行翻转,模型会学到「logo 朝右才是对的」,反而把正常产品误判为缺陷。
3.3.2 色彩变换:模拟光照变化
产线的光照会随着时间、灯管老化、环境光变化而波动。色彩变换就是为了模拟这些变化。
- 亮度调整: ±20%
- 对比度调整: ±15%
- 饱和度调整: ±10%
- 高斯噪声: 模拟传感器噪声
小技巧:不要用 HSV 空间的随机抖动,工业图像很多是灰度图,HSV 变换会引入不真实的颜色。我一般只用亮度和对比度调整,再加一点高斯噪声就够了。
3.3.3 高级增强:Mosaic 和 MixUp
YOLO 系列自带 Mosaic 增强,就是把 4 张图拼成 1 张。这个策略对工业场景特别有用——它能让模型在 1 张图里同时看到多个缺陷,变相增加了缺陷样本的密度。
# YOLOv8 训练时启用 Mosaic 增强
# 在 ultralytics 的配置文件中设置
mosaic: 1.0 # 1.0 表示 100% 的批次使用 Mosaic
mixup: 0.1 # 10% 的概率使用 MixUp
MixUp 是把两张图按比例混合,标签也按比例混合。这个策略对工业场景效果一般,因为混合后的图像看起来「不真实」,模型可能会学到一些奇怪的纹理。我个人习惯:Mosaic 必开,MixUp 看情况。
3.3.4 工业场景特有的增强策略
除了通用增强,工业场景还有一些「独门秘籍」:
| 增强策略 | 模拟场景 | 实现方式 |
|---|---|---|
| 随机遮挡 | 产品被零件遮挡 | 随机用黑色矩形块遮挡部分区域 |
| 模糊模拟 | 相机失焦、运动模糊 | 高斯模糊、运动模糊核 |
| 光照渐变 | 产线光照不均匀 | 在图像上叠加径向渐变 |
| 缺陷复制粘贴 | 增加缺陷样本数量 | 从标注图中抠出缺陷,粘贴到正常图上 |
缺陷复制粘贴这个策略,我强烈推荐。做法很简单:从已有的缺陷样本里把缺陷区域抠出来,然后随机粘贴到正常产品的图像上。这样既能增加缺陷样本数量,又能保证缺陷的「真实性」——因为缺陷本身是真实的,只是位置变了。
避坑指南:缺陷复制粘贴时,要注意粘贴位置的合理性。比如划痕不能贴在产品的边缘之外,气泡不能贴在金属表面(气泡只出现在透明材质上)。我曾经犯过这个错,模型学了一堆「不可能出现的缺陷位置」,上线后误检率奇高。
3.4 本章知识体系总览
说了这么多,我画了一张图来总结本章的核心内容。你可以把它当作一个「数据准备路线图」:
从这张图可以看得很清楚:数据采集是源头,标注是桥梁,增强是放大器。三个环节环环相扣,任何一个环节出问题,最终模型效果都会打折扣。