主要内容

Acoustics-Based机器故障识别

在本例中,您开发一个深度学习模型来检测故障在一个空气压缩机使用声学测量。发展模式之后,你打包系统,以便您可以识别断层基于流的输入数据。

数据准备

下载并解压缩空气压缩机数据集[1]。这个数据集由空气压缩机的录音在健康状态或错误的7个州之一。

downloadFolder = matlab.internal.examples.download金宝appSupportFile (“音频”,“AirCompressorDataset / AirCompressorDataset.zip”);dataFolder = tempdir;解压缩数据集(downloadFolder dataFolder) = 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丽芙·203值列表203 NRV 203活塞203 Riderbelt 203
countEachLabel (adsValidation)
ans =8×2表标签数_____ _____轴承22飞轮22健康22丽芙·22值列表22 NRV 22活塞22 Riderbelt 22
adsTrain = shuffle (adsTrain);adsValidation = shuffle (adsValidation);

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

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

时间序列的数据由录音的声学缺陷或健康的空气压缩机。因此,有很强的样本之间的关系。听录音,画出波形。

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

因为相关的样品,您可以使用递归神经网络(RNN)的数据模型。很长一段短期记忆(LSTM)网络是RNN的受欢迎的选择,因为它是旨在避免消失和梯度爆炸。你可以训练网络之前,充分的准备是很重要的数据。通常,最好变换或从单维的信号中提取特征数据,以提供丰富的功能集模型借鉴。

工程特性

下一步是提取一组声学特性作为网络的输入。音频工具箱™可以提取光谱描述符作为输入常用的机器学习任务。你可以提取使用单个函数的特性,或者您可以使用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)抽搐指数= 1:元素个数(adsTrain.Files)数据=阅读(adsTrain);trainFeatures{指数}=(提取(aFE、数据))';结束disp (“训练集的特征提取”+ toc +“秒”。);
特征提取的火车花了15.7192秒。

数据增加

训练集包含一个相对较少的原声录音培训学习模型。一个受欢迎的方法来扩大数据集是使用混合。在混合,增加你的数据集通过混合特性和标签从两个不同的类实例。混合物被新配方[2]标签来自一个概率分布,而不是混合标签。支持函数金宝app,混合,需要培训功能,相关的标签,每个观测的混合数量,然后输出混合和相关的标签。

trainLabels = adsTrain.Labels;numMixesPerInstance =2;(augData抽搐,augLabels] =混合物(trainFeatures, trainLabels numMixesPerInstance);trainLabels =猫(1 trainLabels augLabels);trainFeatures =猫(2 trainFeatures augData);disp (“功能增强的火车”+ toc +“秒”。);
功能增强的火车花了0.16065秒。

生成验证特性

重复验证特性的特征提取。

validationFeatures =细胞(1,元素个数(adsValidation.Files));重置(adsValidation)抽搐指数= 1:元素个数(adsValidation.Files)数据=阅读(adsValidation);validationFeatures{指数}=(提取(aFE、数据))';结束disp (“验证设置了“特征提取+ toc +“秒”。);
特征提取的验证组花了1.6419秒。

火车模型

接下来,定义和培训网络。跳过训练网络,集downloadPretrainedSystem真正的,然后继续下一节

downloadPretrainedSystem =;如果downloadPretrainedSystem downloadFolder = matlab.internal.examples.download金宝appSupportFile (“音频”,“AcousticsBasedMachineFaultRecognition / AcousticsBasedMachineFaultRecognition.zip”);dataFolder = tempdir;解压缩(downloadFolder dataFolder) netFolder = fullfile (dataFolder,“AcousticsBasedMachineFaultRecognition”);目录(netFolder)结束

定义网络

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

numHiddenUnits =One hundred.;dropProb =0.2;层= [sequenceInputLayer (aFE.FeatureVectorLength正常化=“zscore”)lstmLayer (numHiddenUnits OutputMode =“序列”)dropoutLayer (dropProb) lstmLayer (numHiddenUnits OutputMode =“最后一次”)fullyConnectedLayer(元素个数(独特(adsTrain.Labels))) softmaxLayer classificationLayer];

