主要内容

基于小波散射的空压机故障检测

这个例子展示了如何使用小波散射网络和支持向量机(SVM)对空压机声学记录中的故障进行分类。金宝app该示例提供了使用GPU加速小波散射变换计算的机会。如果您希望使用GPU,您必须拥有并行计算工具箱™和受支持的GPU。金宝app看到GPU计算要求(并行计算工具箱)获取详细信息。

术语说明:在小波散射的背景下,术语“时间窗口”指的是对平滑操作的输出进行下采样后获得的样本数量。有关更多信息,请参见时间窗口

数据集

数据集由单级往复式空气压缩机所收集的声学记录组成[1].数据以16千赫采样。空压机的规格如下:

  • 气压范围:0-500 lb/m2, 0-35 Kg/cm2

  • 感应电机:5HP, 415V, 5Am, 50hz, 1440rpm

  • 压力开关:PR-15型,范围100- 213psi

每个记录表示8个状态中的一个,其中包括健康状态和7个错误状态。故障状态有7种:

  1. 进气阀(LIV)故障

  2. 出漏阀故障

  3. NRV故障

  4. 活塞环故障

  5. 飞轮的错

  6. 骑带故障

  7. 轴承故障

下载数据集并将数据文件解压缩到您有写权限的文件夹中。本示例假设您正在下载指定为的临时目录中的数据tempdir在MATLAB®。如果您选择使用不同的文件夹,请将该文件夹替换为tempdir在下面。录音以.wav文件的形式存储在以其各自状态命名的文件夹中。

url =“//www.tatmou.com/金宝appsupportfiles/audio/AirCompressorDataset/AirCompressorDataset.zip”;下载文件夹= fullfile(tempdir,“AirCompressorDataSet”);如果~ (fullfile (tempdir,存在“AirCompressorDataSet”),“dir”) loc = websave(下载文件夹,url);解压缩(loc fullfile (tempdir“AirCompressorDataSet”))结束

使用一个audioDatastore管理数据访问。每个子文件夹只包含指定类的记录。使用文件夹名作为类标签。

