1. 钢材表面缺陷检测项目概述
在工业质检领域,钢材表面缺陷检测一直是个技术难点。传统人工检测方式效率低下且容易漏检,而基于深度学习的自动化检测方案正在逐步改变这一现状。最近我基于YOLOv5模型和东北大学(NEU)表面缺陷数据集,完成了一个钢材表面缺陷检测项目,在此分享完整的实现过程和实战经验。
这个项目的核心目标是实现对热轧带钢六类典型表面缺陷的精准识别,包括:
- 轧内垢(RS)
- 斑块(Pa)
- 裂纹(Cr)
- 点蚀面(PS)
- 夹杂物(In)
- 划痕(Sc)
数据集包含1800张200×200像素的灰度图像,每类缺陷各300个样本。从实际样本观察,这些缺陷存在三个显著特征:
- 类内差异大:同种缺陷可能呈现不同形态(如划痕有水平、垂直、倾斜等多种方向)
- 类间相似度高:不同类别缺陷可能具有相似视觉特征
- 成像条件不稳定:光照和材料变化导致灰度分布不一致
2. 数据集分析与预处理
2.1 数据集特性深入解析
NEU数据集虽然样本量适中,但蕴含着丰富的挑战性场景。通过详细分析,我发现以下几个关键特性需要特别注意:
类内多样性示例:
- 划痕类缺陷包含:
- 水平划痕(角度0-15度)
- 垂直划痕(角度75-90度)
- 斜向划痕(角度15-75度)
- 断续划痕(非连续线性缺陷)
类间相似性对比:
| 缺陷类型 | 相似特征 | 区分要点 |
|---|---|---|
| 轧内垢 vs 裂纹 | 都有线性特征 | 轧内垢边缘更模糊 |
| 斑块 vs 点蚀面 | 都是面状缺陷 | 点蚀面有更明显的凹陷感 |
2.2 数据预处理全流程
针对数据集特性,我设计了以下预处理流程:
python复制import cv2
import albumentations as A
# 基础预处理流程
def preprocess(image_path):
# 读取灰度图像
img = cv2.imread(image_path, 0)
# 标准化处理
img = img.astype('float32') / 255.0
# 数据增强管道
transform = A.Compose([
A.RandomBrightnessContrast(p=0.5),
A.GaussNoise(var_limit=(0, 0.01), p=0.3),
A.ElasticTransform(alpha=1, sigma=20, p=0.1)
])
return transform(image=img)['image']
关键处理步骤解析:
- 灰度保持:直接读取灰度图避免色彩干扰
- 标准化:将像素值归一化到[0,1]范围
- 针对性增强:
- 亮度对比度调整:模拟光照变化
- 高斯噪声:增强模型鲁棒性
- 弹性变换:应对材料形变场景
特别注意:对于小目标缺陷(如细小裂纹),避免使用过度模糊化的增强操作,这会损失关键特征信息。
3. YOLOv5模型构建与训练
3.1 模型架构优化策略
基于YOLOv5s(小型版本)进行改造,主要优化点包括:
骨干网络改进:
- 在Backbone末端增加SPPFAST模块,增强多尺度特征提取能力
- 将部分3×3卷积替换为可变形卷积(DCN),更好适应不规则缺陷形状
- 添加CBAM注意力模块,提升对微小缺陷的敏感度
python复制# 模型配置示例(yolov5s_defect.yaml)
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, DCN, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, CBAM, [256]], # 添加注意力模块
[-1, 1, SPPFAST, [512, [5, 9, 13]]] # 改进的SPP结构
]
3.2 训练参数配置技巧
经过多次实验验证,以下参数组合效果最佳:
| 参数项 | 推荐值 | 调整依据 |
|---|---|---|
| 初始学习率 | 0.01 | 小目标检测需要更大学习率 |
| 优化器 | SGD+momentum | 比Adam更适合小数据集 |
| Batch Size | 16 | 平衡显存和梯度稳定性 |
| 输入尺寸 | 640×640 | 原始图像上采样3倍 |
| 数据增强 | Mosaic+MixUp | 提升小样本利用率 |
学习率调整策略:
python复制lr0: 0.01 # 初始学习率
lrf: 0.2 # 最终学习率 = lr0 * lrf
warmup_epochs: 3 # 渐进式热身
4. 模型性能优化实战
4.1 困难样本挖掘策略
针对类间相似度高的问题,我采用了以下方法:
-
难例挖掘:
- 第一轮训练后,筛选出预测置信度在0.3-0.6之间的样本
- 对这些样本进行针对性增强(主要增加几何变换)
- 加入第二轮训练集
-
对抗训练:
python复制# FGSM对抗样本生成
def fgsm_attack(image, epsilon=0.05):
image.requires_grad = True
outputs = model(image)
loss = criterion(outputs, targets)
loss.backward()
perturbed_image = image + epsilon * image.grad.sign()
return perturbed_image
4.2 多模型融合方案
为提升最终效果,我采用了加权融合策略:
| 模型版本 | 输入尺寸 | 增强策略 | 权重 |
|---|---|---|---|
| YOLOv5s | 640×640 | 基础增强 | 0.4 |
| YOLOv5m | 896×896 | 几何增强 | 0.3 |
| YOLOv5l | 1024×1024 | 色彩增强 | 0.3 |
融合后mAP@0.5从单模型的0.812提升到0.847,特别是对相似缺陷的区分度有明显改善。
5. 实际部署与性能调优
5.1 TensorRT加速实践
将训练好的模型转换为TensorRT格式,获得显著的推理加速:
bash复制python export.py --weights best.pt --include engine --device 0 --half
性能对比:
| 平台 | 推理速度(FPS) | 显存占用 |
|---|---|---|
| PyTorch CPU | 8.2 | - |
| PyTorch GPU | 45 | 1.8GB |
| TensorRT FP32 | 78 | 1.2GB |
| TensorRT FP16 | 112 | 0.9GB |
5.2 实际产线集成方案
在真实工业场景中,我推荐以下部署架构:
code复制工业相机 → 预处理服务器 → 检测模型 → 结果可视化 → 分拣机构
↑
MES系统数据对接
关键参数配置:
yaml复制camera:
resolution: 2048×1536
fps: 30
roi: [800:1200, 600:1000] # 聚焦钢材表面区域
inference:
batch_size: 8
confidence_thresh: 0.65
iou_thresh: 0.45
6. 常见问题与解决方案
6.1 典型问题排查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 同类缺陷漏检率高 | 样本多样性不足 | 增加针对性数据增强 |
| 不同类缺陷混淆 | 特征相似度高 | 引入对比学习损失 |
| 边缘缺陷检测差 | 感受野不足 | 添加ASPP模块 |
| 推理速度慢 | 模型复杂度高 | 使用TensorRT优化 |
6.2 精度提升技巧
-
标签优化技巧:
- 对于不规则缺陷,采用密集标注点而非矩形框
- 模糊边缘缺陷适当扩大标注范围
-
训练过程监控:
python复制# 自定义评估指标
def evaluate(model, dataloader):
tp, fp, fn = 0, 0, 0
for imgs, targets in dataloader:
outputs = model(imgs)
# 计算每个类别的精确匹配
...
return {
'strict_acc': tp / (tp + fp + fn),
'relaxed_acc': ... # 允许位置偏差的准确率
}
经过三个月的迭代优化,最终系统在测试集上达到以下指标:
- mAP@0.5: 0.89
- 单图推理时间: 15ms (Tesla T4)
- 最大吞吐量: 65 FPS
这套方案目前已在某钢铁厂的热轧产线试运行,相比原有人工抽检方式,缺陷检出率从82%提升到97%,误检率控制在3%以下。