☰
振动信号GADF图像化与Swin-CNN-GAM混合模型轴承故障诊断全流程解析
2026/10/20 17:39:58 网站建设 项目流程

1. 从一维振动信号到二维图像:GADF到底在做什么

拿到一个轴承故障诊断项目,第一反应通常是“走,上CNN”。但真正操作过的人都会遇到一个尴尬问题:一维振动信号直接喂进卷积网络,时序特征提取得不错,可故障冲击的周期性和相位关系往往会被局部感受野切得七零八落。这也是我在这类项目里选择先用GADF(Garmian Angular Difference Field,格拉姆角差场)做信号转图像的原因——不是跟风,是把信号“画”出来之后,网络能捕捉到的结构信息确实不一样。

先说清楚GADF的原理,它本质上是把一维时间序列变换到极坐标系,再通过三角差运算生成一个二维矩阵。具体分三步走:

  • 第一步,归一化。把原始振动序列x = {x1, x2, ..., xn}缩放到[0, 1]区间,公式是:
x_tilde_i = (x_i - min(x)) / (max(x) - min(x))

为什么要先把数据压到0~1?因为后续要用arccos函数求极角,arccos的定义域是[-1, 1],如果不做归一化,角度计算直接就崩了。

  • 第二步,转极坐标。对于归一化后的每个点,计算极角:
phi_i = arccos(x_tilde_i)

同时用时间索引i定义半径:

r_i = i / N

这里N是序列长度。换句话说,信号幅值映射成角度,时间顺序映射成半径,整个序列被铺到一个半圆范围内。

  • 第三步,算格拉姆差分矩阵。GADF的每个元素定义为两个点极角之差的正弦值:
GADF[i][j] = sin(phi_i - phi_j)

这个矩阵有几个很有意思的性质:对角线恒为0(因为sin(0)=0),非对角元素把i和j两个时刻的角差编码进去了。对比另一个变体GASF用的是cos(phi_i + phi_j),GADF更能凸显信号在时间方向上的局部变化——对振动数据里那种短促的冲击脉冲,响应会更加敏感。

实际项目里我通常把一段振动信号切成若干重叠片段,每个片段长度取128或256个采样点做一次上述变换,生成一张128×128或256×256的单通道灰度图。由于GADF图对角线是0,视觉上天然存在一条暗色斜线,这是正常现象,不是数据有问题。

有读者可能会问:直接给一维信号不就行了吗,为什么要绕这么一圈?我的理解是这样的:CNN在图像上做卷积时,卷积核天然能够感知局部区域的二维纹理和边缘方向;而振动信号转成GADF图后,不同故障类型对应的纹理模式差异会被放大。比如滚动体故障在图上会出现规律的菱形纹理,外圈故障则呈现间隔明显的条带状结构,这种肉眼可辨的差异,正是网络学习的核心线索。

2. Swin-CNN-GAM混合模型:注意力机制加在哪,为什么加在那

选模型架构的时候我纠结过一阵,纯Swin Transformer在图像分类上效果很好,但直接用在轴承故障诊断上有两个问题:一是Swin的全局建模能力强,可局部高频的冲击特征提取不如CNN直接;二是参数量偏大,故障诊断场景的数据量通常只有几千到几万张图,硬上大模型容易过拟合。

所以最终我的做法是Swin-CNN-GAM的混合结构,把两者各自的长处拼起来。

2.1 主干网络:Swin的窗口机制与层次特征

Swin Transformer的核心设计是移位窗口注意力,我把最关键的几个参数列出来,方便你参考我的实际配置:

参数配置值作用说明
输入尺寸224 × 224 × 3把GADF单通道图复制成三通道输入
Patch size4 × 4将图像切成长度为16的token序列
窗口大小7 × 7局部注意力计算范围
Stage各层数[2, 2, 6, 2]四个阶段的Transformer Block数量
Embedding维度[96, 192, 384, 768]各阶段特征通道数
移位窗口步长3 / 6相邻Block间shift量,实现跨窗口信息交互

Swin的移位窗口设计很巧妙。第一个Block在规则窗口内做自注意力,第二个Block把窗口整体平移几个像素,让原本被窗户隔开的信息能在下一层产生交互。这种“先局部后全局”的模式,对GADF图里那种周期性的纹理缺陷特别有效——外圈故障的带纹跨越多个人窗口,单靠局部注意力看不完整,平移窗口之后就能拼出完整pattern。

