主要内容

基于声学的机器故障识别

在本例中,您将开发一个深度学习模型,使用声学测量来检测空压机中的故障。在开发模型之后,对系统进行打包,以便能够根据流输入数据识别故障。

数据准备

下载并解压空压机数据集[1].该数据集由空气压缩机在正常状态或七个故障状态之一的记录组成。

downloadFolder = matlab.internal.examples.downloadSupportFile (“音频”,“AirCompressorDataset / AirCompressorDataset.zip”);dataFolder = tempdir;unzip(downloadFolder,dataFolder) dataset = fullfile(dataFolder,“AirCompressorDataset”);

创建一个audioDatastore(音频工具箱)对象来管理数据并将其划分为训练集和验证集。调用countEachLabel(音频工具箱)检查标签在训练集和验证集中的分布情况。

广告= audioDatastore(数据集,IncludeSubfolders = true, LabelSource =“foldernames”);[adsTrain, adsValidation] = splitEachLabel(广告,0.9,0.1);countEachLabel (adsTrain)
ans =8×2表标签数量_________ _____轴承203飞轮203健康203 LIV 203 LOV 203 NRV 203活塞203传送带203
countEachLabel (adsValidation)
ans =8×2表标签数_________ _____轴承22飞轮22健康22 LIV 22 LOV 22 NRV 22活塞22传送带22
adsTrain = shuffle (adsTrain);adsValidation = shuffle (adsValidation);

您可以减少本例中使用的训练数据集,以牺牲性能为代价加快运行时。一般来说,减少数据集对于开发和调试来说是一个很好的实践。

speedupExample =如果splitEachLabel(adsTrain,20);结束

这些数据由故障或正常空气压缩机的声学时间序列记录组成。因此,样本之间在时间上有很强的关系。听录音并绘制波形图。

[sampleData, sampleDataInfo] =阅读(adsTrain);fs = sampleDataInfo.SampleRate;soundsc (sampleData fs)情节(sampleData)包含(“样本”) ylabel (“振幅”)标题(”状态:“+字符串(sampleDataInfo.Label)轴

因为样本在时间上是相关的,所以可以使用循环神经网络(RNN)对数据建模。长短期记忆(LSTM)网络是RNN的一个流行选择,因为它被设计成避免消失和爆发的梯度。在训练网络之前,充分准备数据是很重要的。通常,最好是从一维信号数据中转换或提取特征,以便为模型提供更丰富的特征集,以便从中学习。

工程特性

下一步是提取一组用作网络输入的声学特征。Audio Toolbox™使您能够提取通常用作机器学习任务输入的谱描述符。您可以使用单个函数提取特性,也可以使用audioFeatureExtractor(音频工具箱)简化工作流程,一气呵成。

trainFeatures =细胞(1,元素个数(adsTrain.Files));windowLength = 512;overlapLength = 0;aFE = audioFeatureExtractor (SampleRate = fs,...窗口=汉明(windowLength,“周期”),...OverlapLength = OverlapLength,...spectralCentroid = true,...spectralCrest = true,...spectralDecrease = true,...spectralEntropy = true,...spectralFlatness = true,...spectralFlux = false,...spectralKurtosis = true,...spectralRolloffPoint = true,...spectralSkewness = true,...spectralSlope = true,...spectralSpread = true);重置(adsTrain)抽搐index = 1: numl (adsTrain. files) data = read(adsTrain);trainFeatures{指数}=(提取(aFE、数据))';结束disp (列车集合的特征提取+ toc +“秒”。);
列车集特征提取耗时15.7192秒。

数据增加

训练集包含相对少量的声学记录,用于训练深度学习模型。放大数据集的一种流行方法是使用mixup。在mixup中,通过混合来自两个不同类实例的特性和标签来扩充数据集。Mixup是由[2]从概率分布中抽取的标签,而不是混合标签。支持函数,混合,获取训练特征、相关标签和每次观察的混合数量,然后输出混合和相关标签。

trainLabels = adsTrain.Labels;numMixesPerInstance =2;tic [augData,augLabels] = mixup(trainFeatures,trainLabels,numMixesPerInstance);trainLabels =猫(1 trainLabels augLabels);trainFeatures =猫(2 trainFeatures augData);disp (“列车组的特征增强”+ toc +“秒”。);
列车组的特征增强耗时0.16065秒。

生成验证特性

对验证特征重复特征提取。

validationFeatures =细胞(1,元素个数(adsValidation.Files));重置(adsValidation)抽搐index = 1:numel(adsValidation. files) data = read(adsValidation);validationFeatures{指数}=(提取(aFE、数据))';结束disp (验证集的特征提取+ toc +“秒”。);
验证集的特征提取耗时1.6419秒。

火车模型

接下来,定义和训练一个网络。要跳过网络训练,设置downloadPretrainedSystem真正的,然后继续阅读下一节

downloadPretrainedSystem =如果downloadPretrainedSystem下载文件夹= matlab.internal.examples.downloadSupportFile(“音频”,“AcousticsBasedMachineFaultRecognition / AcousticsBasedMachineFaultRecognition.zip”);dataFolder = tempdir;unzip(downloadFolder,dataFolder) netFolder = fullfile(dataFolder,“AcousticsBasedMachineFaultRecognition”);目录(netFolder)结束

定义网络

LSTM层学习时间序列或序列数据的时间步之间的长期依赖关系。第一个lstmLayer有100个隐藏单元和输出序列数据。然后使用dropout层来减少过拟合。第二个lstmLayer输出时间序列的最后一步。

numHiddenUnits =One hundred.;dropProb =0.2;层= [...sequenceInputLayer (aFE)。FeatureVectorLength正常化=“zscore”) lstmLayer (numHiddenUnits OutputMode =“序列”) dropoutLayer (dropProb) lstmLayer (numHiddenUnits OutputMode =“最后一次”) fulllyconnectedlayer (numel(unique(adsTrain.Labels))) softmaxLayer classificationLayer];

