HRNET模型实现钢板表面缺陷检测
关于深度实战社区
我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万+粉丝,拥有2篇国家级人工智能发明专利。
社区特色:深度实战算法创新
获取全部完整项目数据集、代码、视频教程,请进入官网:zzgcz.com。竞赛/论文/毕设项目辅导答疑,v:zzgcz_com
1. 项目简介
该项目旨在利用深度学习模型进行医学影像分割与图像处理。主要涉及使用UNet和HRNet两种经典的图像分割模型来进行图像特征提取与分割,从而实现对特定目标区域(如病灶、组织边界等)的精准识别。UNet模型通过其对称的编码器和解码器结构,使得模型能够捕捉到细粒度的特征信息,适用于较小样本量的医学图像数据。而HRNet模型通过引入高分辨率分支结构,使得模型在捕捉全局和局部特征时具有更高的表现力,尤其适用于处理复杂结构的医学图像。本项目的应用场景主要为医学图像分析与病灶分割,能够辅助医学专家提高诊断效率与准确度。项目通过多种可视化方案,如生成的分割图、特征可视化图等,帮助用户更好地理解模型的输出结果,并为后续的临床应用提供数据支持。
2.技术创新点摘要
- 模型架构设计与优化:本项目使用了经典的HRNet与UNet模型进行钢材缺陷检测与分割,并在此基础上引入多尺度特征融合策略。HRNet通过保持高分辨率的同时逐步进行多尺度特征聚合,能够在复杂背景下实现更高精度的缺陷边缘识别,而UNet利用其对称编码器-解码器结构,在分割任务中有效地捕获目标区域的细节信息。通过组合两种模型的优点,本项目能够在精度和效率之间取得良好平衡。
- 数据预处理与增强策略:该项目在数据预处理过程中应用了自定义的图像裁剪、旋转、翻转以及伪造缺陷的策略,以增强模型对不同缺陷类型的泛化能力。同时,为了应对类别不平衡问题,使用了数据重采样技术,通过控制训练样本的分布,进一步提升了模型对小样本缺陷的识别效果。
- PaddleX优化加速方案:项目使用了百度飞桨(PaddleX)深度学习平台进行模型开发与训练,结合飞桨的高效计算库与分布式训练框架,在大规模数据集上实现了训练效率的提升。此外,利用飞桨特有的动态图模式进行模型调试,使得开发者可以更灵活地进行模型结构调整与创新设计。
- 高效的推理与部署方案:为了解决实际工业场景下的实时检测需求,项目在模型推理阶段使用了量化与裁剪技术,显著降低了模型的参数量与计算成本,使得模型能够部署在资源受限的边缘设备上,满足钢材生产线的在线缺陷检测需求。
3. 数据集与预处理
本项目使用的数据集来源于Kaggle举办的“Severstal: Steel Defect Detection”竞赛数据集,专用于钢材表面缺陷检测。数据集包含高分辨率的平板钢材图像及其对应的缺陷标注信息。图像数据被分为训练集和测试集:训练集包含若干张带有标注的钢材图像,而测试集则不提供标注。训练集中的每张图像可能包含四类不同的缺陷类型,包括划痕、锈斑、凹陷等,类别分布不均衡,且有的图像不包含缺陷(正常样本),因此类别不平衡是模型训练的一个主要挑战。
在数据预处理环节,首先对图像数据进行尺寸调整和格式转换,以便统一输入模型的尺寸规格(通常使用256×256或512×512的尺寸)。然后进行标准化(归一化)处理,使得每个像素值在[0,1]或[-1,1]区间内,确保输入数据具有相同的分布特征,有助于提升模型的收敛速度和稳定性。
为了提升模型的泛化能力,项目引入了多种数据增强策略,包括随机裁剪、水平与垂直翻转、旋转、亮度与对比度调整等。通过数据增强生成更多具有多样性特征的样本,从而有效缓解训练过程中过拟合的问题。此外,项目还使用了特征工程方法,如伪造小样本缺陷与随机噪声填充,进一步增加了模型对不同缺陷的辨识能力。
最终,通过系统化的数据预处理与特征工程流程,确保了模型在不同缺陷类型和复杂背景下都能保持较高的检测精度和稳定性。
4. 模型架构
本项目采用了两种经典的深度学习图像分割模型:HRNet(High-Resolution Network)和UNet。模型的整体结构设计如下:
-
UNet模型: UNet模型主要用于医学图像分割任务,其结构包含对称的编码器和解码器。编码器(下采样部分)逐步提取图像的特征信息,而解码器(上采样部分)逐步恢复图像空间分辨率,并结合编码器的特征信息,实现精细分割。其数学表示如下:
- 编码器层: C i = Conv i ( C i − 1 ) C_i = \text{Conv}_{i} (C_{i-1}) Ci=Convi(Ci−1) 其中,Convi 代表第i层的卷积操作,Ci 为第i层特征图。
- 下采样操作: D i = DownSample ( C i ) D_i = \text{DownSample}(C_i) Di=DownSample(Ci) Di 为第i层下采样后的特征图。
- 解码器层: U i = UpSample ( D i + 1 ) + C i U_i = \text{UpSample}(D_{i+1}) + C_i Ui=UpSample(Di+1)+Ci 其中,Ui 为解码层的上采样特征图,通过跳跃连接将编码层的特征图与上采样后的特征图进行融合。
-
HRNet模型: HRNet通过并行的多分辨率卷积网络保持高分辨率的特征流,并在网络的每个阶段进行多尺度特征融合。模型主要由以下几部分组成:
- 高分辨率分支(High-Resolution Stream): 每个高分辨率分支包含多个卷积层,保持输入图像的空间分辨率,并在每个阶段引入不同分辨率的特征图。
- 特征聚合模块: 使用跨尺度的特征融合操作: F i = ∑ j = 1 N W i j × S j F_i = \sum_{j=1}^{N} W_{ij} \times S_{j} Fi=j=1∑NWij×Sj 其中,Sj 表示第j尺度的特征图,Wij 表示跨尺度融合的权重矩阵。
- 输出层: 通过1×1卷积层将特征图映射到目标类别空间,生成最终的分割结果。
mIoU = 1 N ∑ i = 1 N A i ∩ B i A i ∪ B i \text{mIoU} = \frac{1}{N} \sum_{i=1}^{N} \frac{A_i \cap B_i}{A_i \cup B_i} mIoU=N1i=1∑NAi∪BiAi∩Bi
其中,Ai 和 Bi 分别表示第i个类别的预测区域和真实区域。
5. 核心代码详细讲解
1. 数据预处理与特征工程( prepare_dataset.py
)
核心代码功能:该模块主要用于将Kaggle提供的训练数据进行预处理,并生成对应的Mask(分割标注图)文件,为模型训练做好数据准备。
import os
import numpy as np
import pandas as pd
import shutil
import cv2
- 导入库:
os
用于文件路径操作,numpy
进行数值计算,pandas
读取数据文件,shutil
用于文件操作,cv2
处理图像数据。
def name_and_mask(start_idx):
- 定义函数
name_and_mask
: 该函数用于根据数据索引生成每个图像对应的文件名及其Mask(标注)图像。
img_names = [str(i).split("_")[0] for i in train_df.iloc[col:col + 4, 0].values]
- 获取图像名称: 从
train.csv
文件中读取图像文件名,提取前缀作为该图像的唯一标识符。
if not (img_names[0] == img_names[1] == img_names[2] == img_names[3]):raise ValueError
- 数据一致性检查: 确保同一图像的标注数据是4行连续的(每种缺陷类型一行)。如果前缀不一致,则说明数据格式有误。
labels = train_df.iloc[col:col + 4, 1]mask = np.zeros((256, 1600), dtype=np.uint8)
- 创建初始的
mask
图:256×1600
是图像分辨率,初始值全为0(表示无缺陷区域)。
for idx, label in enumerate(labels.values):if label is not np.nan:label = label.split(" ")positions = map(int, label[0::2])length = map(int, label[1::2])
- 解析标注数据:
positions
表示缺陷在图像中的起始位置,length
表示该缺陷的长度。
for pos, le in zip(positions, length):mask_label[pos - 1:pos + le - 1] = idx + 1
- 生成分割标注图: 将缺陷区域在
mask_label
中标记为相应的类别ID(从1开始)。
mask[:, :] = mask_label.reshape(256, 1600, order='F')return img_names[0], mask
- 转换
mask_label
为二维矩阵: 重新排列标注数据,使其与图像大小匹配,order='F'
代表按列填充数据。
2. 模型推理与评估( infer.py
)
核心代码功能:该模块用于加载训练好的模型,进行缺陷分割预测,并生成可视化的预测结果图。
import paddlex as pdx
import os
import cv2
- 导入库:
paddlex
是飞桨(PaddlePaddle)的高层API库,用于深度学习任务,os
进行路径操作,cv2
处理图像文件。
pic_index = 25
test_path = 'steel/test_list.txt'
f = open(test_path)
lines = f.readlines()
- 获取测试图像文件名: 从
test_list.txt
中读取第pic_index
行的测试图像路径,准备进行模型推理。
imgname = os.path.basename(lines[pic_index].split(' ')[0])
labelname = os.path.basename(lines[pic_index].split(' ')[1]).replace('\n', '')
f.close()
- 提取图像和标签文件名: 解析测试图像路径,并去除标签文件名中的换行符,保证路径格式一致。
image_path = os.path.join('steel/JPEGImages', imgname)
model = pdx.load_model('output/hrnet/best_model')
- 加载模型: 使用
pdx.load_model
加载训练好的HRNet模型,模型保存在output/hrnet/best_model
中。
result = model.predict(image_path)
pdx.seg.visualize(image_path, result, weight=0.4, save_dir='output/predict')
-
模型推理与可视化:
- 推理: 使用
model.predict
对图像进行分割预测。 - 可视化: 通过
pdx.seg.visualize
将预测结果叠加在原图上,weight=0.4
表示预测图透明度为40%,保存结果至output/predict
目录中。
- 推理: 使用
label_path = os.path.join('steel/Annotations', labelname)
mask = cv2.imread(label_path, cv2.IMREAD_GRAYSCALE)
gt = {'label_map': mask}
pdx.seg.visualize(image_path, gt, weight=0.4, save_dir='output/gt')
- 可视化真实标签: 使用
cv2.imread
加载真实标签mask
,并生成ground truth图像,保存至output/gt
目录中。
6. 模型优缺点评价
优点:
- 高分辨率特征保留: HRNet模型在不同分辨率的特征流中保持高分辨率信息,有效捕捉了钢材表面细微的缺陷特征,提升了分割的精度,特别是在复杂背景中表现优异。
- 多尺度特征融合: HRNet模型通过多尺度融合策略实现了不同分辨率特征的高效聚合,从而能够在处理复杂形状和边缘信息时保持全局和局部的细节。
- 轻量化与可移植性: UNet模型结构简单,参数量较少,适合在资源受限的场景中部署,如边缘设备或实时检测中使用。
- 有效的数据增强策略: 项目中通过多种数据增强(随机翻转、旋转等)提升了模型对不同场景和缺陷形态的适应性,缓解了类别不平衡的问题。
缺点:
- 复杂度高: HRNet模型虽然提升了精度,但由于多分辨率分支结构,计算量较大,导致训练和推理速度较慢,不利于实时应用。
- 对小样本缺陷识别能力不足: 当缺陷区域较小且分布稀疏时,模型难以准确识别,表现出较高的误检率和漏检率。
- 依赖大量标注数据: 由于模型复杂性较高,对数据集规模和标注质量要求较高,标注错误或数据不足时模型容易过拟合。
改进方向:
- 模型结构优化: 可以尝试引入轻量化网络(如MobileNet)作为HRNet的主干网络,降低参数量,提升推理速度。
- 超参数调整: 针对类别不平衡问题,可考虑调整损失函数(如加入类别权重或使用Focal Loss),进一步提升模型在小样本上的性能。
- 数据增强策略扩展: 可以引入更复杂的增强策略(如CutMix、Mosaic等),增强模型对各种形变的鲁棒性。
↓↓↓更多热门推荐:
transformers和bert实现微博情感分类模型提升
基于ResNet50模型的船型识别与分类系统研究
全部项目数据集、代码、教程进入官网zzgcz.com
相关文章:

