在工业设备中,滚动轴承是最容易出故障的部件之一。传统诊断方法往往依赖人工提取时域、频域特征,再送入分类器,但特征工程繁琐且依赖经验。近年来,深度学习通过直接处理原始振动信号或时频图取得了很好效果,但缺点是黑盒,很难解释模型到底依据什么判断故障。本文首先用短时傅里叶变换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》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