基于声音信号的工业设备异常检测

news/2024/10/18 14:21:49/

异常检测主要目标是将异常事件与正常事件区分开来,因此才有了“异常”一词。本文将介绍基于声音信号的工业机械异常检测,使用的数据集是MIMII声音数据集,该数据集很容易在网上获得。

异常检测的任务可以通过多种方式实现。其中最简单的一种方法是将问题作为监督学习任务,并对正常和异常声音训练分类器。这种方法的问题是异常情况很少,相应地异常类的数据量有限,这样会对分类性能有很大的影响。还有一种无监督学习技术,在不使用标签的情况下就可以进行判断,这种方法使用一种常见的神经网络架构就是自编码器。

自编码器在深度学习中非常流行,并且已经成功地应用于许多任务中,例如噪声去除,数据压缩等。

自编码器

自编码器架构由三个块构成,即编码器块、隐空间和解码器块,如下图所示。模型学习数据的隐藏内部表示,该数据使用比原始数据更低的维度来描述数据集的信息。

异常检测

现在引入了自编码器后,可以利用该模型执行异常检测。首先使用机器在正常状态下运行的声音信号来训练构建的自编码器模型。然后将使用训练好的模型在错误阈值的帮助下执行异常检测。

因为我们这里使用声音数据集,所以需要从原始声音信号中提取特征作。声音的特征提起一般会使用梅尔频谱图。这里使用librosa包完成了如下所示的操作。

 def extract_signal_features(signal, sr, n_mels=64, frames=5, n_fft=1024):# Compute a mel-scaled spectrogram:mel_spectrogram = librosa.feature.melspectrogram(y=signal,sr=sr,n_fft=n_fft,n_mels=n_mels)# Convert to decibel (log scale for amplitude):log_mel_spectrogram = librosa.power_to_db(mel_spectrogram, ref=np.max)# Generate an array of vectors as features for the current signal:features_vector_size = log_mel_spectrogram.shape[1] - frames + 1# Skips short signals:dims = frames * n_melsif features_vector_size < 1:return np.empty((0, dims), np.float32)# Build N sliding windows (=frames) and concatenate them to build a feature vector:features = np.zeros((features_vector_size, dims), np.float32)for t in range(frames):features[:, n_mels * t: n_mels * (t + 1)] = log_mel_spectrogram[:, t:t + features_vector_size].Treturn features

一旦提取了特征并创建了由正常声音组成的数据集,下一步就是设计自动编码器模型架构。

 def autoencoder_baseline(input_dims):#input layerinputLayer = Input(shape=(input_dims,))#Encoder blockx = Dense(128, activation="relu")(inputLayer)x = Dense(64, activation="relu")(x)#Latent spacex = Dense(32, activation="relu")(x)#Decoder blockx = Dense(64, activation="relu")(x)x = Dense(128, activation="relu")(x)#Output layerx = Dense(input_dims, activation=None)(x)#Create and return the modelreturn Model(inputs=inputLayer, outputs=x)

然后使用准备好的数据集训练创建的模型,如下所示。

 #Set model parameters#Shape of the input datainput_shape = n_mels*frames#Loss functionmodel_loss = 'mean_squared_error'#Optimizer learning ratelr = 1e-3#Batch size and number of epochs to train the modelbatch_size = 512epochs = 30#Create the baseline model and compile it with the hyperparametersbaseline_model = autoencoder_baseline(input_shape)baseline_model.compile(loss=model_loss,optimizer=Adam(learning_rate=lr))#Model trainingbaseline_hist = baseline_model.fit(train_data, train_data,batch_size=batch_size,epochs=epochs,verbose=2)

模型的学习曲线如下图所示。从图中可以明显看出,模型损失开始时相当高,但随着训练的进行迅速下降。

模型训练好后就可以用来进行信号重建。这次要重建的信号既包含来自机器的正常声音,也包含异常声音。使用训练后的模型重建正常和异常声音对应的rmse损失使用下图中的直方图来描述。从图中可以明显看出,正常声音的rmse低于异常声音。

