尧图精选

西储大学轴承数据集故障诊断仿真平台实战指南

🕒 发布时间:2026/9/28 2:07:45 📁 来源:尧图网络
简介本资源是一个基于西储大学轴承数据集构建的故障诊断仿真平台面向机械故障诊断、信号处理与智能运维方向的初学者及高校研究者提供从数据加载、特征提取到模型训练与实时诊断的完整实践流程。压缩包共31个文件含11个Python核心模块如training_model.py、diagnosis.py、feature_extraction.py、10个MATLAB格式轴承原始数据样本覆盖正常及多种故障工况、3个说明文档含requirements.txt与资源内容.txt、以及UI界面文件和图标资源整体大小为12.96MB。目前已有52人学习下载适合希望快速搭建轴承故障诊断实验环境、理解PySide2桌面应用开发与传统机器学习算法集成逻辑的学习者。平台支持多种分类算法可直接运行进行模型训练与诊断结果可视化代码结构清晰、模块职责明确附带详细注释与页面截图便于二次开发与教学复现。1. 西储大学轴承数据集故障诊断仿真平台不是“拿来即用”的压缩包而是工业故障诊断落地的最小闭环验证沙盒你下载了西储大学轴承数据集故障诊断仿真平台.zip双击解压后发现——没有exe安装程序、没有图形界面、甚至没有README.md只有几个.mat文件、几段Python脚本、一个config.yaml和一堆命名像0HP_1797_1.mat的文件。别急着删这恰恰是工业界真实项目启动时最常遇到的“原始态”它不提供开箱即用的AI模型也不承诺一键部署到PLC它提供的是可复现、可拆解、可嵌入产线诊断流程的最小技术闭环——从西储大学Case Western Reserve University, CWRU公开轴承加速寿命试验数据出发经信号预处理、特征工程、模型训练到在线推理模拟全部代码可控、路径可调、参数可验。适合两类人一是刚接触故障诊断的新手需要绕过论文黑匣子亲手跑通从原始振动信号到故障标签的完整链路二是产线算法工程师正为某台数控主轴或AGV驱动电机设计轻量级边缘诊断模块需要一个高保真、带工况标签、含多故障类型内圈/外圈/滚动体/正常的基准验证环境。它不是玩具但也不是成品系统——它是你把“轴承故障诊断”从PPT落到产线边缘设备前必须亲手打磨的第一块试金石。2. 从.mat到.npy西储大学原始数据的结构解析与标准化加载西储大学轴承数据集本质是一组在不同工况转速、负载、不同故障位置内圈/外圈/滚动体、不同故障尺寸0.007, 0.014, 0.021下采集的电机驱动端轴承振动信号。其原始格式为MATLAB.mat文件每个文件包含一个结构体字段名因版本略有差异但核心信号始终藏在Xxxx_DE_time驱动端加速度传感器时间序列中。直接用scipy.io.loadmat()读取会返回嵌套字典极易因字段名拼写错误如DE_timevsDE_time_signal导致索引失败。必须先确认结构再提取。2.1 确认.mat文件内部结构并安全提取驱动端信号import scipy.io as sio import numpy as np def inspect_mat_structure(file_path): 打印.mat文件顶层结构避免盲目索引 mat sio.loadmat(file_path, squeeze_meTrue, struct_as_recordFalse) print(f文件 {file_path} 的顶层键{list(mat.keys())}) # 查找含_DE_time的键常见命名 de_keys [k for k in mat.keys() if _DE_time in k] if de_keys: print(f找到驱动端信号键{de_keys}) # 取第一个匹配项通常唯一 signal mat[de_keys[0]] print(f信号形状{signal.shape}, 数据类型{signal.dtype}) return signal else: print(未找到_DE_time字段尝试遍历所有字段...) for k, v in mat.items(): if hasattr(v, shape) and len(v.shape) 1 and v.shape[0] 1000: print(f疑似信号字段{k}, 形状{v.shape}) return None # 示例检查一个典型文件 signal inspect_mat_structure(1797_3_218.mat)提示西储官网提供的数据包中1797代表电机转速1797 RPM对应约30Hz基频3代表故障直径0.021英寸218是样本编号。但文件名不等于标签——标签需根据文件所在目录推断如/InnerRaceFault/0.021/→ 内圈故障。这是后续构建数据集的关键逻辑不能仅靠文件名。2.2 构建统一数据加载器按工况故障类型自动归类西储数据集官方未提供标准划分常见做法是按采样频率12kHz、截取长度如2048点、重叠率50%生成样本并将同一工况下的所有文件合并为一个大数组再按目录结构打标签。以下是一个生产级加载器的核心逻辑import os import glob from pathlib import Path def load_cwru_dataset(base_dir: str, rpm: int 1797, fault_type: str all) - tuple[np.ndarray, np.ndarray]: 加载指定转速下的西储数据集 :param base_dir: 数据根目录含Normal Baseline Data/, InnerRaceFault/, OuterRaceFault/等子目录 :param rpm: 目标转速1797, 1772, 1750, 1730 :param fault_type: all, normal, inner, outer, ball :return: (X: [N, 2048], y: [N,]) # 映射rpm到目录名官网约定 rpm_map {1797: 1797, 1772: 1772, 1750: 1750, 1730: 1730} rpm_dir rpm_map.get(rpm, 1797) # 构建搜索路径 search_patterns [] if fault_type in [all, normal]: search_patterns.append(os.path.join(base_dir, Normal Baseline Data, f*{rpm_dir}*.mat)) if fault_type in [all, inner]: search_patterns.append(os.path.join(base_dir, InnerRaceFault, *, f*{rpm_dir}*.mat)) if fault_type in [all, outer]: search_patterns.append(os.path.join(base_dir, OuterRaceFault, *, f*{rpm_dir}*.mat)) if fault_type in [all, ball]: search_patterns.append(os.path.join(base_dir, BallFault, *, f*{rpm_dir}*.mat)) all_files [] for pattern in search_patterns: all_files.extend(glob.glob(pattern)) X, y [], [] label_map {Normal Baseline Data: 0, InnerRaceFault: 1, OuterRaceFault: 2, BallFault: 3} for file_path in all_files: try: signal inspect_mat_structure(file_path) if signal is None: continue # 截取前2048点标准长度 if len(signal) 2048: X.append(signal[:2048]) # 从路径推断标签 parent_dir Path(file_path).parent.name if parent_dir in label_map: y.append(label_map[parent_dir]) else: # 处理多级目录如 BallFault/0.007/... grandparent Path(file_path).parent.parent.name y.append(label_map.get(grandparent, 0)) except Exception as e: print(f跳过文件 {file_path}错误{e}) continue return np.array(X), np.array(y) # 使用示例加载1797RPM下全部故障类型 X_train, y_train load_cwru_dataset(./CWRU_Bearing_Dataset/, rpm1797) print(f加载完成{X_train.shape[0]}个样本类别分布{np.bincount(y_train)})这段代码解决了三个关键问题路径鲁棒性不依赖固定文件名用glob通配符匹配标签一致性通过目录层级而非文件名确定故障类型规避命名混乱容错加载单个文件损坏不影响整体加载日志明确提示失败原因。这是后续所有特征提取和模型训练的数据基石——如果这里出错后面全是空中楼阁。3. 信号预处理与特征工程为什么FFT和包络谱比深度学习更值得先调试在西储大学轴承数据集故障诊断仿真平台中“仿真”二字常被误解为“用仿真软件生成数据”。实际上这里的“仿真”指在真实数据上构建一个可配置、可复现、可插拔的诊断流程沙盒——它允许你自由切换预处理方法、特征提取器、分类器观察每一步对最终准确率的影响。而第一步永远是信号预处理。新手常犯的错误是跳过时频分析直接把原始时序喂给CNN结果模型在测试集上波动极大。原因在于——西储数据虽干净但存在工频干扰、随机噪声、传感器幅值漂移且不同故障的冲击特征在时域上高度相似尤其小故障必须通过频域或时频域增强才能分离。3.1 基于FFT的频谱能量特征轻量、可解释、产线友好轴承故障特征频率BPFI/BPFO/BSF/FTF与转速强相关。以1797RPM≈30Hz为例内圈故障特征频率BPFI ≈ 162Hz外圈BPFO ≈ 107Hz。这些频率分量在原始频谱中往往被基频及其谐波淹没。因此标准做法是对信号做FFT取幅值谱切割0–1000Hz频段覆盖前10阶谐波及故障特征将该频段划分为N个子带如N64计算每带能量幅值平方和归一化后作为特征向量。from scipy.fft import fft import matplotlib.pyplot as plt def fft_energy_features(signal: np.ndarray, fs: int 12000, n_bands: int 64, max_freq: int 1000) - np.ndarray: 提取FFT能量子带特征 :param signal: 一维振动信号2048点 :param fs: 采样频率12kHz :param n_bands: 子带数量 :param max_freq: 最高分析频率Hz :return: [n_bands,] 特征向量 # FFT计算 n len(signal) freqs np.fft.fftfreq(n, 1/fs) fft_mag np.abs(fft(signal)) / n # 幅值谱归一化 # 只取正频率部分 idx freqs 0 freqs, fft_mag freqs[idx], fft_mag[idx] # 截取0-max_freq范围 mask (freqs 0) (freqs max_freq) freqs, fft_mag freqs[mask], fft_mag[mask] # 划分子带并计算能量 band_width max_freq / n_bands features np.zeros(n_bands) for i in range(n_bands): low, high i * band_width, (i 1) * band_width band_mask (freqs low) (freqs high) features[i] np.sum(fft_mag[band_mask] ** 2) # 能量 幅值平方和 return features / np.sum(features) # L1归一化消除幅值差异 # 示例对一个样本提取特征 sample_signal X_train[0] fft_feat fft_energy_features(sample_signal) print(fFFT特征维度{fft_feat.shape}能量总和{fft_feat.sum():.6f})为什么选能量而非幅值工业现场传感器灵敏度易漂移同一故障在不同传感器上幅值可能差3倍但各频带能量占比相对稳定。L1归一化后特征对绝对幅值不敏感更适合跨设备迁移。3.2 包络谱分析针对微弱冲击故障的终极武器当故障尺寸小于0.007英寸时FFT频谱中故障特征峰几乎不可见。此时必须用包络谱Envelope Spectrum——它先对信号做希尔伯特变换获取包络再对包络做FFT能极大增强冲击调制边带。西储平台中这是区分“早期微弱故障”与“正常磨损”的关键步骤。from scipy.signal import hilbert, butter, filtfilt def envelope_spectrum(signal: np.ndarray, fs: int 12000, band_low: float 2000, band_high: float 8000) - np.ndarray: 计算带通滤波后的包络谱 :param signal: 原始信号 :param fs: 采样率 :param band_low/band_high: 关键共振频带西储数据常用2-8kHz :return: 包络谱幅值0-1000Hz # 1. 带通滤波提取轴承共振频带 b, a butter(4, [band_low, band_high], btypebandpass, fsfs) filtered filtfilt(b, a, signal) # 2. 希尔伯特变换求包络 analytic_signal hilbert(filtered) envelope np.abs(analytic_signal) # 3. 对包络做FFT n len(envelope) freqs np.fft.fftfreq(n, 1/fs) env_fft np.abs(np.fft.fft(envelope)) / n # 4. 取正频率0-1000Hz idx (freqs 0) (freqs 1000) return env_fft[idx] # 对比FFT与包络谱 env_spec envelope_spectrum(sample_signal) plt.figure(figsize(12,4)) plt.subplot(121) plt.plot(fft_feat); plt.title(FFT能量特征) plt.subplot(122) plt.plot(env_spec[:200]); plt.title(包络谱0-200Hz) plt.show()你会发现包络谱在107HzBPFO、162HzBPFI处出现尖锐峰值而FFT特征图中这些位置只是平缓隆起。这就是包络谱对微弱冲击的检测优势——它把隐藏在噪声中的周期性冲击“放大”出来。在产线部署时若边缘设备算力有限优先实现包络谱简单阈值判断比训练一个ResNet更可靠、更易维护。4. 模型训练与在线推理仿真用Scikit-learn搭建可部署的诊断流水线西储大学轴承数据集故障诊断仿真平台的“平台”属性在此章集中体现它不绑定深度学习框架而是提供一个基于Scikit-learn的、可热替换模型的诊断流水线。这意味着你可以用SVM快速验证特征有效性用RandomForest分析特征重要性用XGBoost提升精度最后无缝导出为ONNX在树莓派或Jetson Nano上运行。这种设计直击工业痛点算法工程师需要快速迭代模型而产线运维人员只关心“这个盒子接上振动传感器后绿灯亮表示正常红灯亮表示内圈故障”。4.1 构建可持久化的Pipeline预处理特征模型三位一体Scikit-learn的Pipeline是封装诊断逻辑的黄金标准。它确保训练与推理时的预处理完全一致避免“训练时归一化、推理时忘记归一化”的经典翻车。from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix import joblib # 定义特征提取器可替换 class FFTFeatureExtractor: def __init__(self, fs12000, n_bands64, max_freq1000): self.fs fs self.n_bands n_bands self.max_freq max_freq def fit(self, X, yNone): return self def transform(self, X): return np.array([fft_energy_features(x, self.fs, self.n_bands, self.max_freq) for x in X]) # 构建完整Pipeline pipeline Pipeline([ (feature, FFTFeatureExtractor(fs12000, n_bands64, max_freq1000)), (scaler, StandardScaler()), # 特征归一化对SVM至关重要 (classifier, SVC(kernelrbf, C1.0, gammascale, probabilityTrue)) ]) # 训练 pipeline.fit(X_train, y_train) # 保存整个Pipeline含预处理和模型 joblib.dump(pipeline, cwru_svm_pipeline.pkl) # 加载并推理产线部署时只需这两行 loaded_pipe joblib.load(cwru_svm_pipeline.pkl) pred_proba loaded_pipe.predict_proba(X_train[:5]) # 返回各类概率 print(预测概率\n, pred_proba)关键细节StandardScaler必须放在Pipeline内而非单独fit。否则导出的模型无法保证推理时的缩放参数与训练一致。这是90%的初学者部署失败的根源。4.2 在线推理仿真模拟边缘设备实时诊断的延迟与吞吐真正的“仿真平台”价值在于它能模拟产线真实约束。例如边缘设备每2秒采集一次2048点信号推理耗时需100ms连续5次预测同一故障才触发告警防误报。以下代码模拟这一过程import time from collections import deque class OnlineDiagnosisSimulator: def __init__(self, pipeline, window_size5, threshold0.8): self.pipeline pipeline self.window deque(maxlenwindow_size) # 滑动窗口存储最近预测 self.threshold threshold def infer_once(self, signal: np.ndarray) - dict: 单次推理返回带置信度的结果 start_time time.time() proba self.pipeline.predict_proba([signal])[0] pred_class np.argmax(proba) confidence proba[pred_class] infer_time_ms (time.time() - start_time) * 1000 # 更新滑动窗口 self.window.append((pred_class, confidence)) # 判断是否触发告警窗口内多数票且最高置信度阈值 votes [p[0] for p in self.window] most_common max(set(votes), keyvotes.count) recent_conf [p[1] for p in self.window if p[0] most_common] avg_conf np.mean(recent_conf) if recent_conf else 0 alarm (votes.count(most_common) len(self.window)//2 1) and (avg_conf self.threshold) return { class_id: int(pred_class), class_name: [Normal, Inner, Outer, Ball][pred_class], confidence: float(confidence), infer_time_ms: round(infer_time_ms, 2), alarm_triggered: bool(alarm), window_votes: votes } # 初始化仿真器 simulator OnlineDiagnosisSimulator(pipeline, window_size5, threshold0.75) # 模拟连续10次推理 for i in range(10): result simulator.infer_once(X_train[i % len(X_train)]) print(f[{i1}] 预测{result[class_name]} (置信度{result[confidence]:.3f}) f耗时{result[infer_time_ms]}ms {⚠️告警 if result[alarm_triggered] else })输出示例[1] 预测Normal (置信度0.921) 耗时8.2ms [2] 预测Inner (置信度0.883) 耗时7.9ms [3] 预测Inner (置信度0.912) 耗时8.1ms [4] 预测Inner (置信度0.897) 耗时7.7ms [5] 预测Inner (置信度0.876) 耗时8.0ms ⚠️告警这正是产线需要的逻辑不看单次结果看趋势与置信度。仿真平台的价值就是让你在部署前就看到——你的模型在真实节奏下会不会误报、响应是否够快、告警策略是否合理。5. 避坑指南西储大学数据集诊断中90%的人踩过的5个具体坑西储大学轴承数据集看似简单实则暗坑密布。以下是我用该数据集交付7个产线项目后血泪总结的5个高频翻车点。每一条都附带现象、根因和可立即执行的解决方案拒绝空泛“注意数据质量”。5.1 现象模型在训练集上准确率99%测试集骤降至60%原因训练/测试集划分方式错误——直接按文件随机切分导致同一故障尺寸如0.021的样本同时出现在训练集和测试集。模型记住了故障尺寸的频谱模式而非故障物理本质。解决严格按故障尺寸划分。例如训练集用0.007和0.014数据测试集只用0.021数据。代码修正# 错误随机切分 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3) # 正确按故障尺寸分层需先解析文件路径获取尺寸信息 fault_sizes [] # 从文件路径提取如 /BallFault/0.014/... for path in file_paths: size_str Path(path).parent.name # 0.014 fault_sizes.append(float(size_str.replace(, ))) # 然后用StratifiedGroupKFold按size分组5.2 现象包络谱无峰值或峰值位置与理论故障频率偏差10Hz原因带通滤波器设计不当。西储数据中轴承共振频带并非固定2–8kHz而是随电机负载变化。官网文档明确建议对1797RPM数据使用3–6kHz带通更优。解决实测调整滤波频带。用scipy.signal.freqz可视化滤波器响应确保通带平坦、阻带衰减40dBb, a butter(4, [3000, 6000], btypebandpass, fs12000) # 绘制频率响应 w, h freqz(b, a, fs12000) plt.plot(w, 20*np.log10(np.abs(h))); plt.grid()5.3 现象SVM训练时内存爆炸或耗时超1小时原因FFT特征维度设置过高如n_bands256导致特征矩阵过大或未对特征做StandardScaler使SVM的RBF核计算失效。解决特征维度控制在32–128之间64最常用必须启用Pipeline中的StandardScaler对大数据集改用LinearSVC更快或降维PCA保留95%方差。5.4 现象加载.mat文件时报错KeyError: X097_DE_time原因西储官网提供了多个版本数据包2008版、2019更新版字段名不一致。2008版用X097_DE_time2019版用X097_DE_time_signal。解决放弃硬编码字段名用动态查找def safe_load_de_signal(mat_dict): candidates [DE_time, DE_time_signal, X097_DE_time, X097_DE_time_signal] for cand in candidates: if cand in mat_dict: return mat_dict[cand] raise KeyError(f未找到DE_time字段可用键{list(mat_dict.keys())})5.5 现象模型预测“Normal”概率恒为0.99其他类几乎不出现原因类别不平衡未处理。西储数据中Normal样本数通常是单个故障类的3–5倍SVM默认类别权重相等导致模型偏向多数类。解决在SVC中启用class_weightbalanced或手动计算权重from sklearn.utils.class_weight import compute_class_weight classes np.unique(y_train) weights compute_class_weight(balanced, classesclasses, yy_train) class_weight_dict dict(zip(classes, weights)) pipeline.set_params(classifier__class_weightclass_weight_dict)6. 进阶技巧如何用西储平台验证你的自研算法并产出产线可交付物西储大学轴承数据集故障诊断仿真平台的终极价值不是复现某篇论文的99.2%准确率而是成为你验证自研算法鲁棒性的压力测试仪。我给自己定的铁律是任何新提出的特征或模型必须在西储平台上完成三轮验证——否则不许上产线。这三轮直接决定交付物的质量。6.1 第一轮跨工况泛化测试验证算法是否真懂物理西储数据提供4种转速1797/1772/1750/1730 RPM对应不同故障特征频率。合格的算法必须在1797RPM上训练在1772RPM上测试准确率下降≤3%若下降5%说明模型过拟合特定转速下的频谱需引入转速归一化如将频率轴除以基频。# 转速归一化示例将FFT频率轴映射为阶次Order def fft_order_features(signal: np.ndarray, fs: int 12000, base_freq: float 30.0, n_orders: int 64): 将频谱转换为阶次谱消除转速影响 # 先做FFT n len(signal) freqs np.fft.fftfreq(n, 1/fs) fft_mag np.abs(np.fft.fft(signal)) / n # 取正频率 idx freqs 0 freqs, fft_mag freqs[idx], fft_mag[idx] # 转换为阶次order frequency / base_freq orders freqs / base_freq # 插值到固定阶次网格 target_orders np.linspace(0, 20, n_orders) # 0–20阶 interp_mag np.interp(target_orders, orders, fft_mag, left0, right0) return interp_mag / np.sum(interp_mag)6.2 第二轮噪声鲁棒性测试模拟真实产线环境西储原始数据信噪比极高40dB但产线振动信号常叠加电机电磁干扰、机械共振噪声。我在仿真平台中内置了三档噪声注入噪声类型参数适用场景高斯白噪声SNR20dB传感器基础噪声工频干扰50Hz正弦谐波电网耦合干扰冲击噪声随机脉冲幅度5×RMS机械碰撞瞬态def add_noise(signal: np.ndarray, snr_db: float 20, noise_type: str gaussian) - np.ndarray: 向信号添加指定类型噪声 signal_power np.mean(signal ** 2) noise_power signal_power / (10 ** (snr_db / 10)) if noise_type gaussian: noise np.random.normal(0, np.sqrt(noise_power), len(signal)) elif noise_type powerline: t np.arange(len(signal)) / 12000 noise 0.5 * np.sin(2*np.pi*50*t) 0.3 * np.sin(2*np.pi*100*t) noise * np.sqrt(noise_power / np.mean(noise**2)) elif noise_type impulse: noise np.zeros_like(signal) n_impulses len(signal) // 100 impulse_locs np.random.choice(len(signal), n_impulses, replaceFalse) noise[impulse_locs] np.random.normal(0, 5*np.sqrt(signal_power), n_impulses) return signal noise # 测试在测试集上加20dB高斯噪声重新评估 X_test_noisy np.array([add_noise(x, snr_db20) for x in X_test]) score_noisy pipeline.score(X_test_noisy, y_test) print(f加噪后准确率{score_noisy:.3f}原始{original_score:.3f})6.3 第三轮轻量化部署验证产线交付的生死线产线边缘设备如STM32H7或RK3399资源有限。我要求所有算法必须满足模型文件大小 500KB单次推理耗时 50ms在目标硬件实测不依赖GPU或特殊库仅NumPy Scikit-learn。为此我强制使用sklearn2onnx导出ONNX并用onnxruntime在树莓派4B上实测# 导出ONNX需安装skl2onnx from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType # 定义输入类型64维FFT特征 initial_type [(float_input, FloatTensorType([None, 64]))] onnx_model convert_sklearn(pipeline, initial_typesinitial_type) # 保存 with open(cwru_diagnosis.onnx, wb) as f: f.write(onnx_model.SerializeToString()) # 树莓派实测代码需安装onnxruntime import onnxruntime as ort sess ort.InferenceSession(cwru_diagnosis.onnx) input_name sess.get_inputs()[0].name result sess.run(None, {input_name: fft_feat.reshape(1,-1).astype(np.float32)})最后交付给客户的东西从来不是“一个模型”而是✅ 一份《西储平台验证报告》PDF含三轮测试数据、对比图表✅ 一个diagnosis_edge文件夹内含cwru_diagnosis.onnx模型inference.py50行以内调用代码test_sample.npy10个典型样本供客户快速验证✅ 一句承诺“若在您产线同型号电机上相同工况下准确率低于报告值3%我们免费优化至达标。”这套流程跑下来客户不再问“你们模型准不准”而是问“下次升级能支持我们新采购的XX品牌传感器吗”——这才是仿真平台该有的样子。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →