基于时频图和卷积神经网络的诊断故障诊断

本文介绍了如何通过短时傅里叶变换将时域振动信号转化为STFT图片,并详细说明了制作数据集的过程,包括数据划分、模型训练和tensorboard监控。重点展示了如何自定义数据加载器与配置文件的修改,适合信号处理与深度学习入门者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

什么是时域信号?什么是频域信号?那么什么又是时频图?有什么区别,优缺点又如何

时域信号:

对于振动信号来说,时域信号是随着时间变化的振动幅度或者加速度,对于振动系统的变化有着最直接的表现

时域信号图片

在这里插入图片描述

频域信号 :

由于振动系统发出的信号是经过很多振动源叠加的信号,那么时域信号就会难以分析。
离散傅里叶变换(DFT),是将离散的时域信号转换为频域信号,其采样率和采样点数决定了频域的分辨率,分辨率也就是说能够分辨信号频率的精度最高是多少,或者也可以用能识别的频率最小间隔来描述。

相应的频域信号图片,大小通常表示振幅

在这里插入图片描述

时频域图像:

经过离散傅里叶变换,我们可以很好的观察到信号频率分布,但是频率信号丢失了时间信息,这是它最大的缺点。
短时傅里叶变换(STFT)就可以将时域信号转换为时频域信号,时频域信号能够反应信号等频率随着时间的变化。通常这也可以看系统是否稳定。

短时傅里叶变换:

1.分祯
将信号进行分祯,通常还会重叠一部分分割的地方。
2.加窗
当分祯取的信号不在一个周期时,会发生频谱泄露,出现不存在的频率,那么需要加窗平滑信号首位部分,让首尾是连续的,或者变化不那么大,常用的有汉明窗。
3.DFT计算
对每一个片段信号做DFT计算得到频谱信息。

短时傅里叶变换图像(时频图像)

在这里插入图片描述

从这副图可以看出,时域信号是较为稳定的。

制作数据集

将信号保存成STFT图片

我的数据集是由txt构成的,由于数据比较少,采用的是随机重复采样,一次截取20000个点,采样率为20000。数据集的标签体现在路径上。STFT的计算可以采scripy.signal的stft函数

def loadSingleFileWithReapetSampling(SampleNum:int,path:str,SampleLen=20000,SampleLate = 20000):

    signal,all_lenght,m =readfile(path)
    for i in range(SampleNum):
        random_start= np.random.randint(low=0,high=all_lenght - SampleLen)
        sliceSignal = signal[random_start:random_start+SampleLen]
        data_stft = STFT.GetFrequencyFeature4(sliceSignal,SampleLate) 
        newPath = path.split("/")
        newPath[-1] = "index-{}.jpg".format(i) #重构文件名
        newPath =  os.path.join(*newPath) #将列表展开成参数
        plt.imsave(newPath,data_stft)
loadSingleFileWithReapetSampling(5000, "data2/0/0hp-70%rpm/channel-0/xxx.txt")

划分数据集

这里采用把数据分别放到train目录和test目录下,其他文件结构不变。

import os
import glob
import numpy as np
from shutil import *
from torch.utils.data import random_split, Subset
for root,cDir,filename in os.walk("data2\\"):
    # print(root)
    if len(root.split("\\"))==4:
        paths = glob.glob(root+"\\*.jpg") #按匹配符加载文件路径,巨好用
        dataSize = len(paths)
        trainSize = int(0.8*dataSize)
        train_set = Subset(paths, range(trainSize)) #也可以用切片
        test_set = Subset(paths, range(trainSize, dataSize))
        for index in test_set:
            newPath = "data3\\test\\"+os.path.join(*index.split("\\")[1:-1])
            if not os.path.exists(newPath):
                os.makedirs(newPath)
            print("newPath:",newPath)
            print("oldPath:",index)
            copyfile(index,newPath+"\\"+os.path.basename(index))
        for index in train_set:
            newPath = "data3\\train\\"+os.path.join(*index.split("\\")[1:-1])
            if not os.path.exists(newPath):
                os.makedirs(newPath)

训练模型

下载模板

这里采用了模板框架github地址:github.com

