当前位置: 首页 > news >正文

[故障诊断方向]基于二维时频图像和数据增强技术的轴承故障诊断模型

1. ​引言(Introduction)​

  • 背景与问题​:滚动轴承是旋转机械的关键部件,约30%的机械故障源于轴承失效(如疲劳点蚀、塑性变形和热变化)。传统故障诊断方法(如基于振动检测或解析模型)存在局限性:模型复杂度高、泛化能力差,且数据驱动方法(如SVM或ELM)在特征提取深度不足。深度学习方法(如CNN)虽有效,但在实际应用中面临标记故障数据稀缺的挑战,导致模型过拟合。
  • 现有解决方案​:数据增强技术(如SMOTE或基于GAN的方法)被用于扩充样本,但传统方法(如复制样本或一维GAN)易导致数据分布边缘问题或特征丢失。本文旨在解决两个关键问题:(a)一维信号特征提取不足;(b)生成数据质量低和训练不稳定。
  • 贡献​:
    • 使用连续小波变换(CWT)将一维振动信号转换为二维时频图像,充分利用时频域信息。
    • 提出基于QP-Div的GANs-QP数据增强方法,避免梯度消失问题并自动满足Lipschitz约束。
    • 集成数据增强与CNN,构建端到端故障诊断模型,在样本不足条件下提升精度。

2. ​理论背景(Theoretical Background)​

2.1 ​连续小波变换(CWT)​
  • 原理​:CWT将一维时间序列信号 x(t) 转换为二维时频图像,通过小波函数 ψ(t) 的尺度和位移变换捕捉信号局部特征:

 其中 a 为尺度参数(关联频率),τ 为位移参数(关联时间)。频域形式为:

 

  • CWT能有效处理非平稳信号,在故障诊断中提取判别性特征。
  • 应用优势​:相比一维信号,时频图像包含更丰富的结构信息(如图5所示),适合作为CNN输入。

 图5

2.2 ​生成对抗网络(GANs)基础
  • GANs框架​:由生成器(Generator)和判别器(Discriminator)组成对抗训练(图1)。目标是最小化真实数据分布 p(x) 与生成数据分布 q(x) 的差异,常用JS散度:

 但JS散度在分布无重叠时梯度消失(如Wasserstein距离虽稳定但需额外约束)。

 

图1 

2.3 ​QP-Div与GANs-QP
  • QP-Div(Quadratic Potential Divergence)​​:一种新型概率散度,直接在双空间定义

 

3. ​提出的方法(Proposed Method)​

  • 整体框架​:如图2所示,方法分为三步:
    1. 数据预处理​:原始一维振动信号通过CWT转换为128×128像素的二维时频图像(图5)。
    2. 数据增强​:使用CWT-GANs-QP生成新样本。生成器和判别器网络结构见表2(如生成器使用转置卷积层,判别器使用卷积层)。
    3. 故障诊断​:结合原始和生成样本训练2D-CNN(结构见表3),输出故障类别。

 

图2 

  • 关键创新​:
    • CWT转换​:增强特征表达力,解决一维信号非平稳性问题。
    • CWT-GANs-QP​:直接处理二维图像,生成高质量样本(如MMD和SSIM指标优于传统方法)。
    • 端到端训练​:CNN结构包括卷积层(C1-C3)、池化层(P1-P3)和全连接层(FC1),使用Softmax分类。

4. ​实验与结果(Experiments and Discussion)​

4.1 ​案例一:CWRU标准数据集
  • 数据集​:包含10类轴承状态(正常、内圈/外圈/滚动体故障,缺陷直径0.007/0.014/0.021英寸),每类2400个样本(400点/样本)。训练集80%(19200图像),测试集20%(4800图像)。

 

图4 

  • 小样本诊断性能​:训练样本减少时,CNN准确率显著下降(表4)。如样本数从19200减至100时,准确率从100%降至79.06%,证实数据不足导致过拟合。
  • 数据增强质量评估​:
    • 生成数据质量​:使用MMD、EMD、KL散度和SSIM指标(表5)。训练样本≥1200时,CWT-GANs-QP生成数据质量高(SSIM >0.89);样本<600时质量劣化(图6显示图像模糊)。

 

 

图6 

