分类问的是「这是哪一种已知故障?」。异常检测问的是另一个、往往更实用的问题: 这一件听起来正常吗? 它只用正常样本训练, 因此可以用在缺陷罕见、失效模式无法事先穷举, 或者下个月会遇到的故障眼下还没发生过的产线上。
| 情形 | 分类 | 异常检测 |
|---|---|---|
| 故障类型已知且可标注 | 首选 | 可用,但给出的信息更少 |
| 缺陷样本极其稀少 | 困难 —— 没有足够的例子可学 | 首选 |
| 必须抓住未知或全新的失效模式 | 训练集里没有的都会漏掉 | 首选 —— 任何不像正常的都会报出 |
| 需要指出故障名称,而不只是发现异常 | 首选 | 只能报「异常」 |
自编码器是一种被训练成「先把声音压缩成一个很小的内部表示、再重新还原出来」的网络。 只用正常录音训练之后,它会非常擅长还原正常声音,而对其他一切都很笨拙。 因此,输入与还原之间的差异 —— 即重构误差 —— 对正常件很小,对异常件则很大。
由于正常件彼此也并不完全相同,它们的误差构成一个分布,而不是一个固定数值。 阈值划在该分布的上尾:落在其右侧的都报为异常。
进入第 2 步 —— 训练模型,选择 Python(深度学习),
按 Export Autoencoder Template。把脚本指向存放正常录音的文件夹,
设定输出 .onnx 路径与训练轮数(自编码器从 100 轮起步比较合适),即可开始。
data\
Normal\
unit_0001.wav
unit_0002.wav
unit_0003.wav
...
每段录音被转换为 Mel 频谱图(64 个 Mel 带 × 128 帧),网络学习将其复现。 由于只有一个类别,完全不需要标注工作 —— 收集确认合格的单件就是全部的数据准备。
训练结束时,脚本会测量每一个训练样本的重构误差,并按
均值 + 3 × 标准差得出阈值。该阈值以同名加
.meta.json 后缀的小 JSON 文件写在模型旁边:
{
"threshold": 0.004120,
"mean_error": 0.001850,
"std_error": 0.000757,
"n_samples": 240
}
加载模型时会自动读取该文件,因此检测器一上来就已按您的产线校准好。 把模型复制到别的机器时,请连同这个文件一起复制。 阈值之后可以调整,以在两类错误之间取舍:
| 调整 | 效果 | 什么时候这么做 |
|---|---|---|
| 调低(如 均值 + 2σ) | 抓住更多缺陷,误报增加 | 漏检代价高、复检成本低 |
| 默认(均值 + 3σ) | 均衡的起点 | 首次部署、尚无现场数据时 |
| 调高(如 均值 + 4σ) | 误报减少,漏检增加 | 报警太多,操作者已开始无视 |
每个被分析的样本会返回:
Normal 或 ANOMALY值得长期跟踪的是 Z 值。z = 3.1 的单件只是刚刚越线,值得听一听; z = 15 的单件则与训练中见过的一切都相差极远。 把一个班次内所有单件的 Z 值画成趋势,往往能在单件真正开始失效之前就发现漂移。
Insert 目录中还提供一个更轻量的检测器:AI Anomaly Score(AI 异常度得分)。 它不需要神经网络,也不需要训练过程。 它逐帧计算一个 14 维特征向量 —— 8 个时域描述量(RMS、峭度、峰值因子、波形因子、 脉冲因子、裕度因子、能量熵、过零率)与 6 个频域描述量(谱质心、谱扩展度、谱平坦度、 谱峰值因子、谱熵、谱滚降点)—— 再以标准差为单位,衡量每一帧偏离基线的程度。
这个量纲很直观:与基线完全一致的帧得 0 分;每一维都偏离一个标准差的帧,恰好得 1 分。 输出是一条随时间变化的得分曲线,并在超过阈值处给出报警, 因此您能看到异常出现在录音的什么时刻,而不只是知道它存在。
基线有三个来源,按优先级排列:
| 基线来源 | 含义 | 用于 |
|---|---|---|
| 基线统计文件 | 此前在合格件上拟合并保存的基线 | 按固定参照对产线做筛查 |
| 录音开头 N 秒 | 以文件开头一段定义「正常」 | 磨合监测、试验过程中的劣化 |
| 整个文件(默认) | 录音以自身为参照 | 在一段录音中找出相对最反常的片段 |
拟合好的基线可导出为 JSON 文件并在日后重新加载 —— 这正是让整台试验台(乃至多台试验台)按同一参照判定的做法。 默认以 2048 点窗、1024 点帧移、汉宁窗逐帧分析; 报告的单值取得分曲线的 95 分位,使短促瞬态不至于主导整体结论。
© 2026 Deepsona. All Rights Reserved.