公司动态

机械故障诊断公开数据集盘点:从CWRU到PU的避坑指南

📅 2026/8/29 23:42:21
机械故障诊断公开数据集盘点:从CWRU到PU的避坑指南
简介机械故障诊断是工业设备健康管理的核心技术而高质量的数据集是算法验证与模型落地的基石。在深度学习方法驱动下研究者通常依赖公开的振动信号数据来开展故障分类、退化识别与剩余寿命预测等任务。滚动轴承作为旋转机械中故障率最高的部件其公开数据集如CWRU、IMS、MFPT、XJTU-SY等承载了从人工注入故障到全寿命退化数据的多种实验场景为不同研究方向提供了基础支撑。理解数据集的采集原理、工况条件与标签结构是避免模型过拟合和结果虚高的关键。无论是做跨工况迁移学习、多传感器融合还是面向工业现场的鲁棒性验证合理选型与规范预处理都直接决定实验结论的可信度。本文系统梳理了主流机械故障诊断公开数据集的特点、适用任务与常见坑点帮助研究者和工程师快速建立数据选型与实验设计的全局认知。 做机械故障诊断的人尤其是想往深度学习方向走的同学最头疼的往往不是模型结构选什么而是数据从哪来。我接触过不少项目和论文第一版实验用的基本都是某个公开数据集跑出来的。说实话机械故障诊断公开数据集这潭水挺深的看似能找到一堆资源真要能直接拿来用、能复现、能写进论文里的其实就那几个。今天这篇不端着把我自己用过的、踩过坑的、认为值得用的数据集全部盘一遍该给的细节给到位该避的坑也不藏着。先说个背景为什么公开数据集这么稀缺。机械故障诊断的核心是拿到故障状态下的振动信号而这类信号必须在真实设备或者实验台上采集故障不是你想注入就能注入的你得有专门的实验台得准备不同损坏程度的轴承、齿轮得安排传感器和采集系统一套下来几十万打底。更麻烦的是现场设备不可能为了你的研究去故意跑坏一个轴承。所以大多数实验室和工程师都把目光投向公开数据。但公开数据集本身有一个特点——它们大多来自高校或研究机构的实验台实验条件、传感器安装位置、采样参数都各不相同这既是挑战也是机会挑战在于跨数据集的泛化问题机会在于你可以用不同数据做迁移学习、域适应这类更有深度的题目。我下面按部件类型来拆先从最成熟、最常用的滚动轴承数据集开始讲。1. 滚动轴承数据集入坑首选和进阶路线滚动轴承是旋转机械里故障率最高的部件之一所以公开数据集里轴承类的最多也最规范。这一节我把四个绕不开的数据集逐个说透从入门到进阶都有。1.1 CWRU绕不开的入门数据集CWRU是由美国凯斯西储大学轴承数据中心发布的滚动轴承振动数据集说它是机械故障诊断领域的“Hello World”一点不过分。实验装置大致是一台2马力电机通过扭矩传感器和测力计连接负载测试轴承安装在电机驱动端和风扇端。故障是用电火花加工的方式在轴承上人为制造的点蚀损伤损伤直径有0.007英寸、0.014英寸、0.021英寸、0.028英寸几个等级故障类型覆盖内圈故障、外圈故障、滚动体故障另外还有正常状态的样本。这个数据集的使用频率高到几乎所有相关论文里都能看到它的身影但你真正去下载的时候才会发现几个问题。第一它的文件组织方式是编号形式早期版本直接是一串数字的mat文件比如105.mat、118.mat得配合官方的说明文件才能查到具体对应哪个工况、哪种故障、多少负载后面更新过的版本才有更直观的文件名。第二数据采样率有12kHz和48kHz两种电机负载从0到3马力对应转速大概在1797、1772、1750、1730转每分钟左右这个参数在论文方法对比时一定要写清楚不写清楚别人根本没法复现你的实验。我在实际使用中强烈建议如果你只是想快速验证一个算法流程就用12kHz驱动端数据切段长度在1024到2048个点之间正常、内圈故障、外圈故障、滚动体故障各取一部分做四分类。这个数据量大、标签清晰非常适合作为基准测试。但也要清醒认识一点CWRU的故障是规则的人工损伤信号特征干净噪声相对小和真实工业环境里的早期微弱故障差距很大。所以它适合做算法验证不适合作为唯一说服力。1.2 IMS拿到退化全过程的珍贵数据IMS数据来自美国辛辛那提大学智能维护系统中心由NSF资助的长期轴承疲劳试验产生。它的设计思路和CWRU完全不同——不是人为加工故障而是让轴承在过载条件下自然跑完整个寿命周期一直到损坏。实验条件是四个轴承同时安装在轴上转速保持在2000转每分径向载荷6000磅振动信号由三个通道采集采样率20kHz每隔10分钟记录一次数据。这套数据的价值在于它记录了轴承从健康到退化再到严重损坏的完整过程因此特别适合做剩余寿命预测、退化状态识别这类题目。数据文件是txt格式每个文件里是一个N乘3的矩阵三列对应三个通道。我在处理时习惯把三个通道都读出来先做特征提取再看趋势。需要注意的是IMS的三个实验组对应的失效位置不一样第一组和第二组是内圈或滚动体损坏第三组是外圈损坏你要做寿命预测时必须明确自己用的是哪一组因为失效模式不同退化规律也不同。由于它是全生命周期数据你拿来切样本的时候要特别注意“健康期”和“退化期”的边界划分。这个边界没有统一标准很多论文用均方根值或峭度的突变点来定你也可以根据实际数据的趋势图来定。这里提醒一句如果直接用全部数据训练一个分类器把早期健康段和晚期故障段强行分成两类效果会“好”得很虚假因为这两类差异太明显了没有任何诊断价值。1.3 MFPT适用面广的基准数据集MFPT数据集由美国机械故障预防技术学会提供全称是MFPT Fault Data Sets多数情况下你在论文里看到的“MFPT bearing dataset”指的就是它。它是在故障模拟实验台上采集的数据分成几个类别正常状态、外圈故障、内圈故障还有不同负载工况下的组合故障和复合故障。采样率记得是97656Hz左右大约是97.6kHz采样精度比较高信号细节比12kHz的数据丰富很多。我用这套数据的经历比较特殊因为它的文件数量不算多但每种故障的工况覆盖比较全。比如内圈故障有多个负载等级外圈故障也有不同负载这为做“跨工况诊断”提供了便利。你可以用低负载的数据训练用高负载的数据测试看看模型能不能适应负载变化。整体上说MFPT的故障数据相对于CWRU更接近真实故障形态适合做算法鲁棒性验证。不过它的文件结构是mat格式有些还有结构体嵌套读取的时候要小心后面我会专门讲读取工具的坑。1.4 XJTU-SY加速寿命实验的国产高质量数据集XJTU-SY数据集是西安交通大学和昇科仪器联合发布的滚动轴承加速寿命试验公开数据在2019年前后逐渐被国内研究者广泛使用。它一共包含15个滚动轴承的完整加速退化振动信号分三种工况每种工况下有5个轴承实验一直运行到轴承完全失效为止采样频率我记得在25.6kHz左右数据文件以csv格式存储每个文件对应一个时间段的振动信号。这套数据的特色在于每个轴承的退化轨迹都不一样有些轴承的寿命非常短有些能跑很久真实地反映了工业现场“同类轴承寿命离散性大”的特点。所以我通常把它作为RUL预测或者退化阶段划分的第二验证集避免了只在一个数据集上得出结论的尴尬。它也是目前国内高校自建数据中引用率比较高的一套。后续做实验的话建议把前几个采样点作为健康基线后面真正进入退化期再做标签两个阶段分开处理效果会好很多。2. 齿轮箱与复合传动系统数据集从单部件走向整机轴承数据只是单部件诊断但实际工业设备往往是轴、轴承、齿轮、联轴器等多部件耦合在一起故障特征互相干扰诊断难度上了一个台阶。我接着聊三个我实际用过的多部件或齿轮箱相关数据集。2.1 SEU齿轮箱数据集有故障粒度细分的入门选择SEU是东南大学发布的齿轮箱故障诊断数据集在领域内也经常看到。它采集的是齿轮箱的振动信号健康状态包括正常、缺齿、断齿、齿根裂纹、齿面磨损等类型同时部分数据还包含轴承故障。数据采集有两种负载设置通过控制电压来模拟不同负载工况因此在跨工况验证上很有价值。这个数据集的采样频率我记得是5120Hz属于低频段但故障特征信息足够而且文件命名和标签相对清晰对新手友好。如果你之前只玩过CWRU拿SEU来练手是非常自然的过渡——数据量适中、类别数多、工况维度也够。不过它的信号长度相对较短切窗时窗口不宜太大我一般取256到1024个点就足够了。需要提醒的是SEU数据集中不同故障类别下的样本数量并不均衡尤其正常状态样本少训练时要考虑类别加权或者过采样。2.2 PHM系列挑战赛数据检验方法上限的好素材PHM是故障预测与健康管理领域的顶级会议它每年组织数据挑战赛其中PHM09齿轮箱故障诊断数据是经典中的经典。这套数据来源于齿轮箱实际运行实验包含正常状态和多种齿轮故障状态而且是在不同转速和负载组合下采集的任务目标是判断齿轮箱的健康状态。数据格式比较规整采样率较高但是标签体系和普通数据集不太一样它把多个工况、多个故障混在一起必须自己整理映射关系。PHM10的数据则是轴承加速寿命试验为主用的是一个四工位实验台每个轴承跑完整个退化过程官方给出训练轴承的退化数据要求预测测试轴承的剩余寿命。这类挑战赛数据的价值不仅在于“数据量大”更在于任务定义清晰评判标准明确。你拿PHM09做有监督分类拿PHM10做RUL回归正好可以同时检验方法在分类任务和回归任务上的能力。说实话很多人只盯着CWRU跑分类精度我反而建议多在PHM数据上做做回归课题这类方向发文章的竞争压力小一些而且工程价值更高。2.3 PU轴承数据集工业味道最浓的选择PU轴承数据集来自德国帕德博嫩大学全称是Paderborn University Bearing Dataset。它和前面所有数据集最大的不同在于轴承故障一部分是真实运行过程中自然损坏的另一部分是人工注入的同时还包括健康状态。整个实验在工业级的模块化试验台上完成采集信号包括振动和电流两大类型传感器布置和采样频率都更接近工业现场官方说明书里还把每个轴承的运行时长、损坏过程都标注得清清楚楚。我最早用PU数据集时最大的感受是“原来真实工业信号这么不友好。”它包含的干扰成分明显比CWRU多很多“健康”样本在时域和频域上看都不是那么干净这恰恰是好事——你训练的模型如果能在PU数据上表现稳定才说明它真的具备落地潜力。PU数据集还有一个隐藏优势它同时给出了振动信号和电机电流信号适合做多传感器融合的论文方向。不过它的文件格式是结构化的mat文件内部字段嵌套层次较深第一次上手时需要多花点时间梳理字段结构。3. 数据集横向对比到底选哪个一张表说清楚前面分别介绍了主流数据集但很多新手真正纠结的是我到底该用哪个我把核心参数和适用任务汇总成一张表并给出对应建议。数据集部件类型故障类型采样率工作条件文件格式适合任务CWRU滚动轴承内圈/外圈/滚动体/正常12k/48k Hz4种负载mat分类入门、特征提取验证IMS滚动轴承全生命周期退化20k Hz单工况txtRUL预测、退化检测MFPT滚动轴承内圈/外圈/正常/组合约97.6k Hz多负载mat跨工况诊断、复合故障XJTU-SY滚动轴承加速寿命退化约25.6k Hz3种工况csvRUL预测、退化阶段识别SEU齿轮箱轴承缺齿/断齿/裂纹/磨损5.12k Hz2种负载mat齿轮箱分类、跨工况验证PHM09齿轮箱多种齿轮故障高频多转速多负载csv/mat竞赛复现、算法排序PHM10/FEMTO滚动轴承全寿命退化25.6k Hz多工况多工位csv/matRUL挑战赛PU滚动轴承天然人工故障/健康64k Hz含电流多工况mat多传感器融合、域适应看完表你可能会问是不是直接选一个最好用的就行了我的建议是这样分的。如果你是第一次接触机械故障诊断先跑CWRU理由很简单数据量适中、标签明确、社区讨论多遇到问题搜得到答案。当你把整个流程跑通以后再接触IMS和XJTU-SY这类退化数据尝试做更难的寿命预测任务。如果目标是发论文强烈建议至少用一个真实退化数据集和一个复合故障数据集做补充实验而不是只在CWRU上刷一个漂亮的分类精度。审稿人现在对这个非常敏感纯CWRU分类报告已经比较难作为工作量支撑了。另外还有一个选型思路是结合自己的研究方向。做域自适应、跨工况迁移学习的优先选MFPT和SEU因为它们天然包含不同工况做多传感器融合的优先选PU因为它同时有振动和电流做小样本学习的可以考虑PHM09因为它的训练测试划分相对严格不容易作弊。4. 实操流程从下载原始数据到跑通第一个基准实验有了数据集之后不少人又卡在了加载和预处理上。这一步看着简单但不同数据集的格式差异很大直接套同样的代码往往会报错。我以CWRU为例给一套完整可跑的流程这套流程同样可以用在其他mat数据集上。4.1 目录组织一开始就为扩展做准备我强烈建议在项目根目录下按“原始数据”和“处理数据”分开组织原始数据只读不做任何修改处理数据存放切片、特征和标签。这样当你想换数据集或者重新做清洗时不会动到原始文件。目录结构可以参考这样datasets/ raw/ cwru/ 12k_drive_end/ 12k_fan_end/ 48k_drive_end/ processed/ cwru_12k/ train/ test/ models/原始数据下载下来以后先解压放好文件名尽量保留官方原始命名不要自作主张改成中文名否则后期写论文对应的数据版本时容易搞混。4.2 加载mat文件并跳过版本大坑CWRU的mat文件多数是旧版MATLAB格式用scipy可以正常读取。需要注意的有两种异常情况一是有些新上传的数据被保存成了v7.3格式这种文件用scipy.io.loadmat读不了会报“not implemented”之类的错误二是即使能读通mat中保存的键名可能和你预期不同需要先打印keys看看。我建议写一个通用加载函数自动判断是普通mat还是HDF5格式代码如下import scipy.io import h5py import numpy as np def load_mat(path): try: data scipy.io.loadmat(path) return {k: v for k, v in data.items() if not k.startswith(__)} except NotImplementedError: with h5py.File(path, r) as f: data {} for k in f.keys(): data[k] np.array(f[k]) return data读出来的数据一般是一个二维数组行或列对应不同通道。CWRU驱动端12kHz数据通常是“DE_time”驱动端振动、FE_time风扇端振动、“BA_time”基座振动三个键每个键对应一个一维数组你需要哪个通道就取哪个。4.3 滑窗切片与训练测试划分警惕数据泄漏采集到的原始振动信号是一长串连续的数据不能直接把整段丢给模型通常用滑动窗口截成等长样本。窗口长度我常用1024步长512这样样本之间有50%重叠数据量是原来的两倍左右对小数据集来说很划算。但这里有一个最隐蔽的坑如果先切窗再随机划分训练集和测试集来自同一段原始连续信号的窗户可能同时出现在训练集和测试集里模型实际上“见过”测试数据的相邻片段指标虚高得离谱。这在论文里是硬伤。正确的做法是先按原始文件划分训练和测试或者按“段的边界”划分。如果某类数据只来自一个文件那就要把该文件的前70%作为训练、后30%作为测试或者干脆按不同记录编号划分。代码如下def make_windows(signal, win_len1024, stride512): windows [] for start in range(0, len(signal) - win_len 1, stride): windows.append(signal[start:start win_len]) return np.array(windows) # 假设每个mat文件对应一段独立工况按文件划分 train_windows [] test_windows [] for file in train_files: train_windows.append(make_windows(load_file(file))) for file in test_files: test_windows.append(make_windows(load_file(file))) train_windows np.concatenate(train_windows, axis0)切片后还需要做归一化。由于振动信号幅值在不同工况下可能相差较大建议在训练集上计算均值和标准差然后同样的参数应用到测试集而不是每个样本单独归一化不然跨工况实验的结果说服力会受影响。4.4 用一个极简一维CNN快速验证流程数据整理好以后不需要先上复杂模型搭一个最基础的一维卷积网络能完整跑通训练和评估流程就够了。我这里给一个用PyTorch写的极简示例目的是验证数据管道没有问题而不是追求最优准确率。import torch import torch.nn as nn class SimpleCNN1D(nn.Module): def __init__(self, num_classes4): super().__init__() self.conv1 nn.Sequential( nn.Conv1d(1, 16, kernel_size3, padding1), nn.ReLU(), nn.MaxPool1d(2) ) self.conv2 nn.Sequential( nn.Conv1d(16, 32, kernel_size3, padding1), nn.ReLU(), nn.MaxPool1d(2) ) self.fc nn.Sequential( nn.Flatten(), nn.Linear(32 * (1024 // 4), 64), nn.ReLU(), nn.Linear(64, num_classes) ) def forward(self, x): x x.unsqueeze(1) x self.conv1(x) x self.conv2(x) x self.fc(x) return x输入维度是1024经过两次池化之后变成256全连接层的维度按这个来算。跑训练的时候建议用一个很小的批次比如32学习率1e-3跑几十个epoch看训练曲线是否正常下降。如果这个极简模型在数据集上能稳定收敛到80%以上CWRU四分类通常很容易说明数据加载、标签对应、训练流程全部正常这时候再换复杂模型才有意义。5. 这些数据集藏得很深的坑我逐个踩过最后这部分是真正的经验值了。有些坑我一开始都忽略了等到实验做了一半或者写论文时才发现返工成本极高。5.1 mat文件的版本和转置问题前面提到过v7.3格式的问题这里再展开讲一下。很多新版本MATLAB默认保存格式就是v7.3这种文件用scipy读不了如果你只会用scipy.io.loadmat一定会卡在这里。解决办法是改用h5py读取但要注意h5py读出来的数组默认是转置的维度顺序可能和MATLAB里的原始数组相反。比如MATLAB里存储形状是3乘N的数据h5py读出来可能是N乘3你必须针对具体文件做转置检查否则后面所有样本都会被切错。强烈建议在加载函数里加一个维度检查的断言。5.2 CWRU文件名和标签对应关系容易搞错CWRU官网上有多个版本的文件不同版本的文件命名规则不完全一样。有的版本直接是“105.mat”这种纯数字编号需要查官方的excel表有的版本是“IR007_0.mat”这种直观命名。纯数字编号版本特别容易出错因为编号不连续中间还有缺失你如果用range自动生成编号再一一对应一定会对错。我的做法是把官方说明表格下载下来通过文件名映射建立字典再手动抽查几个文件确认标签和信号大致吻合。5.3 IMS和XJTU-SY的长序列数据需要自己定“健康”和“故障”边界寿命数据没有给你现成的标签官方只告诉你轴承最后坏了但具体从哪个时刻开始算退化得自己判断。这个问题如果不处理好你标注的“故障”样本可能混入了大量健康数据模型学不到真正的故障特征。我常用的方法是先计算振动信号的均方根值随时间的变化曲线找到曲线开始明显上升的拐点再结合3西格玛准则确定阈值。需要注意的是不同轴承的拐点位置差异很大必须逐个判断不能一套阈值用到底。5.4 样本不平衡很多数据集的正常样本远远少于故障样本以CWRU为例按故障类型和损伤尺寸组合后各类别样本数其实不一致。更麻烦的是在复合故障数据集里单一故障样本往往多于复合故障样本。如果直接按原始比例训练训练过程会被多数类主导少数类的召回率惨不忍睹。我习惯在构建数据集时先做类别分布统计如果某个类别样本数远低于中位数就通过增大窗口重叠率、加噪声或者时间拉伸等方式做数据增强而不是简单粗暴地降采样多数类。5.5 跨数据集泛化时不同传感器位置和采样参数带来巨大差异很多同学在CWRU上训练完直接拿MFPT或者PU数据测试发现准确率断崖式下跌然后就怀疑自己的模型不行。这其实不是模型的问题而是两个数据集的域差异太大传感器安装位置不同、转速不同、故障类型不同、采样率不同直接迁移本身就不合理。如果你确实要做跨数据集泛化建议先用标准化把采样率统一再把信号进行带通滤波只保留故障特征集中的频段最后用域自适应方法来对齐特征分布。这一套流程写进论文属于很规范的迁移学习实验设计比单纯在单数据集上刷点有说服力得多。6. 最后分享一点真实体会我自己这些年用过公开数据集最大的感受是数据集只是工具但它决定了你实验结论的可信边界。只在一个数据集上做实验哪怕准确率99%也无法证明你的方法真的有效反过来如果在三个特性差异很大的数据集上都稳定表现哪怕准确率只有90%你的方法也远比前者有价值。所以现在我做实验的最低要求是至少一个轴承数据集、一个齿轮箱数据集、一个退化趋势数据集分类和回归各覆盖一个任务。做到这个程度无论是自己判断方法优劣还是应付审稿人心里都有底。再分享一个小技巧每次下载数据集后建一个README记录下载时间、官方版本号、样本数量、通道名称、采样率。这个习惯帮我省了太多事写论文时可以直接查不用重新下载核对。特别是有些官方数据集页面会更新版本或者调整文件结构有个记录才能追溯到底用的哪个版本。有同学总问要不要自己买传感器去现场采集数据。我的建议是如果条件允许当然要采公开数据集的工况再丰富也代表不了你实际面对的设备。但如果条件不具备把上面这些数据集吃透尤其是把跨工况、跨数据集的实验设计做扎实同样能产出一份相当有说服力的研究成果。路都是人走出来的数据虽然是公开的但你能从里面挖掘到什么取决于你的实验设计是否严谨思考是否深入。本文还有配套的精品资源点击获取