尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

轴承故障诊断实战:从振动信号处理到深度学习模型训练全流程

轴承故障诊断实战:从振动信号处理到深度学习模型训练全流程 轴承故障诊断这几年真的是设备预测性维护领域里最热的方向之一。只要是做过工业数据项目的朋友应该都有体会真正拉开差距的往往不是模型用什么架构而是数据从原始信号到能喂进模型这一路上有多讲究。这篇博文我就用一次完整的轴承故障分类项目为例聊聊从数据处理到模型训练里那些容易踩坑、但又决定成败的细节适合正在做设备状态监测、或者想入门故障诊断分类的朋友参考。1. 项目背景与整体设计思路1.1 轴承故障诊断到底在解决什么问题轴承是旋转机械里最容易出故障的零部件电机、泵、风机、机床主轴几乎离不开它。传统做法是靠老师傅听声音、摸温度、看振动值经验门槛高不说人还会疲劳、会误判。我做的这个项目就是想用振动信号数据训练一个自动分类模型让机器替人回答“这个轴承现在是健康、内圈故障、外圈故障还是滚动体故障”。这里面的核心难点在于振动信号是非平稳、强噪声背景下的高维时间序列同一个故障类型在不同转速、不同负载、不同测点下表现差异很大。所以项目从来不是“拿数据训模型”这么简单而是要把领域知识轴承结构、故障机理、信号特征和数据建模方法结合起来。1.2 方案选型为什么选择“数据处理模型训练”这条路做故障诊断分类市面上主流路线其实有三条一是基于动力学模型的解析法二是基于传统信号处理和专家规则的诊断法三是基于数据驱动的统计学习/深度学习方法。动力学模型对设备参数要求太高工业现场你很难拿到精确的轴承刚度、阻尼、载荷分布专家规则方法在单一工况下好用工况一变规则就失效。所以我选了第三条路也就是数据驱动方案用数据预处理把原始振动信号转成干净、有区分度的特征再用分类模型自动学习故障模式。这样做的优势很直接不依赖人工规则、能适配多工况场景、模型可以持续迭代。项目的整体流程我拆成了四块数据采集与数据集构建、数据清洗与特征工程、模型训练与调优、评估与部署。后面每一块我都会结合实践细讲。2. 数据处理全流程从原始振动信号到训练样本2.1 数据集怎么选CWRU为什么是首选做轴承故障分类绕不开一个公开数据集就是美国凯斯西储大学CWRU的轴承数据中心数据集。很多论文、比赛、入门教程都用它我在项目早期也是用它来跑通流程的。CWRU数据集好在哪我总结三点第一有标准的故障类型标注包括正常Normal、内圈故障Inner Race、外圈故障Outer Race、滚动体故障Ball每种故障还分了不同损伤直径0.007、0.014、0.021英寸标注非常细第二采样频率高有12kHz和48kHz两种振动信号特征清晰第三覆盖多工况电机负载从0到3hp马力分了好几档方便研究工况变化对诊断的影响。不过我也得提醒一句CWRU数据太干净了。现场采集的信号有环境噪声、有转速波动、有其它部件干扰直接用CWRU训出来的模型拿到现场往往性能会崩。所以这个数据集适合做方法验证和流程搭建真做工业项目还是得用自己的现场数据或者用一些更贴近实际工况的开源数据集做迁移学习。2.2 数据清洗与样本切分拿到原始振动信号后第一步不是急着提特征而是先做数据清洗。我自己在实战中总结了一套固定流程按下面的顺序走去除异常段先可视化看一下整段信号的时域波形把明显掉线、限幅、突变的部分标记出来并剔除。振动信号采样率动辄几十kHz一段几秒钟的数据就几十万个点靠人工一眼眼看不过来我是用滑窗统计幅值范围和方差来粗筛的。去均值与趋势项传感器零漂和温漂会引入直流分量或缓慢变化的趋势项直接用FFT快速傅里叶变换做频谱分析时会把低频分量弄得很丑。用信号减去均值再做一次去趋势处理就能把这个问题消掉。异常值处理对于明显超出物理合理范围的点比如加速度幅值超过传感器量程用中值滤波或者直接剔除补齐避免个别野点把后面的特征计算带偏。样本切分这也是新手最常犯糊涂的地方。CWRU数据是一段长连续信号需要切成一个个短样本。切分的核心原则是每个样本至少要包含数个完整的旋转周期这样样本里才蕴含足够的故障冲击信息。我当时的做法是电机转速1797rpm也就是约30Hz的转频我取每个样本0.5秒大概15个旋转周期对应12kHz采样率就是6000个点一段。然后用滑窗重叠率为50%的方式切分这样在数据量有限的情况下能多得到一些样本。样本切分这里有个很关键的细节我之前吃过亏就是切分时必须先洗牌再划分训练集和测试集否则模型可能过拟合到信号的连续段特征上。后面我会专门讲这个数据泄漏问题。2.3 特征工程时域、频域与时频域特征提取样本切好之后就要考虑用什么特征来表达这段信号。这一步直接决定模型上限模型只是在这个特征空间里画边界。我梳理一下三类特征的适用场景时域特征计算成本最低也是我首选的基础特征。常用的包括均方根值RMS、峰值、峰峰值、峭度Kurtosis、峰值因子、脉冲因子、波形因子。这里面尤其值得关注的是峭度它对轴承早期故障很敏感因为早期故障会产生冲击脉冲信号概率分布会偏离正态分布峭度值就会明显升高。我在项目里对正常轴承和故障轴承分别算过峭度正常样本基本在3附近内圈故障样本能冲到8甚至更高区分度非常直观。频域特征主要看频谱形状。对振动信号做FFT之后故障特征频率会出现在特定的频带上。比如内圈故障特征频率BPFI、外圈故障特征频率BPFO、滚动体故障特征频率BSF这些频率由轴承几何参数和转速决定。我常用的做法是把频谱的总能量、重心频率、频率方差、特定频带能量占比作为特征。这里说一句做频域分析时窗函数要选好我一般用汉宁窗来抑制频谱泄漏。时频域特征就是用短时傅里叶变换STFT、小波变换把信号映射到时间-频率平面再统计各频带的能量分布。对于非平稳信号时频域特征往往比纯时域或纯频域更稳。我当时对比过一个简单实验只用时域特征时XGBoost在CWRU上的准确率大概89%加入频域和时频域特征之后能提到97%以上。这个提升幅度就足以说明特征工程的价值。我把当时用到的核心特征清单整理成了表格方便你参考特征类型具体特征物理含义对故障灵敏度时域均方根值信号能量大小中等通用时域峭度冲击性程度高早期故障灵敏时域峰值因子冲击强度高频域频谱重心信号主频带位置中等频域频带能量比特定故障频率能量占比高时频域小波包能量熵能量分布复杂程度高特征也不是越多越好。特征多了容易带来冗余和过拟合我当时用随机森林的特征重要性排序做过一轮筛选把重要性垫底的一批特征剔掉之后模型精度反而略微提升训练时间倒是省了不少。这一步在你特征数量超过50个的时候建议一定做。3. 分类模型构建与训练实操3.1 基线模型XGBoost跑通分类流程特征工程做完后别一上来就上深度学习我建议先用XGBoost这类经典机器学习模型把基线跑出来。好处是训练快、可解释性强、能快速验证特征有效性。我用XGBoost做多分类四类正常、内圈、外圈、滚动体故障的步骤大致如下标签编码把四种类别映射成0、1、2、3用LabelEncoder处理。数据集划分训练集和测试集按8:2划分划分之前先对样本索引做随机打乱这个细节很重要。配置模型参数我在项目里用的核心参数如下。import xgboost as xgb model xgb.XGBClassifier( n_estimators200, max_depth6, learning_rate0.1, subsample0.8, colsample_bytree0.8, objectivemulti:softprob, num_class4, eval_metricmlogloss, early_stopping_rounds20 )这里面的设计逻辑是n_estimators设200棵树足够拟合中等规模的特征矩阵配合早停防止过拟合max_depth6比较适中太浅欠拟合太深容易学过头subsample和colsample_bytree都取0.8相当于每棵树只用80%的样本和80%的特征以此增加模型的随机性降低过拟合风险。objective选multi:softprob是让模型输出每个类别的概率值方便后续分析置信度。训练后我在测试集上的准确率是96.5%左右F1分数也差不多。这个结果已经能证明特征有效接下来就轮到深度学习上场来挑战这个基线了。3.2 深度学习方案一维CNN与ResNet架构深度学习路线的最大优势是可以跳过手工特征工程直接从原始波形里学特征。但跳过不等于不需要数据预处理归一化、样本切分、类平衡这些事情一个都不能省。我用的一维CNN模型结构不复杂设计思路参考了经典VGG的堆叠思想用多层小卷积核逐级提取特征第一层卷积核大小64数量16用来捕捉短时冲击细节第二层卷积核大小32数量32扩大感受野第三层卷积核大小16数量64继续抽象高维模式每层卷积后面接BN批归一化和ReLU激活再经过最大池化降维最后接全局平均池化和全连接分类层输出4类概率。训练时我用的优化器是Adam初始学习率0.001batch size取64训练50个epoch。损失函数用交叉熵这在多分类任务里是标准选择。对比下来一维CNN在CWRU测试集上的准确率到了99%左右比XGBoost高了两三个点。这也符合预期毕竟深度模型能直接利用原始的时序位置信息挖掘到手工特征覆盖不到的局部模式。不过纯CNN对长程依赖的建模能力还是有限所以我还试过一个更深的方案直接在预训练ResNet34的基础上改输入输出做迁移。思路是ResNet34原本处理图像我就把一维振动信号做CWT连续小波变换转成时频图再用图像分类的思路去训。这个方案准确率能到99.5%以上但代价是推理速度慢预处理还要额外算小波变换。对实时性要求高的场景就不太合适了。3.3 训练参数配置与调优经验模型训练不是一把梭参数配置直接决定了最终效果和训练效率。我在调参过程中总结出几个关键经验学习率是最先要调的参数。我习惯先用一个稍微偏大的学习率比如0.01看loss曲线是否快速下降再衰减到0.001附近精细训练。有一种做法是用学习率预热加余弦退火前期用较小学习率防止震荡后期平滑收敛我在这个项目里确实试过最终收敛效果比固定学习率好一些不过要是不想引入太多复杂度固定0.001配合早停也完全够用。batch size的选择跟显存和学习率要联动。batch size从32调到128模型收敛速度明显加快但太大容易陷入尖锐的局部极小值泛化性反而下降。我最终取64这是个各方面比较均衡的配置。早停策略一定要加。我早期训练的时候没设early stopping老老实实跑满50个epoch结果训练集准确率接近100%测试集反而往下掉典型的过拟合。后来我在验证集上盯着loss连续10个epoch不下降就停止训练然后保存最佳epoch的权重这样测试集效果稳定了不少。这里还有一个改变训练效果的技巧就是标签平滑。故障分类的标签虽然是硬标签但如果故障类型之间有相似性比如早期内圈故障和外圈故障特征接近硬标签会迫使模型过度自信导致泛化变差。我用了0.1的标签平滑系数测试集上的校准度明显改善置信度分布更合理。4. 踩坑实录常见问题与排查技巧4.1 数据泄漏精度虚高的罪魁祸首这是我见过最多人踩的坑也是我自己第一次做故障分类时犯过的错。问题出在样本切分和数据集划分的顺序上。错误做法是先把整段振动信号切成了几千个样本然后不洗牌直接按样本顺序取前80%做训练、后20%做测试。这样做模型精度往往虚高到99%以上但一上现场就拉胯。原因在于相邻样本来自同一段连续信号它们之间的差异非常小训练集和测试集高度相似模型等于变相记住了答案。正确做法是切完样本后先整体随机打乱再划分训练集和测试集。更进一步如果是多工况数据应该按工况切分比如用一个工况的数据训练用另一个工况的数据测试这样才能验证模型跨工况的泛化能力。我第二次做这个项目时换了这种划分方式测试集精度立刻掉到了92%左右但心里踏实多了因为那才是真实水平。4.2 类别不平衡问题CWRU数据集里各类样本数量相对均衡所以初跑流程时没觉得这是个问题。后来换到现场数据正常样本可能占90%故障样本每种只有几个百分点用这类数据直接训练模型很容易把所有样本都预测成正常类反正准确率也有90%但实际一点用都没有。处理类别不平衡我用了几个组合拳采样策略对少数类做过采样、对多数类做欠采样。我当时用SMOTE做过采样在特征空间里合成少量类样本效果不错。调整类别权重XGBoost里有scale_pos_weight参数深度学习里直接在损失函数里给少数类样本加权。交叉熵损失在反向传播时少数类样本的错误会得到更大惩罚。评价指标换掉不要只看准确率改看宏平均F1、召回率、混淆矩阵。我在项目里主要盯各类别的召回率尤其是内圈故障和外圈故障的召回率因为这两种故障漏检代价大。4.3 模型部署与实时推理训练好模型只是第一步真正落地部署时还会有新的一堆问题。我当时把模型部署到边缘设备上做实时推理踩了几个点在这里一并分享模型体积控制。XGBoost模型文件一般只有几十MB但深度学习模型要看架构我自己训的一维CNN权重文件不到5MB放入边缘设备没有问题。如果模型更大就要考虑剪枝和量化。推理速度优化。边缘设备CPU算力有限一个关键优化是减少预处理耗时。我一开始在实时流程里用STFT提取时频图再喂给CNN单车速工况下延迟非常高后面把预处理改成轻量级的时域特征计算加XGBoost推理延迟降到了毫秒级。所以深度学习不一定总是最优解要看现场到底要什么。在线更新问题。设备状态会漂移、工况会变化模型训练时的数据分布和线上数据分布会有偏差精度会随时间衰减。这个层面的解决方案就是定期用新数据做增量训练流程上要提前留好数据回流通道。我最后整理了一个故障排查速查表都是平时最容易遇到的情况遇到问题可以直接对着查现象可能原因排查方向训练准确率99%测试准确率低数据泄漏或过拟合检查样本切分顺序、是否及时早停所有样本都预测为正常类类别不平衡用加权损失或过采样跨工况测试性能骤降工况特征差异大做工况归一化或采集多工况数据模型推理延迟过高预处理复杂或模型过大简化特征、模型量化、剪枝现场噪声大导致误报训练数据太干净数据增强或在样本中叠加噪声写在最后这个项目做下来我最大的体会是故障诊断分类的难点不在模型结构有多新奇而在数据处理的细致程度和对问题本身的物理理解。花了最多时间调模型参数不如花时间把特征工程做得更扎实、把数据划分做得更严谨、把评估方式设计得更贴近现场。还有一个小技巧想分享给大家每一轮实验都保存好特征文件和模型配置别嫌麻烦。我因为中途没记录参数组合调参调得晕头转向后想回头找最优配置发现当时的设置早忘了白白浪费了好几天时间。做数据项目有条有理的记录习惯比调参技巧更能救你的命。
返回列表