定义网络Hyperparameters

为网络,定义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.Labels},ValidationFrequency = ValidationFrequency);

列车网络的

训练网络,使用trainNetwork

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

评估网络

视图的混乱图表验证数据。

validationResults =分类(airCompNet validationFeatures);confusionchart (validationResults adsValidation.Labels,Title =准确性:“+的意思是(validationResults = = adsValidation.Labels) * 100 +“(%)”);

模型流检测

创建函数来处理数据流循环

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

有许多额外的注意事项需要考虑使系统工作在实际的嵌入式系统。

例如,

  • 率或间隔的分类可以进行准确的结果

  • 网络的大小而言,生成的代码(程序内存)和重量(数据内存)

  • 网络的效率的计算速度

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

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

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

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

结合流媒体特征提取和分类

作为垫文件保存训练网络。

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

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

类型recognizeAirCompressorFault.m
功能分数= recognizeAirCompressorFault (audioIn, rs) %这是流分类器函数持续airCompNet如果isempty (airCompNet) airCompNet = coder.loadDeepLearningNetwork (“AirCompressorFaultRecognitionModel.mat”);如果rs airCompNet = resetState (airCompNet);结束%提取功能使用函数特性= extractAudioFeatures (audioIn);%分类[airCompNet,分数]= predictAndUpdateState (airCompNet、特点);结束

测试流循环

接下来,在MATLAB中测试流分类器。流音频一个框架来表示一个系统,因为它将被部署在一个实时嵌入式系统。这使您能够测量和可视化流实现的时间和精度。

在多个音频文件流和情节对于每一帧的数据输出分类结果。在一个时间间隔的长度等于每个文件,评估分类器的输出。

重置(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);%应用流分类器函数抽搐得分= recognizeAirCompressorFault (x, rs);写(timingBuffer toc);%存储分数进行分析写(scoreBuffer,得分);rs = false;结束重置(audioSource)%为该文件存储类的结果成绩=阅读(scoreBuffer);[~,结果]= max(分数(最终,:),[],2);streamingResults (fileIdx) =分类(标签(结果));随着时间的推移%情节分数比较图绘制(分数)% #好< * NASGU >传奇(字符串(airCompNet.Layers(结束). class),位置=“西北”)包含(“时间步”)ylabel (“分数”)标题(“已知的Label = "+字符串(dataInfo.Label),“预测标签= "+字符串(streamingResults (fileIdx))))结束

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

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

分析了执行时间。上面的状态重置时执行时间通常是32女士预算。然而,在实际部署系统,初始化时间只会发生一次。主循环的执行时间是10毫秒左右,这是远低于32女士预算实时性能。

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

金宝app支持功能

函数[augData, augLabels] =混合物(数据、标签、numMixesPerInstance) augData =细胞(1,元素个数(数据)* numMixesPerInstance);augLabels = repelem(标签,numMixesPerInstance);kk = 1;2 = 1:元素个数(数据)jj = 1: numMixesPerInstanceλ= max (min (randn. / 10) + 0.5 (1), 0);%找到所有可用的数据用不同的标签。availableData =找到(标签~ =标签(ii));%随机选择一个可用的数据用不同的标签。numAvailableData =元素个数(availableData);,numAvailableData idx =兰迪([1]);%的组合。augData {kk} =λ*{2}+(1λ)*数据{availableData (idx)};%指定标签作为随机设定的λ。如果λ<兰德augLabels (kk) =标签(availableData (idx));其他的augLabels (kk) =标签(ii);结束kk = kk + 1;结束结束结束

引用

[1]Verma Nishchal K。,等。基于“智能状态监测用空气压缩机的声学信号。”IEEE Transactions on Reliability, vol. 65, no. 1, Mar. 2016, pp. 291–309. DOI.org (Crossref), doi:10.1109/TR.2015.2459684.

[2]Huszar,费伦茨。“混合:视数据增大。”InFERENCe. November 03, 2017. Accessed January 15, 2019.https://www.inference.vc/mixup-data-dependent-data-augmentation/