论文题目:MIMII DATASET: SOUND DATASET FOR MALFUNCTIONING INDUSTRIAL MACHINE INVESTIGATION AND INSPECTION
1 摘要
2 背景介绍
3 录制环境与相关设置
4 数据集内容
5 实验
6 数据读取
工厂机器容易出现故障或故障,给公司带来巨大损失。因此,利用包括麦克风在内的不同传感器进行机器监控正受到越来越多的关注。在科学界,公开数据集的出现推动了声音场景和事件的检测与分类研究,但在真实的工厂环境中,针对工业机器在正常和异常运行状态下的声音数据集却不存在。在本文中,我们提供了一个新的工业机器声音数据集,称为“用于工业机器故障调查和检查的声音数据集”(MIMII数据集)。该数据集为不同类型工业机器(即阀门、泵、风机和滑轨)记录了正常声音,并为了模拟真实场景,还记录了各种异常声音(如污染、泄漏、旋转不平衡和轨道损坏等)。发布MIMII数据集的目的是帮助机器学习和信号处理社区开发自动设施维护技术。
对机器自动检查的需求日益增长,这源于对工厂设备维护质量提升的迫切需求。目前,发现机器故障的部件主要依赖于现场工程师的经验,但由于检查需求的增加导致现场专家短缺。因此,迫切需要一种高效且经济的解决方案来解决这个困境。
在过去的十年里,工业物联网(Industrial IoT)和数据驱动技术已经彻底改变了制造业,并且尝试了多种方法来监测机器的状态,例如基于振动传感器的方法[1-4]、基于温度传感器的方法[5]和基于压力传感器的方法[6]。另一种方法是利用声音场景分类和事件检测技术从声音中检测异常[7-13]。目前在声音场景分类和事件检测方面已经取得了显著进展,并且有许多前沿研究[14-16]。显然,众多开放基准数据集[17-20]的出现对于推动研究领域的发展至关重要。然而,据我们所知,目前还没有包含真实工厂环境中不同类型机器声音的公开数据集。在本文中,我们介绍了一个新的数据集,该数据集包含真实工厂环境中机器在正常和异常运行条件下的声音。我们收集了四种不同类型机器的声音——(i)阀门、(ii)泵、(iii)风机和(iv)滑轨——并且对于每种类型的机器,我们考虑了七种不同的产品型号。我们假设主要任务是在无监督学习的情况下,在10秒的声音片段中发现机器的异常状况。换言之,在训练阶段只能使用正常机器声音,而在测试阶段要正确区分正常机器声音和异常机器声音。
数据集采用System In Frontier[21]公司生产的TAMAGO-03麦克风收集,它是一个包含八个麦克风的环形阵列,可评估单通道和多通道方法,其细节如图1所示。麦克风阵列距离机器50厘米(在阀门案例中为10厘米),录制10秒的声音片段。数据集包含每个片段的八个通道。图2描述了每种机器的方向和距离的记录设置。在运行状态下,机器声音以16位音频信号形式在混响环境中以16kHz采样率录制。此外,还连续录制了多个真实工厂中的背景噪音,并将其与目标机器声音混合以模拟真实环境,背景噪音使用与目标机器相同的麦克风阵列录制。
图1 圆形麦克风阵列
图2 记录数据集的实验装置示意
MIMII数据集包含四种不同类型机器的声音:阀门、泵、风机和滑轨。阀门是反复开关的电磁阀;泵是排水并连续向水池注水的水泵;风机是用于在工厂中提供连续气体或空气流动的工业风机;滑轨则是由移动平台和底座组成的线性滑动系统。各种机器产生的声音具有平稳和非平稳特性,特征各异且难度不同。图3展示了所有四种类型机器声音的功率谱图,清楚地表明每种机器具有独特的声音特征。
图3 6dB信噪比下正常条件的功率谱图
表1列出了每种机器类型的声音文件列表。每种机器类型包括七台 独立的机器,它们可能是不同的产品型号。为了有效训练模型,需要包含现实复杂性的大型数据集,因此我们为所有单个机器录制了总计26,092个正常声音片段。此外,还考虑了每种机器的不同现实异常情况:污染、泄漏、旋转不平衡、轨道损坏等。各种运行状况列于表2中。每种不同类型机器的每个异常声音片段数量较少,因为我们把数据集的主要目标视为无监督学习场景,并将异常片段视为测试数据的一部分。如第2节所述,在多个真实工厂中录制了背景噪音,并将其与目标机器声音混合,以模拟真实环境。在将原始声音与噪音混合时,八个通道是分别处理的。对于某个信噪比(SNR)γ dB,通过以下步骤创建每种机器模型的噪音混合数据:
1. 计算机器模型所有片段的平均功率 a;
2. 对于机器模型的每个片段 i:
(a) 随机选择一个背景噪音片段j,并调整其功率bj,使得
(b) 通过将目标机器片段i 和功率调谐后的背景噪音片段 j 相加,计算得到噪音混合数据。
表1 MIMII数据集内容细节
表2 运行和异常状况列表
本节介绍了一个基准测试的示例。主要目标是在无监督学习场景中检测异常声音。一些研究已经成功地将自编码器用于无监督异常检测[12,22–24],因此在这里评估一种基于自编码器的无监督异常检测器。
仅使用麦克风的第一个通道(图1中的"1号")。将log-Mel(对数梅尔)谱图视为输入特征。为了计算Mel频谱图,在该实验中考虑了1024的帧大小、512的跳跃大小和64个Mel滤波器。五个帧被组合起来,用以初始化输入特征向量x(320维)。编码器和解码器神经网络的参数(即θ=(θe,θd))被训练用以最小化给定的损失函数:
我们的基本假设是,这个训练好的模型对异常机器声音将具有较高的重构误差。实验中使用的自编码器网络结构总结如下:编码器网络(E(·))包括FC(Input, 64, ReLU);FC(64, 64, ReLU);以及FC(64, 8, ReLU),而解码器网络(D(·))包含FC(8, 64, ReLU);FC(64, 64, ReLU);以及FC(64, Output, none),其中FC(a, b, f)表示一个全连接层,有a个输入神经元,b个输出神经元,以及激活函数f。ReLUs是指修正线性单元[25]。该网络通过Adam[26]优化技术训练50个周期。
对于每种机器类型和模型ID,所有片段被分为训练数据集和测试数据集。所有异常片段被视为测试数据集,随机选择相同数量的正常片段作为测试数据集的一部分,其余所有正常片段则被视为训练数据集。通过仅由正常样本组成的训练数据集,针对每种机器类型和模型ID训练了不同的自编码器。通过对每个片段在10秒内平均重构误差设定阈值来执行异常检测,并为每种机器类型和模型ID的测试数据集计算了曲线下面积(AUC)值。此外,我们还考虑了不同信噪比水平(与工厂噪声相关):例如,6dB、0dB和−6dB。
表3列出了三次独立初始化训练的平均AUC。很明显,阀门的AUC低于其他机器。阀门的声音信号是非平稳的——特别是,它们在时间上是脉冲式的和稀疏的——并且随时间推移平均的重建误差往往很小,这使得检测阀门的异常变得困难。相比之下,风机的异常更容易检测,因为风扇的声音信号是平稳的。此外,对于某些机器型号,AUC随着噪声水平的增加而迅速下降。这些结果表明,我们需要解决非平稳性和噪声引起的性能下降问题以实现无监督的异常声音检测。
表3 运行和异常状况列表
import os
import librosa
import seaborn as sns
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib import rcParams
config = {
"font.family": 'serif', # 衬线字体
"font.size": 15, # 相当于小四大小
"font.serif": ['SimHei'], # 宋体
"mathtext.fontset": 'stix', # matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
'axes.unicode_minus': False # 处理负号,即-号
}
rcParams.update(config)
def load_sound_file(wav_name, mono=False, channel=0):
"""
加载音频文件并提取指定声道的数据。
参数:
wav_name (str): 音频文件的路径。
mono (bool): 是否将音频转换为单声道。默认为 False。
channel (int): 如果音频是多声道且 mono=False,指定要提取的声道索引。默认为 0。
返回:
signal (numpy.ndarray): 提取的音频信号数据。
sampling_rate (int): 音频的采样率。
"""
channel_data, sampling_rate = librosa.load(wav_name, sr=None, mono=mono)
signal = np.array(channel_data)[channel, :]
return signal, sampling_rate
绘制正常信号与异常信号对比(以水泵信号为例):
def plot_waveforms(normal_signal, anomaly_signal, sr, title="Signal Waveforms"):
"""
绘制正常信号和异常信号的波形图。
参数:
normal_signal (array-like): 正常信号的波形数据。
anomaly_signal (array-like): 异常信号的波形数据。
sr (int): 采样率。
title (str): 图表的标题,默认为 "Signal Waveforms"。
"""
sns.set_theme(style="white", font_scale=1.2)
plt.figure(figsize=(8, 5), dpi=100)
librosa.display.waveshow(normal_signal, sr=sr, label="Normal Signal", alpha=0.8, color='blue', linewidth=1.5)
librosa.display.waveshow(anomaly_signal, sr=sr, label="Anomaly Signal", alpha=0.8, color='red', linewidth=1.5)
plt.title(title, fontsize=16, fontweight='bold')
plt.xlabel("Time (sec)", fontsize=14)
plt.ylabel("Amplitude", fontsize=14)
plt.legend(fontsize=12, loc="upper right", framealpha=0.8)
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()
编辑:肖鑫鑫