第27章:EfficientNet全家桶|钢材表面6类缺陷分类完整Pytorch实现

摘要:钢材是现代制造业重要基础原料,生产过程中会产生裂纹、夹杂、斑块、点蚀、氧化皮、划痕等多种表面缺陷,不同缺陷对应不同生产故障成因,准确识别缺陷类型对工艺改进、产品质量管控意义重大。本文基于Pytorch搭建EfficientNet(b0‑b7)全套工业缺陷分类工程,数据集1700余张钢材表面图像,完成crazing、inclusion、patches、pitted_surface、rolled‑in_scale、scratches共6类缺陷识别。工程支持迁移学习、冻结主干训练、参数量与计算量统计、全套多分类评价指标、混淆矩阵、多指标曲线可视化、批量图片推理;附带可直接渲染的Mermaid网络结构图。本文从研究背景、数据集、EfficientNet原理、网络结构(Mermaid代码)、代码模块解析、训练策略、指标解读、运行流程、不足与优化方向完整展开。

1 研究背景与意义

钢铁板材在轧制、热处理生产过程,受原料、设备、工艺参数影响,会产生各式各样的表面缺陷。

  • crazing(裂纹):表面出现网状开裂纹路;
  • inclusion(夹杂):外来杂质嵌入钢材表面;
  • patches(斑块):局部不规则色斑斑块;
  • pitted_surface(点蚀表面):密集点状凹坑损伤;
  • rolled‑in_scale(氧化皮):轧制带入氧化铁皮;
  • scratches(划痕):长条状摩擦刮伤痕迹。

传统工厂大多依靠人工肉眼分拣,长时间工作后工人疲劳,会造成漏检错检;另外人工检测速度有限,难以匹配高速流水线生产节拍。机器视觉结合深度学习可以24小时不间断工作,自动区分不同缺陷种类,不仅判断有无缺陷,还可以区分缺陷类别,反向指导生产工艺调整。

EfficientNet是Google提出的轻量化高性能CNN,区别于以往单独增加网络深度或者通道数的做法,提出复合缩放(Compound Scaling) ,使用一组复合系数,同时缩放网络深度、网络宽度、输入图像分辨率,在计算量和识别精度之间取得很好平衡,b0为基础最小模型,b1b7逐级放大模型规模。工业场景硬件配置差异大,可以根据算力选择b0b7不同版本,算力弱选b0,追求精度选b7。

本数据集一共1700多张钢材缺陷图像,属于中小规模工业数据集,非常适合使用迁移学习,利用ImageNet预训练学到的边缘、纹理特征,迁移到钢材缺陷纹理识别任务。

2 数据集说明

数据集6类钢材表面缺陷,标签json定义:

复制代码
{
    "0": "crazing",
    "1": "inclusion",
    "2": "patches",
    "3": "pitted_surface",
    "4": "rolled-in_scale",
    "5": "scratches"
}

数据集采用ImageFolder目录格式组织:

复制代码
data
├─train
│  ├─crazing
│  ├─inclusion
│  ├─patches
│  ├─pitted_surface
│  ├─rolled-in_scale
│  └─scratches
└─val
   ├─crazing
   ├─inclusion
   └─......其余缺陷类别

数据预处理流水线

  • 训练集:Resize(256) → RandomRotation(90)随机旋转 → CenterCrop(224) → ToTensor() → ImageNet标准化mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
  • 验证集:Resize(256) → CenterCrop(224) → ToTensor() → 同样标准化。

说明:钢材缺陷很多是方向性纹理(划痕、裂纹),随机旋转增强可以提升模型对缺陷方向的鲁棒性;本项目使用ImageNet预训练权重,因此沿用ImageNet均值方差。工业实际部署时,如果图像灰度分布差异巨大,可以重新统计数据集自身均值方差。

3 EfficientNet网络整体架构与Mermaid结构图

EfficientNet核心基础模块是MBConv(Mobile Inverted Bottleneck),融合深度可分离卷积、倒残差结构、SE通道注意力。

  • 1×1升维卷积提升通道;
  • 3×3深度可分离卷积做空间特征提取;
  • SE注意力模块对通道特征重标定;
  • 1×1降维卷积压缩通道;
  • 残差跳跃连接,输入输出相加。
