资讯动态

物理约束与不平衡样本下的工业故障诊断实时部署框架

发布时间:2026/10/27 5:56:27 来源:尧图企业网站定制
做工业故障诊断的算法最怕的不是模型精度不够而是模型在实验室指标漂亮、一到产线就开始乱报。我近一年都在做“物理约束下基于不平衡样本的工业故障诊断与实时部署框架”从数据采集、模型训练到边缘端推理整个链路都走了一遍今天把里面真正起作用的思路、代码和坑一次说清楚。这个方向适合正在做旋转机械监测、电机异常检测、流水线质量判定的人参考也适合刚接触工业AI的学生看看真实项目里的取舍。这里说的“物理约束”不是让模型硬背物理公式而是把振动、温度、电流这些信号的客观规律作为先验连同不平衡样本处理一起设计进训练目标里“实时部署”则照顾产线上毫秒级判断的需求。文章不会只讲概念我会把损失函数怎么改、窗口怎么设、模型怎么压缩、现场怎么调阈值都摊开讲希望你看完能少走弯路。1. 为什么工业故障诊断绕不开物理约束1.1 纯数据驱动在产线上的“三连崩”第一崩是变工况。一台离心泵转速从2900转/分调到1500转/分振动频谱的峰位和幅值全部变化纯数据模型如果没采过低速工况很容易把正常状态判成故障。第二崩是故障样本天然稀缺重型设备不允许故意弄坏故障样本往往是历史事故攒下来的类别极度不平衡。第三崩最隐蔽模型训练时没有引入物理一致性推理结果可能违背常识。举一个具体例子。轴承内圈损伤产生的冲击会以特定频率形成边频带这个频率由轴承几何参数和实时转速唯一确定。纯数据模型在样本充足时也能学到这种特征可一旦转速偏离训练分布它可能把任何一个高能量频段都当成故障证据于是现场频繁误报。物理约束在这里的作用就是逼着模型只在“物理上说得通”的频率范围内寻找证据训练分布之外的频率即使幅值很高也会被抑制。这三连崩叠加起来光靠加大数据量根本解决不了。数据可以补但变工况下补样本的成本和风险都很高模型可以堆参数但推理合理性没法靠堆参数保证。物理约束恰好是少数能在模型结构之外同时缓解这些问题的杠杆。1.2 物理约束具体约束什么能量、频段、因果我在项目中把物理约束分成三类来落地能量约束、频段约束、时域因果约束。能量约束比较好理解设备正常运行时振动烈度总在一定范围突然出现不可能的能量跳变通常来自传感器冲击或外界干扰模型应把这种突变归为异常事件而不是故障类别如果输出层给出高置信度故障判断但对应频段能量根本达不到物理阈值这个判断就是可疑的。频段约束是最常用的。以滚动轴承为例外圈故障特征频率BPFO、内圈BPFI、滚动体BSF都可以由转速和轴承参数实时算出来正常部件能量集中在转频及其低阶谐波附近故障部件会在特征频率附近出现边频带。网络在频谱图上的注意力如果落在与这些频率完全不沾边的区域物理损失就会变大反向传播会慢慢纠正这种错误。时域因果约束则关注顺序关系故障冲击通常先出现微弱周期再逐渐变得密集最后恶化到明显破坏。模型如果直接跳到“严重故障”而跳过演化过程在时序任务里就违反了因果先验。这一条在早期故障诊断里尤其重要因为现场要的是“趋势判断”而不是只看瞬时刻状态。2. 不平衡样本比想象中更难处理的“三种不平衡”2.1 数量失衡、时窗失衡、难易失衡说到工业数据不平衡大多数人的第一反应就是故障样本少、正常样本多。这确实是最直观的数量失衡一般用重采样和类别加权就能顶住。但落地之后我发现真正让模型失效的是另外两种不平衡时窗失衡和难易失衡。时窗失衡指的是故障不是全程都明显的比如轧机咬钢瞬间电流冲击大但故障特征只在某个转速区间内激发。切窗时如果按时间均匀切故障出现在窗口内的时刻和时长都不均匀模型学到的是“某段时间异常”而不是“某种物理状态异常”。难易失衡更隐蔽早期故障、复合故障、轻微磨损这类样本占比极少而且特征弱模型为了降低整体损失会直接忽略这些难样本。普通重采样解决不了这两种问题因为简单重复故障样本并不会增加信息量。2.2 采样、代价敏感和物理约束的配合顺序我试过SMOTE、ADASYN、随机过采样也试过Focal Loss和类权重。坦率说如果样本量差距在一两个数量级内Focal Loss加上合理类权重已经够用差距再大就必须做合成样本。但SMOTE这类方法有一个致命问题它在特征空间线性插值可能合成出物理上根本不可能出现的数据比如把正常频谱和严重故障频谱的中值当成“早期故障样本”训练时模型会学到一种现实中不存在的过渡态。我的经验是物理约束要前置到数据层和损失层两边。数据层合成样本之后先用物理规则做一遍过滤计算合成样本的频谱峰值是否落在合理故障频率附近离得太远的直接丢弃损失层再把物理项写进总损失让模型即使见到不合理样本也没有动力去拟合它。配合顺序上先保证物理约束存在再把重采样比例控制在不超过3:1最后才用Focal Loss调难易样本权重。这个顺序反了我吃过亏第一版先把SMOTE拉满公开测试集分数很好看现场一跑就露馅。3. 把物理约束写进损失函数从原理到代码3.1 三大实现方式软约束、硬约束与数据约束物理约束落到代码里有三种常见实现方式。第一种是软约束也叫正则约束在原有分类或回归损失后面加上一个物理损失项通过梯度下降端到端训练是最通用也最好调的方式。第二种是硬约束直接改网络输出层让输出一定满足物理公式比如预测故障特征频率时把输出投影到理论频率附近区间这种方式约束最强但会破坏网络的学习自由度应用面比较窄。第三种是数据约束在训练前清洗和筛选样本把物理上可疑的样本按规则过滤或改标注它不影响模型结构只影响数据质量。工业项目我默认选“数据约束在前、软约束为主”。原因很简单软约束写起来快调试时能单独看物理损失的变化而且和现有深度学习框架完全兼容数据约束不增加训练复杂度又能把明显的脏数据挡在外面。硬约束留给那种输出物理量本身、且物理关系非常明确的子任务比如用轴心轨迹预测转子偏心量这种场景用硬约束收益更大。3.2 物理损失不该“写上去就完事”权重和顺序是关键物理损失最常见的问题是权重给得太大。物理约束的目的不是全盘否定数据驱动而是让模型在模糊地带不乱猜。我先把不带物理约束的模型训练到收敛保存一个基线再加载权重、加入物理损失微调。物理项权重从0.01开始观察训练集和验证集的走势如果纯分类精度掉了超过三个点说明权重太大压缩回一半。判断物理约束是否有用的指标不只看准确率更重要的是看验证集上的“物理违规率”推理结果里有多少条落到了理论频率窗口之外。另外要注意物理损失和分类损失的量纲可能差很多。物理损失通常是能量比值或频率误差数值在0到几之间分类损失是交叉熵数值可能到几甚至几十。如果不做归一化λ1很可能让物理项淹没分类项。我习惯先对物理损失做归一化让它均值在0.5上下再乘权重。下面给一段极简的物理损失代码它计算频谱能量在理论故障频带内的占比并把“占比过低”当成惩罚。实际项目还会加频带宽度、多次谐波、转频成分等这里省略了重点是看思路。import torch def physics_band_loss(spec, freqs, fault_freq, band_ratio0.05, eps1e-8): # spec: [B, F] 幅度谱 # freqs: [F] 每个bin对应的频率 low fault_freq * (1 - band_ratio) high fault_freq * (1 band_ratio) mask (freqs low) (freqs high) # 理论故障频带 band_energy spec[:, mask].pow(2).sum(dim1) total_energy spec.pow(2).sum(dim1) ratio band_energy / (total_energy eps) # 目标不是让比例越高越好而是如果故障频带几乎无能量判为故障则矛盾 loss torch.clamp(0.5 - ratio, min0).mean() return loss # 总损失 # loss ce_loss lambda_phy * physics_band_loss(...)这段代码体现的是“软约束”的最小实现只有断言“故障频带能量占比不能太低”。实际操作中还要根据输入信号的采样率、窗长和FFT点数把freqs生成对否则频率对不上物理约束反而帮倒忙。4. 实时部署框架边缘选型、模型压缩与流式推理4.1 部署架构中心训练加边缘推理是默认答案工业实时诊断几乎不可能把数据全部传到云端推理。一条产线几百个测点每秒几万赫兹采样实时性要求每窗处理在几十毫秒内完成网络一旦抖动部署就会失效。所以我们采用中心训练加边缘推理的架构训练阶段在GPU服务器上完成推理阶段把模型转换、量化后部署到产线边缘装置。边缘端怎么选要看信号通道数量和单窗延迟预算。大多数旋转机械测振场景一块带NPU或GPU的工控机就够了如果测点特别密集可以用多路采集边缘网关把数据切到不同计算核心。选型时的硬指标不是峰值算力而是持续推理下的算力利用率有些设备标称算力很高但散热一上来就会限频这个必须在现场跑压力测试。我踩过这个坑选型时不看持续负载部署后一到夏季车间温度一高就掉链子。换成更注重持续算力的方案才解决。4.2 剪枝量化蒸馏把模型压到能上产线的体积训练好的模型直接部署通常会吃亏尤其实际网络中混合了1D CNN、GRU和特征处理层参数并不小。我的标准动作是蒸馏加量化先让复杂教师模型产生软标签把小模型蒸馏到教师模型95%以上的预测一致率然后做结构化剪枝剪掉注意力得分持续很低的通道最后做INT8定点化标定集必须从真实测点采集不能只用训练集的随机子集。这里要强调一个容易被忽视的点量化不是所有层都收益。物理约束相关的频带统计层用INT8会引入频率定位误差我一般把这层保留FP32其他卷积和全连接层用INT8。虽然增加了一点内存占用但换来了物理约束下的推理一致。整套压缩下来模型体积降到原来的1/4到1/6单窗延迟从几十毫秒降到几毫秒这种收益在工业现场是决定性的。4.3 滑窗和去抖实时推理的工程细节不少文章讲完模型就把系统丢给部署但真正让实时诊断“能看”的是滑窗和输出平滑。振动信号采集是连续流推理时按固定窗口长度切段窗口之间需要有重叠。重叠率太低故障冲击可能被窗口边界切碎太高又浪费算力。我实测下来的惯用值是窗口长度1秒步长0.25秒也就是重叠率75%。这个设定既保留了故障冲击完整性又让输出每250毫秒刷新一次现场人员不觉得迟滞。输出平滑也有讲究。单窗推一个类别概率往往像噪声一样跳动直接报警会误报。我在框架里做了两级规则第一级对最近N个窗口的概率做指数移动平均第二级要求故障概率连续M个周期超过阈值才触发。N和M都要根据现场误报容忍度调先用历史数据回放确定初值再到现场迭代。整体上物理约束下的推理输出本身就比纯数据模型平滑因为特征已经被约束在物理合理区域误报尖峰少了一大半平滑策略的压力小很多。5. 一次现场落地实录轴承故障诊断框架复现5.1 数据准备与物理特征频率核对这个框架在轴承故障诊断上的复现路径值得从头到尾走一遍。第一步是数据准备我采集的是电机驱动端振动加速度信号采样率25600Hz转速用编码器同步记录。采集时长要覆盖启停、匀速和加载三个工况段不能让某类样本只出现在某一段。切窗时按1秒长度、0.25秒步长切同时记录每个窗口的平均转速和载荷这两个值后面会决定物理约束频带。第二步是计算轴承各部件故障特征频率并和频谱图核对。以滚动轴承为例设滚珠个数n、滚珠直径d、节径D、接触角α、转频fr公式是外圈BPFO(n/2)·fr·(1−d/D·cosα)内圈BPFI(n/2)·fr·(1d/D·cosα)滚动体BSF(D/(2d))·fr·(1−(d/D·cosα)^2)保持架FTF(fr/2)·(1−d/D·cosα)。把这些理论值画到频谱图上如果实测峰值频点偏离理论值超过2%首先怀疑标注错误或者转速不对而不是先改模型。这一步特别费时间但能过滤掉一半以上的脏样本。5.2 模型结构、训练超参与物理损失调参模型结构我用的是1D CNN加双向GRU再加物理约束头1D CNN负责抽取局部冲击形态双向GRU负责不同时间尺度上的趋势分类头输出四种状态正常、外圈故障、内圈故障、滚动体故障物理约束头接收转速信息计算每个窗口的故障频带能量占比损失。特征频率不是网络自己猜的而是用上一步的公式实时算出来喂给物理头所以模型不用死记转速和频率的关系。训练参数我给了个可复现的配置Adam优化器初始学习率1e-3批大小64训练100轮前70轮只训练分类损失后30轮打开物理损失并让λ从0.01线性涨到0.1。这里我特意用“先分类后物理”而不是一开始就联合训练原因是物理约束在早期可能压制CNN学到的有效特征等分类结构基本确定再微调两个目标不会打架。总损失就是ce_lossλ·physics_loss我一般把物理损失归一化到0.5均值后λ从0.01起调。5.3 边缘端实测精度、延迟、吞吐和内存对照最后一环是把模型部署到边缘设备上实测。下面这个表是我在同一批现场数据上做的云侧FP32与边缘INT8对照不算是普适基准但可以看出量化和物理约束共同作用后的典型表现指标云侧FP32边缘INT8测试集准确率0.9710.968单窗推理延迟28ms3.2ms单核推理吞吐35窗/s260窗/s模型体积56MB14.2MB峰值内存810MB214MB差距最大的不是精度而是延迟和内存。INT8让单窗延迟降了一个数量级峰值内存只剩四分之一左右。准确率虽然只降了0.3个百分点但如果没有物理约束纯数据模型量化后的准确率掉得更厉害因为分类边界被标定误差扰动。引入物理约束后网络的特征表示已经落在物理合理区域内量化引入的少量噪声不足以把小样本推到错误边界。6. 常见问题与排查技巧实录6.1 训练时物理损失NAN或发散的排查思路物理损失出现NAN我踩过几次最常见原因是频谱频率轴和采样参数对不上。比如采样率写了25600窗口长度却是1秒不整除FFT点数一改freqs数组长度和谱向量错位mask就会出问题。排查步骤很固定先打印freqs的最后一个值和采样率的一半是否相等再检查物理头拿到的转速单位如果转速是RPM而公式用的是转每秒特征频率会差60倍物理损失立刻爆炸。另一个原因是λ设置过大或归一化没做物理损失量级比分类损失大很多梯度更新方向被带偏。解决办法是先不对物理损失求梯度只记录数值确认置信区间正常后再打开。如果还发散就加梯度裁剪一般clip_norm1.0够用。最后提醒一句不要在训练早期就加入硬约束硬约束投影太强容易让早退学习崩掉软约束微调是更保险的路线。6.2 漏报误报的平衡阈值、置信度与趋势斜率漏报和误报是现场的两个死对头。调阈值不是拍脑袋我的方法是先离线回放一段足够长的历史数据模拟各种阈值下的漏报率和误报率画出一条权衡曲线再让现场工艺人员根据可接受代价选点。比如更怕设备烧毁就调低报警阈值更怕停产误停就调高阈值。单靠概率阈值还不够我还会加趋势斜率只允许报警在最近几个窗口的故障概率持续走高时触发瞬时尖峰不报警。趋势斜率的计算非常简单用最小二乘拟合最近5个窗口的输出概率斜率为正且达到设定值才有效。这个方法配合物理约束效果更明显因为纯数据模型的概率跳动大趋势拟合容易被干扰加了物理约束后概率序列整体平滑趋势判断的可靠性也上来了。6.3 量化后精度下降校准集和物理规则的兜底INT8量化后精度下降先不要急着换更大模型。最常见的原因是校准集选得太随意只用了训练集的随机几百个样本没有覆盖现场真实的工况范围。校准集应该从现场连续采集数据中均匀抽样至少覆盖正常、早期故障、明显故障三类并且包含不同转速和载荷段让量化器充分看到动态范围。如果校准集没问题但精度还是掉就把物理约束相关层保留FP32或者对量化后的模型用物理规则做后处理修正。比如模型输出概率是0.6的内圈故障但频谱在BPFI附近完全没有能量就用物理规则把输出概率压回正常类别。这种兜底听起来老土实际在产线上特别能用因为物理规律不会跟着量化误差漂移。真要我给一条最终建议我会说物理约束不是用来把测试集分数刷高的插件而是部署之后让系统不容易乱报的刹车。把物理规律先写进损失里再去调不平衡采样顺序别反。我因为这个顺序吃过亏第一版先把SMOTE拉满模型在公开数据集上很漂亮现场一跑就露馅。后面把物理约束放在了第一步不平衡采样只做适度强化整个框架才算真正落地。另一个小技巧是平时多保留一些“物理违规率”日志现场扯皮时那一串数字比什么曲线都有说服力。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