十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CWRU轴承数据集故障诊断实战:Python加载、特征提取与分类全攻略

CWRU轴承数据集故障诊断实战:Python加载、特征提取与分类全攻略 简介凯斯西储大学(CWRU)轴承数据集是一份面向机械故障诊断研究的经典资源汇集了正常状态以及内环、外环、滚珠等多种故障类型的振动信号涵盖不同故障尺寸与负载工况适合从事轴承故障识别、特征工程和机器学习建模的研究人员与工程师使用。压缩包共172个文件以165个mat格式振动信号文件为主体另含3个Python整理分析程序、2个pyc辅助文件及2个txt使用说明整体约230.77MB。配套Python脚本覆盖数据整理、预处理与特征分析流程可帮助规避原始数据处理中的常见问题提升实验效率txt使用说明则对数据来源、结构和研究方法做了梳理便于快速上手。该资源在故障诊断方向已有24495人学习下载无论是用于课程设计、科研验证还是算法对比都能提供可靠的数据支撑。 做故障诊断方向的同学大概率都绕不开CWRU轴承数据集。这个由凯斯西储大学电气工程实验室发布的公开数据集几乎成了滚动轴承故障识别领域的“标准普通话”无论是做信号处理、特征提取还是跑深度学习分类拿它来验证算法效果都格外顺手。我这次整理了一份带Python解析脚本和使用说明的完整数据包正好把CWRU数据集的加载、切分、特征提取到分类这条链路串起来分享给刚入门的同学和做横向项目的工程师们参考。这个包解决的问题很直接CWRU官网原始文件的命名规律不够友好.mat通道字段又多初学者下载回来往往对着一个数字文件名和一行行数组发呆不知道怎么把数据变成能训练模型的样本。整理之后目录结构、通道含义、故障类型映射都写成了表格Python脚本则把加载、可视化、特征提取和模型验证四件事拆成独立模块拿来改改就能用在其他振动数据集上。适合的人机械/自动化的研究生、做设备健康管理PHM的算法工程师以及想快速上手机械故障分类的Python开发者。不需要很高的信号处理基础只要会基础numpy和sklearn就能跑通全流程。1. CWRU轴承数据集到底是什么为什么大家都在用1.1 实验台设计与数据来源CWRU数据集的出处是凯斯西储大学电气工程实验室的轴承振动实验台。平台由一台电机、一个扭矩传感器、一个测功计和相应的控制电路组成。测试轴承安装在电机轴的两端驱动端用的是SKF 6205-2RS JEM深沟球轴承风扇端用的是SKF 6203-2RS JEM。实验人员用电火花加工技术在轴承部件上人为制造单点故障然后把振动加速度计贴在电机壳体上采集分别在正常、内圈故障、外圈故障和滚动体故障四种状态下的振动信号。故障损伤直径分为四档0.007英寸、0.014英寸、0.021英寸和0.028英寸约等于0.18毫米到0.71毫米。负载工况从0马力到3马力不等对应电机转速大约在1797 RPM到1720 RPM之间。采样率方面驱动端加速度信号常用12 kHz和48 kHz两种风扇端和基座通道也各有对应配置。实验覆盖的场景虽然不算复杂但对故障分类研究来说故障类型、损伤尺寸、负载和采样率四个维度已经足够做出很多文章。1.2 为什么它成了故障诊断的“默认基准”我在实际项目里最看重CWRU的三点第一数据完全公开任何人在任何地方拿到的是同一批数据实验结果可比性很强论文里跟别人的方法对比时不会因为数据采集条件不同而吵得不可开交第二多负载设计直接支持跨工况研究你可以用0负载的数据训练模型再拿到1马力、2马力、3人工况上测试这对落地项目非常关键第三故障类型和损伤尺寸有明确标注不需要自己去人工打标省掉了故障诊断中最头疼的标注环节。不过也要提醒一句CWRU的现实数据是实验室环境下的结果跟工业现场轴承相比信号相对“干净”。算法在这个数据集上效果好不代表在工厂现场直接能用它更多是作为算法验证和教学入门的起点。我一般会把它当作“最小可用样集”先把整个技术链路跑通再拿现场数据继续迭代。2. 数据包的目录结构和文件命名规则2.1 文件命名规律与故障类型映射我整理的数据包对官方文件做了重新组织按normal、inner_race、outer_race、ball三种故障状态分类存放每个子目录下文件名统一采用“故障类型_损伤直径_负载序号.mat”的格式比如outer_race_0.007_0.mat表示外圈故障、损伤直径0.007英寸、负载序号0。之所以要重新整理是因为CWRU官网原始下载包里的文件名经常是一串数字像105.mat、118.mat这种数字对应关系还得查实验命名表对新手很不友好。如果是从第三方渠道拿到的数据建议先花十分钟做一次文件名普查。常见的情况是同一数据在不同的共享包里会有不同的命名规则有的用转速编号有的用负载编号还有的用采样率后缀。不要一上来就写自动化脚本先手工确认几个文件对应的是哪个故障、哪种工况后面处理才不容易出乌龙。2.2 .mat文件里的通道到底是什么意思用scipy.io.loadmat打开一个CWRU数据文件后能看到一组字段最典型的包括DE、FE、BA、RPM这几个。DE是驱动端加速度振动信号FE是风扇端加速度信号BA是基座加速度信号RPM是转速通道。官方数据文件中还有些历史字段比如time等信息不同版本会有差异不必每个都搞清楚核心拿DE和RPM就够用。需要特别注意的是DE、FE、BA这些通道的长度是12k或48k采样率对应的点数而RPM通道的采样率比较低长度跟振动信号不一致。做特征融合之前一定要先明确各自采样率否则直接拼到同一矩阵里会报维度错误。下面这段代码可以帮你快速查看一个mat文件里都有哪些键和维度import scipy.io as scio mat scio.loadmat(outer_race_0.007_0.mat) for key in mat.keys(): if not key.startswith(__): print(key, mat[key].shape)这里我用了一个示例文件名实际读取时替换成你本地的路径就行。看到输出结果后再针对DE列做后续处理。另外如果你的mat文件是用MATLAB 2018a以后的版本保存的v7.3格式scipy.io.loadmat可能会直接报错需要改用h5py读取这一点在后面的问题清单里也会详细说。3. Python实战从加载数据到故障分类3.1 加载数据并正确提取通道首先写一个通用加载函数返回指定通道的numpy数组。为了节省内存可以每次只读取需要的通道。以下是我在实际脚本中用的写法import scipy.io as scio import numpy as np def load_cwru(path, channelDE): mat scio.loadmat(path) data mat[channel].flatten() return data # 示例读取单个文件 data_de load_cwru(outer_race_0.007_0.mat) print(信号长度:, len(data_de))注意有些整理版文件里通道名可能是DE_time、FE_time而不是DE所以函数里最好加一个兼容判断把DE_time也映射到同一通道。通道名差异是各个共享包最容易不一致的地方我见过同一份数据在两个包里分别叫DE和signal务必先print keys确认。3.2 信号切片把长序列变成训练样本原始振动信号是长时间连续采集的长序列单条序列可能几十万点。直接整条扔进模型不现实通常的做法是滑动窗口切成长度相等的样本。窗口长度怎么选是关键常见取值是1024、2048或4096个采样点。以12 kHz采样率为例1024个点对应约85毫秒的信号对轴承故障信号来说已经包含足够多的旋转周期信息。窗口太短会丢失故障特征窗口太长会稀释样本数量、增加训练时间。我一般先看转速转速1797 RPM意味着每转约33毫秒窗口至少覆盖2到3转才比较稳也就是在小采样率下400个点左右。下面是切片代码示例def sliding_window(data, win_length1024, step512): samples [] for i in range(0, len(data) - win_length 1, step): samples.append(data[i:i win_length]) return np.array(samples)step可以等于win_length也可以小于win_length实现重叠采样。重叠能扩充样本量但也要小心如果后续切训练集测试集不按原始序列分组重叠会导致同一个原始片段既出现在训练集又出现在测试集性能虚高。3.3 特征提取时域和频域怎么组合不知道选什么特征时先把经典时域特征都算出来均方根值、峰值、峰值因子、峭度、偏度、波形因子、脉冲因子。这些指标对不同的故障模式有各自的敏感性。比如滚动体故障的冲击特征常常反映在高峭度上而外圈故障的周期性冲击会让峰值因子明显上升。算的时候用scipy.stats里的函数或者直接用numpy手写都不复杂。频域特征通常先做FFT取幅值谱然后计算重心频率、均方频率、频率方差等指标。如果直接拿原始FFT点几百上千维作为特征对于传统机器学习会有点臃肿可以先降维再进模型。一个比较稳的做法是把时域8个特征和频域5个特征拼成一个13维向量作为每条样本的描述子。from scipy import fft def extract_features(signal, fs12000): # 时域 rms np.sqrt(np.mean(signal ** 2)) peak np.max(np.abs(signal)) crest_factor peak / rms kurtosis np.mean((signal - np.mean(signal)) ** 4) / (np.std(signal) ** 4) # 频域 spectrum np.abs(fft.fft(signal))[:len(signal) // 2] freqs np.fft.fftfreq(len(signal), 1 / fs)[:len(signal) // 2] spectral_centroid np.sum(freqs * spectrum) / np.sum(spectrum) return np.array([rms, peak, crest_factor, kurtosis, spectral_centroid])这里我把特征控制得很少方便你理解流程。真正做比赛或论文时通常会组合更多特征比如小波包能量、经验模态分解的IMF能量占比、包络谱特征等但核心思路不变先提取形状合适的特征矩阵再喂给分类器。3.4 训练一个简单的故障分类模型把所有样本的特征矩阵组装好标签对应normal、inner_race、outer_race、ball四类。这里有一个关键操作训练集和测试集的划分不能简单随机打乱应该按“原始文件”分成不同的组。比如用0负载的所有文件做训练用1负载的文件做测试这样测出来的才是模型真正的跨工况泛化能力。如果随机打乱同一个文件里滑动出来的样本会同时出现在训练和测试集指标会好看很多但一到实际场景就崩。from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report X_train, y_train build_features(train_files) X_test, y_test build_features(test_files) clf RandomForestClassifier(n_estimators200, random_state42) clf.fit(X_train, y_train) y_pred clf.predict(X_test) print(accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred))随机森林是一个很稳的基线模型参数少、不容易过拟合。如果想用深度学习做端到端分类可以把切片后的原始信号直接送进1D-CNN输入形状是[batch, 1024, 1]训练流程和图像分类差不多这里就不再展开了但是基本的思路是相通的。4. 我在处理CWRU数据时踩过的坑与避坑建议4.1 常见问题速查表我整理一个表格都是实战中高频碰到的问题。问题原因解决办法scipy.io.loadmat 报错mat文件是v7.3格式改用h5py读取keys会变成str类型找不到DE字段不同整理版命名不一致先打印所有keys再统一映射DE和RPM长度不一致采样率不同分开读取不做直接拼接训练准确率99%但跨工况测试只有70%训练测试样本来自同一原始序列按文件分组划分数据集内存崩溃一次加载全部文件再切窗分批加载、边读边切h5py读取v7.3格式时有个很隐蔽的坑读出来的数据维度经常是转置的而且keys前面可能带着斜杠比如/DE。初次接触容易在这里卡很久。稳妥的做法是读出来后马上打印shape再用np.array(...).squeeze()去冗余维度。4.2 跨负载泛化检验是CWRU的试金石CWRU数据集最容易被忽略的一个细节就是负载工况。很多人把0、1、2、3马力所有负载的数据混在一起随机划分训练集测试集得到99%的精度但这实际上是在同一个工况分布里做的分类并没有真正验证模型对工况变化的鲁棒性。我建议至少做两个实验一个是在单负载内划分跑通流程另一个是用0负载训练、1/2/3负载分别测试或者反过来看模型跨工况掉点多少。这两个数字之间的差距能直观反映出模型是学到了故障机制还是只记住了某个转速下的特例。我自己的经验是跨工况测试掉点在5个百分点以内是比较健康的结果如果掉点超过20个百分点多半是特征选取过于依赖某个特定转速下的谐波分量需要重新设计特征比如使用包络谱、归一化频带能量等对转速变化不敏感的特征。还有一个容易被忽视的问题CWRU的原始文件里同一个故障状态下有时会有多次重复采集比如多次记录的数据分别放在不同文件里。整理数据包时要留意这些重复实验文件不要把同一个实验过程的多个文件都选入训练集以免造成不真实的重复信息。最后再分享一个实操心得拿到CWRU数据集后别急着跑模型先写一个小脚本把每个mat文件的通道名、长度、故障类型打印出来做个Excel清单。这一步看起来笨但能帮你后面省掉大量调试时间。数据包的整理脚本本身也是一份可复用的代码之后换到IEEE PHM 2012轴承数据集或者其他振动数据只需改改通道名逻辑就行。本文还有配套的精品资源点击获取
返回列表