2.2 CNN分支:保留冲击特征的“快速通道”

Swin是主干,但我并行加了一条CNN分支,结构不复杂:三个5×5卷积层(步长2),通道数从64到128再到256,每个卷积后面接BatchNorm和ReLU,最后做全局平均池化。为什么选5×5大卷积核而不是小核堆叠?因为GADF图上的故障冲击通常是集中在几个像素点上的尖锐响应,大卷积核能更快地覆盖周边上下文,帮助判断这个冲是不是孤立的噪声尖峰。

CNN分支输出256维向量,Swin主干输出768维向量,两者拼接成1024维,后续再接GAM和全连接分类头。这里有个容易被忽略的细节:拼接时我不用简单concat,而是先分别做L2归一化再拼接。否则两个分支的特征尺度差异(CNN特征数值通常在个位数,Swin特征可能差一个量级)会直接影响GAM对通道重要性的判断。

2.3 GAM注意力:在通道和空间两个维度上“重新加权”

GAM(Global Attention Mechanism)的定位是“特征精炼器”。它先做通道注意力,再做空间注意力,最后通过共享MLP生成全局权重。放到我们的模型里,它做的事情可以通俗理解为:告诉网络哪些通道(某种纹理响应器)和哪些区域(图像中的某些空间位置)对这一张图更重要。

通道注意力部分我用了一个很轻量的一维卷积实现,卷积核大小k根据通道数自适应,公式是k = log2(C) / 2 + 1取整。比如输入1024维,k≈6,远比全连接层的参数量小。空间注意力则是拿通道重标定后的特征图做一个2D卷积,生成单通道的空间权重图,相当于逐像素打分。

GAM加在哪里很有讲究。我试过加在Swin最后一层之后、加在特征拼接之前、加在拼接之后,实测下来效果最好的是拼接之后、全连接分类头之前。为什么?因为拼接区域是两类特征第一次交汇的地方,信息冗余和冲突最严重,在这里加注意力相当于做一个特征融合前的“去噪和重标定”,比在各自分支内做更有效。

整个模型在单张RTX 4090上的推理时间是21ms左右,训练一个epoch处理1600张图大约45秒,这个效率对工业场景的在线检测来说是够用的。

3. 遗传算法(GA)在这个框架里到底优化了什么

很多初学者听说“遗传算法+深度学习”,第一反应是让GA去搜网络结构。但神经架构搜索(NAS)在轴承诊断这种中等规模任务里收益不高,搜索空间膨胀带来的是巨大的算力开销,反而得不偿失。我做这版的时候,GA的目标是从两个层面的参数里找到“最稳的一组”,而不是搜网络结构。

  • 输入层面的参数:滑动窗口的长度(128/256/512,决定GADF图的分辨率)、重叠率(0.25/0.5/0.75)、归一化策略(min-max/z-score)
  • 训练层面的参数:学习率(1e-4到1e-2的对数区间)、批大小(16/32/64)、权重衰减(1e-6到1e-3)、Dropout率(0.1到0.5)

8个参数被编码成一个个体,每个个体用二进制串或者实数向量表示——我用的是实数编码,简单直接。

适应度函数是整个GA设计的关键。我最初只用验证集准确率作为适应度,结果跑出来的参数在测试集上泛化并不理想,本质原因是验证集和测试集在工况差异下有分布偏移。后来我把适应度改成了验证集F1分数、混淆矩阵对角均值、AUC三者的加权组合,权重分别是0.5、0.3、0.2。这样一个个体光靠“蒙对几个多数类样本”拿不了高分,必须让每一类故障的召回率都站得住。

GA的进化策略我用的是锦标赛选择(锦标赛规模为3)、模拟二进制交叉(SBX,交叉概率0.85)、多项式变异(PM,变异概率0.1)。种群规模设了20,进化代数15代,每一代要训练20个模型。这里有一个很实际的优化技巧:如果每个模型从头训练到收敛,一代就要跑20次完整训练,15代就是300次,算力完全扛不住。我的做法是给所有个体设置统一的early stopping,patience=8个epoch;同时把最大训练轮数限制在60轮以内。大多数个体在20~30轮就能分出优劣,根本不需要等到完全收敛。这样整体跑完GA只需要大约3万次迭代计算,在单卡上一天左右能出结果。