方法对比​:CWT-GANs-QP在MMD、SSIM等指标上优于DCGANs、WGANs和WGANs-GP(表6)。图7显示DCGANs有棋盘伪影,WGANs改进但仍有约束问题,而CWT-GANs-QP图像更接近真实。 

 图7

  • 诊断精度提升​:
    • 数据增强效果​:加入生成样本后,准确率显著提高(表7)。如1200真实样本+1200生成样本时,准确率从99.12%升至99.29%。
    • 方法对比​:CWT-GANs-QP-CNN优于其他数据增强方法(表8)。如1200样本+1200生成样本时,准确率99.29%,高于DCGANs(98.66%)和WGANs(99.11%)。
  • 其他图像方法对比​:与Gram角场(GAF)对比(图8),CWT时频图像特征更丰富(表9)。GAF-GANs-QP准确率较低(98.25% vs. 99.29%),证明CWT更优。

 

 

图8 

 

案例二:实验室真实数据集
  • 数据集​:使用SQI故障模拟器采集5类状态(正常、内圈/外圈/滚动体/复合故障),每类200样本。训练集80%(800图像),测试集20%(200图像)。

 

  • 结果​:
    • 数据增强效果​:生成800样本时,诊断准确率从93.75%提升至99.35%(表10)。过多生成样本(>800)会因误差导致性能下降。
    • 分类性能​:CWT-GANs-QP的F1均值(99.33%)显著高于DCGANs(96.01%)和WGANs-GP(98.28%)(表11)。
    • 泛化性​:在SVM、SAE等分类器上,数据增强均提升F1均值≥4.67%(表12),证明方法鲁棒。

 

5.核心代码实现(基于PyTorch框架) 