定义网络Hyperparameters

要为网络定义超参数,请使用trainingOptions

miniBatchSize =128;validationFrequency =地板(元素个数(trainFeatures) / miniBatchSize);选择= trainingOptions (“亚当”,...MiniBatchSize = MiniBatchSize,...MaxEpochs = 35,...情节=“训练进步”,...Verbose = false,...洗牌=“every-epoch”,...LearnRateSchedule =“分段”,...LearnRateDropPeriod = 30,...LearnRateDropFactor = 0.1,...ValidationData = {validationFeatures adsValidation。标签},...ValidationFrequency = ValidationFrequency);

列车网络的

要训练网络,使用trainNetwork

airCompNet = trainNetwork (trainFeatures、trainLabels层,选择);

评估网络

查看验证数据的混淆图表。

validationResults =分类(airCompNet validationFeatures);confusionchart (validationResults adsValidation。标签,...Title =准确性:“+平均值(validationResults == adsValidation.Labels)*100 +“(%)”);

模型流检测

创建函数在流循环中处理数据

一旦您有了一个训练有素的具有令人满意性能的网络,您就可以以流的方式应用该网络来测试数据。

要使系统在真实的嵌入式系统中工作,还需要考虑许多其他因素。

例如,

  • 分类速度:分类能得到准确结果的速率或间隔时间

  • 用生成的代码(程序内存)和权重(数据内存)表示的网络大小

  • 用计算速度来表示网络的效率

在MATLAB中,您可以模拟网络是如何在一个真实的嵌入式系统上部署和在硬件中使用的,并开始回答这些重要的问题。

创建兼容C/ c++代码生成的MATLAB函数

一旦训练了深度学习模型,就可以将其部署到嵌入式目标上。这意味着您还需要部署用于执行特征提取的代码。使用generateMATLABFunction的方法audioFeatureExtractor生成一个兼容C/ c++的MATLAB函数代码生成。指定IsStreaming作为真正的使生成的函数为流处理优化。

文件名= fullfile (pwd,“extractAudioFeatures”);generateMATLABFunction (aFE,文件名,IsStreaming = true);

流特征提取与分类相结合

将训练过的网络保存为MAT文件。