GA收敛后,最优个体往往落在学习率5e-4附近、窗口长度256、重叠率0.5这个组合区间。这不是偶然——窗口长度256刚好能覆盖3~5个轴承旋转周期,图中既能看到完整的故障周期纹理,又不至于因为太长而模糊了局部脉冲的细节。

4. 实验全流程拆解:从数据预处理到消融对比

再好的模型也要靠实验说话。这一节我把整个实验链路拆开,方便你照着搭。

4.1 数据集构建与划分策略

我用的数据来自某公开轴承故障模拟平台(这里以“模拟项目X”代称),包含正常状态、外圈故障、内圈故障、滚动体故障四种类型,每种故障又分轻、中、重三个损伤等级,合计10类。采样率12kHz,电机转速范围覆盖900~1500rpm,负载0.75~1.5kW。

处理流程:

  1. 将连续振动信号按滑动窗口切段:窗口长度256,重叠率0.5,每段生成一张256×256的GADF图
  2. 每类样本量控制到2000张,避免类别不均衡
  3. 全部样本做z-score标准化(这里的标准化发生在转图之前,是对原始信号做的)
  4. 划分训练集/验证集/测试集:70% / 15% / 15%,划分前先按工况分组,同一工况的样本不跨集合

最后一步很多人会忽略:如果直接随机划分,训练集和测试集可能混入同一条连续信号前后紧邻的片段,造成数据泄漏,测试结果虚高。按工况先分组再切,才能模拟“模型在没见过的工况下诊断”的真实场景。

4.2 训练细节与超参数

训练用AdamW优化器,初始学习率对应GA搜索到的最优值(本实验为4.8e-4),权重衰减1e-4。学习率采用余弦退火调度,最低降到初始值的1/20。Batch size 32,训练轮数上限80,early stopping阈值设置在验证F1连续8轮不上升即停止。

数据增强上只用了随机水平翻转和随机旋转(±10度),没有加颜色抖动和裁剪。GADF图的纹理特征对翻转和旋转具备物理上的不变性(轴承旋转周期内的模式重复),但过度裁剪会破坏故障冲击的连续性。

最终模型在测试集上的结果是这样(均值±标准差,5次重复实验):

方法准确率平均F1参数量
纯CNN(ResNet-18)91.6% ± 0.8%90.5%11.2M
纯Swin-T93.2% ± 0.6%92.4%28.3M
CNN+Swin拼接(无GAM)94.1% ± 0.5%93.3%31.5M
CNN+Swin+GAM(本文)96.0% ± 0.3%95.6%32.1M
本文+GA参数优化97.2% ± 0.2%96.8%32.1M

几个关键结论:GAM带来的提升是0.9~1个百分点,GA再贡献1.2个百分点。单独看每个模块幅度都不大,但累积起来,从91.6%到97.2%的差距足以决定一个诊断系统能不能达到95%以上的上线门槛。

4.3 消融实验:每个模块必须证明自己有用

消融实验是审稿人和团队评审最容易挑刺的环节。除了上表里的大块消融,我还做了更细的对比,主要回答三个问题:

  • 问题1:GAM加在拼接前和拼接后差距有多大?

拼接后加GAM比拼接前加平均F1高0.5%。有意思的是,只在CNN分支加GAM(Swin分支保持原样)效果最差,比只在Swin分支加GAM还低。推测原因是CNN分支本身的特征表达相对“浅层”,加注意力容易放大局部噪声;而Swin分支输出已经经过了多层自注意力筛选,再叠GAM属于冗余。

  • 问题2:GADF和GASF哪个更适合这个任务?

我在相同模型上对比了两种图像化方法,GADF平均F1高1.3%。原因在我前面提过:GADF编码的是两点间的差分信息,对故障冲击引起的剧烈信号变化更敏感;GASF编码的是和信息,对全局趋势的表达好,但振动信号恰恰是差分特征比趋势特征重要。

  • 问题3:GA搜出来的参数用在纯CNN上有效吗?

有效,但增益没有在混合模型上大。GA搜索的最优窗口长度256和重叠率0.5,也把纯CNN的F1从90.5%提到了91.8%。这说明一部分收益来自数据预处理层面的优化,这部分是模型无关的;而另一部分收益(约1.2%)需要混合模型+GAM配合才能充分兑现。

