1. 从零开始为什么你需要一个靠谱的机械故障诊断数据集搞AI模型尤其是做机械故障诊断最头疼的是什么不是算法不够新也不是算力不够强而是手里没数据或者数据质量太差。我见过太多同学和刚入行的工程师模型结构设计得天花乱坠结果一跑起来准确率惨不忍睹问题往往就出在数据这个源头。你可能也经历过在网上搜“轴承故障数据”、“齿轮振动信号”结果要么是零散的、格式不统一的文件要么就是需要付费的商业数据库对于学生党或者个人研究者来说门槛实在太高了。这就好比你想学做一道名菜但连最基础、最正宗的主食材都买不到只能用一些替代品那最后做出来的味道肯定和原版相差甚远。在故障诊断领域一个高质量、标注清晰、场景覆盖全面的开源数据集就是那道名菜的“正宗食材”。它不仅能让你验证算法的基本能力更能让你在公平的基准上和其他研究者的工作进行对比知道自己的模型到底处在什么水平。更重要的是对于很多工业场景比如风电齿轮箱、高铁轴承、工业机器人关节真实的故障数据极其珍贵企业出于安全和保密考虑很少会公开。因此学术界开源的数据集就成了我们学习和研究最重要的“练兵场”。通过这些数据你可以熟悉不同故障类型如内圈故障、外圈故障、滚动体故障、齿轮断齿、点蚀的信号特征掌握数据预处理、特征提取的套路甚至尝试最新的迁移学习、小样本学习技术而不必担心数据来源的合法性和一致性问题。所以今天我想跟你深入聊聊的就是这么一个宝藏资源——由东南大学团队开源维护的机械故障诊断数据集。它不仅包含了经典的轴承案例还有非常难得的齿轮故障数据。我会把自己在下载、使用、以及基于它做项目时踩过的坑和总结的经验毫无保留地分享给你让你能绕过我走过的弯路直接上手用起来。2. 宝藏库详解东南大学机械故障诊断数据集这个数据集在GitHub上的仓库名叫Mechanical-datasets维护者是cathysiyu。根据我的查证和论文对照这背后是东南大学严如强教授团队的成果主要贡献者应该是邵思羽博士。他们不仅开源了数据还发表了一篇非常扎实的论文《High-Accurate Machine Fault Diagnosis Using Deep Transfer Learning》可以说数据和理论是互相印证的这大大增加了数据集的可信度。这个数据集具体好在哪里呢我根据实际使用体验给你梳理了几个核心亮点第一故障类型覆盖全面。以轴承数据为例它不仅仅提供了简单的“健康”和“故障”二分标签。而是细致地划分了单点故障并且故障位置内圈、外圈、滚动体和故障尺寸损伤直径都有不同的等级。比如外圈故障可能分0.007英寸、0.014英寸、0.021英寸等不同尺寸这让你可以研究故障严重程度对振动信号的影响这对于做故障预后Prognostics或者健康管理PHM来说非常有用。第二工况条件多样。数据是在不同的负载和转速下采集的。这一点极其关键因为现实中的机器不可能永远在同一个工况下运行。一个只在固定转速下表现良好的诊断模型是没有任何实用价值的。这个数据集提供了多种负载-转速组合下的数据强迫你的模型必须学会提取与工况无关的、真正代表故障的本质特征这样才能具备鲁棒性。第三数据格式规整标注清晰。下载下来的数据通常以.mat(MATLAB文件) 或.csv格式存储每个文件对应一种具体的状态如“健康”、“内圈故障_0.007英寸_1772转_0负载”。文件名或内部的元数据就包含了完整的标签信息省去了你大量手动整理和标注的时间。对于初学者我强烈建议先从.csv格式入手用Python的pandas库可以非常方便地加载和分析。为了让你更直观地了解数据集的构成我整理了一个简单的表格以经典的CWRU轴承数据集部分为例注东南大学的数据集结构类似但可能包含更多自定义工况数据文件示例故障类型故障尺寸英寸转速 (RPM)负载 (HP)建议用途IR007_0.mat内圈故障0.00717720轻微故障检测OR014_1.mat外圈故障0.01417501不同负载下的故障识别B021_2.mat滚动体故障0.02117302严重故障与负载关系分析Normal_3.mat正常无故障无17973建立健康基线模型拿到数据后我建议你先别急着往复杂的模型里灌。第一步应该是“看”数据。用Python简单的画图把不同状态下的振动信号时域波形画出来对比一下。比如把正常信号和不同故障位置的信号放在一起你肉眼就能看出波形的幅值、冲击周期有明显的差异。然后再做快速傅里叶变换FFT看看频谱图故障特征频率如轴承的通过频率是否在频谱上凸显出来了。这个过程能帮你建立最直接的“数据感”。3. 手把手实战数据下载、预处理与第一个诊断模型光说不练假把式咱们直接进入实战环节。假设你现在已经成功访问了GitHub访问方法下一节会详细说找到了cathysiyu/Mechanical-datasets这个仓库。第一步获取数据。通常仓库的README.md文件里会提供数据下载链接。数据可能存放在GitHub Releases页面或者通过网盘链接如百度云分享。我个人的经验是优先选择 Releases 里的压缩包下载速度和完整性都更有保障。下载后解压到一个你项目专用的文件夹里比如./data/SEU_gear_bearing/。第二步数据加载与探索。这里我用Python给你演示一个最基础的加载和查看流程。我们假设你处理的是.mat文件。import scipy.io as sio import numpy as np import matplotlib.pyplot as plt import os # 1. 加载一个数据文件 data_path ‘./data/SEU_gear_bearing/轴承数据/IR007_0.mat‘ mat_data sio.loadmat(data_path) # .mat文件通常包含多个变量需要查看一下键名 print(mat_data.keys()) # 输出可能类似dict_keys([‘__header__‘, ‘__version__‘, ‘__globals__‘, ‘X‘, ‘Y‘]) # 其中 ‘X‘ 是振动信号数据‘Y‘ 是标签可能为数字编码或one-hot # 假设振动数据在 ‘X‘ 键下它是一个 (n_samples, n_channels) 的数组 vibration_signal mat_data[‘X‘] # 假设标签在 ‘Y‘ 键下如果是one-hot需要转换为类别索引 labels mat_data[‘Y‘] print(f“信号形状{vibration_signal.shape}“) print(f“标签形状{labels.shape}“) # 2. 绘制时域波形取第一个通道为例 plt.figure(figsize(12, 4)) plt.plot(vibration_signal[:5000, 0]) # 只画前5000个点看得清楚 plt.title(‘时域振动信号示例 (内圈故障-轻微)‘) plt.xlabel(‘采样点‘) plt.ylabel(‘幅值‘) plt.grid(True) plt.show() # 3. 简单计算并绘制频谱 from scipy.fft import fft, fftfreq N len(vibration_signal[:, 0]) fs 12000 # 采样频率这个信息非常重要通常在数据说明里找假设是12kHz yf fft(vibration_signal[:, 0]) xf fftfreq(N, 1 / fs)[:N//2] # 取单边频谱 plt.figure(figsize(12, 4)) plt.plot(xf, 2.0/N * np.abs(yf[0:N//2])) plt.title(‘频域频谱图‘) plt.xlabel(‘频率 (Hz)‘) plt.ylabel(‘幅值‘) plt.grid(True) plt.xlim([0, 2000]) # 聚焦在主要频段 plt.show()第三步构建一个最简单的诊断模型。探索完数据我们对它的特征有了感觉。现在我们可以用经典的机器学习方法快速搭建一个基线模型。这里我们用支持向量机SVM为例但前提是需要从原始振动信号中提取一些特征。我们提取几个最基础的时域特征均方根RMS、峰值、峭度、波形因子。from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.metrics import classification_report # 假设我们已经用一个循环加载了所有数据文件并提取了特征 # features_list 是特征矩阵形状 (n_samples, n_features) # label_list 是标签列表形状 (n_samples,) # 分割数据集 X_train, X_test, y_train, y_test train_test_split(features_list, label_list, test_size0.2, random_state42) # 标准化特征对SVM很重要 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 训练SVM分类器 svm_clf SVC(kernel‘rbf‘, C1.0, gamma‘scale‘, random_state42) svm_clf.fit(X_train_scaled, y_train) # 在测试集上评估 y_pred svm_clf.predict(X_test_scaled) print(classification_report(y_test, y_pred, target_names[‘健康‘, ‘内圈故障‘, ‘外圈故障‘, ‘滚动体故障‘]))这个流程虽然简单但能让你快速验证数据的可用性并建立一个性能基准。当你后续使用更复杂的深度学习模型如CNN、LSTM时就可以对比看性能提升了多少。4. 齿轮故障诊断的特殊性与数据应用技巧说完了轴承咱们重点聊聊这个数据集里更宝贵的部分——齿轮故障数据。齿轮传动系统在工业中无处不在但其故障诊断比轴承要复杂一些。齿轮的振动信号往往包含强烈的啮合频率及其谐波故障特征如断齿、点蚀引起的调制现象容易淹没在复杂的背景噪声和正常的啮合振动中。在这个数据集中齿轮数据通常会模拟几种典型故障齿根裂纹这是渐进性故障初期信号变化非常微弱。齿面点蚀分布式故障会产生宽带冲击。断齿局部性严重故障会产生周期性的强烈冲击。处理齿轮数据时仅仅看时域波形和频谱可能不够。你需要更高级的信号处理工具来“放大”故障特征。这里我分享两个非常实用的方法第一个是解调分析尤其是包络谱分析。齿轮故障的冲击会调制在高频的共振频带上。我们可以先用带通滤波器把信号中轴承或齿轮箱体某个构件的共振频带滤出来然后对这个信号做希尔伯特变换求包络最后对包络信号做频谱分析。在包络谱上故障特征频率齿轮的转频及其倍频会清晰地显现出来这比直接看原始信号的频谱要明显得多。from scipy.signal import hilbert, butter, filtfilt import numpy as np def envelope_spectrum(signal, fs, high_freq): “““计算信号的包络谱 Args: signal: 输入振动信号 fs: 采样频率 high_freq: 带通滤波的高端截止频率根据共振频带确定 “““ # 设计一个高通滤波器提取共振频带这里简化为低通实际应用需根据数据调整 nyquist fs / 2 high high_freq / nyquist b, a butter(4, high, btype‘low‘) # 4阶低通滤波器 filtered_signal filtfilt(b, a, signal) # 希尔伯特变换求包络 analytic_signal hilbert(filtered_signal) amplitude_envelope np.abs(analytic_signal) # 对包络信号做FFT得到包络谱 N len(amplitude_envelope) env_spectrum np.abs(fft(amplitude_envelope))[:N//2] freqs fftfreq(N, 1/fs)[:N//2] return freqs, env_spectrum # 使用示例 # 假设你有一个齿轮振动信号 gear_signal 和采样频率 fs # 通过观察频谱确定共振频带大约在2000-3000Hz我们取 high_freq3000 freqs_env, spec_env envelope_spectrum(gear_signal, fs12000, high_freq3000) # 绘制包络谱寻找齿轮转频如20Hz及其倍频的峰值第二个是时频分析比如连续小波变换CWT。齿轮的故障特征可能是非平稳的时频图可以同时展示频率成分随时间的变化对于识别瞬态冲击特别有用。你可以使用pywt库来实现。在实际建模时对于齿轮数据我建议可以尝试将原始信号、包络谱特征以及从时频图如小波尺度图中提取的统计特征融合在一起构成一个更丰富的特征向量再送入分类器。或者直接使用二维时频图作为输入用卷积神经网络CNN进行端到端的识别这也是目前非常主流且效果不错的方法。5. 高效访问与协作GitHub使用小贴士工欲善其事必先利其器。数据集在GitHub上一个稳定高效的访问环境是第一步。我知道很多朋友在访问GitHub时可能会遇到速度慢甚至无法连接的情况这非常影响学习和研发效率。这里我分享几个我自己和身边同事一直在用的、完全合规且稳定的方法让你能顺畅地克隆仓库、下载代码和数据。首选方案使用可靠的开发者工具与镜像。对于克隆仓库和日常开发最根本的解决方法是配置Git的代理或使用镜像站。如果你使用的是命令行Git可以通过以下命令设置代理请确保你拥有合法合规的网络代理服务# 设置HTTP/HTTPS代理替换为你自己的合法代理地址和端口 git config --global http.proxy http://your-proxy-address:port git config --global https.proxy https://your-proxy-address:port # 完成后可以通过以下命令检查是否设置成功 git config --global --get http.proxy git config --global --get https.proxy # 如果需要取消代理设置 git config --global --unset http.proxy git config --global --unset https.proxy不过对于大多数只是需要下载数据或代码压缩包的用户更简单的方法是使用GitHub的镜像网站。这些镜像站同步了GitHub的内容在国内访问速度通常快很多。一个常用的方法是修改本地的Hosts文件将GitHub的域名指向更快的IP地址。但Hosts文件需要定期更新IP维护起来有点麻烦。更推荐的方法利用国内代码托管平台的导入功能。这是我现在觉得最省心、最稳定的方法。像Gitee码云和国内的GitCode等平台都提供了“从GitHub导入仓库”的功能。你只需要在Gitee上新建一个仓库在创建时选择“导入已有仓库”然后粘贴上GitHub仓库的URL例如https://github.com/cathysiyu/Mechanical-datasets。Gitee会自动帮你把整个仓库包括代码、数据和提交历史都克隆到它的服务器上。之后你就可以像访问国内网站一样高速地从Gitee上克隆这个仓库了git clone https://gitee.com/your-username/Mechanical-datasets.git这个方法完美解决了下载速度的问题。而且你还可以在Gitee上提交Issue、发起Pull Request虽然最终可能需要同步回原GitHub仓库但对于学习和使用数据来说完全足够。对于数据集中的大文件如果GitHub原仓库是用Git LFS管理的导入Gitee后同样可以正常下载。关于数据版本管理。在真正开始你的研究项目时我强烈建议你对下载的数据集也进行简单的版本管理。不要直接在原始数据文件夹里修改。你可以创建一个专门的项目目录用Git初始化然后把数据处理脚本、特征提取代码、模型训练代码和实验结果如日志、模型权重都管理起来。这样当你尝试不同的特征工程方法或模型参数时可以清晰地回溯每一步操作确保研究的可复现性。这也是东南大学团队开源这个数据集所希望促进的良好科研习惯。