HRNET模型实现钢板表面缺陷检测
关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…...

28 基于51单片机的两路电压检测(ADC0808)
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,通过ADC0808获取两路电压,通过LCD1602显示 二、硬件资源 基于KEIL5编写C代码,PROTEUS8.15进行仿真,全部资源在页尾,提供…...

SpringBootTest Mockito 虚实结合编写测试
SpringBootTest & Mockito 虚实结合测试 起因 单一使用mockito,会出现很多mock困难的问题,导致测试编写过程太长,太恶心 单一使用springboottest,会遇到需要外部接口的地方,这个时候就非得去真实调用才行。也很恶…...

国内外网络安全政策动态(2024年9月)
国内网络安全政策动态 ▶︎ 1.三项智能网联汽车强制性国家标准正式发布 9月4日,工业和信息化部组织制定的GB 44495—2024《汽车整车信息安全技术要求》、GB 44496—2024《汽车软件升级通用技术要求》和GB 44497—2024《智能网联汽车 自动驾驶数据记录系统》三项强制…...

使用Android studio进行Unit Test中遇到的问题记录
1、模块本身代码运行不起来 提示: Cannot resolve method ‘getVolumes’ in ‘StorageManager’ Cannot resolve method ‘registerListener’ in ‘StorageManager’ Cannot resolve method ‘unregisterListener’ in ‘StorageManager’ 查看Android 源码&…...

