资讯动态

小波时频图与移位窗口Transformer:轴承故障诊断的高效建模方案

发布时间:2026/9/18 21:01:10 来源:尧图企业网站定制
简介这是一份面向机械故障诊断研究者和工业设备监测工程师的完整项目资料针对旋转机械轴承故障诊断中的非平稳振动特征提取与跨工况泛化难题给出了基于小波时频图WTFP与移位窗口视觉TransformerST的端到端解决方案。内容涵盖连续小波变换生成时频图、窗口注意力与移位窗口机制、模型训练与评估、GUI设计及部署应用既有算法原理解析也有可运行的Python代码示例。资源包共1个文件文件类型为docx整体大小约147KB适合具备Python编程和深度学习基础、希望复现完整智能诊断流程的读者。目前已有62人浏览学习。通过该资源可系统掌握从原始振动信号切片、标准化、WTFP构建、数据增强到故障分类的全链路实现细节尤其对数据划分、参数调优和训练稳定性设计有详细说明能为构建高效鲁棒的工业智能运维系统提供可复现的技术参考。1. 小波时频图WTFP与移位窗口 Transformer轴承故障诊断的全局建模新思路小波时频图WTFP加移位窗口视觉 TransformerST的组合正在成为轴承故障诊断落地项目中替代人工特征工程的高频选择。把一维振动信号转成二维时频图再交给视觉模型分类这个思路本身不新鲜但能在工程中落地的组合不多。卷积网络对冲击条纹这类跨区域重复模式建模效率偏低全局自注意力又扛不住高分辨率时频图的显存开销ST 用局部窗口注意力把计算复杂度压到接近线性再用移位窗口打通跨窗口交互正好卡在两者之间。本项目用 Python 和 PyTorch 实现完整链路并附带 GUI适合手里有振动数据、想脱离包络谱和手动特征筛选的诊断工程师参考。2. 数据链路构建振动切片、连续小波变换与 WTFP 生成2.1 样本泄漏是第一个要处理的坑轴承振动数据通常来自连续采集的长时间序列常见做法是滑动窗口切片。但这里有一个容易被忽略的问题如果先切片再随机划分训练集和测试集同一条原始序列中相邻的重叠窗口会被分到不同集合模型在测试时实际看到了训练样本的“近亲”评估指标会系统性虚高。这不是模型能力强而是数据边界没有控制好。我一般会按原始记录文件或采集批次先划分集合再对每个集合内部独立切片。这样测试集窗口与训练集窗口来源完全隔离得到的准确率才反映真实泛化能力。切片长度通常取 1024 到 4096 点步长取 50% 重叠即可满足样本量需求若故障冲击间隔较大切片长度应至少覆盖两个冲击周期这样时频图中才会出现可学习的周期性能量纹理而不是孤立的单次冲击。采样率对切片长度也有约束。25.6 kHz 采样率下1024 点对应 40 ms 信号时长对于转速 1500 r/min 的轴承旋转周期 40 ms刚好覆盖一个完整旋转周期。若转速更低建议把切片长度加长到 2048 或 4096 点否则一个样本内可能看不到完整的转频调制关系。工程数据与公开数据集最大的差别就在这公开数据集通常已经切好而现场数据必须自己决定这个长度切短了丢失周期信息切长了样本量缩水且训练变慢。2.2 连续小波变换参数选择逻辑WTFP 的质量取决于小波基、尺度范围与归一化策略。复 Morlet 小波是振动诊断中的常见选择它同时保留幅值与相位信息且带宽通过中心频率与带宽比控制能较好匹配轴承冲击引起的局部共振响应。cmor1.5-1.0是实践中比较稳的起点带宽 1.5、中心频率 1.0在时间分辨率与频率分辨率之间取了一个平衡。带宽参数调大时时间分辨率更好但频率分辨率变差对分离相邻边带不利调小时频率分辨率提升但冲击在时间轴上会拖得更长图像出现竖直条纹伪影。频率范围需要结合采样率和故障特征频率设定。范围过宽会把大量无故障背景能量带进图里故障纹理占比下降范围过窄则可能截断共振带。以 25.6 kHz 采样率、故障特征频率集中在 500 Hz 到 8 kHz 的场景为例将频率轴设为 500 Hz 到 8000 Hz 是合理起点。尺度数量也就是最终图像的高度一般取 128 或 256过少则频率分辨率不足过多则引入冗余且训练变慢。图像宽度直接由切片长度决定若切片 2048 点可以缩放到 224 宽保持与视觉模型兼容的输入尺寸。参数推荐值调整方向小波基cmor1.5-1.0带宽加大→时间分辨率提升频率范围500 Hz8 kHz按故障特征频率收窄尺度数量224图像模糊时增大切片长度2048低速场景加长2.3 WTFP 生成代码与参数说明import numpy as np import pywt def generate_wtfp(signal, fs25600, fmin500, fmax8000, scales224): 将一维振动信号转为小波时频图 :param signal: 一维 ndarray长度建议 1024~4096 :param fs: 采样率 :param fmin/fmax: 关注的频率范围 :param scales: 尺度数量对应时频图高度 dt 1.0 / fs freqs np.linspace(fmin, fmax, scales) # 频率转尺度pywt 使用相对采样率的归一化频率 scales_cwt pywt.frequency2scale(cmor1.5-1.0, freqs / fs) coeffs, _ pywt.cwt(signal, scales_cwt, cmor1.5-1.0, dt) # 模值 对数压缩抑制强冲击对动态范围的垄断 wtfp np.abs(coeffs) wtfp np.log1p(wtfp) # 分位数归一化保留弱故障纹理 lo, hi np.percentile(wtfp, [2, 98]) wtfp np.clip((wtfp - lo) / (hi - lo 1e-8), 0, 1) return wtfp.astype(np.float32)参数说明frequency2scale把目标频率转换为连续小波变换实际使用的尺度值这里传入的freqs / fs是相对采样率的归一化频率cmor1.5-1.0表示中心频率 1.0、带宽 1.5 的复 Morlet 小波。log1p对模值做对数压缩因为轴承故障常伴随大幅值冲击直接按最大最小值归一化会把低幅值区域的纹理压缩到不可见。分位数归一化用 2% 和 98% 分位点代替全局极值避免少量离群点主导图像对比度1e-8防止除零。生成后应该抽查时频图正常样本整幅能量分布均匀内圈或外圈故障样本会出现沿时间轴重复的垂直能量条带。若图像表现为一片噪点优先增大尺度数量或收窄频率范围若出现整幅过曝说明对数压缩前幅值差异过大可以把log1p改为np.log1p(wtfp * 10)增强低幅值响应。3. 移位窗口注意力实现从窗口划分到 Patch Merging3.1 为什么选择 ST 而不是全局自注意力标准视觉 Transformer 对每个图像块与其他所有图像块计算注意力图像块数为 N 时复杂度为 O(N²)。一张 224×224 的时频图按 patch 4×4 切分数量达到 3136注意力矩阵规模接近千万级普通显卡上 Batch Size 只能压得极低训练效率很差。ST 的思路是把特征图均匀切分成固定尺寸窗口注意力只在窗口内计算复杂度降为线性量级再通过相邻层之间的窗口移位建立跨窗口信息交换。对轴承 WTFP 而言局部窗口适合建模冲击纹理和窄带共振这类局部结构而故障的周期性决定了它的能量条纹会在时频图上跨多个窗口重复出现。如果不做窗口移位每个窗口只能看到自己的局部区域模型无法建立“这个冲击和 50 ms 前的冲击同源”的关联。移位窗口的实质就是在计算效率与全局感受野之间做折中单层看局部叠多层看全局。3.2 窗口划分与循环移位代码实现def window_partition(x, window_size): 输入 x: (B, H, W, C) 返回: (B*num_windows, window_size, window_size, C) B, H, W, C x.shape x x.reshape(B, H // window_size, window_size, W // window_size, window_size, C) x x.permute(0, 1, 3, 2, 4, 5).contiguous() return x.view(-1, window_size, window_size, C) def window_reverse(windows, window_size, H, W, C): 将窗口还原为原始特征图供后续模块使用 B int(windows.shape[0] / (H / window_size * W / window_size)) x windows.view(B, H // window_size, W // window_size, window_size, window_size, C) x x.permute(0, 1, 3, 2, 4, 5).contiguous() return x.view(B, H, W, C)window_partition的 reshape 顺序是这段代码的关键先按高度方向切成H // window_size段再按宽度方向切成W // window_size段经过permute调整维度顺序后view把每个窗口内的像素连续排列。window_reverse是逆操作保证还原后的特征图与输入保持相同的内存布局否则后续 Patch Merging 的拼接会错位。移位窗口的实现用torch.roll对特征图做循环位移位移量为窗口尺寸的一半。第一层用规则窗口第二层先位移再划分窗口计算注意力计算完成后再反向位移还原。这里需要给位移后产生的不完整窗口加注意力掩码将无效区域对应的注意力分数置为负无穷避免边缘像素与循环位移带来的跨边界区域产生无意义关联。3.3 网络结构与计算开销对照表阶段Patch Embedding / MergingST 块配置输出尺寸Stage 1patch4, 维度96窗口4, 头数356×56×96Stage 22×2 合并, 维度192窗口4, 头数628×28×192Stage 32×2 合并, 维度384窗口4, 头数1214×14×384分类头全局池化 Linear类别数N窗口尺寸取 4 是我个人最常用的配置窗口内只有 16 个 patch单层注意力计算量很小跨窗口信息完全依赖堆叠层数逐步扩散。取 8 时单层感受野更大但注意力矩阵尺寸变为 64×64计算量比窗口 4 大四倍在显存有限的场景收益不明显。头数设计遵循“通道越多头数越多”的原则保证每个头的维度保持在 32 左右这是自注意力训练稳定性的经验值。输入统一为单通道灰度图不叠加伪彩色映射颜色编码只会引入额外的分布偏移对现场不同采集链路的迁移没有帮助。4. 训练稳定性设计分层划分、标签平滑与评估验证4.1 数据划分与增强策略类别不均衡是轴承诊断的常态正常样本和固定转速下的特定故障样本往往数量多早期剥落或保持架故障样本稀少。划分数据时用分层抽样保证训练集、验证集与测试集内类别比例一致若样本总量太少宁可减少验证集占比也不要让验证集缺失某一类别否则最佳模型选择会失真。增强策略不宜过猛。对振动信号有效的是这三项幅值缩放 0.91.1 模拟载荷变化、小幅时间平移模拟触发位置抖动、添加标准差为信号标准差 1% 的高斯噪声模拟采集链路噪声。随机遮挡和强旋转虽然常用于自然图像但会破坏时频图的时间连续性与频率结构不建议使用。增强只在训练集施加验证集和测试集保持原始状态否则评估结果无法反映真实数据分布。4.2 优化器与学习率调度配置optimizer torch.optim.AdamW( model.parameters(), lr1e-4, weight_decay0.05 ) scheduler torch.optim.lr_scheduler.SequentialLR( optimizer, schedulers[ torch.optim.lr_scheduler.LinearLR( optimizer, start_factor0.1, total_iters10 ), torch.optim.lr_scheduler.CosineAnnealingLR( optimizer, T_maxepochs - 10 ) ], milestones[10] ) criterion torch.nn.CrossEntropyLoss(label_smoothing0.1)参数说明AdamW 的weight_decay0.05是视觉 Transformer 训练中验证过的稳定配置比卷积网络常用的 0.0001 大一两个数量级能有效抑制时频图中高频噪声对应的权重过度生长。学习率 1e-4 适合从零训练的中小规模网络如果加载预训练权重可以放大到 3e-4 或 5e-4。前 10 个 epoch 线性 warmup 把学习率从 10% 逐步升到目标值避免 Transformer 在训练初期因梯度震荡而发散之后余弦退火让学习率平滑下降在训练后期细调权重。4.3 评估指标与混淆矩阵解读指标计算方式实际关注点宏平均 F1各类 F1 的算术平均类别均衡程度单类召回率TP/(TPFN)早期故障漏报率混淆矩阵预测 vs 真实类别误判规律只用整体准确率评估会掩盖小类别失效。现场部署时我习惯额外输出每个类别的召回率并重点观察滚动体故障是否被误判为外圈故障——这两种故障在时频图中都表现为窄带冲击纹理相似度天然较高混淆矩阵对应位置颜色加深是符合物理直觉的说明模型学到了确实接近的特征而非粗暴记忆标签。训练过程只记录验证损失在验证损失最低点保存权重而不是保存最后一个 epoch。若验证损失在训练中期就开始反弹排查顺序是先确认数据划分边界是否泄漏再检查增强强度最后才调 weight_decay这个顺序能省下大量无效调参时间。5. GUI 落地把 WTFP-ST 模型封装成可操作的诊断工具5.1 界面模块划分与数据流GUI 的价值在于让现场人员完成“加载信号 → 生成时频图 → 推理 → 导出报告”的闭环而不需要理解 Transformer 内部机制。本项目的界面按区域划分左侧为数据输入与参数设置区包含文件路径选择、采样率输入、频率范围与尺度数量设置中间为原始振动波形和 WTFP 时频图两个绘图区右侧为类别概率卡片与诊断结果底部为数据质量检测与日志导出区。所有参数默认值与训练配置一致避免现场操作中因为误改参数导致推理结果失真。5.2 推理封装与自检逻辑def predict_sample(model, signal, cfg): model.eval() wtfp generate_wtfp(signal, cfg.fs, cfg.fmin, cfg.fmax, cfg.scales) tensor torch.from_numpy(wtfp).unsqueeze(0).unsqueeze(0) with torch.no_grad(): probs torch.softmax(model(tensor.float()), dim1) return probs.squeeze().numpy(), wtfp推理阶段不做数据增强但预处理参数必须与训练完全一致同一个fmin/fmax/scales组合、同一种分位数归一化差一个值时频图分布就会偏移准确率可能从 95% 掉到 60% 以下。GUI 加载权重后先跑一条训练时见过的样本做自检输出概率与训练记录比对一致再开放使用。5.3 现场部署的取舍部署环节两个务实建议模型导出用 TorchScript推理时不依赖训练脚本和数据增强逻辑体积小且版本可控实时诊断对连续数据流按固定步长滑动相邻窗口概率做平均或多数投票单次预测抖动会被有效平滑。数据质量检测放在推理前检查信号是否饱和削顶、是否存在零漂移、有效值是否在合理区间——这三类异常会直接生成无效时频图提前拦截比事后解释误报更有价值。诊断日志按时间戳记录类别、置信度与图像路径为后续误判分析和模型迭代保留完整证据链。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价