3.1 整体网络文字结构
复制代码
输入图像 3×224×224
    ↓
Stem层:3×3 Conv + BN + Swish激活
    ↓
重复堆叠多组MBConv模块(不同b版本深度、通道数不一样)
    ↓
Head层:1×1 Conv升维 + BN + Swish
    ↓
Global Average Pooling全局平均池化
    ↓
Dropout随机失活
    ↓
Linear分类头 → 输出6维(6类钢材缺陷)
3.2 MBConv模块内部子结构
复制代码
MBConv输入特征图
    ↓
1×1 Pointwise卷积(升通道)+ BN + Swish
    ↓
k×k Depthwise深度卷积 + BN + Swish
    ↓
SE 通道注意力模块(全局池化‑>两层全连接‑>sigmoid通道权重)
    ↓
1×1 Pointwise卷积(降通道)+ BN
    ↓
Dropout
    ↓
残差shortcut(输入与输出相加,步长=1且通道匹配时启用)
3.3 Mermaid绘图代码
3.4 b0~b7版本差异说明
模型 缩放系数 参数量 特点
EfficientNet‑b0 基础基准 最小 适合嵌入式、低算力设备,快速实验
EfficientNet‑b1 复合缩放1 小 精度略高于b0,速度较快
EfficientNet‑b2 复合缩放2 中小 工业项目常用折中选择
EfficientNet‑b3 复合缩放3 中等 精度进一步提升
EfficientNet‑b4 复合缩放4 中高 算力充足推荐
EfficientNet‑b5 复合缩放5 偏大 高精度,显存占用高
EfficientNet‑b6 复合缩放6 大 适合离线检测场景
EfficientNet‑b7 复合缩放7 最大 追求最高识别精度

本项目代码通过--model b0/b1/b2...b7参数切换模型;加载官方预训练权重,替换最后classifier层输出维度为6,适配6类钢材缺陷;开启--freeze_layers True可以冻结主干网络,仅训练最后的分类头,保护预训练特征,适合1700张这样的中小数据集。

4 项目核心代码模块解读

项目包含三份核心脚本:train.py训练脚本、utils.py工具库、predict.py批量推理脚本。

4.1 utils.py核心模块
  1. create_model():模型工厂函数,根据model参数选择b0‑b7,加载对应官方预训练权重,替换分类头输出通道等于缺陷类别数量。
  2. get_device()自动获取cuda/cpu运行设备;mkdir()自动清空旧实验目录,新建weights权重文件夹;data_trans()训练集验证集两套数据增强。
  3. ConfusionMatrix混淆矩阵类:计算多分类全套指标:准确率、每一类Precision精确率、Recall召回率、Specificity特异度、F1‑score,输出宏平均指标;自动绘制保存混淆矩阵图片。>

工业缺陷检测重点指标:Recall召回率,代表缺陷被找出来的比例,缺陷检测场景希望召回率尽可能高,降低漏检;Precision精确率控制把正常表面误判为缺陷的误检情况。混淆矩阵可以直观看到哪两类缺陷容易混淆,例如patches斑块和pitted_surface点蚀容易发生错分。

  1. train_one_epoch():一轮训练,CrossEntropy交叉熵损失,tqdm进度条实时打印loss、acc;evaluate()验证集评估。
  2. 绘图工具函数:plt_loss_acc()损失精度曲线;plot_lr_decay()学习率变化曲线;plot_prsf()每epoch宏平均Precision、Recall、Specificity、F1曲线。
  3. get_data()读取ImageFolder数据集;gen_json()生成class_indices.json类别映射;get_optim()支持SGD、Adam、AdamW三种优化器。
4.2 train.py训练脚本流程
  1. 接收命令行参数,自定义实验保存目录save_ret;调用mkdir清空旧文件;获取训练设备。
  2. 加载训练、验证数据集,自动生成类别json文件,打印训练集、验证集样本数量。
  3. 创建EfficientNet模型,thop工具统计总参数量、可训练参数量、FLOPs计算量,控制台打印输出。
  4. freeze_layers开启时,冻结主干全部参数,只训练classifier分类头。
  5. 筛选可更新梯度参数pg;选择优化器;设置LambdaLR余弦退火学习率调度器。
  6. epoch循环:
    • 执行train_one_epoch训练一轮;scheduler更新学习率;evaluate做验证;
    • 每epoch全部指标保存到train_log_results.json;
    • 对比验证集accuracy,保存最优best.pth;训练结束保存last.pth。
  7. 训练结束自动绘制loss‑acc、lr、P‑R‑S‑F1曲线图。
  8. 加载best最优权重,分别计算、绘制训练集、验证集混淆矩阵并保存图片。

