基于VGG16+Grad-CAM的可解释机械故障诊断和自动报警系统(TensorFlow+LangGraph)
在工业设备中,滚动轴承是最容易出故障的部件之一。传统诊断方法往往依赖人工提取时域、频域特征,再送入分类器,但特征工程繁琐且依赖经验。近年来,深度学习通过直接处理原始振动信号或时频图取得了很好效果,但缺点是黑盒,很难解释模型到底依据什么判断故障。本文首先用短时傅里叶变换STFT把振动信号变成时频图,再用预训练的VGG16网络进行分类;然后,引入Grad-CAM技术,它能高亮显示时频图中对分类最关键的像素区域,从而定位故障对应的频率成分;更进一步,采用Grad-CAM找到的热区去掩蔽原始时频图,再找出掩蔽后能量最大的点,从而精确计算出故障频率(比如内圈故障特征频率BPFI),这既验证了模型的物理合理性,又为后续诊断提供了具体数值。最后,还搭建了一个LangGraph智能体,当模型检测到故障时,自动将诊断报告写入数据库,并在严重故障时通过SendGrid发送邮件报警,实现了从感知到决策的闭环。
如果你对信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测有疑问,或者需要论文思路上的建议,欢迎咨询
担任《MSSP》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测

算法步骤
数据准备从文件夹里读取CWRU轴承的.mat文件,文件名里包含了故障类型和尺寸(如IR007表示内圈0.007英寸故障),据此给每个文件打上0~9的标签(正常、3种故障×3种尺寸)
def calculate_hybrid_frequency_faithfulness(img_array, target_class_idx, model, last_conv_layer_name, bandwidth=2):
"""
混合方法:通过Grad-CAM热力图定位关键频率,并计算掩码后的置信度下降(Faithfulness)
参数:
img_array: 输入图像,形状(1, 224, 224, 3)
target_class_idx: 目标类别索引(用于计算对该类的梯度)
model: 训练好的Keras模型
last_conv_layer_name: VGG16最后一个卷积层的名称('block5_conv3')
bandwidth: 掩码时保留的行数范围(默认2行)
返回:
faithfulness: 原始置信度减去掩码后置信度(数值越大,定位越准)
masked_img: 掩码后的图像(用于可视化)
critical_row: 关键频率对应的行坐标(y坐标)
heatmap_resized: 调整大小后的热力图(用于可视化)
"""
# 1. 获取原始预测概率(用于对比)
preds_orig = model.predict(img_array, verbose=0)
score_orig = preds_orig[0, target_class_idx]
# 2. 计算Grad-CAM热力图
heatmap = make_gradcam_heatmap(img_array, model, last_conv_layer_name, pred_index=target_class_idx)
H, W = img_array.shape[1], img_array.shape[2]
# 3. 将彩色图像转为灰度图,作为STFT幅度图的代理(因为原始图像是彩色,但实际信息在灰度)
img = img_array[0]
img_uint8 = (img * 255).astype(np.uint8)
stft_proxy = cv2.cvtColor(img_uint8, cv2.COLOR_RGB2GRAY)
stft_proxy = stft_proxy.astype(np.float32) / 255.0 # 归一化回[0,1]
# 4. 生成二进制掩码:热力值大于75%最大值的区域视为重要区域
threshold_value = 0.75 * np.max(heatmap)
binary_mask = (heatmap >= threshold_value).astype(np.float32)
# 5. 将掩码缩放到原图尺寸,并应用到STFT代理图上
mask_resized = cv2.resize(binary_mask, (W, H), interpolation=cv2.INTER_NEAREST)
masked_stft = stft_proxy * mask_resized # 只保留热区内的能量
# 6. 找到掩码区域内的最大能量点坐标(y方向对应频率)
y_true_max, x_true_max = np.unravel_index(np.argmax(masked_stft), masked_stft.shape)
# 7. 构造一个全零掩码,只保留该点附近带宽内的行(模拟频带滤除)
masked_img_array = img_array.copy()
mask_start = max(0, y_true_max - bandwidth)
mask_end = min(H, y_true_max + bandwidth + 1)
masked_img_array[0, mask_start:mask_end, :, :] = 0.0 # 将该频带所有像素置零
# 8. 计算掩码后的预测概率,得到Faithfulness指标
preds_masked = model.predict(masked_img_array, verbose=0)
score_masked = preds_masked[0, target_class_idx]
faithfulness = score_orig - score_masked
# 9. 调整热力图尺寸用于显示
heatmap_resized = cv2.resize(heatmap, (W, H))
return faithfulness, masked_img_array[0], y_true_max, heatmap_resized






如果你对信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测有疑问,或者需要论文思路上的建议,欢迎咨询
担任《MSSP》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测
更多推荐
所有评论(0)