智能运维与问题诊断工具:提升生产环境的安全稳定性
引言 在当今复杂的IT环境中,确保生产系统的安全稳定运行是一项巨大挑战。随着技术的进步,智能运维和问题诊断工具应运而生,为IT团队提供了强大的支持。本文将介绍一系列先进的工具,这些工具利用人工智能、机器学习和自动化技术,帮助组织提高系统可靠性、加速问题解决、优…...

【MAUI】CommunityToolkit社区工具包介绍
一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…...

【答疑解惑】图文深入详解undo和redo的区别及其底层逻辑
题记:最近有些人问我,undo和redo到底是什么关系,他们中不乏已经入行3-4年的同学,今天咱们就来深入探讨下到底什么是undo和redo,他们分别做什么,底层逻辑原理是什么等等。 1. undo 1.1 undo的存储结构 Un…...

低通滤波、反相放大器电路
1 简介 这种可调低通滤波、反相放大器电路可将信号电平放大 26dB 或 20V/V。R2 和 C1 会为此电路设置截止频率。此电路的频率响应与无源 RC 滤波器的相同,除非输出按放大器的通带增益进行放大。低通滤波器通常用于音频信号链,此滤波器有时也称为低音增强…...

SpringBoot助力服装生产流程优化
1 绪论 1.1 研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高…...

