主要内容

基于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编码器)

准备输入数据集

指定抽样率fs16khz和awindowLength中定义的512个样本基于声学的机器故障识别(音频工具箱).集numFramesOne 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);

初始化signalToBeTestedpinkNoiseSignal或者从下拉列表中选择一个信号来测试数据集中您选择的文件。

如果~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可执行程序执行机器故障识别

初始化signalToBeTestedpinkNoiseSignal或者从下拉列表中选择一个信号来测试数据集中您选择的文件。

如果~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函数的执行时间recognizeAirCompressorFaultMATLAB可执行程序(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。