直接使用git clone https://github.com/victoresque/pytorch-template拷贝到本地

得到结构如下,然后data3为数据集

在这里插入图片描述

自定义数据加载器

因为数据集是自己的所以要自定义加载器(data_loader文件夹下):

class JJDataLoader(BaseDataLoader):
    #参数在config.json中配置
    def __init__(self,data_dir, batch_size, shuffle=True, validation_split=0.0, num_workers=1, training=True):
        trans = transforms.Compose([
            transforms.ToTensor()
        ])
        self.data_dir = data_dir
        self.dataset = JJDataSet(data_dir,trans)
        super().__init__(self.dataset, batch_size, shuffle, validation_split, num_workers)
class JJDataSet(Dataset):
    def __init__(self,dir:str,transforms):
        self.img_path = glob.glob(dir+"/*/*/*/*.jpg")
        print("len:",len(self.img_path))
        self.img_label =  np.array([index.split("/")[-4] for index in self.img_path])
        if transforms is not None:
            self.tramsforms= transforms
        else:
            self.tramsforms = None
    def __getitem__(self, index):
        img = Image.open(self.img_path[index]).convert('L')
        if self.tramsforms is not None:
            img = self.tramsforms(img)
        lbl = int(self.img_label[index])
        # print("lbl:",lbl)
        # print("path:",self.img_path[index])
        return img,torch.tensor(lbl)
    def __len__(self):
        return len(self.img_path)    

修改配置文件

主要是修改加载器名称和训练集路径

在这里插入图片描述

训练模型

注意训练的gpu数量和测试的数量一定要一致

python train.py -c config.json --resume saved/models/xxxx/model_best.pth 

测试模型

这里主要修改的是配置文件下的数据集目录
在这里插入图片描述

开启tensorboard监控

可以很好的看到训练精确度的变化和损失值的变化

tensorboard --logdir saved/log/

在这里插入图片描述

