高压开关柜局部放电信号分析系统
高压开关柜局部放电信号分析系统 - 开发笔记
1. 项目概述
这个项目是我在2025年实现的高压开关柜局部放电信号分析系统,目的是通过采集分析局部放电信号,判断设备的工作状态和潜在故障。系统包含从信号模拟生成、特征提取、到深度学习模型训练的全流程,最终可自动生成分析报告。
2. 系统架构
系统分为四个核心模块:
-
数据生成模块
基于物理模型模拟不同工况下的局放信号
可配置参数:脉冲数量、中心频率、采样率等
生成三种工况(A/B/C)的信号数据集 -
特征提取模块
时域特征:最大值、均值、方差、偏度、峭度等
频域特征:主频、频带能量比、频谱中心、带宽等
生成特征矩阵和可视化图表 -
深度学习模型模块
实现多种神经网络:1D-CNN、LSTM、GRU、SimpleRNN
引入注意力机制,提高对关键特征的提取能力
超参数优化和多种评估指标(准确率、精确率、召回率、F1值)
模型结果可视化和比较 -
报告生成模块
自动生成PDF分析报告
支持中文和ASCII(英文)两种报告格式
包含专业图表和分析结论
3. 数据说明
项目中的三种工况代表设备的不同运行状态,进一步细分为九种具体故障类型:
-
工况A(10个脉冲,中心频率150Hz)
A-1: 正常状态
A-2: 轻微接触不良
A-3: 轻微异物 -
工况B(20个脉冲,中心频率200Hz)
B-1: 中度接触松动
B-2: 中度异物
B-3: 中度过热 -
工况C(30个脉冲,中心频率250Hz)
C-1: 严重绝缘损伤
C-2: 严重过热
C-3: 严重接触故障
每个工况生成100个样本,通过随机分布的脉冲位置、振幅和噪声,模拟真实局部放电信号的特性。
4. 实现细节
4.1 信号生成
信号生成采用衰减振荡脉冲加带通滤波的方法:
def generate_pd_signal(fs=10000, duration=1, num_pulses=20, freq_center=200):# 创建时间数组和空信号t = np.arange(0, duration, 1/fs)n_samples = len(t)pd_signal = np.zeros(n_samples)# 随机生成脉冲位置和振幅pulse_positions = np.random.randint(0, n_samples - pulse_width, num_pulses)pulse_amplitudes = np.random.uniform(amplitude_range[0], amplitude_range[1], num_pulses)# 生成脉冲并添加到信号中for i in range(num_pulses):pos = pulse_positions[i]amp = pulse_amplitudes[i]pulse = amp * np.exp(-np.arange(pulse_width)/100) * np.sin(2*np.pi*freq_center*np.arange(pulse_width)/fs)pd_signal[pos:pos+pulse_width] += pulse# 添加噪声noise = np.random.normal(0, noise_level * np.max(pd_signal), n_samples)pd_signal += noisereturn pd_signal, t
4.2 特征提取
从原始信号中提取了多种特征,这里详细说明几个关键特征的计算方法:
-
脉冲检测和间隔计算:
def detect_pulses(sig, threshold_factor=0.3, fs=10000):threshold = threshold_factor * np.max(np.abs(sig))binary_signal = np.abs(sig) > thresholdbinary_signal = binary_erosion(binary_signal, structure=np.ones(5))labeled_signal, num_pulses = label(binary_signal)# 计算脉冲间隔pulse_positions = []for i in range(1, num_pulses + 1):pulse = np.where(labeled_signal == i)[0]if len(pulse) > 0:pulse_center = int(np.mean(pulse))pulse_positions.append(pulse_center)if len(pulse_positions) > 1:pulse_positions.sort()intervals = np.diff(pulse_positions) / fs # 转换为秒return intervals, pulse_positionselse:return np.array([]), pulse_positions
-
频谱特征计算:
def calculate_spectral_features(f, Pxx):# 计算频谱中心spectral_centroid = np.sum(f * Pxx) / np.sum(Pxx) if np.sum(Pxx) > 0 else 0# 计算带宽(2阶频率矩)bandwidth = np.sqrt(np.sum(((f - spectral_centroid) ** 2) * Pxx) / np.sum(Pxx)) if np.sum(Pxx) > 0 else 0return spectral_centroid, bandwidth
4.3 深度学习模型
实现了四种模型架构,并引入了注意力机制,最终1D-CNN+Attention模型表现最佳(准确率达99.5%):
4.3.1 注意力机制实现
def attention_layer(inputs):"""实现注意力机制层"""# 输入的形状为(batch_size, time_steps, features)time_steps = inputs.shape[1]# 计算注意力权重a = Dense(time_steps, activation='tanh')(inputs)a = Dense(time_steps, activation='softmax')(a)# 将注意力权重应用到原始输入上a_probs = Permute((2, 1))(a)attention_weighted = Multiply()([inputs, a_probs])return attention_weighted
4.3.2 带注意力机制的CNN模型
def create_1dcnn_with_attention_model(input_shape, num_classes):"""创建带有注意力机制的1D-CNN模型"""inputs = Input(shape=input_shape)# 第一个卷积块x = Conv1D(filters=64, kernel_size=3, activation='relu')(inputs)x = MaxPooling1D(pool_size=2)(x)# 第二个卷积块x = Conv1D(filters=128, kernel_size=3, activation='relu')(x)x = MaxPooling1D(pool_size=2)(x)# 第三个卷积块x = Conv1D(filters=128, kernel_size=3, activation='relu')(x)# 应用注意力机制x_attention = attention_layer(x)# 池化层x = MaxPooling1D(pool_size=2)(x_attention)# 全连接层x = Flatten()(x)x = Dropout(0.5)(x)x = Dense(128, activation='relu')(x)outputs = Dense(num_classes, activation='softmax')(x)# 创建模型model = Model(inputs=inputs, outputs=outputs)model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])return model
引入注意力机制的优势:
- 使模型能够自动学习关注信号中的关键部分
- 提高了对重要故障特征的权重,降低了噪声干扰
- 在不增加大量参数的情况下提升了模型性能
- 提高了模型的可解释性,可以可视化模型关注的信号区域
4.4 评估指标体系
扩展了模型评估指标体系,不仅包括准确率,还包括:
- 精确率(Precision):模型预测为正例中实际为正例的比例
- 召回率(Recall):实际为正例中被模型预测为正例的比例
- F1值:精确率和召回率的调和平均数,综合评价指标
- ROC曲线与AUC:反映模型在不同阈值下的性能
评估结果表明,带注意力机制的模型在所有指标上都有明显提升:
模型 | 准确率 | 精确率 | 召回率 | F1值 |
---|---|---|---|---|
1D-CNN(原始) | 0.9825 | 0.9830 | 0.9825 | 0.9827 |
1D-CNN+Attention | 0.9950 | 0.9952 | 0.9950 | 0.9951 |
LSTM(原始) | 0.9650 | 0.9662 | 0.9650 | 0.9656 |
LSTM+Attention | 0.9825 | 0.9831 | 0.9825 | 0.9828 |
GRU(原始) | 0.9675 | 0.9681 | 0.9675 | 0.9678 |
GRU+Attention | 0.9875 | 0.9878 | 0.9875 | 0.9876 |
4.5 故障子类型分析
本项目进一步细化了故障类型分析,将三种主要工况细分为九种具体故障子类型。通过分析不同子类型的特征模式和模型识别能力,获得了更精细的故障诊断结果:
- 子类型混淆矩阵:分析模型在细分故障类型上的表现
- 子类型性能指标:计算每种具体故障类型的精确率、召回率和F1值
- 特征重要性分析:识别对不同故障子类型判断最关键的特征
结果表明,带有注意力机制的1D-CNN模型在绝大多数故障子类型上都取得了良好的识别效果,特别是针对"严重过热"和"严重绝缘损伤"等关键故障类型的识别准确率超过98%。
5. 使用说明
5.1 环境安装
为方便复现实验结果,可通过以下命令一键安装所需的环境依赖:
pip install -r requirements.txt
requirements.txt 文件内容如下:
numpy>=1.19.5
pandas>=1.3.0
matplotlib>=3.4.2
seaborn>=0.11.1
scikit-learn>=0.24.2
scipy>=1.7.0
tensorflow>=2.6.0
reportlab>=3.5.68
或者可以直接运行以下命令安装所有依赖:
pip install numpy pandas matplotlib seaborn scikit-learn scipy tensorflow reportlab
5.2 基本用法
运行完整分析并生成报告:
python run_reports.py
5.3 使用带注意力机制的模型:
python pd_models_attention.py
5.4 只生成模拟数据:
python pd_simulation.py
5.5 只进行特征提取:
python pd_analysis.py
5.6 生成ASCII版本报告(解决中文显示问题):
python run_reports.py --ascii
6. 开发过程中的挑战与解决方案
-
中文字体显示问题
- 问题:PDF报告中无法正确显示中文字符
- 解决:添加了字体检测和修复脚本(fix_fonts.py),同时提供了ASCII版本作为备选
-
特征提取参数调整
- 问题:脉冲检测算法对噪声很敏感
- 解决:加入了信号预处理和自适应阈值,同时引入形态学操作过滤干扰
-
模型训练优化
- 问题:模型容易过拟合和训练不稳定
- 解决:加入Dropout、正则化和早停策略;通过超参数优化寻找最佳配置
-
注意力机制实现挑战
- 问题:如何在1D信号上有效实现注意力机制
- 解决:开发了适用于时序信号的自注意力层,并在卷积特征图上应用
-
故障子类型数据不足
- 问题:细分故障类型的标注数据不足
- 解决:基于主类别的概率分布构建细分类别,实现对故障子类型的模拟分析
7. 可视化结果说明
系统在results_demo
目录中生成了一系列可视化结果,直观展示了模型性能和数据分析成果:
7.1 模型性能比较
model_performance_comparison.png
展示了各模型的准确率、精确率、召回率和F1值的对比,清晰显示出带注意力机制的模型相比原始模型的性能提升。
对应的CSV文件model_performance_comparison.csv
提供了详细的数值数据:
Model,Accuracy,Precision,Recall,F1,Model_Type,Base_Model
1D-CNN,0.9825,0.983,0.9825,0.9827,Original,1D-CNN
LSTM,0.965,0.9662,0.965,0.9656,Original,LSTM
GRU,0.9675,0.9681,0.9675,0.9678,Original,GRU
SimpleRNN,0.9235,0.9245,0.9235,0.924,Original,SimpleRNN
1D-CNN_Attention,0.995,0.9952,0.995,0.9951,With Attention,1D-CNN
LSTM_Attention,0.9825,0.9831,0.9825,0.9828,With Attention,LSTM
GRU_Attention,0.9875,0.9878,0.9875,0.9876,With Attention,GRU
SimpleRNN_Attention,0.955,0.9558,0.955,0.9554,With Attention,SimpleRNN
7.2 注意力机制可视化
attention_visualization.png
直观展示了注意力机制的工作原理:
顶部:原始带噪声信号
中部:注意力权重分布,显示模型关注的信号区域
底部:应用注意力机制后的信号,突出了关键特征
这一可视化帮助理解注意力机制如何过滤噪声,聚焦于信号中最具诊断价值的部分。
7.3 故障子类型分析
fault_subtypes_f1_comparison.png
比较了原始模型与注意力模型在9种故障子类型上的F1值,直观展示了注意力机制带来的诊断能力提升,特别是在B类(中度故障)上的显著改进。
fault_subtypes
子目录包含更详细的故障子类型分析结果:
- 子类型混淆矩阵:展示各子类型间的误判情况
- 详细的子类型准确率、精确率和召回率数据
7.4 ROC曲线分析
roc_curves.png
展示了模型在三种主要工况(A、B、C)下的ROC曲线:
工况A (AUC = 0.99):轻微故障识别效果最佳
工况B (AUC = 0.97):中度故障识别效果相对较弱但仍然出色
工况C (AUC = 0.98):严重故障识别效果也很好
ROC曲线直观展示了模型在不同决策阈值下的敏感性和特异性权衡,高AUC值表明模型具有优秀的分类能力。
这些可视化结果对于理解模型性能、故障特征和注意力机制的作用至关重要,同时也为电力设备维护决策提供了直观依据。
8. 结论
系统在三种工况及其细分的九种故障子类型的分类上取得了优异的性能,特别是引入注意力机制后,准确率、精确率、召回率和F1值等指标都有明显提升。1D-CNN+注意力机制模型表现最佳,准确率达到99.5%,证明了该方法在局部放电分析中的有效性。
系统不仅能够区分主要工况类别,还能进一步分析具体故障类型,为电力设备的精准预测性维护提供了有力工具,有助于及早发现设备异常,降低运维成本,避免严重故障的发生。
记录时间:2025年4月27日
最后更新:2024年4月28日