datasetLocation = fullfile(tempdir,“AirCompressorDataSet”“AirCompressorDataset”);ads = audioDatastore(datasetLocation,“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

检查每节课的例题数量。每节课有225个录音,共计1800个录音。

countcats (ads.Labels)
ans =8×1225 225 225 225 225 225 225

将数据分成训练集和测试集。用80%的数据进行训练,剩下的20%进行测试。在拆分之前对数据进行一次洗牌。

rng默认的广告= shuffle(广告);[adsTrain,adsTest] = splitEachLabel(ads,0.8,0.2);

验证每个类中的示例数量是否为预期的数量。

uniqueLabels =唯一的(adsTrain.Labels);tblTrain = countEachLabel(adsTrain);tblTest = countEachLabel(adsTest);H = bar(uniqueLabels,[tblTrain.]计数,tblTest。数),“堆叠”);传奇(H, [“训练集”“测试集”),“位置”“NorthEastOutside”

从训练集中随机选取一些样本进行绘图。每条记录都有5万个以16千赫采样的样本。

idx = randperm(numel(adsTrain.Files),8);Fs = 16e3;n = 1:数字(idx) x = audioread(adsTrain.Files{idx(n)});t = (0:size(x,1)-1)/Fs;次要情节(4 2 n);情节(t, x);如果N == 7 || N == 8 xlabel(“秒”);结束标题(string (adsTrain.Labels (idx (n))));结束

小波散射网络

根据数据特征构造小波散射网络。设置不变性尺度为0.5秒。

N = 5e4;Fs = 16e3;Is = 0.5;小波散射(“SignalLength”N“SamplingFrequency”Fs,...“InvarianceScale”, 0.5);

通过这些网络设置,每个示例有330个散射路径和25个时间窗口。您可以通过下面的代码看到这一点。

[~,numpaths] = paths(sn);nfs = numCoefficients(sn);总和(numpaths)
Ans = 330
Ncfs
Ncfs = 25

注意,这已经表示每个记录的数据大小减少了6倍。我们将数据大小从50,000个样本减少到8250个样本。在这种情况下,我们通过对时间窗口进行6倍的子抽样来进一步减少,将每个示例的大小减少25倍。

得到训练集和测试集的小波散射特征。如果你有一个合适的GPU和并行计算工具箱,你可以设置useGPU真正的加速散射变换。这个函数helperBatchScatFeatures得到散射变换并对时间窗口进行6倍的子采样。

批量大小= 64;useGPU = false;scTrain = [];hasdata(adsTrain) sc = helperBatchScatFeatures(adsTrain,sn,N,batchsize,useGPU);scTrain = cat(3,scTrain,sc);结束

对持有的测试集重复该过程。

scTest = [];hasdata(adsTest) sc = helperBatchScatFeatures(adsTest,sn,N,batchsize,useGPU);scTest = cat(3,scTest,sc);结束scTest = gather(scTest);

确定散射路径的数量和时间窗口的数量。有330条散射路径和5个时间窗口。

[Npaths,numTimeWindows,~] = size(scTrain);

重塑训练集和测试集的散射变换,使每一行都是横跨所有330个散射路径的时间窗口。由于在这个下采样小波散射变换中存在5个时间窗口,因此大小为TrainFeatures是5 * 1440———330。类似的,大小TestFeatures是5 * 360———330。

TrainFeatures = permute(scTrain,[2 3 1]);TrainFeatures =重塑(TrainFeatures,[],Npaths,1);TestFeatures = permute(scTest,[2 3 1]);TestFeatures =重塑(TestFeatures,[],Npaths,1);

为了拟合我们的SVM模型,复制标签,以便每一行都有一个标签TrainFeatures

trainLabels = adsTrain.Labels;numTrainSignals = numel(trainLabels);trainLabels = repmat(trainLabels,1,numTimeWindows);trainLabels =重塑(trainLabels',numTrainSignals*numTimeWindows,1);

支持向量机分类

使用带有三次多项式核的多类支持向量机金宝app分类器。将SVM与训练数据进行拟合。

template = templateSVM(...“KernelFunction”多项式的...“PolynomialOrder”3,...“KernelScale”“汽车”...“BoxConstraint”, 1...“标准化”,真正的);分类svm = fitcecoc(...TrainFeatures,...trainLabels,...“学习者”模板,...“编码”“onevsall”“类名”, uniqueLabels);

使用5倍交叉验证确定SVM模型的交叉验证精度。

partitionedModel = crossval(classificationSVM,“KFold”5);validationAccuracy = (1 - kfoldLoss(partitionedModel))*100
validationAccuracy =99.5278

当每个时间窗口单独分类时,交叉验证的准确率在99%以上。这种性能非常好,但是实际的交叉验证精度实际上更高。因为每个示例有五个窗口,所以我们应该使用所有五个时间窗口来分配类标签。有很多方法可以做到这一点,但在这里我们使用的是对五个窗口的简单多数投票。如果没有多数,我们分配类“NoUniqueMode”,并认为这是一个分类错误。

从交叉验证模型中获得类预测,并使用简单多数投票检查准确性。

validationforecasts = kfoldPredict(partitionedModel);TrainVotes = helperMajorityVote(validationforecasts,adsTrain.Labels,uniqueLabels);crossvalAccuracy = sum(TrainVotes == adsTrain.Labels)/numel(adsTrain.Labels)*100;crossvalAccuracy
crossvalAccuracy = 100

交叉验证的准确率接近100%。将模型应用到保留的测试集。使用简单多数投票来分配类标签。

predLabels = predict(classificationSVM,TestFeatures);[TestVotes,TestCounts] = helperMajorityVote(predLabels,adsTest.Labels,uniqueLabels);testAccuracy = sum(TestVotes == adsTest.Labels)/numel(adsTest.Labels)*100;testAccuracy
testAccuracy = 100

在保留测试集上的准确性接近100%,这表明我们的模型可以很好地推广到未见数据。画出困惑图。注意,每个测试示例都生成了一个多数类(唯一模式)。

图confusionchart (adsTest.Labels TestVotes)

总结

在本例中,我们采用小波散射变换结合支持向量机对空压机故障进行分类。散射变换提供了一组健壮的特征,通过这些特征SVM能够实现出色的交叉验证和测试性能。

参考文献

[1]维尔马,尼什查尔·K.,拉胡尔·库马尔·塞瓦库拉,索纳尔·迪克西特和阿尔·萨鲁。基于声学信号的空气压缩机智能状态监测IEEE可靠性汇刊65年,没有。1(2016年3月):291-309。https://doi.org/10.1109/TR.2015.2459684

helperBatchScatFeatures-该函数返回给定输入信号的小波时间散射特征矩阵。散射特征被6倍的下采样。如果useGPU设置为真正的,在GPU上计算散射变换。

函数sc = helperBatchScatFeatures(ds,sn,N,batchsize,useGPU)此函数仅用于支持小波中的示例金宝app%的工具箱。在将来的版本中可能会更改或删除它。从音频数据存储中读取一批数据batch = helperReadBatch(ds,N,batchsize);如果useGPU batch = gpuArray(batch);结束获得散射特征S = sn.featureMatrix(batch,“转换”“日志”);收集(批处理);S =集合(S);对特征进行子抽样sc = S(:,1:6:end,:);结束

helperReadBatch-该函数从数据存储中读取指定大小的批,并以单精度返回输出。输出的每一列都是来自数据存储的单独信号。如果数据存储没有足够的记录,则输出的列可能比批处理大小少。

函数batchout = helperReadBatch(ds,N,batchsize)此函数仅支持小波工具箱示例。金宝app它可能%更改或在将来的版本中删除。% batchout = readReadBatch(ds,N,batchsize),其中ds是数据存储和% ds是数据存储% batchsize是批处理大小Kk = 1;(hasdata(ds)) && kk <= batchsize tmpRead = read(ds);batchout(:,kk) = cast(tmpRead(1:N),“单一”);% #好< AGROW >Kk = Kk +1;结束结束

helperMajorityVote-该函数获得类标签的多数投票。如果没有多数,则返回"NoUniqueMode"并作为错误处理。

函数[ClassVotes,ClassCounts] = helperMajorityVote(predLabels,origLabels,classes)此函数仅支持小波散射示例。金宝app它可能%更改或在将来的版本中删除。如果标签不是分类的,则创建分类数组predLabels = categorical(predLabels);origLabels = categorical(origLabels);%期望predLabels和origLabels都是分类向量Npred =数字(predLabels);Norig =数字(origLabels);Nwin = Npred/Norig;predLabels =重塑(predLabels,Nwin,Norig);ClassCounts = countcats(predLabels);[mxcount,idx] = max(ClassCounts);ClassVotes = classes(idx);tmpsum = sum(ClassCounts == mxcount);ClassVotes(tmpsum > 1) = categorical({“NoUniqueMode”});结束

另请参阅

相关的例子

更多关于