<think>好的,我需要帮助用户了解如何使用卷积神经网络(CNN)进行滚动轴承故障诊断的方法实现案例。首先,我得回顾一下用户提供的参考资料,确保回答准确。 用户提到了两个引用:一个是基于Matlab的CNN连续小波变换(CWT)的方法,另一个是使用Python的一维CNN进行二分类的轴承故障诊断。这两个案例分别涉及不同的工具(Matlab vs Python)不同的数据处理方法(CWT处理为图像 vs 一维信号处理)。需要将这两者的方法结合起来,给出一个全面的回答。 首先,我需要明确滚动轴承故障诊断的一般流程。通常包括数据采集、预处理、特征提取、模型构建、训练与评估。CNN在这里主要用于自动特征提取分类。 接下来,根据引用[1],Matlab案例中使用了CWT将振动信号转换为时频图像,这可能是因为二维CNN在处理图像数据上有优势。而引用[2]中的Python案例使用一维CNN直接处理原始信号,这需要处理一维时序数据。 因此,在回答中需要区分这两种不同的数据预处理方法,并说明各自的优缺点。例如,CWT转换能捕捉时频特征,但计算量较大;一维CNN直接处理信号,节省计算资源但可能需要更深的网络来提取特征。 然后,需要给出具体的实现步骤。对于基于CWT二维CNN的方法,步骤可能包括数据采集、CWT转换生成图像、构建CNN模型(卷积层、池化层、全连接层等)、训练测试。对于一维CNN的方法,步骤则是数据预处理(归一化、分段)、构建一维卷积层、池化层、全连接层,然后进行分类。 同时,用户可能需要知道如何选择适合自己情况的方法,比如数据量、计算资源、是否需要时频分析等因素。此外,代码示例也是重要的,用户提供的引用中有MatlabPython的案例,可能需要简要说明代码结构,但由于不能直接复制,应指导用户如何查找或构建这些代码。 还需要注意用户提到的“实现方法与案例”,因此要结合两个引用中的案例,说明不同实现方式的异同点。例如,引用[1]可能更侧重于图像处理,而引用[2]侧重于时序信号处理。 最后,生成的相关问题需要围绕这两个案例展开,可能涉及数据预处理方法比较、不同工具的实现差异、模型优化策略等。 现在需要检查是否有遗漏的步骤,比如数据增强、模型评估指标(如准确率、混淆矩阵)、交叉验证等。这些内容虽然用户没有直接提到,但在故障诊断中也很重要,可能需要简要提及。 另外,要确保回答符合系统级指令,特别是LaTeX格式的正确使用,例如变量用$...$,公式用$$...$$。例如,在提到小波变换时,可能需要写出公式,但用户提供的引用中没有具体公式,所以可能不需要,或者可以提及CWT的数学表达式。 最后,确保引用标识正确添加,例如在提到Matlab案例时添加[^1],在提到Python的一维CNN时添加[^2]。 总结,回答的结构应该包括方法概述、两种实现路径(CWT+2D CNN1D CNN)、步骤详解、案例参考,以及相关问题。需要清晰分点,使用中文,避免Markdown,保持口语化但专业。</think>### 卷积神经网络在滚动轴承故障诊断中的实现方法与案例 #### 一、方法概述 卷积神经网络(CNN)通过自动提取振动信号中的故障特征,实现轴承状态的分类。其核心流程包括**数据预处理**、**特征提取**、**模型训练****故障分类**。根据信号处理方式的不同,主要分为以下两类实现路径: 1. **基于时频图像的方法**(二维CNN) 通过连续小波变换(CWT)将原始振动信号转换为时频图像,再利用二维CNN处理图像特征。例如,引用[1]中使用CWT生成时频图,通过卷积层捕捉频率与时间的关联模式[^1]。 **数学表达**: 连续小波变换公式为: $$W(a,b) = \frac{1}{\sqrt{a}} \int_{-\infty}^{\infty} x(t) \psi^*\left(\frac{t-b}{a}\right) dt$$ 其中$a$为尺度参数,$b$为平移参数,$\psi(t)$为小波基函数。 2. **基于原始信号的方法**(一维CNN) 直接对一维时序信号进行卷积操作,适用于实时性要求高的场景。引用[2]中采用一维卷积层提取局部波形特征,结合池化层降低维度[^2]。 --- #### 二、实现步骤详解 ##### 路径1:CWT+二维CNN(Matlab案例参考) 1. **数据采集与预处理** - 采集轴承振动信号,划分训练集测试集。 - 对信号进行归一化处理:$x_{\text{norm}} = \frac{x - \mu}{\sigma}$,其中$\mu$为均值,$\sigma$为标准差。 2. **生成时频图像** - 使用CWT将信号转换为灰度图像(如Morlet小波基),每张图像对应一个故障类别标签。 3. **构建CNN模型** ```matlab layers = [ imageInputLayer([128 128 1]) % 输入时频图尺寸 convolution2dLayer(3, 32, 'Padding','same') % 3x3卷积核,32通道 batchNormalizationLayer reluLayer maxPooling2dLayer(2, 'Stride',2) fullyConnectedLayer(4) % 假设4类故障 softmaxLayer classificationLayer]; ``` 4. **训练与测试** - 设置优化器(如Adam)学习率衰减策略。 - 通过混淆矩阵评估分类准确率。 ##### 路径2:一维CNN(Python案例参考) 1. **信号分段与增强** - 将长时序信号切分为固定长度(如1024点)的样本。 - 添加噪声或时间偏移以增强数据多样性。 2. **构建一维CNN模型** ```python model = Sequential() model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(1024,1))) model.add(MaxPooling1D(pool_size=2)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(2, activation='softmax')) # 二分类任务 ``` 3. **模型优化** - 使用交叉熵损失函数:$L = -\sum y_i \log(\hat{y}_i)$,其中$y_i$为真实标签,$\hat{y}_i$为预测概率。 - 采用早停法(Early Stopping)防止过拟合。 --- #### 三、关键问题与优化策略 - **数据不平衡**:对少数类样本进行过采样或调整损失函数权重。 - **计算效率**:一维CNN参数量更少,适合嵌入式部署;二维CNN特征表达能力更强,但需更高算力。 - **模型可解释性**:通过梯度加权类激活映射(Grad-CAM)可视化卷积层关注的信号区间。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值