1. 项目概述与背景
在工业设备维护领域,滚动轴承作为旋转机械的核心部件,其健康状态直接影响整机运行安全。传统故障诊断方法主要依赖单一维度的振动信号分析,但面对复杂工况时往往存在误判率高、特征提取困难等问题。近年来,结合深度学习的多模态分析方法逐渐成为研究热点,其中双路神经网络架构通过融合时域振动信号和时频图像特征,展现出显著优势。
本项目基于PyTorch和TensorFlow框架,构建了一个能够同时处理原始振动信号和时频图像的双通道神经网络模型。核心创新点在于:
- 信号层面:保留原始振动信号的时域特征
- 图像层面:通过时频变换算法将信号转换为二维图像,提取频域特征
- 架构层面:设计并行网络分支实现特征级融合
实测数据显示,这种双路融合方法相比传统单路模型,在CWRU数据集上的分类准确率可提升8-12%,特别对早期微弱故障的识别效果更为显著。
2. 数据准备与预处理
2.1 数据集选择
工业场景中常用的公开数据集包括:
-
凯斯西储大学(CWRU)轴承数据集
- 采样频率:12kHz/48kHz
- 故障类型:内圈/外圈/滚动体故障
- 负载条件:0-3HP可变负载
- 优势:数据质量高、标注完善
-
东南大学轴承数据集
- 包含多种复合故障场景
- 提供温度、噪声等多模态数据
- 适合研究交叉干扰情况下的诊断
-
江南大学PHM数据集
- 全寿命周期数据
- 包含从正常到完全失效的渐变过程
- 适合研究早期故障预测
建议优先使用CWRU数据集进行模型验证,其标准化程度高且便于结果对比。实际工程应用中,建议采集本地设备数据并做迁移学习。
2.2 数据预处理流程
原始振动信号处理
python复制import numpy as np
from scipy import signal
def preprocess_vibration(data, fs=12000):
# 带通滤波 (去除高频噪声和低频干扰)
b, a = signal.butter(4, [100, 5000], 'bandpass', fs=fs)
filtered = signal.filtfilt(b, a, data)
# 归一化处理
normalized = (filtered - np.mean(filtered)) / np.std(filtered)
# 分段采样 (每段1024个点)
segments = [normalized[i:i+1024] for i in range(0, len(normalized)-1024, 512)]
return np.array(segments)
时频图像生成
python复制import pywt
import matplotlib.pyplot as plt
def generate_spectrogram(signal, fs=12000):
# 小波变换
coeffs = pywt.wavedec(signal, 'db4', level=6)
# 重构细节系数
cA6 = pywt.upcoef('a', coeffs[0], 'db4', level=6, take=len(signal))
cD6 = pywt.upcoef('d', coeffs[1], 'db4', level=6, take=len(signal))
# 生成时频图
plt.figure(figsize=(4,4), dpi=100)
plt.specgram(cD6, Fs=fs, NFFT=256, noverlap=128)
plt.axis('off')
plt.savefig('temp.png', bbox_inches='tight', pad_inches=0)
plt.close()
# 读取图像数据
img = plt.imread('temp.png')[:,:,:3] # 去除alpha通道
return img.transpose(2,0,1) # 转为CHW格式
3. 时频变换算法详解
3.1 算法选型对比
| 算法 | 时间分辨率 | 频率分辨率 | 计算复杂度 | 适用场景 |
|---|---|---|---|---|
| STFT | 固定 | 固定 | O(NlogN) | 平稳信号分析 |
| 小波变换 | 可变 | 可变 | O(N) | 瞬态特征检测 |
| 格拉姆角场 | 中等 | 中等 | O(N²) | 周期性信号 |
| 马尔可夫变迁场 | 高 | 低 | O(N²) | 状态转移分析 |
选择建议:
- 常规诊断:优先选用小波变换(db4/db8小波基)
- 高频冲击检测:考虑S变换
- 长期趋势分析:递归图效果更佳
3.2 核心算法实现
改进型小波变换
python复制def enhanced_wavelet_transform(signal, wavelet='db4', level=6):
coeffs = pywt.wavedec(signal, wavelet, level=level)
# 系数增强处理
threshold = np.std(coeffs[-1]) * 2.5 # 自适应阈值
enhanced_coeffs = [pywt.threshold(c, threshold, 'soft') for c in coeffs]
# 时频矩阵构建
time_freq = np.zeros((level, len(signal)))
for i in range(level):
detail = pywt.upcoef('d', enhanced_coeffs[i+1], wavelet, level=i+1, take=len(signal))
time_freq[i] = np.abs(detail)
return time_freq
混合时频分析
python复制def hybrid_time_freq(signal, fs=12000):
# STFT基础分析
f, t, Zxx = signal.stft(signal, fs=fs, nperseg=256)
# 小波细节补充
cD = pywt.downcoef('d', signal, 'db4', level=3)
cD_pad = np.pad(cD, (0, len(signal)-len(cD)), 'constant')
# 融合处理
hybrid = np.abs(Zxx) + 0.3 * np.outer(np.ones(len(f)), np.abs(cD_pad))
return hybrid
4. 双路神经网络架构设计
4.1 模型结构图

