1. 项目概述
在钢铁制造行业,钢板表面缺陷检测是质量控制的关键环节。传统的人工检测方式不仅效率低下,而且容易因视觉疲劳导致漏检。我们基于YOLOv5开发了一套自动化检测系统,能够准确识别六种常见缺陷:夹杂、划痕、压入氧化皮、裂纹、麻点和斑块。
这个项目最大的特点就是"开箱即用"——我们不仅提供了完整的训练代码,还包含了2000+张标注好的钢板缺陷数据集和训练好的权重文件。这意味着即使你没有深度学习经验,也能快速部署这套系统进行实际检测。
2. 环境准备与数据解析
2.1 开发环境配置
建议使用Python 3.8+和PyTorch 1.7+环境。以下是快速搭建环境的命令:
bash复制conda create -n steel_defect python=3.8
conda activate steel_defect
pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 -f https://download.pytorch.org/whl/torch_stable.html
pip install -r requirements.txt # YOLOv5官方requirements
注意:如果使用较新的CUDA版本,需要对应调整PyTorch版本。建议使用CUDA 11.1以上版本以获得最佳性能。
2.2 数据集结构解析
我们的数据集采用YOLO标准格式组织:
code复制steel_defect/
├── images/
│ ├── train/ # 训练集图片(1600张)
│ └── val/ # 验证集图片(400张)
└── labels/
├── train/ # YOLO格式标注文件
└── val/
标注文件示例:
code复制0 0.543125 0.621875 0.062500 0.075000 # 类别0(夹杂)
3 0.321875 0.437500 0.050000 0.062500 # 类别3(裂纹)
每个标注行的格式为:class_id x_center y_center width height,所有坐标值都是相对于图片宽高的归一化值(0-1)。
2.3 数据分布统计
我们对六类缺陷的分布进行了统计分析:
| 缺陷类型 | 训练集数量 | 验证集数量 | 平均尺寸(像素) |
|---|---|---|---|
| 夹杂 | 542 | 136 | 32x38 |
| 划痕 | 487 | 122 | 45x8 |
| 压入氧化皮 | 612 | 153 | 28x25 |
| 裂纹 | 398 | 100 | 65x12 |
| 麻点 | 521 | 130 | 15x15 |
| 斑块 | 589 | 147 | 40x35 |
从统计可以看出,压入氧化皮和斑块样本较多,而裂纹相对较少。这种不平衡需要在训练时特别注意。
3. 模型训练与调优
3.1 基础训练配置
使用YOLOv5s模型进行训练,基础命令如下:
bash复制python train.py --img 640 --batch 16 --epochs 100 \
--data steel_defect.yaml --cfg models/yolov5s.yaml \
--weights yolov5s.pt --name steel_defect_detection
关键参数说明:
--img 640: 输入图像尺寸--batch 16: 批次大小(根据GPU显存调整)--epochs 100: 训练轮次--data: 数据集配置文件--cfg: 模型结构配置文件--weights: 预训练权重
3.2 针对小目标的Anchor调整
由于钢板缺陷多为小目标,我们修改了默认的anchor尺寸。在models/yolov5s.yaml中:
yaml复制anchors:
- [5,6, 8,14, 15,11] # 原版默认
- [3,4, 6,8, 10,12] # 调整为适合小目标
- [2,3, 4,5, 5,9] # 更小的检测头
实操技巧:可以使用k-means聚类算法在自己的数据集上重新计算anchor尺寸,命令:
python utils/autoanchor.py --cfg models/yolov5s.yaml --img 640 --task train
3.3 数据增强策略
针对钢板表面特性,我们强化了以下数据增强:
yaml复制augmentations:
hsv_h: 0.015 # 色相增强(模拟不同光照)
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
degrees: 5.0 # 旋转角度(小角度即可)
translate: 0.1 # 平移比例
scale: 0.5 # 缩放比例
shear: 5.0 # 剪切变换
perspective: 0.0001 # 透视变换
flipud: 0.5 # 上下翻转
fliplr: 0.5 # 左右翻转
特别增加了随机模糊和锐化增强,以应对钢板反光问题:
python复制# utils/augmentations.py
class RandomBlur:
def __call__(self, img):
if random.random() < 0.3:
return cv2.GaussianBlur(img, (5,5), 0)
return img
class RandomSharpen:
def __call__(self, img):
if random.random() < 0.3:
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
return cv2.filter2D(img, -1, kernel)
return img
4. 模型推理与部署
4.1 基础推理测试
使用训练好的模型进行推理:
python复制import torch
model = torch.hub.load('ultralytics/yolov5', 'custom',
path='runs/train/steel_defect_detection/weights/best.pt')
img = 'test_image.jpg'
results = model(img)
results.show() # 显示检测结果
results.save() # 保存检测结果
4.2 部署优化技巧
对于工业部署,我们推荐以下优化措施:
- TensorRT加速:
bash复制python export.py --weights best.pt --include engine --device 0 \
--imgsz 640 --half # 开启半精度推理
- NMS参数调优:
python复制model.conf = 0.25 # 置信度阈值(根据实际需求调整)
model.iou = 0.45 # 重叠阈值
model.multi_label = False # 单标签模式
- 类别权重调整:
python复制# utils/loss.py
class ComputeLoss:
def __init__(self, ..., class_weights=[1.0, 1.2, 1.5, 2.0, 1.8, 1.3]):
self.class_weights = class_weights
4.3 性能指标
在RTX 3060上的测试结果:
| 分辨率 | FPS | mAP@0.5 | 显存占用 |
|---|---|---|---|
| 640x640 | 120 | 0.892 | 3.2GB |
| 1280x1280 | 65 | 0.912 | 5.8GB |
实际部署建议:在产线环境中,640x640分辨率在速度和精度之间取得了良好平衡。
5. 常见问题与解决方案
5.1 压入氧化皮和斑块误检问题
这是本项目中最常见的误检情况。解决方案:
- 数据层面:
- 增加这两种缺陷的样本数量
- 人工检查标注质量,确保边界清晰
- 添加更多反光条件下的样本
- 模型层面:
yaml复制# 增加分类损失权重
loss:
cls_pw: 1.5 # 原为1.0
5.2 小目标漏检问题
针对麻点等小目标的漏检:
- 修改模型结构,增加小目标检测头:
yaml复制# models/yolov5s.yaml
head:
[[..., 1280]] # 增加一个更深的检测层
- 使用更高分辨率训练:
bash复制python train.py --img 1280 ... # 但会显著增加训练时间
5.3 类别不平衡处理
我们采用以下策略应对:
- 过采样少数类别(如裂纹):
python复制# utils/dataloaders.py
class BalancedDataset:
def __init__(self, ..., oversample_thresh=100):
# 对样本数少于thresh的类别进行过采样
- 损失函数加权:
python复制class_weights = [1.0, 1.1, 1.0, 2.0, 1.3, 1.0] # 对应6个类别
- 使用Focal Loss:
python复制# utils/loss.py
class FocalLoss:
def __init__(self, alpha=0.25, gamma=2):
self.alpha = alpha
self.gamma = gamma
6. 实际应用建议
经过多次产线测试,我们总结了以下实用建议:
- 光照条件控制:
- 建议在检测区域安装均匀光源
- 避免强光直射造成的反光
- 可考虑使用偏振滤镜
- 相机选型:
- 分辨率至少500万像素
- 全局快门优于卷帘快门
- 工业相机优于普通USB相机
- 部署架构:
code复制产线相机 → 工控机(推理) → 结果可视化 → 缺陷分类存储
↓
报警系统
- 持续改进:
- 定期收集新发现的缺陷样本
- 每季度重新训练模型
- 建立缺陷样本库
在实际项目中,我们发现数据质量对最终效果���影响远大于模型结构的选择。建议至少准备2000张高质量标注样本,并且要覆盖各种光照条件和钢板类型。标注时要特别注意边缘模糊的缺陷,这类样本对提升模型鲁棒性非常重要。