【机器学习】线性回归算法简介 及 数学实现方法
线性回归 简介 利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 数学公式: ℎ_(w) w_1x_1 w_2x_2 w_3x_3 … b w^Txb 概念 利用回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关…...

设计模式的学习
OO:Object-Oriented 面向对象 --- 《Head First设计模式》 这本书是用java写的,我是写C的,用C来写相关的代码 --- p2(第二页) #ifndef DUCK_H #define DUCK_H/*** brief The Duck class 鸭子类*/ class Duck { public:D…...

wordpress发邮件SMTP服务器配置步骤指南?
wordpress发邮件功能如何优化?怎么用wordpress发信? 由于WordPress默认的邮件发送功能可能不够稳定,配置SMTP服务器成为了许多网站管理员的选择。AokSend将详细介绍如何在WordPress中配置SMTP服务器,以确保邮件能够顺利发送。 w…...

胤娲科技:机械臂「叛逃」记——自由游走,再悄然合体
夜深人静,你正沉浸在梦乡的前奏,突然意识到房间的灯还亮着。此刻的你,是否幻想过有一只无形的手,轻盈地飘过,帮你熄灭那盏碍眼的灯? 又或者,你正窝在沙发上,享受电视剧的紧张刺激&am…...

分布式事务讲解 - 2PC、3PC、TCC
分布式事务讲解 - 2PC、3PC、TCC 前置知识 BASE理论: BASE是Basically Availbale(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)三个词语的缩写。BASE理论是对CAP理论中AP的一个扩展,通过牺牲强一致性来获得可用性,当…...

