基于飞桨复现语义分割网络HRNet,实现瓷砖缺陷检测
点击左上方蓝字关注我们
【飞桨开发者说】路星奎,沈阳化工大学信息工程学院研究生在读,PPDE飞桨开发者技术专家,研究方向为图像分类、目标检测、图像分割等
内容简介
本项目讲述了HRNet网络结构,并尝试使用PaddleSeg中HRNet网络实现瓷砖缺陷检测
PaddleSeg GitHub:
https://github.com/PaddlePaddle/PaddleSeg
本文包含以下4部分内容:
PaddleSeg介绍
HRNet网络分析
基于PaddleSeg使用HRNet网络进行瓷砖缺陷检测
PaddleSeg介绍
PaddleSeg是基于PaddlePaddle开发的图像分割开发套件,覆盖了DeepLabv3+、U-Net、ICNet、PSPNet、HRNet、Fast-SCNN等主流分割网络。通过模块化的设计,以配置化方式驱动模型组合,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。
PaddleSeg产品特点:
1. 丰富的数据增强:基于百度视觉技术部的实际业务经验,内置10+种数据增强策略,可结合实际业务场景进行定制组合,提升模型泛化能力和鲁棒性。
2. 模块化设计:支持DeepLabv3+、U-Net、ICNet、PSPNet、HRNet、Fast-SCNN六种主流分割网络,结合预训练模型和可调节的骨干网络,满足不同性能和精度的要求;选择不同的损失函数如Dice Loss, Lovasz Loss等方式可以强化小目标和不均衡样本场景下的分割精度。
3. 高性能:PaddleSeg支持多进程I/O、多卡并行等训练加速策略,结合飞桨核心框架的显存优化功能,可大幅度减少分割模型的显存开销,让开发者更低成本、更高效地完成图像分割训练。
4. 工业级部署:全面提供服务端和移动端的工业级部署能力,依托飞桨高性能推理引擎和高性能图像处理实现,开发者可以轻松完成高性能的分割模型部署和集成。通过Paddle-Lite,可以在移动设备或者嵌入式设备上完成轻量级、高性能的人像分割模型部署。
5. 产业实践案例:PaddleSeg提供丰富地产业实践案例,如人像分割、工业表计检测、遥感分割、人体解析,工业质检等产业实践案例,助力开发者更便捷地落地图像分割技术。
HRNet网络分析
论文名称:
High-Resolution Representations for Labeling Pixels and Regions
下载地址:
https://arxiv.org/pdf/1904.04514.pdf
网络整体结构:
如上图所示HRNet有四个并行的分支,包含三次下采样过程。值得注意的是,上图中的输入是以原始输入的1/4开始的,即先经历了2次步长为2的3×3卷积。
HRNet网络结构特点:
始终保持高分辨率表征
从网络整体结构可以看出,每次产生低分辨率特征图之后,原有的高分辨特征还会参与到后续的卷积过程,因此产生了并行的不同分辨率的特征图。
残差单元
图中的直箭头代表残差单元,残差单元由4个残差卷积(1×1、3×3、1×1)构成。
类似全连接的阶段性特征融合
每经过4个残差单元之后会进行一次不同分辨率的特征融合。低分辨率上采样与高分辨率融合,高分辨率下采样与低分辨率融合,最终形成类似于全连接形式的特征融合过程。
简单明了的解码过程
如下图所示,解码过程显得很轻巧,将四个阶段产生的不同分辨率的特征图直接上采样至输入的1/4,经过1次1*1卷积整合各通道的信息,然后进行预测分类,最后上采样至原图大小进行损失计算。
关键性代码:
以下展示了网络搭建过程中重要的方法及注释。
#获取各阶段的通道数{18,36,72,144}channels_2 = cfg.MODEL.HRNET.STAGE2.NUM_CHANNELSchannels_3 = cfg.MODEL.HRNET.STAGE3.NUM_CHANNELSchannels_4 = cfg.MODEL.HRNET.STAGE4.NUM_CHANNELS#获取各阶段残差单元的循环次数{1,4,3}num_modules_2 = cfg.MODEL.HRNET.STAGE2.NUM_MODULESnum_modules_3 = cfg.MODEL.HRNET.STAGE3.NUM_MODULESnum_modules_4 = cfg.MODEL.HRNET.STAGE4.NUM_MODULES #步长为2的跨步卷积 f=3*3x = conv_bn_layer(input=input,filter_size=3,num_filters=64,stride=2,if_act=True,name='layer1_1')#步长为2的跨步卷积 f=3*3x = conv_bn_layer(input=x,filter_size=3,num_filters=64,stride=2,if_act=True,name='layer1_2')#执行1个残差单元la1 = layer1(x, name='layer2')#根据输入中最低分辨率特征图生成低分辨率特征图,并规范特征图的通道数tr1 = transition_layer([la1], [256], channels_2, name='tr1')#执行4次残差卷积,并在每次残差单元结束时进行特征融合st2 = stage(tr1, num_modules_2, channels_2, name='st2')#根据输入中最低分辨率特征图生成低分辨率特征图,并规范特征图的通道数tr2 = transition_layer(st2, channels_2, channels_3, name='tr2')#执行3次残差卷积,并在每次残差单元结束时进行特征融合st3 = stage(tr2, num_modules_3, channels_3, name='st3')#根据输入中最低分辨率特征图生成低分辨率特征图,并规范特征图的通道数tr3 = transition_layer(st3, channels_3, channels_4, name='tr3')#执行1次残差卷积,并在每次残差单元结束时进行特征融合st4 = stage(tr3, num_modules_4, channels_4, name='st4')shape = st4[0].shape##获取st4[0]宽高,并进行双线性插值height, width = shape[-2], shape[-1]st4[1] = fluid.layers.resize_bilinear(st4[1], out_shape=[height, width])st4[2] = fluid.layers.resize_bilinear(st4[2], out_shape=[height, width])st4[3] = fluid.layers.resize_bilinear(st4[3], out_shape=[height, width])#特征通道合并out = fluid.layers.concat(st4, axis=1)#求总通道数last_channels = sum(channels_4)#使用1*1卷积进行跨通道的特征融合out = conv_bn_layer(input=out,filter_size=1,num_filters=last_channels,stride=1,if_act=True,name='conv-2')#使用1*1卷积进行最后的像素分类 out = fluid.layers.conv2d(input=out,num_filters=num_classes,filter_size=1,stride=1,padding=0,act=None,param_attr=ParamAttr(initializer=MSRA(), name='conv-1_weights'),bias_attr=False)#恢复至网络输入的大小out = fluid.layers.resize_bilinear(out, input.shape[2:])
网络的整理流程与细节如下所示:
网络过程中特征的维度变化如下所示:
基于PaddleSeg使用HRNet进行瓷砖缺陷检测
1. 数据准备
表面缺陷检测是筛选不合格产品的核心过程,但该过程很少能自动完成。
据记载,在世界上最大的瓷砖生产基地浙江省的瓷砖厂,有近3/4的工人在检查产品质量。
为了减轻人类的劳动强度,已经提出了许多图像处理技术来尝试这样的检查任务。
瓷砖的自动损伤检测存在纹理复杂、缺陷形状多样、瓷砖光照条件随机性等几个瓶颈问题。
目标缺陷如气孔、裂纹、断裂、磨损如图所示。
2. 环境搭建
环境要求:
PaddlePaddle >= 1.7.0
Python >= 3.5+
由于图像分割模型计算开销大,推荐在GPU版本的PaddlePaddle下使用PaddleSeg
pip install -U paddlepaddle-gpu
安装过程
安装PaddleSeg套件:
git clone https://github.com/PaddlePaddle/PaddleSeg
安装PaddleSeg依赖:
cd PaddleSeg
pip install -r requirements.txt
3. 标签数据
PaddleSeg采用单通道的标注图片,每一种像素值代表一种类别,像素标注类别需要从0开始递增,例如0,1,2,3表示有4种类别。3. 标签数据
NOTE:
标注图像请使用PNG无损压缩格式的图片,标注类别最多为256类。
PaddleSeg支持灰度标注同时也支持伪彩色标注。
PaddleSeg支持灰度标注转换为伪彩色标注,如需转换成伪彩色标注图,可使用PaddleSeg自带的的转换工具
4. 模型选择参数配置
模型选择:根据自己的需求选择合适的模型进行训练。本文选择HRNet-W18作为训练模型。
预训练模型:
pretrained_model/download_model.py中提供了相应的预训练模型下载地址,可以根据自己的需求在其中寻找相应的预训练模型,如不存在,可以按照同样的格式添加对应的模型名称与下载地址。
参数配置:参数由config.py和hrnet_Magnetic.yaml共同决定,.yaml文件的优先级高于config.py 。
常用参数配置详细说明:
DATASET:关于数据集的相关配置,如类别数、训练数据列表、测试数据列表
MODEL:模型配置:
MODEL_NAME: "hrnet" 模型名称
HRNET:配置各个stage中不同分辨率特征图的通道数
STAGE2:
NUM_CHANNELS: [18, 36]
STAGE3:
NUM_CHANNELS: [18, 36, 72]
STAGE4:
NUM_CHANNELS: [18, 36, 72, 144]
MULTI_LOSS_WEIGHT:模型输出权重配置
TRAIN_CROP_SIZE:训练时输入数据大小
EVAL_CROP_SIZE:测试时输入数据大小
BATCH_SIZE:输入网络中的BATCH_SIZE,需要适配显存
SNAPSHOT_EPOCH: 阶段性保存EPOCH
NUM_EPOCHS:总的训练轮数
LOSS:损失函数类别
LR:学习率
5. 参数校验
在开始训练和评估之前,对配置和数据进行一次校验,确保数据和配置是正确的。使用下述命令启动校验流程:
python pdseg/check.py --cfg ./configs/hrnet_Magnetic.yaml
6. 模型训练
本次项目中设置的是阶段性模型评估,同时保存评估结果最好的模型参数在下述目录:
PaddleSeg/saved_model/unet_optic/best_model
best_model文件夹下包含ppcls.pdmodel、ppcls.pdopt、ppcls.pdparams三个文件用来进行后续的评估推理使用。
python pdseg/train.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml --do_eval
7. 模型评估
python pdseg/train.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml --do_eval[EVAL]#image=81 acc=0.9853 IoU=0.8434
[EVAL]Category IoU: [0.9842 0.7891 0.8468 0.7010 0.9258 0.8136]
[EVAL]Category Acc: [0.9927 0.8871 0.9407 0.9106 0.9597 0.8829]
[EVAL]Kappa:0.9037
8. 结果可视化
python pdseg/vis.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml
得到可视化结果之后,可以使用如下代码展示可视化结果:
import matplotlib.pyplot as plt
import os
import cv2
# 定义显示函数
def display(img_name):image_dir = os.path.join("./dataset/Magnetic/images", img_name.split(".")[0]+".jpg")label_dir = os.path.join("./dataset/Magnetic/color",img_name)mask_dir = os.path.join("./visual", img_name)img_dir = [image_dir, label_dir, mask_dir]plt.figure(figsize=(15, 15))title = ['Image', 'label', 'Predict'] for i in range(len(title)):plt.subplot(1, len(title), i+1)plt.title(title[i])if i==0:img_rgb = cv2.imread(img_dir[i])else:img = cv2.imread(img_dir[i])b,g,r = cv2.split(img)img_rgb = cv2.merge([r,g,b]) plt.imshow(img_rgb)plt.axis('off')plt.show()
# 注:第一次运行可能无法显示,再运行一次即可。
img_list=os.listdir("./visual")
for img_name in img_list: display(img_name)
输出结果如下所示:
心得体会
本项目详细介绍了HRNet网络关键性技术点,最后使用基于飞桨开源深度学习框架的图像分割套件PaddleSeg,在AI Studio上完成了数据处理、模型训练、模型评估等工作。PaddleSeg套件让图像分割技术变得更为简单便捷,降低了开发者的上手难度。
在此强烈安利AI Studio。AI Studio是基于百度深度学习平台飞桨的人工智能学习与实训社区,提供在线编程环境、免费GPU算力、海量开源算法和开放数据,帮助开发者快速创建和部署模型。对于像笔者一样没有硬件条件的学习者是一个很大的助力。
整个项目包括数据集与相关代码已公开在AI Studio上,欢迎小伙伴们Fork。
https://aistudio.baidu.com/aistudio/projectdetail/894141
如在使用过程中有问题,可加入飞桨官方QQ群进行交流:1108045677。
如果您想详细了解更多飞桨的相关内容,请参阅以下文档。
官网地址:https://www.paddlepaddle.org.cn
·飞桨 PaddleSeg 项目地址·
GitHub: https://github.com/PaddlePaddle/PaddleSeg
Gitee: https://gitee.com/paddlepaddle/PaddleSeg
·飞桨官网地址·
https://www.paddlepaddle.org.cn/
扫描二维码 | 关注我们
微信号 : PaddleOpenSource
基于飞桨复现语义分割网络HRNet,实现瓷砖缺陷检测相关推荐
- 基于飞桨复现图像分类模型TNT,实现肺炎CT分类
本项目介绍了TNT图像分类模型,讲述了如何使用飞桨一步步构建TNT模型网络结构,并尝试在新冠肺炎CT数据集上进行分类.由于作者水平有限,若有不当之处欢迎批评指正. TNT模型介绍 TNT模型全称是Tr ...
- 基于飞桨的智能课堂行为分析与考试作弊检测系统
智慧课堂:基于飞桨的智能化课堂 本项目主要实现了课堂专注度分析与考试作弊检测两个功能,通过对学生的姿态检测,可以有效的辅助老师有效监督学生的学习上课情况,对学生的上课行为进行分析及评分,避免出现课堂不 ...
- 基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛
点击左上方蓝字关注我们 [飞桨开发者说]尹梓琦,北京理工大学在读本科生,关注图深度学习,图挖掘算法和谱图理论 随着深度学习在欧几里得空间的成功应用,例如CNN,RNN等极大的提高了图像分类,序列预测等 ...
- 笔记:基于DCNN的图像语义分割综述
写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...
- 基于迁移学习的语义分割算法分享与代码复现
摘要:语义分割的数据集是比较大的,因此训练的时候需要非常强大的硬件支持. 本文分享自华为云社区<[云驻共创]基于迁移学习的语义分割算法分享>,原文作者:启明. 此篇文章是分享两篇基于迁移学 ...
- SegNet 语义分割网络以及其变体 基于贝叶斯后验推断的 SegNet
HomePage: http://mi.eng.cam.ac.uk/projects/segnet/ SegNet Paper: https://www.computer.org/csdl/trans ...
- 使用Pytorch搭建U-Net网络并基于DRIVE数据集训练(语义分割)学习笔记
使用Pytorch搭建U-Net网络并基于DRIVE数据集训练(语义分割)学习笔记 https://www.bilibili.com/video/BV1rq4y1w7xM?spm_id_from=33 ...
- FEANet——基于 RGBT的实时语义分割特征增强注意力网络
Overview Title:FEANet: Feature-Enhanced Attention Network for RGB-Thermal Real-time Semantic Segment ...
- python遥感影像地物分类_基于轻量化语义分割网络的遥感图像地物分类方法与流程...
本发明属于图像处理 技术领域: ,特别涉及一种地物分类方法,可用于土地利用分析.环境保护以及城市规划. 背景技术: :遥感图像地物分类,旨在取代繁琐的人工作业,利用地物分类方法,得到输入遥感图像的地物 ...
最新文章
- 优达学城《DeepLearning》大纲和学习愿景
- python绘制雷达图代码实例-Matplotlib绘制雷达图和三维图的示例代码
- Terraform 多云管理工具
- SAP HANA云平台YaaS,你不知道的三件事
- java代码同时下载_java代码实现打包多个文件下载功能
- listView无需适配器添加数据(写demo快速开发)entries属性的特殊用法
- Spring Data JPA 从入门到精通~方法的查询策略的属性表达式
- 高并发 数据库操作比如插入,修改等解决办法
- CoreData整理(二)——多线程方案
- C# WindowService 动态修改服务名
- 浅谈Cisco ASA的基础
- WDS服务不能启动-----Service-specific error code 1056767740
- 2019icpc南京网络赛 A The beautiful values of the palace(离线+树状数组)
- 基于特定实体的文本情感分类总结(PART II)
- Mootools:Hash中的null值
- 合并两个有序表(C语言)
- 哈佛幸福课 24种人格力量测试
- winedit注册码
- 计算机专业教师的简历模板,教师简历模板
- v-slot以及slot-scop(插槽与作用域插槽)
热门文章
- 小众框架JeePlus的理解
- Linux 文档编辑 : fold 命令详解
- 英伟达4070Ti 6499元起/ 微软要推出ChatGPT版Bing/ 苹果头显被曝售价3000美元... 今日更多新鲜事在此...
- AnnotationAwareAspectJAutoProxyCreator is only available on Java 1.5 and higher
- 简述promise原理
- android uevent原理
- 外汇短线操作技巧攻略
- UCL-Dehaze: Towards Real-world Image Dehazing via Unsupervised Contrastive Learning 基于对比学习的无监督真实图像去雾
- 算法学习 - 快速排序
- 实战篇2:假猪套天下第一