基于飞桨复现语义分割网络HRNet,实现瓷砖缺陷检测
内容简介 本项目讲述了HRNet网络结构,并尝试使用PaddleSeg中HRNet网络实现瓷砖缺陷检测 PaddleSeg GitHub: https://github.com/PaddlePaddle/PaddleSeg 本文包含以下4部分内容: PaddleSeg介绍 HRNet网络分析 基于PaddleSeg使用HRNet网络进行瓷砖缺陷检测 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu 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 pipinstall-Upaddlepaddle-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. 参数校验 在开始训练和评估之前,对配置和数据进行一次校验,确保数据和配置是正确的。使用下述命令启动校验流程: pythonpdseg/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. 模型评估 pythonpdseg/train.py--use_gpu--cfg./configs/hrnet_Magnetic.yaml--do_eval [EVAL]#image=81acc=0.9853IoU=0.8434 [EVAL]CategoryIoU:[0.98420.78910.84680.70100.92580.8136] [EVAL]CategoryAcc:[0.99270.88710.94070.91060.95970.8829] [EVAL]Kappa:0.9037 8. 结果可视化 python pdseg/vis.py --use_gpu --cfg ./configs/hrnet_Magnetic.yaml 得到可视化结果之后,可以使用如下代码展示可视化结果: importmatplotlib.pyplotasplt importos importcv2 #定义显示函数 defdisplay(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'] foriinrange(len(title)): plt.subplot(1,len(title),i+1) plt.title(title[i]) ifi==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") forimg_nameinimg_list: display(img_name) 输出结果如下所示: 心得体会 本项目详细介绍了HRNet网络关键性技术点,最后使用基于飞桨开源深度学习框架的图像分割套件PaddleSeg,在AI Studio上完成了数据处理、模型训练、模型评估等工作。PaddleSeg套件让图像分割技术变得更为简单便捷,降低了开发者的上手难度。 在此强烈安利AI Studio。AI Studio是基于百度深度学习平台飞桨的人工智能学习与实训社区,提供在线编程环境、免费GPU算力、海量开源算法和开放数据,帮助开发者快速创建和部署模型。对于像笔者一样没有硬件条件的学习者是一个很大的助力。 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu >>访问 PaddlePaddle 官网,了解更多相关内容。