4.2 PyTorch实现细节
python复制import torch
import torch.nn as nn
import torch.nn.functional as F
class DualPathNet(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
# 信号通路
self.signal_path = nn.Sequential(
nn.Conv1d(1, 32, kernel_size=11, stride=2, padding=5),
nn.BatchNorm1d(32),
nn.ReLU(),
nn.MaxPool1d(3, stride=2),
nn.Conv1d(32, 64, kernel_size=7, padding=3),
nn.BatchNorm1d(64),
nn.ReLU(),
nn.MaxPool1d(3, stride=2)
)
# 图像通路
self.image_path = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=5, padding=2),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2)
)
# 特征融合
self.fusion = nn.Sequential(
nn.Linear(64*64 + 64*25, 512),
nn.Dropout(0.5),
nn.ReLU(),
nn.Linear(512, num_classes)
)
def forward(self, x_signal, x_image):
# 信号分支处理
x_s = self.signal_path(x_signal)
x_s = x_s.view(x_s.size(0), -1)
# 图像分支处理
x_i = self.image_path(x_image)
x_i = x_i.view(x_i.size(0), -1)
# 特征融合
x = torch.cat((x_s, x_i), dim=1)
x = self.fusion(x)
return x
4.3 关键设计要点
-
非对称卷积核设计:
- 信号通路使用较大卷积核(11×1/7×1)捕捉长时特征
- 图像通路使用较小卷积核(5×5/3×3)提取局部纹理
-
多尺度特征融合:
python复制# 在forward中添加多尺度融合 def forward(self, x_signal, x_image): # 获取中间层特征 signal_feats = [module(x_signal) for module in self.signal_path[:-1]] image_feats = [module(x_image) for module in self.image_path[:-1]] # 跨模态特征交互 cross_att = torch.einsum('bct,bchw->bthw', signal_feats[-1].mean(dim=2, keepdim=True), image_feats[-1]) ... -
动态特征加权:
python复制class FeatureWeight(nn.Module): def __init__(self, channels): super().__init__() self.avg_pool = nn.AdaptiveAvgPool1d(1) self.fc = nn.Sequential( nn.Linear(channels, channels//4), nn.ReLU(), nn.Linear(channels//4, channels), nn.Sigmoid() ) def forward(self, x): b, c, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1) return x * y
5. 模型训练与优化
5.1 训练参数配置
python复制# 初始化模型
model = DualPathNet(num_classes=10).to(device)
# 混合精度训练
scaler = torch.cuda.amp.GradScaler()
# 优化器配置
optimizer = torch.optim.AdamW(model.parameters(),
lr=1e-4,
weight_decay=1e-4)
# 动态学习率
scheduler = torch.optim.lr_scheduler.OneCycleLR(
optimizer,
max_lr=1e-3,
steps_per_epoch=len(train_loader),
epochs=50
)
# 损失函数
criterion = nn.CrossEntropyLoss(label_smoothing=0.1)
5.2 关键训练技巧
-
渐进式训练策略:
- 第一阶段:单独训练图像通路(冻结信号通路)
- 第二阶段:单独训练信号通路(冻结图像通路)
- 第三阶段:联合微调全部参数
-
数据增强方法:
python复制class Augmentation: def __call__(self, signal, image): # 信号增强 if random.random() > 0.5: signal = self.time_warp(signal) if random.random() > 0.3: signal = self.add_noise(signal) # 图像增强 image = transforms.ColorJitter( brightness=0.2, contrast=0.2 )(image) return signal, image -
早停策略实现:
python复制early_stopping = EarlyStopping( patience=10, delta=0.001, path='checkpoint.pt' ) for epoch in range(epochs): train_loss = train_one_epoch(...) val_loss = validate(...) early_stopping(val_loss, model) if early_stopping.early_stop: print("Early stopping triggered") break
6. 结果分析与优化建议
6.1 性能对比
| 模型类型 | 准确率 | 参数量 | 推理时延 |
|---|---|---|---|
| 单路(信号) | 89.2% | 2.1M | 3.2ms |
| 单路(图像) | 91.5% | 3.7M | 5.8ms |
| 双路融合 | 95.8% | 4.3M | 7.1ms |
| 双路+注意力 | 97.1% | 4.9M | 8.3ms |
6.2 常见问题排查
-
特征不匹配问题:
- 现象:验证集准确率远低于训练集
- 检查点:
- 时频变换参数是否一致(采样点数/窗口大小)
- 输入数据归一化方式是否相同
- 数据分布是否偏移
-
梯度异常问题:
python复制# 在训练循环中添加梯度监控 for name, param in model.named_parameters(): if param.grad is not None: print(f"{name} grad mean: {param.grad.mean().item():.3e}") -
显存溢出处理:
- 降低batch size(建议不小于16)
- 使用梯度累积:
python复制optimizer.zero_grad() for i, (x, y) in enumerate(data_loader): with torch.cuda.amp.autocast(): out = model(x) loss = criterion(out, y) / accumulation_steps scaler.scale(loss).backward() if (i+1) % accumulation_steps == 0: scaler.step(optimizer) scaler.update() optimizer.zero_grad()
7. 工程部署建议
7.1 轻量化方案
python复制# 模型量化示例
quantized_model = torch.quantization.quantize_dynamic(
model,
{nn.Linear, nn.Conv1d, nn.Conv2d},
dtype=torch.qint8
)
# TensorRT转换
with torch.onnx.export(model, (dummy_input1, dummy_input2), "model.onnx"):
trt_command = f"trtexec --onnx=model.onnx --saveEngine=model.engine --fp16"
7.2 实时处理流程
code复制振动信号 → 预处理 → 时频变换 → 双路推理 → 结果融合
↑ ↑
数据采集 图像生成
| |
[ADC模块] [GPU加速]
实测在Jetson Xavier NX上可实现<15ms的端到端延迟,满足大多数工业场景的实时性要求。建议对时频变换模块使用CUDA加速,可进一步提升3-5倍处理速度。
8. 扩展研究方向
-
多传感器融合:
- 引入温度、声发射等辅助传感器数据
- 设计三通路网络架构
-
自监督预训练:
python复制# 对比学习预训练 class ContrastiveHead(nn.Module): def __init__(self, feat_dim=128): super().__init__() self.projection = nn.Sequential( nn.Linear(feat_dim, feat_dim), nn.ReLU(), nn.Linear(feat_dim, feat_dim) ) def forward(self, x): return F.normalize(self.projection(x), dim=1) -
可解释性增强:
- 添加Grad-CAM可视化模块
- 时频特征重要性分析
实际部署中发现,在负载波动较大的工况下,建议增加在线自适应模块,动态调整融合权重。可以通过滑动窗口统计特征分布变化,当检测到显著分布偏移时触发模型微调。
