振动特征多标签预测: github.com/STARTORUS/t...
概述:设备健康的"智能医生"
在工业4.0时代,预测性维护(PHM - Prognostics and Health Management)正在取代传统的"坏了再修"和"定期维护"模式。想象一下,一台运转了5年的大型旋转设备------风力发电机、水泵、压缩机------它就像人体一样,会通过"振动"这种"生命体征"表达自己的健康状况。
振动PHM ML Backend 就是设备的智能健康管家,通过分析振动信号,自动识别设备的转速水平、故障类型和健康评分,实现从"事后维修"到"预测性维护"的跨越。
一、业务价值:Why - 为什么需要振动智能诊断?
1.1 工业痛点
场景1:风电场运维困境 💨
某海上风电场,100台风力发电机:
- 每台价值5000万元
- 主轴承故障导致停机,损失50万/天
- 传统维护:每年定期检修,成本高昂
- 问题:60%的轴承更换时还能继续使用(浪费),5%的故障未能及时发现(停产)
场景2:水泵站突发故障 💧
城市供水泵站关键设备:
- 凌晨3点突发轴承损坏
- 全城停水12小时
- 抢修费用是计划维护的5倍
- 如果能提前1周预警,损失可避免95%
场景3:压缩机健康监控 ⚙️
化工厂大型压缩机:
- 振动异常可能导致连锁故障
- 人工巡检:每天2次,无法24小时监控
- 依赖老师傅经验,标准不统一
- 年轻工人难以快速掌握诊断技能
1.2 PHM ML Backend的核心价值
通过振动信号智能分析,实现:
✅ 故障预警 :提前7-14天预测轴承/齿轮故障
✅ 成本降低40% :按需维护替代定期维护
✅ 停机时间减少60% :计划性停机替代突发故障
✅ 设备寿命延长20%:及时维护避免连锁损伤
经济效益测算:
markdown
某制造厂案例:
- 关键设备:50台
- 部署PHM系统成本:200万
- 年收益:
* 避免突发故障:300万
* 降低维护成本:150万
* 延长设备寿命:100万
合计:550万/年
- ROI:5个月回本
二、系统架构:What - 振动PHM是什么?
2.1 整体架构
加速度计] --> A2[数据采集卡
1kHz采样] A3[转速传感器
RPM] --> A2 A2 --> A4[时序数据库] end subgraph "Label Studio前端" B1[时序标注界面] --> B2[任务管理] end subgraph "ML Backend核心" C1[_wsgi.py服务] --> C2[VibrationPHMModel
业务编排] C2 --> C3[VibrationPredictor
多标签预测器] end subgraph "算法引擎层" D1[特征提取
extract_features] D2[转速段预测
predict_speed_segments] D3[故障诊断
predict_fault_type] D4[健康评分
predict_quality_score] end subgraph "信号处理库" E1[时域特征
RMS/峰值/峰度] E2[频域特征
FFT/Welch PSD] E3[sklearn
IsolationForest] end A4 --> C2 B2 -->|HTTP API| C1 C3 --> D1 C3 --> D2 C3 --> D3 C3 --> D4 D1 --> E1 D1 --> E2 D3 --> E3 style C3 fill:#4CAF50,color:#fff style D1 fill:#2196F3,color:#fff style D3 fill:#FF5722,color:#fff
2.2 核心组件详解
🎯 VibrationPHMModel - 业务协调层
python
class VibrationPHMModel(LabelStudioMLBase):
"""振动数据PHM预测性维护ML后端模型"""
def setup(self):
self.set("model_version", "vibration_phm_v1.0")
self.predictor = VibrationPredictor()
# 多标签配置
self.label_groups = {
'speed_level': ['低转速', '中转速', '高转速'],
'fault_type': ['正常', '不平衡', '轴承故障', '齿轮故障'],
'quality_score': 'number', # 0-100健康分数
'confidence_level': 'number' # 置信度
}
设计亮点:
- 多标签输出:一次预测返回转速/故障/健康度多个维度
- 在线学习 :
fit()方法支持标注数据反馈优化
🧠 VibrationPredictor - 智能诊断引擎
这是系统的"诊断大脑",实现4个核心预测功能:
python
class VibrationPredictor(BasePredictor):
def predict(self, task_data):
# 1. 提取特征(时域+频域)
features = self.extract_features(task_data)
# 2. 转速段预测
speed_predictions = self.predict_speed_segments(task_data)
# 3. 故障类型诊断
fault_predictions = self.predict_fault_type(task_data, features)
# 4. 健康质量评分
quality_prediction = self.predict_quality_score(features)
return speed_predictions + fault_predictions + [quality_prediction]
三、技术实现:How - 诊断算法深度剖析
3.1 特征工程:从振动信号到诊断特征
振动信号本质是时序数据 ,需要转换为机器可理解的特征向量。
3.1.1 时域特征
物理意义:描述振动幅值的统计特性
python
def extract_time_domain_features(self, vibration_signal):
"""
时域特征提取
"""
features = {}
# 1. RMS均方根值 - 振动能量
# 物理意义:表示振动强度的有效值
# 应用:判断振动是否超标
features['rms'] = np.sqrt(np.mean(vibration_signal**2))
# 2. 峰值 - 最大振幅
# 物理意义:最严重的冲击程度
# 应用:检测突发冲击(如轴承破损)
features['peak'] = np.max(np.abs(vibration_signal))
# 3. 峰值因子 = 峰值/RMS
# 物理意义:冲击性指标
# 正常值:3-4, 异常值:>5(有冲击)
features['crest_factor'] = features['peak'] / max(features['rms'], 1e-6)
# 4. 峰度(Kurtosis) - 分布形态
# 物理意义:描述振动分布的"尖锐度"
# 正常值:3(高斯分布), 异常值:>4(有冲击)
features['kurtosis'] = stats.kurtosis(vibration_signal)
# 5. 偏度(Skewness) - 分布对称性
# 物理意义:振动分布的偏斜程度
# 正常值:接近0, 异常值:明显偏离0
features['skewness'] = stats.skew(vibration_signal)
return features
特征与故障的关系:
| 特征 | 正常值 | 轴承故障 | 不平衡 | 齿轮故障 |
|---|---|---|---|---|
| RMS | <2.0 | 2-4(增大) | 2-3(中等) | 2-5(变化大) |
| 峰值因子 | 3-4 | 5-8(冲击) | 3-4(正常) | 4-6(周期冲击) |
| 峰度 | 3 | 5-10(尖峰) | 3(正常) | 4-6(周期性) |
3.1.2 频域特征
核心思想:不同故障在频谱上有特定"指纹"
python
def extract_frequency_domain_features(self, vibration_signal, fs=1000):
"""
频域特征提取 - 使用Welch方法计算功率谱密度
"""
# 1. 计算功率谱密度(PSD)
# Welch方法:分段FFT取平均,降低噪声
freqs, psd = signal.welch(vibration_signal, fs=fs, nperseg=1024)
# 2. 主频 - 能量最大的频率
# 物理意义:旋转频率或其倍频
# 应用:判断故障特征频率
features['dominant_freq'] = freqs[np.argmax(psd)]
# 3. 频谱质心 - 频率的"重心"
# 物理意义:频率分布中心
# 应用:高频故障(轴承)会使质心上移
features['spectral_centroid'] = np.sum(freqs * psd) / np.sum(psd)
# 4. 频谱滚降 - 85%能量对应的频率
# 物理意义:高频能量占比
# 应用:检测高频异常
cumsum_psd = np.cumsum(psd)
rolloff_idx = np.where(cumsum_psd >= 0.85 * cumsum_psd[-1])[0][0]
features['spectral_rolloff'] = freqs[rolloff_idx]
# 5. 频谱带宽 - 频率分布的离散程度
# 物理意义:频谱复杂度
# 应用:复杂故障频谱带宽大
features['spectral_bandwidth'] = np.sqrt(
np.sum(((freqs - features['spectral_centroid'])**2) * psd) / np.sum(psd)
)
return features
频域故障诊断知识:
makefile
正常设备频谱:
PSD
▲
│ ●(转速频率)
│ │
│────┴──────────────► Freq
0 10Hz ... 1kHz
轴承故障频谱:
PSD
▲ ●(转速)
│ │ ● ● ●(高频谐波,轴承特征频率)
│ │ ││ │
│────┴─┴┴─┴────────► Freq
0 10Hz 500Hz 1kHz
不平衡故障频谱:
PSD
▲
│ ●●●(转速频率及其2x,3x倍频)
│ │││
│────┴┴┴───────────► Freq
0 10Hz 20Hz 30Hz
3.2 转速段智能分割
业务场景:设备在不同转速下运行,需要自动分段标注
算法原理
python
def predict_speed_segments(self, data):
"""
滑动窗口转速分段算法
思路:
1. 用滑动窗口统计每段平均转速
2. 根据转速阈值分类(低/中/高)
3. 检测转速切换点,生成时间段标注
"""
rpm_data = data['rotation_speed']
time = data['time']
predictions = []
window_size = 1000 # 1秒窗口
step_size = 500 # 0.5秒步长(50%重叠)
current_speed_label = None
segment_start = None
# 滑动窗口处理
for i in range(0, len(rpm_data) - window_size, step_size):
window_rpm = rpm_data[i:i+window_size]
avg_rpm = np.mean(window_rpm)
rpm_stability = 1.0 - (np.std(window_rpm) / max(avg_rpm, 1))
# 转速分类
if avg_rpm < 800:
speed_label = '低转速'
elif avg_rpm < 1500:
speed_label = '中转速'
else:
speed_label = '高转速'
# 检测转速切换
if speed_label != current_speed_label:
if current_speed_label is not None:
# 保存上一段
predictions.append(TimeseriesSpan(
start=segment_start,
end=time[i],
label_choice=current_speed_label,
label_group="speed_level"
))
# 开始新段
current_speed_label = speed_label
segment_start = time[i]
# 保存最后一段
if current_speed_label is not None:
predictions.append(TimeseriesSpan(
start=segment_start,
end=time[-1],
label_choice=current_speed_label,
label_group="speed_level"
))
return predictions
可视化示例:
sql
转速曲线:
RPM
2000 ─────────┐ ┌──── 高转速段
│ │
1500 ────────┼─────────┼──── 阈值
│ │
1000 ────┐ │ │
│ │ │ 中转速段
800 ────┼───┴─────────┘──── 阈值
│
500 ────┴───────────────── 低转速段
────┬───┬───┬───┬─────► Time
t1 t2 t3 t4
预测结果:
[
TimeseriesSpan(start=0, end=t1, label='低转速'),
TimeseriesSpan(start=t1, end=t2, label='中转速'),
TimeseriesSpan(start=t2, end=t3, label='高转速'),
TimeseriesSpan(start=t3, end=t4, label='中转速')
]
3.3 故障类型诊断
诊断策略:基于特征的规则引擎
python
def predict_fault_type(self, data, features):
"""
多故障类型诊断
策略:基于特征的评分机制
"""
fault_scores = {}
# 1. 不平衡诊断
# 特征:振动幅值大,主频=转速频率
unbalance_score = 0
for axis in ['vibration_x', 'vibration_y', 'vibration_z']:
rms_key = f'{axis}_rms'
if rms_key in features and features[rms_key] > 1.5:
unbalance_score += min(1.0, features[rms_key] / 2.0)
fault_scores['不平衡'] = unbalance_score / 3 # 归一化
# 2. 轴承故障诊断
# 特征:高频成分增加,峰值因子大,峰度大
bearing_score = 0
if 'dominant_freq' in features and features['dominant_freq'] > 500:
bearing_score += 0.4 # 高频权重
if 'crest_factor' in features and features['crest_factor'] > 5:
bearing_score += 0.3 # 冲击权重
if 'kurtosis' in features and features['kurtosis'] > 5:
bearing_score += 0.3 # 峰度权重
fault_scores['轴承故障'] = bearing_score
# 3. 齿轮故障诊断
# 特征:啮合频率及其边频带
gear_score = 0
if 'spectral_centroid' in features:
# 齿轮故障通常在中频范围
if 100 < features['spectral_centroid'] < 500:
gear_score = min(1.0, features['spectral_centroid'] / 500)
fault_scores['齿轮故障'] = gear_score
# 4. 综合判断
max_fault = max(fault_scores.items(), key=lambda x: x[1])
if max_fault[1] > 0.3: # 故障阈值
label = max_fault[0]
else:
label = '正常'
return [TimeseriesSpan(
start=data['time'][0],
end=data['time'][-1],
label_choice=label,
label_group="fault_type"
)]
故障诊断决策树:
3.4 健康评分系统
评分模型:加权综合评估
python
def predict_quality_score(self, features):
"""
设备健康度评分(0-100分)
评分模型:
基础分100分,根据异常特征扣分
"""
base_score = 100.0
# 1. 振动幅值扣分(权重40%)
rms_penalty = 0
for axis in ['x', 'y', 'z']:
rms = features.get(f'vibration_{axis}_rms', 0)
if rms > 2.0: # 阈值
# RMS每超标1个单位,扣15分
rms_penalty += min(15, (rms - 2.0) * 7.5)
# 2. 频域特征扣分(权重30%)
freq_penalty = 0
dominant_freq = features.get('dominant_freq', 0)
if dominant_freq > 800: # 高频异常
freq_penalty = min(15, (dominant_freq - 800) / 100)
# 3. 峰值因子扣分(权重20%)
peak_penalty = 0
for axis in ['x', 'y', 'z']:
crest = features.get(f'vibration_{axis}_crest_factor', 3)
if crest > 5: # 有冲击
peak_penalty += min(10, (crest - 5) * 2)
# 4. 转速稳定性扣分(权重10%)
speed_penalty = 0
rpm_std = features.get('rpm_std', 0)
rpm_mean = features.get('rpm_mean', 1000)
rpm_cv = rpm_std / max(rpm_mean, 1) # 变异系数
if rpm_cv > 0.05: # 转速波动>5%
speed_penalty = min(10, rpm_cv * 100)
# 5. 计算总分
quality_score = max(0, base_score - rms_penalty - freq_penalty
- peak_penalty - speed_penalty)
return Number(
value=quality_score,
label_group='quality_score',
label_target='ts'
)
健康等级划分:
| 分数区间 | 健康等级 | 维护建议 | 颜色标识 |
|---|---|---|---|
| 90-100 | 优秀 | 继续观察 | 🟢 绿色 |
| 70-89 | 良好 | 定期监测 | 🟡 黄色 |
| 50-69 | 一般 | 加强监测 | 🟠 橙色 |
| 30-49 | 较差 | 计划维护 | 🔴 红色 |
| 0-29 | 危险 | 立即停机检修 | 🚨 紫色 |
四、实战应用案例
案例1:风电场轴承寿命预测
背景:某海上风电场,单台机组价值5000万
部署方案:
-
数据采集
python# 在主轴承和齿轮箱安装加速度传感器 sensors = { 'main_bearing': '三轴加速度计(X/Y/Z)', 'gearbox': '单轴加速度计', 'generator': '单轴加速度计' } # 采样配置 sample_rate = 1000 # 1kHz upload_interval = 3600 # 每小时上传 -
诊断模型
python# 预测示例 prediction = { 'quality_score': 65, # 健康度65分(一般) 'fault_type': '轴承故障', 'confidence': 0.82, 'time_to_failure': '预计7-14天' # 剩余寿命预测 } -
维护决策
markdown决策流程: 1. 收到预警(健康度<70) → 发送邮件通知 2. 派遣工程师现场复核 3. 安排停机检修(选择低风速时段) 4. 更换轴承 → 避免突发故障
实施效果:
- ✅ 年避免3次突发故障 → 节省900万元
- ✅ 计划性维护减少停机时间60%
- ✅ 轴承平均寿命延长18个月
案例2:水泵站故障诊断
背景:城市供水主泵站,5台大型离心泵
诊断实例:
python
# 3号泵振动分析
pump3_analysis = {
'timestamp': '2024-01-15 14:30',
'features': {
'rms': 3.2, # 超标!正常值<2.0
'crest_factor': 6.5, # 超标!正常值3-4
'dominant_freq': 58, # 接近转速频率60Hz
'kurtosis': 4.8 # 偏高
},
'diagnosis': {
'fault_type': '不平衡',
'severity': '中等',
'recommendation': '建议1周内进行动平衡校正'
},
'quality_score': 58 # 健康度58分
}
根因分析:
markdown
故障树分析:
不平衡
│
┌────────────┼────────────┐
│ │ │
叶轮磨损 转子偏心 轴承松动
│ │ │
(可能性60%) (可能性30%) (可能性10%)
建议:
1. 优先检查叶轮(拆检成本低)
2. 如叶轮正常,检查转子
3. 必要时进行动平衡校正
案例3:智能维护大屏
需求:设备管理部门希望实时监控所有设备健康状况
可视化方案:
ini
┌──────────────────────────────────────────────┐
│ 设备健康监控大屏 │
├──────────────────────────────────────────────┤
│ 设备总数: 50 健康: 35 预警: 12 故障: 3│
├──────────────────────────────────────────────┤
│ 泵1 [████████░░] 82分 🟡 良好 │
│ 转速:1450rpm 故障:无 建议:定期监测 │
│ │
│ 泵2 [████░░░░░░] 45分 🔴 较差 │
│ 转速:1480rpm 故障:轴承故障 建议:计划维护 │
│ │
│ 泵3 [██░░░░░░░░] 25分 🚨 危险 │
│ 转速:1520rpm 故障:严重不平衡 建议:立即停机 │
│ │
│ 风机1 [██████████] 95分 🟢 优秀 │
│ 转速:1200rpm 故障:无 建议:继续观察 │
└──────────────────────────────────────────────┘
实时趋势图:
分数
100 ─────●────●────●──── 风机1
/
80 ───●─────●────●───── 泵1
/
60 ─●──────●──────●──── 泵2
/ \
40 ──────●──●──────── 泵3(下降趋势!)
← 时间
五、技术优化建议
5.1 数据增强
目的:增加训练样本多样性,提升模型泛化能力
python
from audiomentations import Compose, AddGaussianNoise, TimeStretch
augmenter = Compose([
AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.01, p=0.5),
TimeStretch(min_rate=0.9, max_rate=1.1, p=0.5),
])
augmented_vibration = augmenter(samples=vibration_data, sample_rate=1000)
5.2 深度学习升级
方向:用CNN/LSTM自动学习特征
python
class VibrationCNN(nn.Module):
def __init__(self):
super().__init__()
# 1D卷积提取时序特征
self.conv1 = nn.Conv1d(3, 64, kernel_size=7, padding=3)
self.conv2 = nn.Conv1d(64, 128, kernel_size=5, padding=2)
# 全连接分类
self.fc = nn.Linear(128, 4) # 4种故障类型
def forward(self, x):
# 输入:[batch, 3轴, 时间步]
x = F.relu(self.conv1(x))
x = F.max_pool1d(x, 2)
x = F.relu(self.conv2(x))
x = F.adaptive_avg_pool1d(x, 1)
x = x.view(x.size(0), -1)
return self.fc(x)
六、总结
核心价值
振动PHM ML Backend通过智能振动分析,实现了:
- 全方位诊断:转速/故障/健康度三维评估
- 预测性维护:提前7-14天故障预警
- 降本增效:维护成本降低40%,停机时间减少60%
- 知识固化:将专家经验转化为算法
适用场景
| 行业 | 设备类型 | 核心价值 |
|---|---|---|
| 风电 | 风力发电机 | 避免突发故障,延长寿命 |
| 水利 | 水泵/水轮机 | 保障供水安全 |
| 石化 | 压缩机/泵 | 预防连锁故障 |
| 制造 | 机床/电机 | 提升设备利用率 |
振动PHM ML Backend是工业4.0时代的"设备健康管家",通过AI赋能,让设备从"坏了再修"走向"预测性维护",为企业创造巨大经济价值。