参考训练超参数

复制代码
--model b0
--pretrained True
--freeze_layers True
--batch‑size 32
--epochs 100
--optim SGD
--lr 0.01
--lrf 0.0001
4.3 predict.py批量推理脚本
  1. 读取指定实验目录下class_indices.json类别映射、best.pth权重;
  2. 读取./inference/infer_img文件夹下全部待检测钢材图片;
  3. 图像预处理,模型推理,softmax得到概率,取top‑3预测结果;
  4. OpenCV将缺陷名称+概率绘制到图像上;
  5. 自动创建inference/ret文件夹,保存绘制完成的结果图片。

运行示例:

复制代码
python predict.py --model b0 --save_ret runs --weights best.pth

5 多分类评价指标解读(钢材表面6类缺陷)

本任务6分类,代码采用宏平均macro‑average,平等对待6种缺陷类别,不受各类样本数量不均衡干扰。

  1. Accuracy准确率:全部样本预测正确占总样本比例;
  2. Precision精确率:预测为某一类缺陷样本中真实属于该缺陷的比例,反映误检;
  3. Recall召回率:真实该类缺陷样本被识别出来的比例,缺陷检测最重要指标,越低代表漏检越多;
  4. Specificity特异度:不属于该缺陷的样本被正确判定为非该缺陷;
  5. F1‑score:精确率、召回率调和平均,综合评价该类别识别性能;
  6. 混淆矩阵:6×6矩阵,对角线为各类别预测正确数量;非对角线代表类别之间错分,用来定位模型容易混淆的缺陷类型。

过拟合判断:训练集指标很高,验证集指标显著偏低。工业小数据集很容易出现过拟合;缓解手段:开启冻结训练、增加数据增强、适当降低epoch、使用权重衰减。

6 完整项目运行流程

  1. 环境依赖
    pytorch、torchvision、opencv‑python、pillow、matplotlib、thop、tqdm

  2. 数据集按照ImageFolder格式放到./data/train与./data/val。

  3. 启动训练示例:

    python train.py --model b0 --pretrained True --freeze_layers True --batch-size 32 --epochs 100 --optim SGD --lr 0.01 --lrf 0.0001

  4. 训练产物全部输出到‑‑save_ret指定目录(默认runs)

  • 权重文件weights/best.pth、last.pth
  • class_indices.json类别映射
  • train_log_results.json完整训练日志
  • loss_accuracy_curve.jpg、LR_decay.jpg、results.jpg各类指标曲线
  • trainSet Confusion Matrix.jpg、valSet Confusion Matrix.jpg混淆矩阵
  1. 批量缺陷推理:将钢材图像放入inference/infer_img,执行predict.py,结果输出至inference/ret。

基于 EfficientNet 全家桶的钢材表面缺陷六分类研究

相关推荐
Ivanqhz2 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
Raymond16881 天前
零样本TTS长视频配音的工程取舍:自回归、非自回归与韵律边界
人工智能·数据挖掘·回归·音视频·音频
tellmewhoisi1 天前
深度学习26:PyTorch:参数更新方法(Momentum)
人工智能·pytorch·深度学习
Zack_Liu1 天前
code样例
pytorch·python·深度学习
论文复现现场1 天前
BEVFormer训练需要几张GPU?2张A100 80GB够不够,显存与云GPU成本分析
pytorch·自动驾驶·a100·bevformer
sbjdhjd1 天前
从污点追踪断点到 PHP-FPM 请求队列:HIDS PHP WebShell 样本复盘
开发语言·网络安全·数据挖掘·渗透测试·开源·php·shell
Be for thing2 天前
PyTorch基础|Tensor张量详解,张量创建、数据类型与常用操作
pytorch·学习·1024程序员节