
1. 异音检测到底在解决什么问题1.1 从产线真实场景说起我第一次接触异音检测是在一个电机装配车间。产线末端有个工位工人戴着耳机听电机运转的声音判断有没有异响。这个岗位一天要听上千台到了下午耳朵基本就麻了漏检率肉眼可见地往上走。更麻烦的是老师傅和新员工的判断标准不一致同一台电机张三说合格李四说有问题扯皮的事经常发生。异音检测要解决的核心问题就一句话用机器替代人耳对设备运行声音做自动化的异常判别。它属于工业质检里比较特殊的一类因为声音信号和图像信号有本质区别。图像是二维空间信号缺陷位置相对固定声音是一维时序信号异常可能只出现在几十毫秒的瞬间而且背景噪声、工况变化都会干扰判断。这个任务适合谁来做如果你手上有产线音频数据想搭建一套自动判别系统或者你正在做设备预测性维护、产品质量检测相关的项目那这套东西就是你要的。它不要求你是声学专家但需要你对信号处理和深度学习有基本的动手能力。1.2 异音检测和普通音频分类的区别很多人一上来就说这不就是音频分类吗拿个CNN就完事了。我一开始也这么想后来发现完全不是一回事。普通音频分类比如识别十种乐器、判断是不是狗叫类别之间差异明显数据量也大。异音检测面对的是极度不平衡的二分类问题正常样本占99%以上异常样本可能只有几十条而且异常类型五花八门——摩擦声、撞击声、啸叫、周期性咔哒声你很难穷举。更关键的是异音检测通常没有明确的异常类别定义。你只知道这台不对劲但说不清它属于哪一类异常。这就导致两个技术路线分叉一是当成监督分类做二是当成异常检测做。选CNN、Transformer还是AutoEncoder本质上就是在选你走哪条路线。注意在动手选模型之前先确认你的数据里异常样本有多少条。如果少于200条监督分类基本没戏直接考虑AutoEncoder路线。1.3 三类模型在异音检测中的定位我把这三类模型在异音检测里的角色做个类比方便你建立直觉CNN像一个经验丰富的老师傅你给他看过足够多的好声音和坏声音他就能凭局部特征快速判断。擅长捕捉频谱图上的局部纹理模式比如某个频段突然冒出的能量峰。Transformer像一个擅长全局推理的工程师它不只看局部还会关注声音信号中远距离的时间依赖关系。比如一个周期性异响间隔可能是0.5秒Transformer能通过注意力机制把这两个时间点关联起来。AutoEncoder像一个只学过正常的质检员它没见过异常但它对正常声音的重构能力很强。来一个声音如果重构误差大就说明这声音不正常。这是无监督路线专门对付异常样本少的情况。这三者不是互斥的实际项目中我经常把它们组合使用。下面我会逐个拆解把选型逻辑、实操细节和踩过的坑都讲清楚。2. 数据准备与特征工程模型选型的前置条件2.1 音频采集的硬性要求在讨论模型之前必须先说采集。我见过太多项目模型调了半天效果上不去最后发现是麦克风选错了或者采样率不够。异音检测的音频采集有几个硬指标参数推荐值说明采样率44.1kHz或48kHz低于16kHz会丢失高频异音信息位深24bit16bit在低幅值段量化噪声明显麦克风类型驻极体或MEMS频响平坦避免动圈麦克风的低频染色采集距离固定10-30cm距离变化会导致幅值波动影响模型环境噪声45dB(A)必要时加隔音罩采样率为什么不能低很多异音的能量集中在8kHz到16kHz比如轴承的早期磨损啸叫。如果你用16kHz采样根据奈奎斯特定理最高只能还原8kHz的信号这部分信息直接丢了。我实测过同一个电机异音48kHz采样下CNN的AUC能到0.96降到16kHz直接掉到0.82。实操心得如果产线环境噪声大不要急着上降噪算法。先把麦克风靠近声源用物理方式提高信噪比比任何软件降噪都管用。2.2 从波形到频谱图时频变换的选择原始音频是一维时序波形直接喂给模型效果通常不好。标准做法是转成时频表示最常用的是**短时傅里叶变换STFT**得到的频谱图。STFT有两个关键参数窗长和帧移。窗长决定频率分辨率帧移决定时间分辨率。这两个是矛盾的——窗越长频率分辨率越高但时间分辨率越差。对于异音检测我的经验值是窗长1024或2048个采样点。48kHz采样下2048点对应约42.7ms频率分辨率约23.4Hz。帧移窗长的1/4到1/2。我通常用512点对应约10.7ms的帧移保证时间轴上有足够的细节。窗函数Hann窗。它旁瓣衰减快能减少频谱泄漏。计算一下48kHz采样2048点窗长帧移512点1秒音频会产生 (48000-2048)/512 1 ≈ 90帧。每帧1024个频率bin取一半最终得到一个90×1024的频谱图。这个尺寸对CNN来说偏大通常还要做Mel滤波降维。2.3 Mel频谱图与对数变换人耳对频率的感知不是线性的低频敏感、高频迟钝。Mel刻度就是模拟这种特性。把线性频谱图通过Mel滤波器组映射到Mel刻度再取对数得到Log-Mel频谱图。参数选择Mel滤波器数量64或128。我一般用128信息保留更完整。频率范围0到采样率的一半。但实际有效信息通常在前16kHz可以截断。对数底数自然对数或10为底都行影响的是数值范围对模型影响不大。经过Mel滤波后90×1024的频谱图变成90×128。这个尺寸就友好多了CNN可以直接处理。注意做对数变换前要加一个很小的常数如1e-6防止log(0)出现负无穷。这个坑我踩过训练时loss直接变NaN排查了半天。2.4 数据增强策略异音检测的数据通常不够增强是必须的。但音频增强和图像增强不一样不能随便翻转旋转。我常用的几种时间平移把音频整体前后移动一小段。模拟的是触发时刻的微小差异。加性噪声混入低幅值的背景噪声。模拟的是产线环境波动。信噪比控制在20-30dB。频率掩蔽在Mel频谱图上随机遮挡几个频段。这是SpecAugment的思路强迫模型不依赖单一频段。时间掩蔽随机遮挡几个时间帧。模拟的是瞬时干扰。速度扰动轻微改变播放速度0.9到1.1倍。模拟的是转速波动。增强的力度要控制。我试过把增强开太大结果模型在验证集上表现很好一到产线就崩。后来发现是增强后的数据和真实分布偏离太远。增强的目的是覆盖真实变化不是创造新分布。3. CNN方案局部特征提取的主力选手3.1 为什么CNN适合异音检测CNN的核心能力是局部感受野加权值共享。在频谱图上一个局部区域对应的是某个时间段内某个频段的能量分布。异音的典型表现是什么就是某个频段突然出现异常能量或者某个频率附近出现规律性的调制。这些模式都是局部的CNN的卷积核正好能捕捉。比如一个3×3的卷积核在Mel频谱图上滑动能检测到相邻频率bin同时出现能量突变这种模式这往往对应摩擦或撞击类异音。权值共享带来的好处是参数量少。一个处理128×90频谱图的CNN参数量可以控制在几十万级别训练数据需求相对小。这对工业场景很重要因为异常样本本来就少。3.2 网络结构设计要点我常用的CNN结构是这样的import torch import torch.nn as nn class AudioCNN(nn.Module): def __init__(self, num_classes2): super().__init__() self.features nn.Sequential( # 输入: 1 x 128 x 90 (Mel x Time) nn.Conv2d(1, 32, kernel_size3, padding1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(2), # 64 x 45 nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2), # 32 x 22 nn.Conv2d(64, 128, kernel_size3, padding1), nn.BatchNorm2d(128), nn.ReLU(), nn.AdaptiveAvgPool2d((4, 4)), # 128 x 4 x 4 ) self.classifier nn.Sequential( nn.Flatten(), nn.Linear(128 * 4 * 4, 256), nn.ReLU(), nn.Dropout(0.5), nn.Linear(256, num_classes) ) def forward(self, x): x self.features(x) return self.classifier(x)几个设计决策的理由BatchNorm放在ReLU之前这是标准做法加速收敛。我试过放在之后训练初期loss震荡明显。MaxPool逐步降维频谱图的空间维度很大需要逐步压缩。但不要一次降太多否则丢失细节。AdaptiveAvgPool替代全连接层的全局池化减少参数量同时让模型适应不同长度的输入。Dropout 0.5异音检测数据少过拟合是头号敌人。Dropout是最简单有效的正则化。3.3 训练策略与超参数CNN训练有几个关键点学习率初始用1e-3配合余弦退火。我试过固定学习率后期loss下降很慢。余弦退火能让模型在后期精细调整。优化器AdamW。比Adam多了权重衰减的解耦泛化更好。权重衰减系数用1e-4。批次大小32或64。太小梯度噪声大太大泛化差。如果显存够64是个稳妥选择。类别不平衡处理这是异音检测的核心问题。正常样本远多于异常样本模型会倾向于预测正常。解决方案加权交叉熵异常类的权重设为正常类的5-10倍。焦点损失Focal Loss降低易分类样本的权重让模型关注难样本。过采样对异常样本做重复采样配合强增强。我一般先用加权交叉熵如果效果不够再上Focal Loss。早停验证集AUC连续10个epoch不提升就停。异音检测的验证集通常很小波动大早停能防止过拟合。3.4 CNN方案的局限与应对CNN不是万能的。它的局限在于感受野有限。标准CNN的深层感受野虽然理论上能覆盖整个输入但实际有效感受野要小得多。这意味着它很难捕捉长距离的时间依赖。举个例子一个异音表现为每0.5秒出现一次咔哒声持续3秒。CNN可能只能看到单个咔哒声的局部模式但无法建模每隔0.5秒重复这个周期性。而这个周期性恰恰是区分某些异音类型的关键。应对方法有两个一是用空洞卷积扩大感受野二是用更深的网络。但更深的网络训练更难数据需求更大。这时候就该考虑Transformer了。4. Transformer方案全局依赖建模的进阶选择4.1 Transformer处理音频的基本思路Transformer原本是为NLP设计的核心是自注意力机制。它把输入序列的每个位置都和其他所有位置做注意力计算从而捕捉全局依赖。用在音频上有两种主流做法第一种频谱图分块。把Mel频谱图切成固定大小的patch每个patch展平成一个向量加上位置编码送入Transformer编码器。这是Vision Transformer的思路适合捕捉频谱图上的全局模式。第二种时序帧序列。把每一帧的Mel特征作为一个token整个音频变成帧序列送入Transformer。这种方式更直接地建模时间依赖。我两种都试过。对于异音检测第一种更适合因为异音的特征往往同时涉及频率和时间两个维度分块能保留二维结构信息。4.2 位置编码的关键作用Transformer本身没有位置概念所有token是并行处理的。位置编码是必须的否则模型分不清哪个帧在前哪个帧在后。标准做法是正弦位置编码import math import torch import torch.nn as nn class PositionalEncoding(nn.Module): def __init__(self, d_model, max_len500): super().__init__() pe torch.zeros(max_len, d_model) position torch.arange(0, max_len).unsqueeze(1).float() div_term torch.exp( torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model) ) pe[:, 0::2] torch.sin(position * div_term) pe[:, 1::2] torch.cos(position * div_term) self.register_buffer(pe, pe.unsqueeze(0)) def forward(self, x): return x self.pe[:, :x.size(1)]对于音频位置编码的尺度很重要。如果音频很长比如10秒900帧正弦编码的高频部分会变化很快模型可能学不到有效的相对位置信息。这时候可以考虑可学习的位置编码或者用相对位置编码。实操心得我做过对比在异音检测任务上可学习位置编码比正弦编码的AUC高约1.5个百分点。但可学习编码需要更多数据如果数据少于1000条还是用正弦编码稳妥。4.3 轻量Transformer的实用配置标准Transformer太大了音频任务用不起。我通常用轻量配置参数推荐值说明d_model128或256嵌入维度太大容易过拟合nhead4或8注意力头数d_model必须能被nhead整除num_layers4或6编码器层数超过6层收益递减dim_feedforward512或1024前馈网络隐藏层维度通常是d_model的4倍dropout0.1注意力dropout防止过拟合一个实用的音频Transformerclass AudioTransformer(nn.Module): def __init__(self, n_mels128, d_model256, nhead8, num_layers4, num_classes2): super().__init__() # 把Mel频段投影到d_model self.input_proj nn.Linear(n_mels, d_model) self.pos_enc PositionalEncoding(d_model) encoder_layer nn.TransformerEncoderLayer( d_modeld_model, nheadnhead, dim_feedforward1024, dropout0.1, batch_firstTrue ) self.encoder nn.TransformerEncoder( encoder_layer, num_layersnum_layers ) self.classifier nn.Sequential( nn.LayerNorm(d_model), nn.Linear(d_model, num_classes) ) def forward(self, x): # x: (batch, time, n_mels) x self.input_proj(x) x self.pos_enc(x) x self.encoder(x) # 全局平均池化 x x.mean(dim1) return self.classifier(x)4.4 Transformer的训练难点与技巧Transformer训练比CNN难主要有几个原因对学习率敏感。Transformer需要warmup前几百步学习率从0线性增加到峰值然后再衰减。我试过不用warmup训练初期loss直接爆炸。对批次大小敏感。Transformer的BatchNorm效果不好通常用LayerNorm。LayerNorm对批次大小不敏感但批次太小梯度噪声大。建议批次至少32。数据需求大。自注意力机制参数量大需要更多数据才能学好。如果异常样本只有几十条Transformer很容易过拟合。这时候要么用预训练模型微调要么回到CNN或AutoEncoder。计算资源。Transformer的训练和推理都比CNN慢。同样长度的音频Transformer的推理时间可能是CNN的3-5倍。如果产线要求实时检测要慎重考虑。注意如果你的产线节拍是每台设备几秒钟Transformer的推理延迟可能成为瓶颈。我建议先做推理速度测试再决定是否上Transformer。5. AutoEncoder方案小样本异常检测的利器5.1 为什么AutoEncoder适合异常样本少的场景AutoEncoder的核心思想是重构。它只学习正常样本的分布把正常声音压缩成低维编码再重构回原始频谱图。训练目标是让重构误差最小。推理时正常样本的重构误差小异常样本的重构误差大。设定一个阈值超过就判为异常。这个思路的妙处在于你不需要异常样本。产线上正常样本要多少有多少异常样本可能几个月才出现一次。AutoEncoder完美匹配这个场景。我做过一个项目轴承异音检测异常样本只有23条。CNN和Transformer都过拟合得厉害验证集AUC只有0.7左右。换成AutoEncoderAUC直接到0.93。这不是说AutoEncoder更强而是它更适合这个数据条件。5.2 网络结构从频谱图到瓶颈层AutoEncoder的结构是编码器-瓶颈层-解码器。对于频谱图我通常用卷积AutoEncoderclass AudioAutoEncoder(nn.Module): def __init__(self, latent_dim64): super().__init__() # 编码器 self.encoder nn.Sequential( nn.Conv2d(1, 32, 3, stride2, padding1), # 64x45 nn.BatchNorm2d(32), nn.ReLU(), nn.Conv2d(32, 64, 3, stride2, padding1), # 32x22 nn.BatchNorm2d(64), nn.ReLU(), nn.Conv2d(64, 128, 3, stride2, padding1), # 16x11 nn.BatchNorm2d(128), nn.ReLU(), nn.AdaptiveAvgPool2d((4, 4)), nn.Flatten(), nn.Linear(128 * 4 * 4, latent_dim) ) # 解码器 self.decoder nn.Sequential( nn.Linear(latent_dim, 128 * 4 * 4), nn.ReLU(), nn.Unflatten(1, (128, 4, 4)), nn.ConvTranspose2d(128, 64, 3, stride2, padding1, output_padding1), nn.BatchNorm2d(64), nn.ReLU(), nn.ConvTranspose2d(64, 32, 3, stride2, padding1, output_padding1), nn.BatchNorm2d(32), nn.ReLU(), nn.ConvTranspose2d(32, 1, 3, stride2, padding1, output_padding1), nn.Sigmoid() ) def forward(self, x): z self.encoder(x) return self.decoder(z)几个关键设计瓶颈层维度64或128。太小重构不好太大容易把异常也重构好。我一般从64开始试。Sigmoid输出如果输入做了归一化到[0,1]输出用Sigmoid。如果输入是标准化到均值0方差1输出不用激活函数。跳跃连接可以考虑加U-Net式的跳跃连接提升重构质量。但要注意跳跃连接太强会让异常也被重构好降低检测灵敏度。5.3 异常评分的计算与阈值设定训练好AutoEncoder后异常评分通常用重构误差def anomaly_score(model, x): with torch.no_grad(): x_recon model(x) # 逐样本计算MSE mse torch.mean((x - x_recon) ** 2, dim[1, 2, 3]) return mse但单纯的MSE有个问题它对所有频率和时间位置一视同仁。实际上异音往往集中在特定频段。改进方法是加权重构误差对高频段或已知敏感频段加大权重。阈值设定是另一个关键。常用方法百分位数法在正常验证集上计算重构误差取95%或99%分位数作为阈值。均值加标准差阈值 均值 k × 标准差k通常取3。极值理论用广义帕累托分布拟合尾部分布更严谨但复杂。我一般先用百分位数法快速验证如果效果稳定再考虑极值理论。实操心得阈值不要设得太死。产线环境会变化夏天和冬天的背景噪声都不一样。我建议阈值留10%的余量宁可误报多一点也别漏检。5.4 AutoEncoder的变体与改进标准AutoEncoder有几个变体值得尝试变分AutoEncoderVAE编码器输出均值和方差从正态分布采样。VAE的潜在空间更规整重构误差的分布更稳定。但VAE的重构质量通常不如标准AE需要权衡。去噪AutoEncoderDAE训练时给输入加噪声让模型学习去噪。这能提升模型对背景噪声的鲁棒性。我试过在输入上加高斯噪声信噪比20dB效果不错。记忆增强AutoEncoderMemAE在瓶颈层加一个记忆矩阵模型只能通过记忆中的正常模式重构。异常样本因为不在记忆里重构误差会更大。这个方法在异常检测上表现很好但实现复杂一些。时序AutoEncoder如果异音的时间模式很重要可以用LSTM或GRU做编码器和解码器直接处理时序帧序列。但训练更慢数据需求也更大。6. 三类模型的横向对比与选型决策6.1 性能对比我实测的数据我在同一个数据集上跑了三类模型数据集是电机异音检测正常样本5000条异常样本120条。Mel频谱图128×90训练集/验证集/测试集按7:1.5:1.5划分。模型AUCF1推理延迟(ms)参数量CNN0.940.8780.5MTransformer0.960.90352.1MAutoEncoder0.930.8560.8M从数据看Transformer的AUC最高但推理延迟是CNN的4倍多。AutoEncoder的AUC略低但推理最快而且不需要异常样本训练。这个结果不是绝对的。如果异常样本增加到500条CNN和Transformer的优势会更明显。如果异常样本只有20条AutoEncoder会大幅领先。6.2 选型决策树根据我的经验选型可以按这个逻辑走第一步看异常样本数量异常样本 50条直接上AutoEncoder。监督模型根本训不起来。异常样本 50-200条AutoEncoder或CNN。CNN需要强增强和正则化。异常样本 200条CNN或Transformer都可以考虑。第二步看实时性要求推理延迟 10msCNN或AutoEncoder。Transformer基本没戏。推理延迟 10-50ms三类都可以。推理延迟 50msTransformer也可以接受。第三步看异常的时间模式异常是瞬时的、局部的CNN足够。异常有长距离时间依赖周期性、调制Transformer更合适。异常模式未知、多样AutoEncoder更稳妥。第四步看计算资源边缘设备部署CNN或轻量AutoEncoder。服务器部署都可以。6.3 组合方案取长补短实际项目中我经常把多个模型组合使用。几种有效的组合方式CNN AutoEncoder用CNN做特征提取AutoEncoder做异常检测。CNN的中间层特征比原始频谱图更有判别性AutoEncoder在这个特征空间上做重构效果通常比直接在频谱图上做好。Transformer CNN用CNN做局部特征提取Transformer做全局建模。这是混合架构兼顾局部和全局。但参数量大训练慢。集成学习三个模型分别训练推理时投票或平均异常评分。这能提升鲁棒性但推理成本翻倍。注意组合方案不是越多越好。我试过三个模型集成AUC只比最好的单模型高0.5个百分点但推理时间翻了三倍。性价比不高。7. 常见问题与排查技巧实录7.1 模型在验证集上表现好产线上崩了这是最常见的问题。原因通常有几个数据分布不一致。训练数据是实验室采集的产线环境噪声不同。解决方案在产线上采集一批数据做验证或者用域适应方法。阈值设定不合理。验证集上的阈值在产线上不适用。解决方案在产线上跑一段时间收集正常样本重新计算阈值。过拟合。模型记住了训练集的噪声模式。解决方案加强正则化增加数据增强减少模型复杂度。7.2 异常样本太少模型学不到异常特征这是异音检测的固有难题。几个应对策略用AutoEncoder不需要异常样本。迁移学习用大规模音频数据集预训练再在小样本上微调。合成异常通过信号处理手段合成异常样本比如在正常声音上叠加冲击信号。主动学习让模型挑选最不确定的样本人工标注迭代训练。7.3 推理速度不达标如果产线节拍快推理速度是硬约束。优化方向模型剪枝去掉不重要的通道或层。量化把FP32转成INT8速度提升2-4倍精度损失通常小于1%。知识蒸馏用大模型教小模型小模型推理快。ONNX Runtime比PyTorch原生推理快不少我实测能快30%左右。7.4 常见问题速查表问题可能原因排查方法解决方案训练loss不下降学习率太大/太小打印每步loss调整学习率加warmup验证loss上升过拟合对比训练/验证曲线加Dropout早停数据增强AUC波动大验证集太小检查验证集样本数增大验证集交叉验证推理结果全为正常类别不平衡检查预测分布加权损失Focal Loss推理结果全为异常阈值太低检查异常评分分布提高阈值产线误报多环境噪声变化对比产线和训练数据域适应重新标定阈值7.5 几个容易忽略的细节音频对齐。如果异音出现在音频的特定位置训练时要保证对齐。否则模型学到的是位置信息而不是异音特征。采样率一致性。训练和推理的采样率必须一致。我见过有人训练用48kHz推理用44.1kHz结果全错。归一化方式。训练时的归一化参数要保存下来推理时用同样的参数。不要重新计算。模型版本管理。产线模型更新要谨慎新模型上线前要做A/B测试。我吃过亏新模型直接替换结果误报率飙升。8. 部署与持续优化8.1 从实验到产线的最后一公里模型在实验环境跑通只是第一步部署到产线还有一堆事推理框架选择。PyTorch原生推理方便但慢ONNX Runtime快但转换可能出问题TensorRT最快但只支持NVIDIA GPU。我一般先用ONNX Runtime如果速度不够再上TensorRT。服务化。把模型封装成API产线系统通过HTTP或gRPC调用。要注意并发和超时处理。日志与监控。记录每次推理的输入、输出、耗时。出问题时能回溯。灰度发布。新模型先跑影子模式不参与决策只记录结果。对比一段时间后再切换。8.2 持续学习与模型迭代产线环境会变模型需要持续更新。几个策略定期重新训练。每季度用新数据重新训练一次。在线学习。对置信度高的样本自动标注加入训练集。但要小心确认偏差。异常样本挖掘。产线上误报的样本人工确认后加入训练集。这是提升模型最有效的方式。模型集成更新。不要一次性替换所有模型逐步更新观察效果。8.3 我踩过的几个大坑坑一忽略音频长度。不同设备的音频长度不一样有的3秒有的10秒。我一开始用固定长度短的补零长的截断。结果补零的部分被模型当成了特征。后来改成变长输入加掩码问题解决。坑二阈值设太死。产线环境噪声有波动固定阈值导致误报率时高时低。后来改成动态阈值根据近期正常样本的分布自动调整。坑三忽略推理延迟。模型精度很高但推理要200ms产线节拍是100ms根本用不了。后来做了量化和剪枝降到50ms才上线。坑四训练数据泄漏。同一台设备的音频被分到了训练集和验证集导致验证集AUC虚高。后来按设备划分数据集AUC降了5个百分点但更真实。8.4 效果评估的注意事项评估异音检测模型不能只看AUC。产线关心的是漏检率异常被判为正常的比例。这个最重要漏检意味着不良品流出。误报率正常被判为异常的比例。误报多了产线会停线成本高。检测延迟从声音产生到给出判断的时间。稳定性不同时间段、不同批次的表現是否一致。我一般会画DET曲线Detection Error Tradeoff看不同阈值下的漏检率和误报率权衡。然后根据产线的容忍度选阈值。实操心得产线通常对漏检零容忍对误报有一定容忍度。所以阈值要偏向保守宁可误报不可漏检。但误报太多也不行工人会直接把系统关掉。找到平衡点是关键。9. 一些个人体会做了几年异音检测最大的感受是模型选型不是最重要的数据质量才是。我见过太多人花大量时间调模型却忽略了麦克风选型、采集位置、环境噪声这些基础问题。结果模型再好数据不行效果就是上不去。CNN、Transformer、AutoEncoder各有适用场景没有绝对的优劣。我的建议是先用最简单的CNN或AutoEncoder快速验证可行性如果效果不够再考虑Transformer。不要一上来就上最复杂的模型那是给自己找麻烦。另外异音检测是一个系统工程不是单靠模型就能解决的。采集、预处理、特征工程、模型、后处理、部署每个环节都影响最终效果。我通常会把60%的时间花在数据和特征上30%在模型上10%在部署上。这个比例供你参考。最后说一个容易被忽略的点和产线工人保持沟通。他们最了解异音的实际表现知道哪些是误报哪些是漏检。我每次模型更新后都会找工人聊收集反馈。这些反馈比任何指标都真实。如果你正在做异音检测项目欢迎交流。这个领域还有很多问题没解决比如跨设备泛化、小样本学习、实时性优化都是值得深入的方向。