在人工智能领域,深度学习平台的重要性毋庸置疑。飞桨是百度自研的深度学习平台,飞桨社区的开发者基于飞桨平台积极的将自己的智慧应用到前沿技术的研究中,为人工智能长期研发目标贡献自己的力量。为此,飞桨开发者说专栏推出论文专题,给予飞桨社区开发者一个平台,介绍学术研究的最新发展动向,分享在学术研究方面的经验。
本期文章将为大家分享飞桨开发者技术专家(PPDE)谢飞发表于ScienceDirect的文章《Research on controllable deep learning of multi-channel image coding technology in Ferrographic Image fault classification》
谢飞
中国财产再保险有限责任公司创新实验室高级承保师,上海市青年金才,百度飞桨开发者技术专家(PPDE),百度AICA项目四期班学员
在AI快车道等活动担任讲师,分享《新能源汽车火灾隐患检测》等内容,依托飞桨发表SCI机械类顶级期刊《Tribology International》论文《Research on controllable deep learning of multi-channel image coding technology in Ferrographic Image fault classification》。
机械设备的智能诊断是一种收集、处理和分析机械运转状态信息的技术,运用该类技术辅助设备维护和保养就是要基于相关信息对设备的状况进行诊断。该技术目前主要应用领域包括精密复杂的机械设备如飞机或船舶发动机、运行工况恶劣的大型机械如大型液压机及海上钻井平台设备等。
图1 铁谱图像
铁谱图像是需要进行专业提取和显微拍摄的图像,其制备过程需要利用摩擦磨损试验机、分析铁谱仪、光学显微镜等设备,制备成本高,图像数量少,因此,要开展相关智能识图研究就必须利用迁移学习技术。相较于通用计算机视觉领域,铁谱图像的智能识别是否可以利用通用视觉领域的预训练模型是研究人员面临的第一个问题。笔者评估两个域的差异程度,其依托于:
图3 基于铁谱图像故障诊断预训练模型的迁移学习结果
图8 MCSA模型结构示意
在G绿色图像通道上的卷积计算过程如公式2所示:
import numpy as np
import paddle
import paddle.nn as nn
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
class Image_combine():
def __init__(self,img_original_path,save_path):
self.img_original_path=img_original_path
self.save_path=save_path
img_original=np.array(Image.open(img_original_path))
self.img_original_R=img_original.transpose([2,0,1])[0,:,:]#pick out the Red channel
self.img_original_G=img_original.transpose([2,0,1])[1,:,:]#pick out the Green channel
self.img_original_B=img_original.transpose([2,0,1])[2,:,:]#pick out the Blue channel
self.add_original=self.img_original_R+self.img_original_G+self.img_original_B#add all channels togather
self.min_original=self.img_original_R+self.img_original_B-self.img_original_G#R+B-G
def combine_method(self,img_Laplace,img_Sobel,channel="add_original"):
if channel=="add_original":
img_R_1=paddle.to_tensor(self.add_original,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.add_original+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.add_original-img_Laplace,dtype="float32").unsqueeze(0)
elif channel=="add_original_confuse":
img_R_1=paddle.to_tensor(self.add_original,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.add_original+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.add_original+img_Sobel,dtype="float32").unsqueeze(0)
elif channel=="RGB_original":
img_R_1=paddle.to_tensor(self.img_original_R,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.img_original_G+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.img_original_B-img_Laplace,dtype="float32").unsqueeze(0)
elif channel=="RGB_original_confuse":
img_R_1=paddle.to_tensor(self.img_original_R,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.img_original_G+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.img_original_B+img_Sobel,dtype="float32").unsqueeze(0)
img_new_1=paddle.concat([img_R_1,img_G_1,img_B_1],axis=0)
img_new_1=img_new_1.transpose([1,2,0])
img_new_1=img_new_1.astype("int32").numpy()
img_new_1[img_new_1>255]=255
img_new_1[img_new_1<0]=0
#plt.imshow(img_new_1)
plt.imsave(self.save_path+self.img_original_path[14:-4]+"_deal_"+channel+".jpg",img_new_1/255)
#matplotlib.image.imsave(self.save_path+self.img_original_path[15:-4]+"_deal_"+channel+".jpg",img_new_1.astype("float32"))
def combine_method_test(self,img_Laplace,img_Sobel,channel="add_original"):
if channel=="add_original":
img_R_1=paddle.to_tensor(self.add_original,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.add_original+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.add_original-img_Laplace,dtype="float32").unsqueeze(0)
elif channel=="add_original_confuse":
img_R_1=paddle.to_tensor(self.add_original,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.add_original+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.add_original+img_Sobel,dtype="float32").unsqueeze(0)
elif channel=="RGB_original":
img_R_1=paddle.to_tensor(self.img_original_R,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.img_original_G+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.img_original_B-img_Laplace,dtype="float32").unsqueeze(0)
elif channel=="RGB_original_confuse":
img_R_1=paddle.to_tensor(self.img_original_R,dtype="float32").unsqueeze(0)
img_G_1=paddle.to_tensor(self.img_original_G+img_Laplace,dtype="float32").unsqueeze(0)
img_B_1=paddle.to_tensor(self.img_original_B+img_Sobel,dtype="float32").unsqueeze(0)
img_new_1=paddle.concat([img_R_1,img_G_1,img_B_1],axis=0)
img_new_1=img_new_1.transpose([1,2,0])
img_new_1=img_new_1.astype("int32").numpy()
img_new_1[img_new_1>255]=255
img_new_1[img_new_1<0]=0
plt.imshow(img_new_1)
plt.imsave(self.save_path+self.img_original_path[14:-4]+"_deal_"+channel+".jpg",img_new_1/255)
return img_new_1
尔后,需要将该模型前置到CNN和ViT模型的前端,实现MCECNN和MCSA两个新模型结构的构建和训练。
图9 MCECNN模型在验证集上的精度提升曲线
图10 MCECNN模型在训练集上的损失收敛情况
图12 各种模型在验证集上的表现
图13 各种模型在训练集上的误差收敛情况
图14 各模型在测试集上的精准率
图15 各模型在测试集上的召回率
如图14所示,测试集上的精准率中MCSA在Chunky故障类(铁谱图像块状磨损颗粒物故障类)上表现更好,而在Cutting故障类(铁谱图像切削状磨损颗粒物故障类)上表现较差。如图15所示,各模型在测试集上的召回率中MCSA在Chunky故障类上表现较差,而在Cutting故障类、Nonferrous故障类(铁谱图像有色金属磨损颗粒物故障类)上表现较好。在利用Vision Transformer技术路线构建铁谱图像智能故障诊断领域,MCSA模型拥有更加强劲的性能。
限于篇幅,利用飞桨进行铁谱图像智能诊断的工作还有很多细节无法披露,例如多维通信、信息聚合机制、如何有效的衔接多通道编码技术和CNN模型、ViT模型、各种颗粒背后的故障机理等等。但是不得不说,飞桨作为一个优秀的国内深度学习框架,其完整的培训体系,清晰的系统构成,有力的技术支持,绝不输于国外任一技术框架,其为相关领域的研究提供了完整而全面的支撑,使相关基础性交叉学科的开展变得更加便捷、高效。
相关链接
论文:
https://www.sciencedirect.com/science/article/pii/S0301679X22002298
https://github.com/fiyen/PaddlePaddle-CNN
PaddleViT:
关注【飞桨PaddlePaddle】公众号
获取更多技术内容~