拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CWRU轴承数据集实战:从文件读取到故障诊断完整流程

简介滚动轴承是旋转机械的核心部件其健康状态直接影响设备可靠性与生产安全故障诊断因此成为工业智能运维的重要基础。振动信号分析是识别轴承故障的常用手段掌握特征频率计算、包络谱分析等概念有助于从复杂信号中定位故障特征。公开数据集为算法验证与对比研究提供了标准基准凯斯西储大学CWRU滚动轴承数据集因覆盖多种典型故障形态成为该领域广泛使用的参考数据。借助Python对振动数据进行读取、滑窗切分、特征提取与深度学习建模可快速搭建完整的故障诊断流程并规避标签混淆、数据泄漏等工程陷阱。围绕CWRU数据集实践能系统理解文件命名规则、特征频率计算与实现要点为轴承故障诊断研究提供可复用参考。 做轴承故障诊断这几年我慢慢发现一个很有意思的现象不管是刚入门的硕士生还是已经发了顶刊的老手大家聊起实验数据第一个被拎出来的往往都是凯斯西储大学CWRU滚动轴承数据集。这套数据从公开发布到今天已经被用了二十多年论文里的出场率仍然高得吓人。它的定位很清晰——一组实验室条件下的滚动轴承振动信号覆盖正常、内圈故障、外圈故障和滚动体故障几种典型状态包含不同负载、不同损伤尺寸还同时提供12kHz和48kHz两种采样率。对于刚接触轴承故障诊断的人来说它是最好的练手材料对于做算法迁移和对比验证的研究者它也是绕不开的基准数据集。不过数据开源不等于拿来即用。我见过很多人在数据读取、文件命名、数据集划分这些最容易忽略的环节上翻车最后模型精度做得很好看但实验设计其实不严谨。这篇文章就把我从搭建第一个CWRU数据管线到现在的一些经验系统梳理一遍包括实验台背景、文件格式解读、特征频率计算、Python处理流程以及那几个反复有人踩的坑。1. 一套1990年代的实验数据为什么今天还在被刷屏1.1 从哪儿来一套公开数据的前世今生凯斯西储大学轴承数据中心CWRU Bearing Data Center是这套数据的官方来源。实验数据从九十年代开始采集由凯斯西储大学的课题组在电机传动实验台上完成后期整理成.mat格式挂在公开网页上免费下载。因为年代足够早、公开时间足够长、用的人足够多它慢慢成了机械故障诊断领域的一个“默认基准”。类似ImageNet在计算机视觉里的地位CWRU差不多就是旋转机械故障诊断圈里的标准起点。为什么我强调它是“实验室条件”数据因为这意味着传感器安装位置固定、采样率固定、故障是人为用电火花加工的所以信号里的故障特征非常干净算法跑起来很容易得到高分。这既是它的优点也是它的陷阱——在CWRU上跑出99%的准确率并不代表算法在工业现场同样有效。理解这一点你才能正确评估自己的模型。1.2 数据里有什么四种状态、三种损伤尺寸、四个负载CWRU数据从状态维度看主要有四种正常Normal、滚动体故障Ball代码里常写作B、内圈故障Inner Race写作IR、外圈故障Outer Race写作OR。故障是使用电火花加工EDM在轴承表面人为制造的单点损伤损伤直径常见的有0.007英寸、0.014英寸和0.021英寸约合0.18mm、0.36mm和0.53mm。个别扩展包还有0.028英寸、0.040英寸的版本。负载工况方面测功机提供0、1、2、3马力四种负载分别对应电机转速约1797、1772、1750、1730 rpm。这里有个容易忽略的点负载和转速是绑定出现的不是两个完全独立的变量。电机负载加大转速自然下降轴承滚动体通过频率也随之变化所以“用不同负载的数据做迁移学习”和“用不同转速的信号做域适应”是同一个物理过程的不同表述。数据量方面正常信号每个文件大约10秒12kHz采样率下约12万个点48kHz下约48万个点。故障数据的文件长度经常不一样有的101个点开头、有的12万点出头跟实验记录时间有关后面处理时要注意统一长度。整体来看这个数据集的规模并不大做深度学习时如果不做滑窗扩增样本数会很紧张。2. 实验台结构电机、传感器与采样配置2.1 一套典型的电机-负载实验台许多资料只把CWRU当文件列表来用完全不关注后台实验装置但我觉得弄清楚实验台结构是理解数据的关键前提。CWRU使用的是一台2马力三相感应电机电机输出轴通过联轴器连接一台扭矩传感器/译码器再接到测功机。测功机的职责是给电机施加可调负载也就是我们看到的0到3马力那一列。实验轴承被安装在两个位置一个是电机的驱动端一个是风扇端。驱动端轴承是6205-2RS JEM深沟球轴承风扇端是6203-2RS JEM深沟球轴承。因为驱动端承受的载荷更大所以主要故障数据都来自驱动端轴承。很多初学者会把风扇端和驱动端的数据混着用理论上它们都可以用但轴承型号不同几何参数也不同特征频率差异非常明显混用时必须分别计算。2.2 传感器布置与采样率选择加速度传感器被安装在电机壳体上的轴承座正上方也就是十二点钟位置一个装在驱动端一个装在风扇端。振动信号经过16通道DAT记录仪采集再用抗混叠滤波器处理后保存。官网提供了三组主流数据文件12k Drive End、12k Fan End、48k Drive End。48kHz那组只有驱动端加速度计12kHz那组则有驱动端和风扇端两个传感器。为什么采样率重要因为轴承故障冲击本身是很尖锐的瞬态信号早期故障的冲击能量集中在高频共振区。采样率如果太低冲击细节会被混叠抹掉包络解调就很难做。CWRU提供的12kHz和48kHz两个档位里48kHz适合做更精细的故障特征分析12kHz则因为数据量小、处理快更适合深度学习的快速迭代。我的习惯是特征工程验证用12kHz足够发布论文或做高精度对比实验时再用48kHz因为更高的采样率意味着更完整的冲击波形。2.3 键名里的冗余信息RPM、rate 等每个.mat文件除了振动信号往往还保存着转速字段、采样率字段、时间字段等元信息。不同来源的文件键名并不完全一致。有的官方原版文件里能直接看到RPM、rate而网上有人二次打包过的版本可能把键名改成了X097_DE_time这类形式。这提醒我们拿到文件后先打印keys()确认实际的键名和数组形状再往下写处理代码不要凭记忆盲抄网上的代码。3. 文件命名就是数据字典DE、FE、BA、6和负载数字逐个拆3.1 文件名里的四段信息CWRU数据下载下来之后第一关就是读懂文件名。文件名看起来像乱码其实编码规则特别固定“故障位置 故障直径 故障位置相位 负载马力”。我以几个典型文件为例拆解文件名含义IR007_0.mat驱动端内圈故障损伤直径0.007英寸负载0hpB014_1.mat滚动体故障损伤直径0.014英寸负载1hpOR0076_0.mat外圈故障损伤直径0.007英寸损伤位于6点钟方向负载0hpNormal_0.mat正常状态负载0hp故障位置代码里IR是内圈B是滚动体OR是外圈。损伤直径只有三个常见档位007、014、021代表0.007、0.014、0.021英寸。负载档位是最后的下划线数字0到3分别对应0到3马力。Normal正常数据不区分故障位置但负载后缀同样存在。3.2 外圈故障的位置为什么是3、6、12外圈故障文件里有个特殊符号比如OR0076_0这个后面的数字表示故障损伤点相对轴承承载区的位置。三组数分别是3点钟、6点钟和12点钟方向。滚动轴承中外圈承载区通常位于径向载荷方向的底部6点钟方向载荷最大12点钟方向载荷最小3点钟方向居中。这意味着同一种外圈故障尺寸只因为损伤位置不同振动幅值和冲击形态就会有明显差异。做分类时如果不区分位置把6点钟和12点钟的外圈故障混成一个标签模型可能会学出很强的位置敏感性换一组数据就崩。我的做法是要么把不同位置的OR数据各自作为一类要么在论文里明确说明合并策略绝不在代码里默默混标签。3.3 采样率不同的两套文件不要直接混在一个训练集里官网下载的.mat文件分为12kHz和48kHz两种采样率统一文件命名规则但内部数据密度不同。如果不加处理把12kHz和48kHz文件一起滑窗送进模型等价于让模型同时学习两个不同时间分辨率下的特征。如果只是做分类模型也许能靠幅值分布硬扛过去如果要做频域特征或包络谱分析采样率不一致就会带来毁灭性的偏差。所以先用哪个采样率、是否重采样、每类多少样本这些决策要在一开始就写清楚。4. 先算特征频率再去看波形6205轴承的几何参数与故障基频4.1 6205-2RS轴承的几何参数理解数据之前我建议先花十分钟把轴承几何参数和特征频率算一遍。这不仅能帮你验证读取的数据是否符合预期还能让你在频谱图里快速定位故障特征峰。CWRU驱动端最常用的6205-2RS深沟球轴承关键参数如下参数数值说明节圆直径D39.04mm滚动体中心所在圆周直径滚动体直径d7.94mm单个滚动体直径滚动体数量Z9滚动体个数接触角α约0°深沟球轴承近似为04.2 四个特征频率公式滚动轴承故障特征频率是转速和轴承几何参数的函数。对内圈、外圈、滚动体和保持架分别有对应公式外圈故障特征频率 BPFO (Z/2) × fr × (1 - (d/D) × cosα)内圈故障特征频率 BPFI (Z/2) × fr × (1 (d/D) × cosα)滚动体故障特征频率 BSF (D/(2d)) × fr × (1 - (d/D)² × cos²α)保持架故障特征频率 FTF (fr/2) × (1 - (d/D) × cosα)以1797rpm为例轴的转频fr约等于29.95Hz。代入6205轴承参数BPFO ≈ 3.5848 × fr ≈ 107.4HzBPFI ≈ 5.4152 × fr ≈ 162.2HzBSF ≈ 2.3568 × fr ≈ 70.6HzFTF ≈ 0.3983 × fr ≈ 11.9Hz随着负载增大、转速下降到1730rpm这些频率也会整体下移。所以在画频谱图标注故障频率时不能只写死一组数值要从文件元数据或对应工况表里取出实际转速再计算。4.3 用特征频率验证数据读取是否正确我知道很多人下载数据后第一件事就是画图但更推荐先算特征频率再画频谱把理论谱线和实测谱峰叠在一起看。比如读取一个内圈故障文件在频谱图上找到162Hz附近的谱峰如果谱峰和BPFI以及它的倍频能一一对应说明你读的数据、选的通道、算的频率都没错。如果完全对不上大概率是采样率取错或通道取成了风扇端。5. 用Python把.mat文件变成可用的训练集loadmat到滑窗切分5.1 读取.mat文件并检查内部结构CWRU的.mat文件本质上是MATLAB格式Python这边用SciPy的loadmat就能直接读不需要换到MATLAB环境。代码非常简单但每个人几乎都会遇到键名问题所以第一步一定是打印keys()。from scipy.io import loadmat import numpy as np mat loadmat(IR007_0.mat) print(mat.keys())常见的输出里会看到DE、FE、BA、time、RPM、rate等键。DE是驱动端加速度计信号FE是风扇端加速度计信号BA是基座加速度计信号。每个键对应的数组通常是一个列向量比如(122572, 1)表示这段信号有122572个采样点。注意loadmat读进来的数组可能是二维列向量切窗和特征计算前最好先ravel()压缩成一维不然一不留神就处理出形状错误。de mat[DE].ravel() fs 12000 print(de.shape, de.dtype)5.2 可视化时域信号与频谱读进来之后最直观的验证方式就是画时域波形和频谱图。时域上故障冲击表现为周期性的尖脉冲频域上可以看到特征频率及其倍频但实际频谱往往会被噪声和谐波淹没所以很多人会立即转到包络谱分析这一点后面专门讲。import matplotlib.pyplot as plt t np.arange(len(de)) / fs plt.figure(figsize(12, 4)) plt.plot(t[:4096], de[:4096]) plt.xlabel(Time (s)) plt.ylabel(Amplitude) plt.show()频谱可以用numpy.fft.rfft计算注意幅值归一化。取前2000Hz来看已经足够覆盖轴承故障特征频率及常见倍频。from numpy.fft import rfft, rfftfreq n len(de) fft_amp np.abs(rfft(de)) * 2.0 / n freqs rfftfreq(n, d1/fs) plt.figure(figsize(12, 4)) plt.plot(freqs, fft_amp) plt.xlim(0, 2000) plt.xlabel(Frequency (Hz)) plt.ylabel(Amplitude) plt.show()5.3 滑窗切分与样本扩增CWRU单个文件只有约10秒信号深度模型直接拿整段训练并不合适。常规做法是用滑窗切出固定长度的短样本。窗口长度一般取1024、2048或4096。窗口越短样本数越多但单样本包含的故障周期越少窗口越长单个样本信息越完整但样本数会骤减。def slide_window(data, win_size, step): windows [] for start in range(0, len(data) - win_size, step): windows.append(data[start:start win_size]) return np.array(windows) win_size 2048 step 1024 x slide_window(de, win_size, step) print(x.shape)以12kHz采样率、窗口2048点、步长1024点计算一个12万点的文件大概能切出约118个样本。如果同时使用多个负载、多个故障直径的文件总样本量能达到几千个对经典深度模型来说已经够用。5.4 标签体系的工程化设计切窗后会得到一个三维数组形状是(样本数, 窗口长度, 通道数)或者直接(样本数, 窗口长度)。标签体系建议不要用裸数字编码而是建一个明确的字典映射。label_map { Normal: 0, IR007: 1, IR014: 2, IR021: 3, B007: 4, B014: 5, B021: 6, OR0076: 7, OR0146: 8, OR0216: 9, }如果你做的是粗粒度四分类可以只区分正常、内圈、外圈、滚动体如果做细粒度十分类就必须区分故障直径和位置。两种任务对模型的难度完全不同写论文时一定要在方法部分明确说明用了哪种标签粒度。6. 时域、频域和包络谱从原始波形到可解释的特征6.1 时域特征快速但不全面的刻画经典故障诊断里时域特征因为计算简单、物理含义直观常用于早期筛选。常用的有均方根值、峰值因子、峭度、偏度、波形因子、脉冲因子、裕度因子等。均方根值反映振动总体能量水平峭度对冲击型故障特别敏感这就是为什么很多工业监测系统只用峭度一个指标也能发现早期轴承损伤。from scipy.stats import kurtosis, skew def calc_time_features(x): rms np.sqrt(np.mean(x**2)) peak np.max(np.abs(x)) features { rms: rms, peak: peak, peak_factor: peak / (rms 1e-12), kurtosis: kurtosis(x), skewness: skew(x), std: np.std(x), } return features时域特征的问题在于对工况变化很敏感。同一轴承负载从0hp变成3hp振动幅值会大幅变化均方根值也随之漂移。所以时域特征适合做单工况监测做跨工况分类时需要配合归一化。6.2 频域特征功率谱与重心频率频域特征能把时域里看不出的周期成分拉开。最简单的做法是计算幅值谱或功率谱再提取统计量比如重心频率、频率均方根、谱峭度等。下面代码计算了频域重心频率和频带能量可以用于分类器的输入。def calc_freq_features(x, fs): n len(x) fft_amp np.abs(rfft(x)) * 2.0 / n freqs rfftfreq(n, d1/fs) total_power np.sum(fft_amp**2) centroid np.sum(freqs * fft_amp**2) / (total_power 1e-12) return { centroid_freq: centroid, mean_amp: np.mean(fft_amp), max_amp: np.max(fft_amp), }6.3 包络谱早期故障的放大器直接看原始频谱时故障冲击往往和机器结构共振混在一起谱峰不明显。包络谱的做法是先用Hilbert变换求出信号的包络再对包络做FFT把高频共振能量解调到低频故障特征频率上。这一步对早期微弱故障特别有效也是工业现场常用共振解调技术的雏形。from scipy.signal import hilbert def envelope_spectrum(x, fs): analytic hilbert(x) envelope np.abs(analytic) n len(envelope) fft_amp np.abs(rfft(envelope)) * 2.0 / n freqs rfftfreq(n, d1/fs) return freqs, fft_amp使用包络谱时有个参数需要注意Hilbert变换对整个序列操作如果信号太长内存和耗时都会上升通常先把信号切段再做包络分析。另外包络谱的幅值不代表原始冲击能量只表示包络波动的强度做比较时要保持相同的处理流程。6.4 特征工程的定位不是替代深度学习而是深度学习的补充现在不少文章一上来就用端到端深度学习完全把特征工程扔掉。这种做法在CWRU上确实可以跑出很高的准确率但一旦把训练好的模型迁移到另一台设备、另一个转速域表现往往断崖式下降。我的习惯是先用特征工程做一轮可解释分析确定故障特征在哪个频带、哪类特征最敏感再用深度学习做自动特征提取。前者指导后者后者也反过来验证前者的判断。7. 实测中容易踩的坑和现在复用这套数据时的习惯7.1 坑一外圈故障位置混用外圈故障有3、6、12点钟三个位置很多代码直接把所有外圈故障文件归成一类而不区分位置。这会让模型把“位置”学习成隐藏分类特征导致在真实场景中对不同载荷方向的外圈故障失效。我的做法是标签里必须带上位置信息或者至少做消融实验说明位置对结果的影响。7.2 坑二负载与转速混为一谈不少代码把0hp、1hp、2hp、3hp的数据全部塞进训练集然后随机切分训练测试集最后得到99%以上的准确率。这种做法不是完全错误但会掩盖模型对工况的适应能力。更严谨的实验设计是用0hp、1hp、2hp训练用3hp测试验证模型能否跨工况泛化。CWRU的载荷范围有限不能完美模拟工况变化但至少能作为一种域偏移测试。7.3 坑三随机切窗造成数据泄漏假设你从一个12万点的文件里切出100个窗口然后随机把这100个窗口分成训练集和测试集那么训练集和测试集里会出现大量来自同一时间段、高度重叠的信号片段。这种情况下模型不是在学“故障特征”而是在学“相邻窗口的连续性”准确率虚高。正确做法是先把文件和窗口分组整个文件要么进训练集要么进测试集不让同一个文件的窗口同时出现在两边。7.4 坑四归一化时机错误归一化是深度学习非常容易出错的一步。常见错误是先用整个数据集计算均值和标准差然后再划分训练测试集。这会引入测试集信息相当于数据泄漏。正确做法是只用训练集统计量进行归一化测试集沿用训练集的均值和方差。对CWRU这种幅值分布本来就比较接近的数据集影响可能不大但这个习惯一旦养成在处理真实工业数据时会救你一命。7.5 坑五对几十年前的实验条件过于信任CWRU数据虽然经典但它毕竟是实验室条件故障类型是电火花加工的单点损伤和实际轴承的磨损、剥落、缺油等复合故障相差很大。在CWRU上效果很好的算法不见得能直接用在现场数据上。我现在的做法是把CWRU作为算法验证的起点再用其他公开数据集或自采数据做交叉验证至少保证方法不只在单一数据集上成立。在我个人操作中拿到任何一个CWRU文件都会先跑一个固定的检查流程打印键名、确认采样率、查看信号长度、算特征频率、画时域和包络谱全部对得上之后才会继续切窗和建模。这个流程看起来多花五分钟但能避免后面所有因为数据读错而产生的无效实验。至于训练阶段我倾向于把不同负载的数据分组成四个子集先看单负载内的分类效果再看跨负载迁移效果两套结果同时写在实验记录里这样既能看到模型能力的上限也能看清它的泛化边界。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门