[故障诊断方向]基于二维时频图像和数据增强技术的轴承故障诊断模型
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所示,方法分为三步:
- 数据预处理:原始一维振动信号通过CWT转换为128×128像素的二维时频图像(图5)。
- 数据增强:使用CWT-GANs-QP生成新样本。生成器和判别器网络结构见表2(如生成器使用转置卷积层,判别器使用卷积层)。
- 故障诊断:结合原始和生成样本训练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%)。
- 方法泛化性强,适用于不同分类器和数据集。