前端基础面试题·第四篇——Vue(其二)
1.Vue中路由传参 1.params传参 params 传参是通过URL路径来传递参数,这种方式传递的参数是必选的。这种传参方式需要在路由配置时在路由路径位置提前指定参数。 路由配置 const router new VueRouter({routes: [{path: /user/:id, // 这里的:id就是参数name: u…...

PHP反射
文章目录 介绍基本用法基本的反射示例1. 反射类2. 反射方法3. 反射属性4.反射全局函数5.反射函数的参数 优势和注意事项优势:注意事项: 介绍 PHP反射是一种强大的机制,允许在运行时检查类、接口、方法、属性等的结构和元数据。它可以用于许多…...

Gated Transformer Networks for Multivariate Time Series Classification
博客贡献人 徐宁 作者 Minghao Liu , Shengqi Ren , Siyuan Ma , Jiahui Jiao , Yizhou Chen , Zhiguang Wang(Facebook AI) and Wei Song∗ 标签 多元时间序列分类,Transformer,门控 摘要 用于时间序列分类的深度学习模型(主要是卷积网…...

这一次,AI真的能帮你实现职场跃迁
你有没有想过: AI不仅能帮你实现工作提效 还能帮你实现职场跃迁! 根据行业报告,近年来**AIGC(AI Generated Content)**领域岗位数量井喷式增长,AI大模型产品经理作为连接技术与市场的桥梁,正扮…...

Python绘制--绘制心形曲线
今天,我们将通过Python代码来绘制一个心形曲线,这是一个经典的数学表达。 一、心形曲线的数学原理 心形曲线,也被称为心脏曲线,是一个代数曲线,可以通过参数方程定义。其数学表达式如下: x16sin3(t)x16…...

初识Linux · 自主Shell编写
目录 前言: 1 命令行解释器部分 2 获取用户命令行参数 3 命令行参数进行分割 4 执行命令 5 判断命令是否为内建命令 前言: 本文介绍是自主Shell编写,对于shell,即外壳解释程序,我们目前接触到的命令行解释器&am…...

海报设计模板免费的好用吗?活动海报排版技巧轻松get
虽然今年所有的法定节假日已经过完了,但对于电商打工族来说,需要制作活动海报的节日,还有很多吧...... 刚听到小道消息,说是今年的双十一,从十月十四号就开始预热了! 怎么样,大家的预热活动海…...

【Linux基础】03 Linux环境基础开发工具使用
1. yum ——软件包管理器 yum 是我们 Linux 预装的一个指令,搜索、下载、、安装对应的软件 yum 相当于 Linux 的应用商店! 安装与卸载 yum list | grep command 通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我…...

【CSS】flex: 1; 的意思
在 Flexbox 布局中,flex: 1; 是一个简写属性,它表示弹性容器中的子元素如何分配可用空间。flex: 1 意味着该元素可以根据剩余的空间进行扩展,占据相应的比例。具体来说,flex: 1; 是 flex-grow、flex-shrink 和 flex-basis 这三个属…...

C++ 3D冒险游戏开发案例
3D冒险游戏的C开发案例,包括游戏设计、实现细节、图形渲染、音效处理等内容。 3D冒险游戏开发案例 一、游戏设计 游戏概述 游戏名称:“探索者的传奇”类型:3D冒险游戏目标:玩家控制角色在一个开放的世界中探索、解谜、战斗并完成…...

【AIGC】Exa AI 要做 AI 领域的 Google
又一个AI搜索引擎诞生:Exa AI。 与其他旨在取代谷歌的AI驱动搜索引擎不同,Exa的目标是创建一个专门为AI设计的搜索工具。 Exa的使命: 互联网包含人类的集体知识,但目前的搜索体验更像在垃圾场中导航,而非在知识图书馆中漫游。核…...

YOLOv8 基于MGD的知识蒸馏
YOLOv8 基于MGD的知识蒸馏 接着上一篇我们介绍了YOLOv8的剪枝方案和代码,本篇文章将剪枝后的模型作为学生模型,剪枝前的模型作为教师模型对剪枝模型进行蒸馏,从而进一步提到轻量模型的性能。 Channel-wise Distillation (CWD) 问题和方法 …...

全国消防知识竞赛活动方案哪家强
关键词:消防安全、预防火灾、消防意识、消防员、防火安全 适合行业:所有行业 推荐功能:答题、投票、H5 宣传角度 1.从日常生活场景出发,指导大家如何检查家庭中的火灾隐患。例如检查电线是否老化、插座是否过载、是否在楼梯间…...

JavaEE学习一条龙服务————概述
鉴于之前的笔记较乱,没有逻辑关系,,博主决定从JacaEE整个学习的阶段出发,整理一系列博客,供大家学习交流,提升自己。 此文章已绑定一篇我为大家梳理的JavaEE一条龙学习知识点的文档,大家可下载…...

分支预测器BPU
分支预测器BPU 0 Intro0.1 CPU执行过程0.2 分支预测0.2.1 TAGE预测器0.2.2 跳转地址 分支预测器BPU是深入研究一个高性能处理器的一个很好的开始项目; 0 Intro 条件分支是指后续具有两路可执行的分支。可以分为跳转分支(taken branch)和不跳转分支(not-taken branc…...