结果非常直观,因为模型在训练阶段没有异常声音的数据,这就是相应的rmse高于正常操作声音的原因。

所以我们可以将重构的rmse值与阈值进行比较,进行异常检测。阈值设置为正常声音的平均rmse,因为异常声音的rmse将高于此值。该模型使用标准分类指标进行评估,如精度,召回率,f1分数和准确性,如下所示。

                    precision recall    f1-score   supportNormal       0.73      0.78      0.76       120Anomaly       0.77      0.72      0.74       120accuracy                           0.75       240macro avg       0.75      0.75      0.75       240weighted avg       0.75      0.75      0.75       240

可以看到效果还是和不错的,F1值已经达到了0.75.

总结

本文的完整代码可以在下面给出的github链接中访问。

https://avoid.overfit.cn/post/97d547d5df8e4d6daf7368ef73a9bc6e

作者:Naveed


http://www.ppmy.cn/news/701357.html

相关文章

Gradio库的Gallery模块介绍与select方法详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

ERP重构-SLA子分类账-分布式实现方案

背景 ERP中的GL总账模块&#xff0c;明细数据来源于各个业务模块如库存、成本、应收、应付、费控、资产等&#xff0c;统称为子模块&#xff0c;生成的账叫做子分类账。然而记账的业务逻辑各式各样&#xff0c;但是最终输出都是来源、类型、期间、科目、借贷金额等等关键信息。…

百度大脑人脸离线识别SDK Windows版

今天给大家带来是百度大脑人脸离线识别SDK Windows版&#xff0c;人脸离线识别SDK经过不断的升级迭代&#xff0c;目前已支持Windows版&#xff0c;下面我们来看具体详情&#xff01;   百度大脑人脸离线识别SDK Windows版对多系统平台全方位适配兼容&#xff0c;同时对杂光线…

ALL IN ONE最佳实践方案分享(从硬件到软件全覆盖)

何为ALL IN ONE 在一个电脑上&#xff0c;完成所有IT需求 软路由旁路由nas网络存储windows系统linux系统 一般情况下&#xff0c;这需要2台以上的电脑才可能实现 本篇文章是一个全方位的知识分享&#xff0c;是可以帮助大家从无到有的搭建ALL IN ONE做一个认识型的了解 硬件…

利用ipv6搭建一台服务器

背景 继上次发现ipv6以来由于要实习&#xff0c;一直只是在尝试部分小功能的实现&#xff0c;终于在这个春节假期才有了一大段空闲时间来部署服务器 硬件需求 首先要搭建属于自己的服务器得要有一定的硬件条件&#xff0c;服务器其实就是一台一天24小时开启的计算机&#xf…

C++多线程学习(一、简单概念理解)

目录 多线程 1.并发 2.进程 3.线程 4.并发实现 4.1:多进程实现并发 4.2:单线程&#xff0c;多线程实现并发 5.c中的多线程 简单的多线程示例代码&#xff1a; 多线程 1.并发 两个或多个独立活动同时发生&#xff08;一个程序执行多个独立任务&#xff09; 举例&#xff1a;吃…

【Redis】数据被删除,内存占用还这么大?

【Redis】数据被删除&#xff0c;内存占用还这么大&#xff1f; 操作系统分配给 Redis 的内存有 6GB&#xff0c;通过指标 used_memory_human 发现存储数据只使用了 4GB&#xff0c;为何会这样&#xff1f;为何无法保存数据&#xff1f; 通过 CONFIG SET maxmemory 100mb或者在…

【基础算法】穷举法

穷举法Exhaustive method是使用最广泛、设计最简单&#xff0c;同时最耗时的算法&#xff0c;也被称为暴力法、蛮力法Brute force method。 两数之和 给定一个整数数组array和一个目标值target&#xff0c;请在数组中找出和为目标值target的两个整数&#xff0c;并输出它们在数…