一、项目背景:为什么要做钢材表面缺陷检测?

钢材是工业的“骨骼”,但生产中难免出现裂纹、氧化皮、点蚀等缺陷——这些缺陷会导致桥梁断裂、汽车零件失效等严重事故。传统检测靠人工目视,有两大痛点:

  • 效率低: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张;
  • 缺陷类型
    1. 轧制氧化皮(RS):表面斑点、鱼鳞状,易脱落;
    2. 斑块(Pa):黄色/黑色不规则斑,由锈蚀或乳化液残留导致;
    3. 开裂(Cr):树枝状裂纹,影响钢材强度;
    4. 点蚀表面(PS):橘皮状粗糙面,由轧辊氧化铁皮导致;
    5. 内含物(In):表面嵌入异物,影响平整度;
    6. 划痕(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类增强:

  1. Mosaic增强:随机选取4张图像,缩放后拼接成1张(尺寸640×640),模拟生产线连续钢材的多缺陷场景;
  2. 线性对比度增强:对灰度图像做线性变换(如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重新聚类:

  • 聚类流程
    1. 统计训练集中所有缺陷边界框的宽高比;
    2. 用K-Means算法(K=9)对宽高比聚类,得到适配钢材缺陷的锚框;
    3. 替换原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原理
    1. 压缩(Squeeze):对特征图做全局平均池化,得到1×1×C的通道描述符;
    2. 激励(Excitation):用2个全连接层学习通道权重(如缺陷通道权重0.8,背景通道0.2);
    3. 重标定(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 训练流程
  1. 数据加载:用YOLOv5的LoadImagesAndLabels类加载增强后的数据集,自动解析标签;
  2. 模型初始化:加载YOLOv5s预训练权重,替换锚框并插入SENet模块;
  3. 训练监控:用TensorBoard实时查看Loss(分类Loss、回归Loss)、mAP变化;
  4. 模型保存:每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 那些踩过的坑

  1. 数据增强过度:初期用随机旋转90°+翻转,导致“竖裂纹”被旋转成“横裂纹”,模型误检率升高——解决:限制旋转角度≤30°,仅保留水平翻转;
  2. SENet位置错误:将SENet加在检测头,导致特征过度压缩——解决:移到骨干网络的CSP模块,平衡特征提取与计算量;
  3. 锚框聚类样本少:初期仅用100张图聚类,锚框适配性差——解决:用全量训练集(1260张)聚类,锚框匹配率提升20%。

4.2 给学弟学妹的建议

  1. 数据优先:钢材缺陷检测的关键是“缺陷标注准确性”,建议用LabelImg逐张检查标注,避免漏标小缺陷;
  2. 小步改进验证:先优化锚框,验证效果后再加注意力机制,避免多改进点叠加导致问题定位难;
  3. 答辩突出工业价值:评委关注“能否落地”,可展示“生产线模拟检测视频”,比单纯讲指标更有说服力。

五、项目资源与后续扩展

5.1 项目核心资源

本项目包含完整的改进YOLOv5代码(SENet实现、K-Means锚框聚类)、NEU-DET标注文件、训练日志,可复现实验结果。若需获取,可私信沟通,还能提供模型部署指导(如转ONNX部署到工业相机)。

5.2 未来扩展方向

  1. 多缺陷实时检测:目前检测6类缺陷,后续可增加“折叠”“分层”等缺陷,覆盖全钢材缺陷类型;
  2. 轻量化部署:用TensorRT对模型加速,将FPS提升到50+,适配嵌入式设备(如NVIDIA Jetson Nano);
  3. 半监督学习:用少量标注数据+大量未标注数据训练,降低工业场景的标注成本。

如果本文对你的工业质检、目标检测相关毕业设计有帮助,欢迎点赞 + 收藏 + 关注,后续会分享更多算法落地案例!

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