共计 2808 个字符,预计需要花费 8 分钟才能阅读完成。
异样检测次要指标是将异样事件与失常事件辨别开来,因而才有了“异样”一词。本文将介绍基于声音信号的工业机械异样检测,应用的数据集是 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_mels
if 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].T
return features
一旦提取了特色并创立了由失常声音组成的数据集,下一步就是设计主动编码器模型架构。
def autoencoder_baseline(input_dims):
#input layer
inputLayer = Input(shape=(input_dims,))
#Encoder block
x = Dense(128, activation="relu")(inputLayer)
x = Dense(64, activation="relu")(x)
#Latent space
x = Dense(32, activation="relu")(x)
#Decoder block
x = Dense(64, activation="relu")(x)
x = Dense(128, activation="relu")(x)
#Output layer
x = Dense(input_dims, activation=None)(x)
#Create and return the model
return Model(inputs=inputLayer, outputs=x)
而后应用筹备好的数据集训练创立的模型,如下所示。
#Set model parameters
#Shape of the input data
input_shape = n_mels*frames
#Loss function
model_loss = 'mean_squared_error'
#Optimizer learning rate
lr = 1e-3
#Batch size and number of epochs to train the model
batch_size = 512
epochs = 30
#Create the baseline model and compile it with the hyperparameters
baseline_model = autoencoder_baseline(input_shape)
baseline_model.compile(loss=model_loss,
optimizer=Adam(learning_rate=lr))
#Model training
baseline_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 support
Normal 0.73 0.78 0.76 120
Anomaly 0.77 0.72 0.74 120
accuracy 0.75 240
macro avg 0.75 0.75 0.75 240
weighted avg 0.75 0.75 0.75 240
能够看到成果还是和不错的,F1 值曾经达到了 0.75.
总结
本文的残缺代码能够在上面给出的 github 链接中拜访。
https://avoid.overfit.cn/post/97d547d5df8e4d6daf7368ef73a9bc6e
作者:Naveed