基于Intel mml - dnn的机器故障识别代码生成
的代码生成基于声学的机器故障识别(音频工具箱)使用长短期记忆(LSTM)网络和谱描述符。本示例使用具有深度学习支持的MATLAB®Coder™来生成一个MEX (MATLAB可执行)函数,该函金宝app数利用了Intel®MKL-DNN库的性能。输入数据由故障或健康空压机的声学时间序列记录组成,输出数据是LSTM网络预测的机械机器状态。关于音频预处理和网络训练的详细信息,请参见基于声学的机器故障识别(音频工具箱).
例子要求
MATLAB编码器接口或深度学习库支持包金宝app
支持Intel Advanced Vect金宝appor Extensions 2 (Intel AVX2)的Intel处理器
Intel深度神经网络库(MKL-DNN)
Intel mml - dnn的环境变量
有关受支金宝app持的库版本以及有关设置环境变量的信息,请参见用MATLAB编码器进行深度学习的先决条件(MATLAB编码器).
准备输入数据集
指定抽样率fs
16khz和awindowLength
中定义的512个样本基于声学的机器故障识别(音频工具箱).集numFrames
来One hundred.
.
Fs = 16000;windowLength = 512;numFrames = 100;
要在测试信号上运行示例,请生成一个粉红色噪声信号。如果需要在实际数据集上测试系统性能,请下载空压机数据集[1].
downloadDataset =虚假的;如果~downloadDataset pinkNoiseSignal = pinknoise(windowLength*numFrames);其他的下载AirCompressorDataset.zip组件=“音频”;文件名=“AirCompressorDataset / AirCompressorDataset.zip”;localfile = matlab.internal.examples.download金宝appSupportFile(组件,文件名);将下载的zip文件解压缩到downloadFolderdownloadFolder = fileparts(localfile);如果~ (fullfile (downloadFolder,存在“AirCompressorDataset”),“dir”解压(localfile, downloadFolder)结束创建一个audioDatastore对象,用于管理数据。dataStore = audioDatastore(下载文件夹,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);使用countEachLabel获取数据集中每个类别的样本数量。countEachLabel(数据存储)结束
在MATLAB中识别机器故障
要在MATLAB中运行流分类器,请下载并解压中开发的系统基于声学的机器故障识别(音频工具箱).
组件=“音频”;文件名=“AcousticsBasedMachineFaultRecognition / AcousticsBasedMachineFaultRecognition.zip”;localfile = matlab.internal.examples.download金宝appSupportFile(组件,文件名);downloadFolder = fullfile(fileparts(localfile),“系统”);如果~存在(downloadFolder“dir”)解压缩(localfile downloadFolder)结束
访问recognizeAirCompressorFault
系统功能,添加downloadFolder
到搜索路径。
目录(downloadFolder)
创建一个dsp。AsyncBuffer
(DSP系统工具箱)对象以流方式读取音频dsp。AsyncBuffer
(DSP系统工具箱)对象来累积分数。
audioSource = dsp.AsyncBuffer;scoreBuffer = dsp.AsyncBuffer;
加载预训练的网络,并从网络中提取标签。
airCompNet = code . loaddeeplearningnetwork (“AirCompressorFaultRecognitionModel.mat”);标签=字符串(airCompNet.Layers(end).Classes);
初始化signalToBeTested
来pinkNoiseSignal
或者从下拉列表中选择一个信号来测试数据集中您选择的文件。
如果~downloadDataset signaltobetests = pinknoisessignal;其他的[allFiles,~] = splitEachLabel(dataStore,1);allData = readall(allFiles);signalToBeTested =allData (6);signaltobetests = cell2mat(signaltobetests);结束
每次流一个音频帧来表示系统,因为它将部署在实时嵌入式系统中。使用recognizeAirCompressorFault
开发的基于声学的机器故障识别(音频工具箱)计算音频特征并进行深度学习分类。
写(audioSource signalToBeTested);resetNetworkState = true;而audioSource。NumUnreadSamples >= windowLength获取一帧音频数据x = read(audioSource,windowLength);应用流式分类器功能score = recognizeAirCompressorFault(x,resetNetworkState);用于分析的商店评分写(scoreBuffer,得分);resetNetworkState = false;结束
从分数中计算出识别出的故障并显示出来。
scores = read(scoreBuffer);[~,labelIndex] = max(scores(end,:),[],2);detectedFault = labels(labelIndex)
detectedFault = "飞轮"
为每一帧绘制每个标签的分数。
情节(分数)传说(""+标签,“位置”,“西北”)包含(“时间步”) ylabel (“分数”) STR = sprintf(“预测分数随时间步骤。\n预测类:%s", detectedFault);标题(str)
生成MATLAB可执行文件
创建代码生成配置对象以生成可执行文件。将目标语言指定为c++。
CFG = code .config(墨西哥人的);cfg。TargetLang =“c++”;
使用mml - dnn库创建用于深度学习代码生成的配置对象。将深度学习配置对象附加到代码生成配置对象上。
DLCFG =编码器。DeepLearningConfig (“mkldnn”);cfg。DeepLearningConfig = dlcfg;
创建一个长度的音频数据帧windowLength
.
audioFrame = ones(windowLength,1);
调用codegen
(MATLAB编码器)函数从MATLAB Coder生成c++代码的recognizeAirCompressorFault
函数。指定配置对象和原型参数。一个名为recognizeAirCompressorFault_mex
生成到当前文件夹。
codegen配置cfgrecognizeAirCompressorFaultarg游戏{audioFrame, resetNetworkState}报告
代码生成成功:查看报告
使用MATLAB可执行程序执行机器故障识别
初始化signalToBeTested
来pinkNoiseSignal
或者从下拉列表中选择一个信号来测试数据集中您选择的文件。
如果~downloadDataset signaltobetests = pinknoisessignal;其他的[allFiles,~] = splitEachLabel(dataStore,1);allData = readall(allFiles);signalToBeTested =allData (8);signaltobetests = cell2mat(signaltobetests);结束
每次流一个音频帧来表示系统,因为它将部署在实时嵌入式系统中。使用生成的recognizeAirCompressorFault_mex
计算音频特征并进行深度学习分类。
写(audioSource signalToBeTested);resetNetworkState = true;而audioSource。NumUnreadSamples >= windowLength获取一帧音频数据x = read(audioSource,windowLength);应用流式分类器功能score = recognizeAirCompressorFault_mex(x,resetNetworkState);用于分析的商店评分写(scoreBuffer,得分);resetNetworkState = false;结束
从分数中计算出识别出的故障并显示出来。
scores = read(scoreBuffer);[~,labelIndex] = max(scores(end,:),[],2);detectedFault = labels(labelIndex)
detectedFault = "飞轮"
为每一帧绘制每个标签的分数。
情节(分数)传说(""+标签,“位置”,“西北”)包含(“时间步”) ylabel (“分数”) STR = sprintf(“预测分数随时间步骤。\n预测类:%s", detectedFault);标题(str)
评估替代性MEX功能工作流的执行时间
使用抽搐
而且toc
测量MATLAB函数的执行时间recognizeAirCompressorFault
MATLAB可执行程序(MEX)recognizeAirCompressorFault_mex
.
创建一个dsp。AsyncBuffer
(DSP系统工具箱)对象记录执行时间。
timingBufferMATLAB = dsp.AsyncBuffer;timingBufferMEX = dsp.AsyncBuffer;
使用在前一节中选择的相同记录作为输入recognizeAirCompressorFault
函数及其MEX等值recognizeAirCompressorFault_mex
.
写(audioSource signalToBeTested);
测量MATLAB代码的执行时间。
resetNetworkState = true;而audioSource。NumUnreadSamples >= windowLength获取一帧音频数据x = read(audioSource,windowLength);应用流式分类器功能tic scoreMATLAB = recognizeAirCompressorFault(x,resetNetworkState);写(timingBufferMATLAB toc);应用流式分类器MEX功能tic scoreMEX = recognizeAirCompressorFault_mex(x,resetNetworkState);写(timingBufferMEX toc);resetNetworkState = false;结束
绘制每一帧的执行时间并分析概要文件。第一个电话recognizeAirCompressorFault_mex
消耗大约四倍的预算,因为它包括加载网络和重置状态。但是,在实际部署的系统中,初始化时间只会发生一次。MATLAB函数的执行时间约为10 ms, MEX函数的执行时间约为1 ms,远低于实时性的32 ms预算。
预算= (windowLength/fs)*1000;timingMATLAB = read(timingBufferMATLAB)*1000;timingMEX = read(timingBufferMEX)*1000;frameNumber = 1:数值(timingMATLAB);perfGain = timingMATLAB./timingMEX;情节(frameNumber timingMATLAB、frameNumber timingMEX,“线宽”, 2)网格在yline(预算,”,{“预算”},“线宽”2)传说(“MATLAB函数”,“墨西哥人函数”,“位置”,“西北”)包含(“时间步”) ylabel (“执行时间(毫秒)”)标题(《MATLAB与MEX函数执行时间图》)
计算除第一次调用外,MEX对MATLAB函数的性能增益。本性能测试在一台使用NVIDIA Quadro P620 (Version 26) GPU和Intel®Xeon®W-2133 CPU的机器上进行,运行频率为3.60 GHz。
PerformanceGain = sum(timingMATLAB(2:end))/sum(timingMEX(2:end))
PerformanceGain = 16.4834
这个例子到此结束。在树莓派上部署机器故障识别,请参见树莓派上基于声学的机器故障识别代码生成(音频工具箱).
参考文献
[1]维尔马,Nishchal K.,等。基于声学信号的空气压缩机智能状态监测IEEE可靠性汇刊,第65卷,no。2016年3月1日,291-309页。中国日报网,doi:10.1109/TR.2015.2459684。