3. 模型训练基础:数据集准备、数据增强与超参数调优
做工业缺陷检测,模型训练是核心环节。但很多人一上来就调网络结构,结果数据没整明白,训练半天全是废的。
我个人习惯,花在数据准备上的时间,至少占整个项目周期的40%。你想想看,模型再牛,喂进去的是垃圾,吐出来的能是什么?
3.1 数据集准备:MVTec AD 与真实产线数据
先说公开数据集。MVTec AD 是工业异常检测的标杆,15个类目,包含纹理、物体、药品等。我建议新手先用它跑通流程。
MVTec AD 核心特点:
- 仅含正常样本用于训练(无监督)
- 测试集包含正常 + 各种缺陷(划痕、凹坑、污染等)
- 图像分辨率从512×512到1024×1024不等
但说实话,真实产线数据才是大头。我在项目中遇到过,客户给的良品样本里混了5%的次品,模型直接学歪了。所以数据清洗是第一关。
| 数据来源 | 优点 | 缺点 | 我的建议 |
|---|---|---|---|
| MVTec AD | 标注精准,场景标准 | 样本量小,场景有限 | 用于算法选型验证 |
| 产线真实数据 | 贴合实际,缺陷真实 | 良品/次品比例悬殊 | 必须做数据清洗与平衡 |
| 合成数据 | 可批量生成罕见缺陷 | 与真实分布有偏差 | 作为补充,不能替代真实数据 |
避坑指南: 我曾经接手一个项目,客户说数据已经标好了。结果一检查,标注框偏移了十几个像素,缺陷区域标得乱七八糟。记住:永远不要完全相信别人给的数据标注,自己抽检20%是底线。
3.2 数据增强策略:不是越多越好
数据增强是解决小样本问题的利器。但很多人上来就一顿乱加,旋转、裁剪、颜色抖动全上,结果模型反而变差了。
为什么会这样?因为工业场景有它的特殊性。比如PCB板检测,你旋转90度没问题,但旋转45度呢?电路走线方向变了,缺陷特征也跟着变,模型就懵了。
我常用的增强策略分三类:
- 几何变换:水平翻转、小角度旋转(±15°)、随机裁剪。注意保持缺陷形态不变。
- 颜色变换:亮度调整、对比度拉伸、高斯噪声。模拟不同光照条件。
- 高级增强:CutOut、MixUp、CutMix。适合缺陷样本极少的情况。
我的经验: 对于纹理类缺陷(如布料、木材),优先用颜色变换和弹性变形。对于结构类缺陷(如螺丝、齿轮),优先用几何变换和CutOut。别搞反了。
下面是我常用的增强配置,你可以直接拿来用:
import albumentations as A
train_transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.Rotate(limit=15, p=0.5),
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.3),
A.GaussNoise(var_limit=(10.0, 50.0), p=0.2),
A.CoarseDropout(max_holes=8, max_height=32, max_width=32, p=0.3),
A.Resize(256, 256),
])
3.3 训练超参数调优:从粗调到细调
超参数调优是个体力活,但有章可循。我一般分三步走:
- 粗调阶段:固定学习率1e-3,batch size 32,跑50个epoch看收敛趋势。
- 细调阶段:根据loss曲线调整学习率,用余弦退火或StepLR。
- 微调阶段:调整权重衰减、dropout比例,防止过拟合。
这里有个关键点:学习率是最敏感的超参数。我见过太多人把学习率设成1e-2,结果loss直接炸了。工业场景下,我建议从1e-4开始试。
| 超参数 | 推荐范围 | 调优策略 |
|---|---|---|
| 学习率 | 1e-4 ~ 1e-3 | 先用余弦退火,再微调初始值 |
| Batch Size | 16 ~ 64 | 根据显存大小,尽量选大一点 |
| 权重衰减 | 1e-5 ~ 1e-4 | 数据量小时用大值 |
| Epoch | 50 ~ 200 | 早停法,patience设10 |
注意: 不要盲目追求大batch size。我试过把batch size从32提到128,结果模型收敛变慢,泛化能力反而下降了。工业场景下,稳定比速度重要。
最后,我习惯用WandB或TensorBoard记录每次实验的指标。调参不是玄学,是科学。你记录得越详细,下次调参就越有方向。
嗯,这一章的内容就这些。数据准备好了,增强策略也定了,超参数也调了,下一步就是真正跑训练了。记住:别急着上大模型,先把小模型跑通,再慢慢迭代。