保存(“AirCompressorFaultRecognitionModel.mat”,“airCompNet”

创建一个结合了特征提取和深度学习分类的函数。

类型recognizeAirCompressorFault.m
这是一个流分类器函数,如果是空的airCompNet (airCompNet) airCompNet = code . loaddeeplearningnetwork ('AirCompressorFaultRecognitionModel.mat');结束if rs airCompNet = resetState(airCompNet);使用函数features提取特征= extractAudioFeatures(audioIn);% classification [airCompNet,scores] = predictAndUpdateState(airCompNet,features);结束

测试流循环

接下来,在MATLAB中测试流分类器。流音频一次一帧,以表示将部署在实时嵌入式系统中的系统。这使您能够测量和可视化流实现的时间和准确性。

输入多个音频文件并绘制每帧数据的输出分类结果。在一个等于每个文件长度的时间间隔内,评估分类器的输出。

reset(adsValidation) N = 10;标签=类别(ads.Labels);numLabels =元素个数(标签);创建dsp。AsyncBuffer以流的方式读取音频audioSource = dsp.AsyncBuffer;创建dsp。AsyncBuffer来累积分数scoreBuffer = dsp.AsyncBuffer;创建dsp。AsyncBuffer记录执行时间。timingBuffer = dsp.AsyncBuffer;预分配数组来存储结果streamingResults =分类(0 (N, 1));%遍历文件fileIdx = 1: N读取一个音频文件,并把它放在源缓冲区(数据、dataInfo) =阅读(adsValidation);写(audioSource、数据);帧上的内循环rs = true;audioSource。NumUnreadSamples > = windowLength获取一帧音频数据x =阅读(audioSource windowLength);应用流分类器功能tic评分= recognizeAirCompressorFault(x,rs);写(timingBuffer toc);%存储用于分析的分数写(scoreBuffer,得分);rs = false;结束重置(audioSource)存储该文件的类结果成绩=阅读(scoreBuffer);[~,结果]= max(分数(最终,:),[],2);streamingResults (fileIdx) =分类(标签(结果));绘制分数随时间变化的比较图图绘制(分数)% #好< * NASGU >传奇(字符串(airCompNet.Layers(结束). class),位置=“西北”)包含(“时间步”) ylabel (“分数”)标题(“已知标签=”+字符串(dataInfo.Label),"预测标签= "+字符串(streamingResults (fileIdx))))结束

比较分类器的流版本和非流版本的测试结果。

testError = mean(validationResults(1:N) ~= streamingResults);disp ("流分类器和非流分类器之间的错误:"+ testError * 100 +“(%)”
流分类器和非流分类器之间的错误:0 (%)

分析执行时间。重置状态时的执行时间通常超过32毫秒预算。然而,在实际部署的系统中,初始化时间只会发生一次。主循环的执行时间约为10毫秒,远远低于实时性能的32毫秒预算。

executionTime =阅读(timingBuffer) * 1000;预算= (windowLength / aFE.SampleRate) * 1000;情节(executionTime“o”)标题(“每帧执行时间”)包含(“帧数”) ylabel (“时间(ms)”) yline(预算,"",“预算”线宽= 2)

支持功能

函数[augData,augLabels] = mixup(data,labels,numMixesPerInstance) augData = cell(1,numel(data)*numMixesPerInstance);augLabels = repelem(标签,numMixesPerInstance);kk = 1;2 = 1:元素个数(数据)jj = 1:numMixesPerInstance lambda = max(min((randn./10)+0.5,1),0);查找所有具有不同标签的可用数据。availableData =找到(标签~ =标签(ii));随机选择一个具有不同标签的可用数据。numAvailableData =元素个数(availableData);, numAvailableData idx =兰迪([1]);%的组合。augData{kk} = lambda*data{ii} + (1-lambda)*data{availableData(idx)};指定由lambda随机设置的标签。如果lambda < rand augLabels(kk) = labels(availableData(idx));其他的augLabels (kk) =标签(ii);结束Kk = Kk + 1;结束结束结束

参考文献

[1] Verma, Nishchal K.,等。基于声学信号的空压机智能状态监测《IEEE可靠性汇刊》第65卷第1期。2016年3月,第291-309页。DOI.org (Crossref), doi: 10.1109 / TR.2015.2459684。

[2] Huszar,费伦茨。“混合:依赖数据的数据增强。”推理。2017年11月3日。进入2019年1月15日。https://www.inference.vc/mixup-data-dependent-data-augmentation/

Baidu
map