基于飞桨复现语义分割网络HRNet,实现瓷砖缺陷检测

内容简介

本项目讲述了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_CHANNELS     channels_3 = cfg.MODEL.HRNET.STAGE3.NUM_CHANNELS     channels_4 = cfg.MODEL.HRNET.STAGE4.NUM_CHANNELS     #获取各阶段残差单元的循环次数{1,4,3}     num_modules_2 = cfg.MODEL.HRNET.STAGE2.NUM_MODULES     num_modules_3 = cfg.MODEL.HRNET.STAGE3.NUM_MODULES     num_modules_4 = cfg.MODEL.HRNET.STAGE4.NUM_MODULES      #步长为2的跨步卷积 f=3*3     x = conv_bn_layer(input=input,filter_size=3,num_filters=64,stride=2,if_act=True,name='layer1_1')     #步长为2的跨步卷积 f=3*3     x = 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
飞桨PaddlePaddle
飞桨PaddlePaddle

飞桨(PaddlePaddle)是中国首个自主研发、功能完备、开源开放的产业级深度学习平台。

https://www.paddlepaddle.org
专栏二维码
工程缺陷检测语义分割网络百度飞桨
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

图像分割技术

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像索赋予相同的编号。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

遥感技术

遥感(remote sensing)是指非接触的、远距离的探测技术。一般指运用传感器/遥感器探测物体的电磁波辐射、反射特性。遥感通过遥感器这类对电磁波敏感的仪器,在远离目标和非接触目标物体条件下探测目标。

双线性插值技术

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。 双线性插值作为数值分析中的一种插值算法,广泛应用在信号处理,数字图像和视频处理等方面。

图像处理技术

图像处理是指对图像进行分析、加工和处理,使其满足视觉、心理或其他要求的技术。 图像处理是信号处理在图像领域上的一个应用。 目前大多数的图像均是以数字形式存储,因而图像处理很多情况下指数字图像处理。

上采样技术

在数字信号处理中,上采样、扩展和内插是与多速率数字信号处理系统中的重采样过程相关的术语。 上采样可以与扩展同义,也可以描述整个扩展和过滤(插值)过程。

模型选择技术

模型选择是从给定数据的一组候选模型中选择统计模型的任务。对于具有类似预测或解释力的候选模型,最简单的模型最有可能是最佳选择(奥卡姆剃刀)。

推理引擎技术

推理机是实施问题求解的核心执行机构,常见于专家系统。它是对知识进行解释的程序,根据知识的语义,对按一定策略找到的知识进行解释执行,并把结果记录到动态库的适当空间中去。

百度机构

百度是全球最大的中文搜索引擎,是一家互联网综合信息服务公司,更是全球领先的人工智能平台型公司。2000年1月1日创立于中关村,公司创始人李彦宏拥有“超链分析”技术专利,也使中国成为美国、俄罗斯、和韩国之外,全球仅有的4个拥有搜索引擎核心技术的国家之一。

https://www.baidu.com/
安利机构

amway常被称为安利,是一家总部位于美国密执安州的亚达城的家居护理产品公司,业务遍布80多个国家和地区。安利生产的产品有450余种,包括营养保健食品、美容化妆品、个人护理用品、家居护理用品和家居耐用品等。

图生成技术

根据给定信息信息生成图表。

暂无评论
暂无评论~