news 2026/4/15 17:55:31

OrderCam-Diag:基于阶次分析和类激活映射的旋转机械可解释故障诊断(Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OrderCam-Diag:基于阶次分析和类激活映射的旋转机械可解释故障诊断(Python)

以角域重采样和阶次分析为核心,通过将时域振动信号转换为转速不变的阶次域表示,消除了转速波动对故障诊断的影响;结合希尔伯特包络分析增强周期性冲击特征,并利用一维CNN进行多类别故障分类;还引入了Grad-CAM可解释性分析,生成注意力热力图直观展示模型决策依据,实现了从数据预处理、特征提取、模型训练到可视化解释的完整端到端智能诊断流程,提升了轴承等旋转机械故障诊断的准确性、鲁棒性和可解释性。

算法步骤

1. 数据加载与预处理

加载CWRU轴承振动数据集

提取转速信息并计算旋转频率

故障类型自动识别与标签编码

2. 角域重采样

将时域信号从时间域转换到角度域

基于转速进行线性插值,实现均匀角度采样

消除转速波动对分析结果的影响

3. 包络分析

应用希尔伯特变换提取信号包络

增强周期性冲击特征(轴承故障特征)

抑制非周期噪声干扰

4. 阶次谱生成

对角度域包络信号进行FFT变换

生成与转速无关的阶次谱(cycles/revolution)

实现故障特征的转速不变表示

5. 时-阶次谱分析

滑动窗口分段处理

对每个窗口进行阶次分析

生成阶次随时间演化的二维谱图

6. 深度学习分类

一维CNN提取深度特征

多类别故障分类(正常/内圈/外圈故障)

模型训练与优化

7. 可解释性可视化

Grad-CAM生成注意力热力图

可视化模型关注的关键特征区域

提供分类决策的直观解释

8. 结果评估与展示

自动峰值检测与标注

多视图可视化(时域、频域、阶次域)

故障诊断结果综合展示

class CWRUDataLoader: def __init__(self, base_path): """ 初始化CWRU数据加载器 Args: base_path (str): CWRU数据集根目录路径 """ self.base_path = Path(base_path) self.fs = 12000 # 采样频率12kHz self.n_rev = 64 # 每转采样点数 # 数据存储 self.X = None # 时域信号 self.Y = None # 故障标签 self.rpm = None # 转速(标量) self.filename = None # 文件名 # 故障类型映射字典 self.fault_types = { 'normal': 0, 'ball': 1, 'inner_race': 2, 'outer_race': 3 } def get_label_from_path(self, file_path: Path) -> int: """ 从文件路径中提取故障标签 Args: file_path (Path): 数据文件路径 Returns: int: 故障类型编码 (0-3) """ # 将路径转换为字符串 path_str = str(file_path) # 根据路径中的关键词判断故障类型 if 'Normal' in path_str or 'normal' in path_str: return self.fault_types['normal'] elif 'Ball' in path_str or 'B' in path_str or 'ball' in path_str: return self.fault_types['ball'] elif 'IR' in path_str or 'Inner' in path_str or 'inner' in path_str: return self.fault_types['inner_race'] elif 'OR' in path_str or 'Outer' in path_str or 'outer' in path_str: return self.fault_types['outer_race'] # 尝试从父目录名判断 parent_dir = file_path.parent.name if 'Normal' in parent_dir: return self.fault_types['normal'] elif 'B' in parent_dir: return self.fault_types['ball'] elif 'IR' in parent_dir: return self.fault_types['inner_race'] elif 'OR' in parent_dir: return self.fault_types['outer_race'] print(f"Warning: Could not determine fault type from path: {path_str}") return -1 # 未知类型 def extract_rpm_value(self, rpm_data): """ 从MATLAB加载的RPM数据中提取标量值 Args: rpm_data: 从MATLAB加载的RPM数据 Returns: float: RPM标量值 """ # 如果rpm_data是NumPy数组,提取标量值 if isinstance(rpm_data, np.ndarray): # 扁平化并取第一个元素 rpm_flat = rpm_data.flatten() if len(rpm_flat) > 0: return float(rpm_flat[0]) # 如果是列表或其他类型 if isinstance(rpm_data, (list, tuple)): if len(rpm_data) > 0: return float(rpm_data[0]) # 如果是标量 try: return float(rpm_data) except: print(f"Warning: Could not extract RPM value from: {rpm_data}") return 0.0 def import_cwru_data(self, file_keys: list): """ 加载CWRU数据集文件 Args: file_keys (list): 文件标识符列表 Returns: tuple: (X, Y) - 时域信号和故障标签 """ base_path_obj = Path(self.base_path) for key in file_keys: # 解析文件标识符(如"105DE" -> "105", "DE") match = re.match(r'(\d+)(\w+)', key) if not match: print(f"Error: Invalid file key format: {key}") continue file_num_str, data_key = match.groups() # 查找匹配的MAT文件 glob_pattern = f'{file_num_str}_*.mat' found_files = list(base_path_obj.rglob(glob_pattern)) if not found_files: print(f"Error: No file found for pattern: {glob_pattern}") continue file_path = found_files[0] self.filename = file_path.name # 设置文件名 print(f"Loading file: {self.filename}") # 加载MATLAB数据 mat_data = loadmat(file_path) # 提取故障标签 label = self.get_label_from_path(file_path) # 查找RPM和信号数据键 rpm_key = None mat_key = None for key_name in mat_data.keys(): if not key_name.startswith('__'): # 跳过MATLAB元数据 if "RPM" in key_name.upper(): rpm_key = key_name elif data_key in key_name: mat_key = key_name if rpm_key is None: print(f"Warning: No RPM data found in {self.filename}") rpm_value = 0.0 else: # 提取RPM标量值 rpm_value = self.extract_rpm_value(mat_data[rpm_key]) if mat_key is None: print(f"Error: No data found for key '{data_key}' in {self.filename}") continue # 提取时域信号 time_series = mat_data[mat_key].flatten() # 存储数据 self.rpm = rpm_value self.X = np.array(time_series) self.Y = label # 打印加载信息 print(f"Loaded {len(self.X)} samples from '{self.filename}'") print(f"RPM: {self.rpm}, Label: {self.Y}") return self.X, self.Y return None, None

参考文章:

OrderCam-Diag:基于阶次分析和类激活映射的旋转机械可解释故障诊断(Python) - 哥廷根数学学派的文章
https://zhuanlan.zhihu.com/p/2002062403219763577

担任《Mechanical System and Signal Processing》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 5:27:22

Thinkphp和Laravel框架的大学生校园跑腿服务系统的设计与实现沙箱支付

目录 设计背景与目标技术选型与框架对比系统功能模块关键实现细节测试与优化总结 开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 设计背景与目标 针对大学生校园内跑腿服务需求,基于ThinkPHP和Laravel框架设计一套…

作者头像 李华
网站建设 2026/4/13 15:51:42

在线测试网速

在线测试网速 给你推荐几个无需下载、打开就能用的在线测速工具,电脑 / 手机都能直接访问,测速步骤简单,结果也准确,涵盖国内常用和通用型的,按需选就行: 🌟 国内常用(适配国内网络…

作者头像 李华
网站建设 2026/4/12 20:34:58

学长亲荐10个降AI率工具 千笔·降AIGC助手帮你精准降AIGC

AI降重工具:让论文更自然,更安全 在当前学术研究日益依赖人工智能的背景下,越来越多的研究生发现,使用AI工具撰写论文虽然提高了效率,但也带来了AIGC率过高的问题。尤其是在论文查重环节,AI生成内容往往被系…

作者头像 李华
网站建设 2026/3/24 9:08:27

Tastepoint by IFF预测2026年十大风味趋势

从樱桃到印度茶香料,Tastepoint趋势专家揭晓本年度将脱颖而出的十大风味。 创新风味创作与味觉解决方案领域的领导者Tastepoint by IFF (NYSE: IFF)已评选出有望在2026年塑造北美食品和饮料行业格局的十大风味。这些预测聚焦于未来一年将在零售、餐饮服务等多个领域…

作者头像 李华
网站建设 2026/4/5 20:56:09

基于STM32的太阳能自动寻光充电系统设计

基于STM32的太阳能自动寻光充电系统设计 第一章 绪论 传统太阳能充电装置多采用固定安装方式,受光照角度变化影响,光电转换效率普遍偏低,仅能达到额定效率的60%-70%,难以满足便携式设备、户外监测终端等场景的高效供电需求。STM32…

作者头像 李华
网站建设 2026/4/10 23:32:22

【毕业设计】基于Python计算机视觉答题卡的设计与实现

💟博主:程序员陈辰:CSDN作者、博客专家、全栈领域优质创作者 💟专注于计算机毕业设计,大数据、深度学习、Java、小程序、python、安卓等技术领域 📲文章末尾获取源码数据库 🌈还有大家在毕设选题…

作者头像 李华