毕业设计实战:基于改进YOLOv5的钢材表面缺陷检测系统(SENet+K-Means全流程落地)
本文针对钢材表面缺陷检测效率低、精度差的问题,提出基于改进YOLOv5的解决方案。通过引入SENet注意力机制强化缺陷特征提取,并结合K-Means优化锚框匹配,使模型在NEU-DET数据集上mAP达73.3%,相比原YOLOv5提升4.3%,检测速度35.7FPS。实验表明,改进模型优于SSD、YOLOv3等算法,能有效检测0.1mm细裂纹和各类钢材缺陷,满足工业生产线实时检测需求。系统采用Py
一、项目背景:为什么要做钢材表面缺陷检测?
钢材是工业的“骨骼”,但生产中难免出现裂纹、氧化皮、点蚀等缺陷——这些缺陷会导致桥梁断裂、汽车零件失效等严重事故。传统检测靠人工目视,有两大痛点:
- 效率低:1名工人每天只能检测500米钢材,且易因疲劳漏检;
- 精度差:小缺陷(如0.1mm裂纹)肉眼难分辨,误检率超15%。
我的毕业设计用改进YOLOv5解决这些问题:通过加入SENet注意力机制和K-Means锚框优化,让系统能自动识别6类钢材缺陷,在NEU-DET数据集上mAP达73.3%,比原YOLOv5提升4.3%,检测速度35.7FPS,可满足工业生产线“实时检测+精准定位”需求。
二、核心技术栈:从算法优化到工业落地
整个系统围绕“数据准备→模型改进→训练测试→效果验证”展开,技术栈兼顾精度与实时性,用Python+PyTorch实现,本科生可复现:
| 技术模块 | 具体工具/算法 | 核心作用 |
|---|---|---|
| 缺陷数据处理 | NEU-DET数据集+LabelImg | 数据基础:NEU-DET含1800张钢材缺陷图(6类缺陷),LabelImg标注边界框; |
| 基础检测框架 | YOLOv5s(PyTorch) | 基准模型:轻量级结构,适合工业端部署,原模型mAP69.0%、速度42.6FPS; |
| 算法改进 | SENet注意力+K-Means锚框 | 优化核心:SENet强化缺陷特征提取,K-Means生成适配钢材缺陷的锚框; |
| 数据增强 | Mosaic+线性对比度增强 | 提升泛化性:Mosaic拼接4张图丰富背景,对比度增强凸显小缺陷; |
| 训练环境 | Ubuntu+GTX1080+CUDA9.0 | 加速训练:GPU并行计算,500轮迭代仅需2.3小时,比CPU快10倍; |
| 性能评估 | mAP/P-R曲线/FPS | 验证效果:用mAP衡量精度,FPS衡量速度,对比原YOLOv5和主流算法; |
三、项目全流程:4步实现钢材表面缺陷检测
3.1 第一步:数据准备——构建缺陷数据集
要训出适配钢材场景的模型,首先需要高质量标注数据,分3步完成:
3.1.1 数据集选择(NEU-DET公开数据集)
- 数据规模:1800张灰度图像,含6类典型钢材缺陷,每类300张;
- 缺陷类型:
- 轧制氧化皮(RS):表面斑点、鱼鳞状,易脱落;
- 斑块(Pa):黄色/黑色不规则斑,由锈蚀或乳化液残留导致;
- 开裂(Cr):树枝状裂纹,影响钢材强度;
- 点蚀表面(PS):橘皮状粗糙面,由轧辊氧化铁皮导致;
- 内含物(In):表面嵌入异物,影响平整度;
- 划痕(Sc):线性划痕,多由加工摩擦导致;
- 划分比例:训练集70%(1260张)、验证集20%(360张)、测试集10%(180张)。
3.1.2 数据标注(LabelImg工具)
用LabelImg手动标注缺陷边界框,生成YOLO格式标签(class x_center y_center w h),标注规则:
- 边界框:紧贴缺陷边缘,如点蚀表面需包含所有腐蚀点,避免漏标;
- 类别编号:0=RS、1=Pa、2=Cr、3=PS、4=In、5=Sc,确保统一;
- 标签保存:每张图像对应1个.txt文件,与图像同名,存于同一文件夹。
3.1.3 数据增强(适配工业场景)
钢材缺陷图像存在“小目标多、对比度低”问题,需做2类增强:
- Mosaic增强:随机选取4张图像,缩放后拼接成1张(尺寸640×640),模拟生产线连续钢材的多缺陷场景;
- 线性对比度增强:对灰度图像做线性变换(如
new_pixel = a*old_pixel + b,a=1.2、b=0),提升小缺陷(如细裂纹)的清晰度,增强前后对比如图4-4所示。
3.2 第二步:算法改进——解决原YOLOv5的2大痛点
原YOLOv5在钢材缺陷检测中存在“小缺陷漏检、锚框不匹配”问题,针对性做2处改进:
3.2.1 改进1:K-Means聚类锚框(适配缺陷尺寸)
原YOLOv5的默认锚框针对自然图像设计,不适合钢材缺陷(如点蚀仅20×20像素、氧化皮达100×80像素),用K-Means重新聚类:
- 聚类流程:
- 统计训练集中所有缺陷边界框的宽高比;
- 用K-Means算法(K=9)对宽高比聚类,得到适配钢材缺陷的锚框;
- 替换原YOLOv5的锚框,新锚框为
[12,19, 24,38, 36,76, 51,26, 68,52, 94,49, 108,92, 146,119, 208,186];
- 效果:锚框与缺陷的匹配率提升25%,小缺陷(如细裂纹)的召回率从65%提升到78%。
3.2.2 改进2:加入SENet注意力机制(强化缺陷特征)
钢材缺陷常被背景(如钢材纹理)干扰,SENet通过“通道权重分配”突出缺陷特征,改进位置:
- 添加位置:在YOLOv5的CSP1-X模块(骨干网络)中,每个残差块后加入SENet模块;
- SENet原理:
- 压缩(Squeeze):对特征图做全局平均池化,得到1×1×C的通道描述符;
- 激励(Excitation):用2个全连接层学习通道权重(如缺陷通道权重0.8,背景通道0.2);
- 重标定(Scale):将权重乘回原特征图,增强缺陷特征;
- 代码实现:
class SEBlock(nn.Module): def __init__(self, c1, r=16): # c1为输入通道数,r为压缩率 super().__init__() self.avgpool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(c1, c1//r, bias=False), nn.ReLU(), nn.Linear(c1//r, c1, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avgpool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y # 权重重标定 - 效果:特征图中缺陷区域的响应值提升30%,背景干扰减少,开裂类缺陷的AP从36.4%提升到42.0%。
3.3 第三步:模型训练——参数配置与流程
基于Ubuntu+GTX1080环境训练,关键参数与流程如下:
3.3.1 核心训练参数
- 输入尺寸:640×640(适配Mosaic增强后的图像);
- 批量大小(batch size):16(GTX1080 8G显存可承载);
- 学习率:初始0.01,每100轮衰减0.1(余弦退火策略);
- 优化器:SGD(动量0.937,权重衰减0.0005);
- 训练轮次:500轮(200轮后Loss趋于稳定)。
3.3.2 训练流程
- 数据加载:用YOLOv5的
LoadImagesAndLabels类加载增强后的数据集,自动解析标签; - 模型初始化:加载YOLOv5s预训练权重,替换锚框并插入SENet模块;
- 训练监控:用TensorBoard实时查看Loss(分类Loss、回归Loss)、mAP变化;
- 模型保存:每50轮保存1次权重,选择验证集mAP最高的权重作为最终模型(
best.pt)。
3.4 第四步:实验验证——从指标到工业场景
用NEU-DET测试集验证改进效果,从3个维度评估:
3.4.1 核心指标对比(改进前后)
| 指标 | 原YOLOv5 | 改进YOLOv5(SENet+K-Means) | 提升幅度 |
|---|---|---|---|
| mAP(%) | 69.0 | 73.3 | +4.3% |
| 召回率(%) | 78.1 | 81.5 | +3.4% |
| 精确率(%) | 46.9 | 52.2 | +5.3% |
| 模型大小(M) | 13.7 | 17.4 | +3.7M |
| 检测速度(FPS) | 42.6 | 35.7 | -6.9FPS |
3.4.2 与主流算法对比
在NEU-DET数据集上,改进模型优于SSD、YOLOv3等算法,尤其在“小模型+高精度”上优势明显:
| 算法 | 模型大小(M) | 检测速度(FPS) | mAP(%) |
|---|---|---|---|
| SSD | 101.0 | 17.2 | 59.5 |
| YOLOv3-SPP | 125.5 | 26.4 | 68.4 |
| YOLOX | 71.9 | 30.6 | 72.3 |
| 改进YOLOv5(本文) | 17.4 | 35.7 | 73.3 |
3.4.3 工业场景测试
- 实时检测:在钢材生产线模拟环境中,输入1080P视频流,系统能实时标注缺陷(延迟<30ms),满足生产线“2米/秒”的检测速度要求;
- 小缺陷检测:对0.1mm细裂纹、5mm点蚀,检测准确率达82%,比人工检测高15%;
- 抗干扰能力:在强光、油污干扰下,mAP仅下降3%,鲁棒性优于原YOLOv5。




四、毕业设计复盘:踩过的坑与经验
4.1 那些踩过的坑
- 数据增强过度:初期用随机旋转90°+翻转,导致“竖裂纹”被旋转成“横裂纹”,模型误检率升高——解决:限制旋转角度≤30°,仅保留水平翻转;
- SENet位置错误:将SENet加在检测头,导致特征过度压缩——解决:移到骨干网络的CSP模块,平衡特征提取与计算量;
- 锚框聚类样本少:初期仅用100张图聚类,锚框适配性差——解决:用全量训练集(1260张)聚类,锚框匹配率提升20%。
4.2 给学弟学妹的建议
- 数据优先:钢材缺陷检测的关键是“缺陷标注准确性”,建议用LabelImg逐张检查标注,避免漏标小缺陷;
- 小步改进验证:先优化锚框,验证效果后再加注意力机制,避免多改进点叠加导致问题定位难;
- 答辩突出工业价值:评委关注“能否落地”,可展示“生产线模拟检测视频”,比单纯讲指标更有说服力。
五、项目资源与后续扩展
5.1 项目核心资源
本项目包含完整的改进YOLOv5代码(SENet实现、K-Means锚框聚类)、NEU-DET标注文件、训练日志,可复现实验结果。若需获取,可私信沟通,还能提供模型部署指导(如转ONNX部署到工业相机)。
5.2 未来扩展方向
- 多缺陷实时检测:目前检测6类缺陷,后续可增加“折叠”“分层”等缺陷,覆盖全钢材缺陷类型;
- 轻量化部署:用TensorRT对模型加速,将FPS提升到50+,适配嵌入式设备(如NVIDIA Jetson Nano);
- 半监督学习:用少量标注数据+大量未标注数据训练,降低工业场景的标注成本。
如果本文对你的工业质检、目标检测相关毕业设计有帮助,欢迎点赞 + 收藏 + 关注,后续会分享更多算法落地案例!
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)