1. CWT时频图像转换模块
import numpy as np
import pywt
import torch
import torch.nn as nn
from torchvision.transforms import Resizeclass CWTTransform:def __init__(self, scales=128, wavelet='morl'):"""连续小波变换(CWT)将一维信号转为时频图像:param scales: 尺度参数数量(决定频率分辨率):param wavelet: 小波类型,默认为Morlet小波"""self.scales = scalesself.wavelet = waveletself.resize = Resize((128, 128))  # 统一输出尺寸def __call__(self, signal):""":param signal: 一维振动信号 (n_samples, signal_length):return: 时频图像 (n_samples, 1, 128, 128)"""# 生成尺度序列(根据信号长度自适应)max_scale = len(signal[0]) // 2scale_range = np.arange(1, max_scale, max_scale // self.scales)cwt_images = []for s in signal:# 计算CWT系数coef, _ = pywt.cwt(s, scale_range, self.wavelet)# 取绝对值并归一化coef_abs = np.abs(coef)coef_norm = (coef_abs - coef_abs.min()) / (coef_abs.max() - coef_abs.min())# 转换为PyTorch张量并调整尺寸tensor = torch.from_numpy(coef_norm).float().unsqueeze(0)  # 添加通道维度resized = self.resize(tensor)cwt_images.append(resized)return torch.stack(cwt_images, dim=0)  # (n_samples, 1, 128, 128)
2. GANs-QP数据增强模块 
class Generator(nn.Module):"""生成器网络(对应论文表2)"""def __init__(self, latent_dim=100, output_channels=1):super().__init__()self.main = nn.Sequential(# 输入: latent_dim维噪声nn.Linear(latent_dim, 1024),nn.BatchNorm1d(1024),nn.ReLU(inplace=True),# 转置卷积上采样nn.ConvTranspose2d(1024, 512, kernel_size=5, stride=2, padding=2, output_padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.ConvTranspose2d(512, 256, kernel_size=5, stride=2, padding=2, output_padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.ConvTranspose2d(256, 128, kernel_size=5, stride=2, padding=2, output_padding=1),nn.BatchNorm2d(128),nn.ReLU(inplace=True),nn.ConvTranspose2d(128, 64, kernel_size=5, stride=2, padding=2, output_padding=1),nn.ReLU(inplace=True),nn.ConvTranspose2d(64, output_channels, kernel_size=5, stride=2, padding=2, output_padding=1),nn.Tanh())def forward(self, z):z = z.view(-1, 1024, 1, 1)  # 调整形状以适应转置卷积return self.main(z)class Discriminator(nn.Module):"""判别器网络(对应论文表2)"""def __init__(self, input_channels=1):super().__init__()self.main = nn.Sequential(# 输入: input_channels x 128 x 128nn.Conv2d(input_channels, 64, kernel_size=5, stride=2, padding=2),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(64, 128, kernel_size=5, stride=2, padding=2),nn.BatchNorm2d(128),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(128, 256, kernel_size=5, stride=2, padding=2),nn.BatchNorm2d(256),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(256, 512, kernel_size=5, stride=2, padding=2),nn.BatchNorm2d(512),nn.LeakyReLU(0.2, inplace=True),nn.Conv2d(512, 1024, kernel_size=5, stride=2, padding=2),nn.LeakyReLU(0.2, inplace=True),nn.Flatten(),nn.Linear(1024 * 4 * 4, 1))def forward(self, x):return self.main(x)def qp_div_loss(D, real_imgs, fake_imgs, lambda_param=10.0):"""QP-Div损失函数(论文公式10-12):param D: 判别器实例:param real_imgs: 真实图像 (batch, C, H, W):param fake_imgs: 生成图像 (batch, C, H, W):param lambda_param: 公式中的λ:return: (判别器损失, 生成器损失)"""# 判别器输出D_real = D(real_imgs)D_fake = D(fake_imgs)# 计算距离(论文d(x_r,x_f))dist = torch.norm(real_imgs - fake_imgs, p=2, dim=(1,2,3)).view(-1, 1)# 判别器损失(公式10)T_diff = D_real - D_fakeD_loss = T_diff - (T_diff**2) / (2 * lambda_param * dist)D_loss = -D_loss.mean()  # 最大化目标# 生成器损失(公式11)G_loss = T_diff.mean()return D_loss, G_loss
3. 2D-CNN故障诊断模块 
class BearingFaultClassifier(nn.Module):"""轴承故障分类CNN(对应论文表3)"""def __init__(self, num_classes=10):super().__init__()self.features = nn.Sequential(# C1: 128x128输入nn.Conv2d(1, 32, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),  # 输出: 64x64# C2nn.Conv2d(32, 64, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),  # 输出: 32x32# C3nn.Conv2d(64, 128, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2)   # 输出: 16x16)self.classifier = nn.Sequential(nn.Flatten(),nn.Linear(128 * 16 * 16, 512),  # FC1nn.ReLU(inplace=True),nn.Dropout(0.5),nn.Linear(512, num_classes)     # 输出层)def forward(self, x):x = self.features(x)return self.classifier(x)

6. ​结论(Conclusion)​

  • 主要贡献​:提出的CWT-GANs-QP-CNN方法有效解决了滚动轴承故障诊断中的数据不足问题。CWT时频图像增强特征表达,GANs-QP生成高质量样本,CNN实现高精度分类(标准数据集准确率>99%,真实数据集>99.35%)。
  • 优势​:
    • 生成数据质量高(SSIM >0.93),优于传统GANs变体。
    • 在样本稀缺条件下提升诊断性能(如1200样本时准确率提升0.17–5.57%)。
    • 方法泛化性强,适用于不同分类器和数据集。
http://www.lryc.cn/news/593610.html

相关文章:

  • [黑马头条]-基于MinIO存储文章详情
  • 代码随想录算法训练营第二十五天
  • Streamlit 官翻 3 - 开发教程 Develop Tutorials
  • 80、【OS】【Nuttx】【启动】caller-saved 和 callee-saved 示例:栈空间对齐
  • Input输入和Screen相关
  • 轻松学习C++:基本语法解析
  • 从丢包到恢复:TCP重传机制的底层逻辑全解
  • 将HTML+JS+CSS数独游戏包装为安卓App
  • 微服务学习(六)之分布式事务
  • 华为擎云L420安装LocalSend
  • Java大视界:Java大数据在智能医疗电子健康档案数据挖掘与健康服务创新>
  • kafka--基础知识点--6.1--LEO、HW、LW
  • LeetCode Hot100【7. 整数反转】
  • 创意 C++ 文本冒险战斗游戏代码
  • Uniapp之自定义图片预览
  • 下一场范式革命:Transformer架构≠最终解法
  • Spring IOC容器在Web环境中是如何启动的(源码级剖析)?
  • Java多线程进阶
  • Node.js net.Socket.destroy()深入解析
  • [spring6: AspectMetadata AspectInstanceFactory]-源码解析
  • 零基础学习性能测试第二章-监控体系
  • OllyDbg技巧学习
  • Redis 如何保证高并发与高可用
  • Python爬虫实战:研究pefile库相关技术
  • PCB 混合介质叠层:材料特性匹配与性能提升的技术解析
  • 1. Spring AI概述
  • OSPF高级特性之Overflow
  • 【c++】提升用户体验:问答系统的交互优化实践——关于我用AI编写了一个聊天机器人……(12)
  • Buildroot vs Yocto:SDK 构建机制的核心差异与实践案例
  • 多线程 示例