5. 踩坑记录与工程化落地建议

前面的内容偏“顺风顺水”,实际上我在这个项目里踩过的坑至少能写三篇长文。挑几个和标题直接相关的,按排查链路讲给你听。

5.1 GADF图像信息坍缩问题

第一次跑实验,我发现不管怎么调参,训练损失下降到一定程度就停滞,验证F1卡在89%左右。排查过程:先看GADF图,发现很多故障样本生成的图片几乎全黑或全灰,纹理完全不可见。进一步追踪归一化代码,发现我在多段连续信号的全局min/max计算上出了问题——把所有片段放在一起求min和max,导致每段信号被同一个极值范围压缩,幅值较小的正常段被压成接近0,故障特征全部丢失。

修复方案:对每个片段独立做归一化,而不是用全局统计量。改成逐段归一化之后,图的对比度明显提升,验证F1直接涨到93%。

这个问题的教训是:当你发现图像化方法“看不出纹理”时,先检查归一化的作用域,这个细节决定GADF方法的成败。

5.2 Swin在小样本场景下的过拟合与缓解

轴承诊断数据集相对图像分类数据集来说小得多。直接使用Swin-T时,训练loss一路降到0.02以下,但验证F1从94%掉到92%,典型过拟合。

尝试的缓解方案依次是:增大Dropout(效果有限)、加MixUp增强(F1提升0.3%)、把Swin的Drop path概率从默认的0.1调到0.3(提升最明显,接近0.6%)。Drop path的原理是训练时随机“丢弃”一部分Transformer Block的残差连接,本质上是一种在深度网络内部的Dropout,对抑制Transformer过拟合特别有效。最终我把Drop path调到0.25,Dropout调到0.3,过拟合现象显著减轻。

5.3 GA搜索过程中的适应度震荡

GA在进化到第7代时,适应度出现了明显的震荡:第6代最优个体验证F1 96.3%,第7代反而掉到95.1%,第8代又回升。排查后发现两个原因:一是早期停止条件不统一,前几代模型训练轮数差异大,导致适应度不可比;二是验证集太小(约300张图),不同个体在验证集上的表现方差太大。

解决办法:把验证集扩充到600张(从训练集里按工况均匀分出一部分),并且固定所有个体最多训练40轮。做了这两处调整之后,适应度曲线才变得平滑可读。

5.4 部署阶段的量化与轻量化

模型最终要部署到边缘设备上,我做了两件事:一是把Swin的特征维度从[96,192,384,768]压缩到[64,128,256,512],参数量下降约40%,准确率只损失0.4%;二是做INT8量化,把模型从FP32的约120MB压到约30MB。量化的坑在于GAM里的MLP层对数值精度特别敏感,直接量化F1掉了3个百分点。解决办法:MLP层保留FP16,其余层全部INT8,最终F1只损失0.6%,推理速度提升1.8倍。

部署后的在线推理流程是这样的:连续采集的振动信号经过一个长度为512的滑窗,步长64,每64个新采样点触发一次推理,单次推理时间小于35ms,对大多数旋转机械的故障响应时间(通常要求秒级)来说绰绰有余。

6. 这套方案能迁移到什么场景

最后说点题外话——这套“信号转图像+Swin-CNN混合注意力+GA参数寻优”的框架,并不局限于轴承。我在其他项目里试过同样的链路去处理齿轮箱故障,只需要把采样率调到20kHz以上、窗口长度改成512,效果依然能打。连变压器振动信号、电机电流信号这种非振动类数据,只要物理上存在周期性故障特征,都可以用GADF图像化之后套用同样架构。

根据我个人的体会,最关键的迁移前提有三个:一是掌握好归一化和窗口切段的尺度,让故障特征在图像上“看得见”;二是别让Swin这种大模型直接裸跑,一定要配合Drop path和early stopping控制过拟合;三是GA虽然好用,但种群规模和进化代数要控制好,省算力的early stopping策略比增加代数更有效。

这版框架当然还有改进空间。比如我目前用的GADF图是三通道复制,如果换成GADF、GASF、Gram Matric角三种图像堆叠成三通道输入,理论上信息互补性会更强;再比如把GA换成贝叶斯优化,小样本场景下的收敛速度可能会更快。这些都是后续可以继续折腾的方向。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询