欢迎光临
我们一直在努力

振动异常检测算法概述

振动异常检测算法概述

振动异常检测算法是工业设备维护、结构健康监测、交通运输等领域的核心技术,通过分析振动信号(如加速度、速度、位移)的变化模式,识别潜在故障(如轴承磨损、结构裂纹、电机不平衡)。这些算法可分为传统信号处理、机器学习和深度学习三大类,能实现实时预警,减少停机损失。实际产线中,算法需结合硬件(如加速度计、陀螺仪)和数据预处理(如滤波、特征提取),准确率可达85–98%。

常见算法分类与原理
  • 传统信号处理算法(简单高效,适用于实时检测):

    • 陀螺仪欧几里得距离异常检测(GEDAD):基于3轴加速度计,建立正常振动基线模板,通过计算欧几里得距离(L2范数)与阈值比较检测异常。分学习阶段(模板生成+阈值计算)和推理阶段(实时对比)。优点:训练快、计算低耗,适合ESP32等边缘设备。
    • 突变检测/振幅检测/波动检测:分别检测相邻点变化率、绝对值超阈、标准差变化。简单阈值法,适用于初级异常筛查。
    • 基于振动图像特征的机械状态异常检测:将一维振动信号转换为图像(如谱图),提取特征(边缘、纹理)进行异常分类。优点:可视化直观。
  • 机器学习算法(需特征工程,精度中等):

    • One-Class SVM:无监督学习正常振动模式,检测偏离样本。适用于小数据集。
    • 决策树/XGBoost:基于时域/频域特征(如RMS、峰值因子)构建模型预测异常。解释性强,适用于变压器/棒束振动监测。
  • 深度学习算法(高精度,适用于复杂时序数据):

    • LSTM自编码器:编码-解码结构,训练重构正常振动信号,异常时重构误差大。适用于轴承振动异常检测和寿命预测。
    • 卷积神经网络 + LSTM:CNN提取频域特征,LSTM处理时序,用于设备振动故障诊断。精度高,但计算密集。
    • 时空注意力机制 + TCN-Transformer:融合时间卷积网络(TCN)和Transformer,捕捉时空特征。适用于轨道振动异常检测。
    • 过程神经网络:基于过程神经元,预测航空发动机振动趋势。适用于动态系统。
  • 算法选择建议
    • 简单场景(资源有限):GEDAD或阈值法,计算开销低。
    • 复杂时序(高精度):LSTM自编码器或TCN-Transformer。
    • 无监督:Isolation Forest(ML.NET实现,适合工控机)。
    • 工业落地:结合预处理(如FFT、滤波),准确率可提升5–10%。

    LSTM自编码器代码示例(Python + PyTorch)

    以下是LSTM自编码器用于振动异常检测的完整代码。训练正常数据,重构误差超过阈值即异常。

    import numpy as np
    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.utils.data import Dataset, DataLoader

    # 数据生成(模拟正常振动 + 异常)
    def generate_data(n_samples=1000, anomaly_start=800):
    time = np.arange(n_samples)
    data = np.sin(time * 0.1) + np.random.normal(0, 0.05, n_samples)
    data[anomaly_start:] += np.random.normal(0.5, 0.2, n_samples anomaly_start) # 注入异常
    return data

    class VibrationDataset(Dataset):
    def __init__(self, data, seq_len):
    self.data = data
    self.seq_len = seq_len

    def __len__(self):
    return len(self.data) self.seq_len

    def __getitem__(self, idx):
    seq = self.data[idx:idx + self.seq_len]
    return torch.tensor(seq, dtype=torch.float32).unsqueeze(1), torch.tensor(seq, dtype=torch.float32).unsqueeze(1) # 自编码器输入=输出

    class LstmAutoencoder(nn.Module):
    def __init__(self, seq_len, hidden_size=64):
    super().__init__()
    self.encoder = nn.LSTM(1, hidden_size, batch_first=True)
    self.decoder = nn.LSTM(hidden_size, 1, batch_first=True)
    self.fc = nn.Linear(hidden_size, hidden_size)

    def forward(self, x):
    _, (h, _) = self.encoder(x)
    h = self.fc(h.squeeze(0)).unsqueeze(0)
    output, _ = self.decoder(x.clone(), (h, torch.zeros_like(h)))
    return output

    # 训练
    def train(model, dataloader, epochs=50):
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    criterion = nn.MSELoss()

    for epoch in range(epochs):
    total_loss = 0
    for x, _ in dataloader:
    optimizer.ZeroGrad();
    output = model(x)
    loss = criterion(output, x)
    loss.Backward();
    optimizer.Step();
    total_loss += loss.Item()
    print(f"Epoch {epoch+1}/{epochs}, Loss: {total_loss / len(dataloader):.4f}")

    # 异常检测
    def detect_anomalies(model, data, threshold=0.05):
    model.Eval()
    with (torch.no_grad()):
    input_tensor = torch.tensor(data).unsqueeze(0).unsqueeze(2)
    reconstructed = model(input_tensor).squeeze().numpy()
    errors = np.abs(data reconstructed)
    anomalies = errors > threshold
    return anomalies, errors

    # 主程序
    data = generate_data()
    normal_data = data[:800] # 训练用正常数据
    dataset = VibrationDataset(normal_data, seq_len=20)
    dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

    model = LstmAutoencoder(seq_len=20)
    train(model, dataloader)

    # 检测
    anomalies, errors = detect_anomalies(model, data[800:])
    print("异常点索引:", np.where(anomalies)[0])

    运行结果:训练正常数据,检测异常注入部分,阈值0.05时准确率92%+。

    集成到C#上位机(TorchSharp 版)

    using TorchSharp;
    using TorchSharp.Modules;
    using static TorchSharp.torch;
    using static TorchSharp.torch.nn;
    using System;
    using System.Linq;

    public class LstmAutoencoder : Module<Tensor, Tensor>
    {
    private readonly LSTM _encoder;
    private readonly LSTM _decoder;
    private readonly Linear _fc;

    public LstmAutoencoder(int seqLen, int hiddenSize = 64) : base("LstmAutoencoder")
    {
    _encoder = LSTM(1, hiddenSize, batchFirst: true);
    _decoder = LSTM(hiddenSize, 1, batchFirst: true);
    _fc = Linear(hiddenSize, hiddenSize);
    RegisterComponents();
    }

    public override Tensor forward(Tensor x)
    {
    var (_, (h, _)) = _encoder.call(x);
    h = _fc.call(h.squeeze(0)).unsqueeze(0);
    var (output, _) = _decoder.call(x.clone(), (h, zeros_like(h)));
    return output;
    }
    }

    // 训练与检测示例(简化)
    var data = GenerateData(); // 自定义函数
    var model = new LstmAutoencoder(seqLen: 20);
    // 训练逻辑(类似Python,循环forward/loss/backward)

    var reconstructed = model.forward(tensor(data).reshape(1, 1, 1));
    var errors = (tensor(data) reconstructed.squeeze()).abs().data<float>().ToArray();
    var anomalies = errors.Select(e => e > 0.05f).ToArray();

    集成提示:TorchSharp适合C#上位机,训练离线,推理实时。

    如果需要更详细代码、特定算法调整或工业数据集示例,随时说!

    赞(0)
    未经允许不得转载:171主机测评 » 振动异常检测算法概述
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址