1. 项目背景与核心思路
轴承作为机械设备中的关键部件,其健康状态直接影响整个设备的运行安全。传统基于振动信号FFT分析的诊断方法在复杂工况下表现有限,而深度学习为故障诊断提供了新思路。这个项目创新性地结合了小波时频分析和Swin Transformer模型,构建了一个端到端的轴承故障诊断系统。
核心流程分为三步:首先通过连续小波变换(CWT)将一维振动信号转换为二维时频图,保留时频域联合特征;然后采用Swin Transformer作为主干网络,利用其窗口注意力机制捕捉时频图中的长程依赖关系;最后通过分类头输出故障类型预测。实测在CWRU轴承数据集上达到98.7%的准确率,显著优于传统CNN方法。
关键创新点:小波时频图解决了传统STFT时频分辨率固定的问题,Swin Transformer的自注意力机制比CNN更能捕捉故障特征的全局上下文关系。
2. 数据准备与预处理
2.1 数据集选择与说明
采用凯斯西储大学(CWRU)轴承数据集作为基准,包含正常状态和内圈、外圈、滚动体三种故障类型,每种故障又有不同损伤直径(0.007英寸到0.021英寸)。采样频率12kHz,驱动负载0-3马力可变。
数据目录结构示例:
CWRU/ ├── normal │ ├── 0hp.mat │ ├── 1hp.mat │ └── 3hp.mat ├── inner_race │ ├── 007_0hp.mat │ └── 021_3hp.mat └── outer_race ├── 007_0hp.mat └── 021_3hp.mat2.2 信号分段与时频图生成
- 信号切片:每个样本取1024个采样点(约85ms),重叠率50%
- 小波变换:使用PyWavelets库进行Morlet小波变换
import pywt def generate_cwt(signal, scales=64): coefficients, _ = pywt.cwt(signal, scales, 'morl') return np.abs(coefficients)- 图像标准化:对时频图进行Min-Max归一化,并resize到224×224
注意事项:Morlet小波的带宽参数需根据轴承特征频率调整,通常设为中心频率/带宽=5
3. 模型架构与实现
3.1 Swin Transformer配置
基于PyTorch实现Swin-Tiny变体:
from swin_transformer_pytorch import SwinTransformer model = SwinTransformer( hidden_dim=96, layers=(2, 2, 6, 2), heads=(3, 6, 12, 24), channels=1, # 单通道时频图 num_classes=10 # 故障类别数 )关键参数说明:
- patch_size=4:平衡计算效率和局部特征保留
- window_size=7:适合224×224输入尺寸
- mlp_ratio=4:FFN层隐藏维度扩展系数
3.2 自定义数据加载器
class BearingDataset(Dataset): def __init__(self, root_dir): self.samples = [] for label, fault_dir in enumerate(os.listdir(root_dir)): for mat_file in glob(f"{root_dir}/{fault_dir}/*.mat"): data = loadmat(mat_file)['X'].flatten() for i in range(0, len(data)-1024, 512): segment = data[i:i+1024] cwt = generate_cwt(segment) self.samples.append((cwt, label)) def __getitem__(self, idx): img, label = self.samples[idx] return torch.FloatTensor(img).unsqueeze(0), label4. 训练策略与调优
4.1 损失函数与优化器
采用带标签平滑的交叉熵损失,防止过拟合:
criterion = nn.CrossEntropyLoss(label_smoothing=0.1) optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=0.05) scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=50)4.2 数据增强策略
针对时频图的特殊增强:
transform = transforms.Compose([ transforms.RandomHorizontalFlip(p=0.5), transforms.RandomApply([ transforms.GaussianBlur(kernel_size=(3,3), sigma=(0.1,1.0)) ], p=0.3), transforms.RandomErasing(p=0.2, scale=(0.02,0.1)) ])4.3 混合精度训练
使用Apex加速:
pip install apex训练代码片段:
from apex import amp model, optimizer = amp.initialize(model, optimizer, opt_level="O1") with torch.cuda.amp.autocast(): outputs = model(inputs) loss = criterion(outputs, labels) optimizer.backward(loss)5. 部署与性能优化
5.1 模型量化
将FP32模型转换为INT8:
model.eval() quantized_model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 ) torch.jit.save(torch.jit.script(quantized_model), "bearing_fault_int8.pt")5.2 ONNX导出
dummy_input = torch.randn(1, 1, 224, 224) torch.onnx.export( model, dummy_input, "bearing_fault.onnx", opset_version=11, input_names=["input"], output_names=["output"] )6. 常见问题与解决方案
6.1 时频图模糊问题
现象:小波变换后特征不清晰解决方法:
- 调整小波尺度范围:
scales = pywt.central_frequency('morl')*fs / np.arange(1,101) - 增加采样点数到2048点
- 改用Complex Morlet小波
6.2 过拟合处理
现象:训练准确率高但测试集表现差对策:
# 增加DropPath正则化 from timm.models.layers import DropPath class SwinBlock(nn.Module): def __init__(self, drop_path_rate=0.2): self.drop_path = DropPath(drop_path_rate)6.3 类别不平衡
处理方案:
# 加权采样 weights = 1. / torch.bincount(dataset.targets) sampler = WeightedRandomSampler(weights, len(weights))7. 扩展应用方向
- 多传感器融合:结合声发射信号时频图
- 迁移学习:在预训练ImageNet权重上微调
- 边缘部署:使用TensorRT加速,部署到Jetson设备
- 异常检测:结合One-Class SVM进行未知故障检测
实际部署中发现,在工业现场使用时频图输入相比原始信号有显著优势——时频特征对转速波动不敏感,且可视化结果便于人工复核。一个实用的技巧是在诊断界面同时显示原始信号和时频图,帮助工程师快速验证模型决策依据。