ECG分类(一)

前言

看了的博主https://me.csdn.net/weixin_42559479文章跟着动手做的复现,论文题目是An Improved Convolutional Neural Network Based Approach for Automated Heartbeat Classification。(我是小白,大佬请绕行!)

数据预处理

1.采用文章里提到的小波去噪的方法
滤波将小于5hz和大于90hz的小波系数替换为0,只保留第3和第6细节子带之间的系数进行重构。

# 小波去噪
def Wtfilt_1d(sig):
    # 将信号进行小波分解,选用Daubechies8小波
    coeffs = pywt.wavedec(sig, 'db6', level = 9)  # dec分解滤波值,level分解阶次(要变换多少层)
    coeffs[-1] = np.zeros(len(coeffs[-1]))
    coeffs[-2] = np.zeros(len(coeffs[-2]))
    coeffs[0] = np.zeros(len(coeffs[0]))
    sig_filt = pywt.waverec(coeffs, 'db6')      #  rec重构滤波值
    return sig_filt
# 绘制图片(以100为例)
record = wfdb.rdsamp("MIT-BIH/100", sampto = 100)[0][:,0]
plt.plot(record)
plt.title("Raw sigal")
plt.show()
record1 = Wtfilt_1d(record)
plt.plot(record1)
plt.title("De-noised signal using wavelet techniques")
plt.show()

在这里插入图片描述

2.心拍截取(R峰定位等基准点检测不是本次研究的重点,直接采用给定的R峰索引)

  • 取R峰前0.4s(=0.4 * 360=144)+R峰后0.5s(=0.5s * 360=180)共324个点作为一个心拍
# 心拍截取
def Heartbeat(file):
    N_Seg = []
    SVEB_Seg = []
    VEB_Seg = []
    F_Seg = []
    Q_Seg = []
    
    #去掉指定的四个导联的头文件
    de_file = [path[:-1] + "\\102.hea", path[:-1] + "\\104.hea", path[:-1] + "\\107.hea", path[:-1] + "\\217.hea"]
    # set的集合运算
    # b有a无 list(set(b).difference(set(a)))
    file = list(set(file).difference(set(de_file))) # 去掉指定四个导联后的集合
  
    for i in range(len(file)):
        annotation = wfdb.rdann(path + file[i][-7:-4], "atr")
        record_name = annotation.record_name                     # 读取记录名称
        raw_record = wfdb.rdsamp(path + record_name)[0][:,0]        # 只读取一个导联 
        record = Wtfilt_1d(raw_record)
        label = annotation.symbol       # 心拍标签列表
        label_index = annotation.sample # 标签索引列表
        for j in range(len(label_index)):
            if (label_index[j] >= 144) and ((label_index[j] + 180) <= 650000):
                if label[j] == "N" or label[j] == "." or label[j] == "L" or label[j] == "R" or label[j] == "e" or label[j] == "j":
                   seg = record[label_index[j] - 144: label_index[j] + 180]
                   segment = resample(seg, 251, axis = 0) # 重新采样到251 
                   N_Seg.append(segment)
                   
                if label[j] == "A" or label[j] == "a" or label[j] == "J" or label[j] == "S":
                   seg = record[label_index[j] - 144: label_index[j] + 180]
                   segment = resample(seg, 251, axis = 0) 
                   SVEB_Seg.append(segment)
                   
                if label[j] == "V" or label[j] == "E" :
                   seg = record[label_index[j] - 144: label_index[j] + 180]
                   segment = resample(seg, 251, axis = 0) 
                   VEB_Seg.append(segment)
                   
                if label[j] == "F":
                   seg = record[label_index[j] - 144: label_index[j] + 180]
                   segment = resample(seg, 251, axis = 0) 
                   F_Seg.append(segment)
                
                if label[j] == "/" or label[j] == "f" or label[j] == "Q":
                   seg = record[label_index[j] - 144: label_index[j] + 180]
                   segment = resample(seg, 251, axis = 0) 
                   Q_Seg.append(segment)
                   
    N_Segment = np.array(N_Seg)
    SVEB_Segment = np.array(SVEB_Seg)
    VEB_Segment = np.array(VEB_Seg)
    F_Segment = np.array(F_Seg)
    Q_Segment = np.array(Q_Seg)
    print(N_Segment.shape, SVEB_Segment.shape, VEB_Segment.shape, F_Segment.shape, Q_Segment.shape)
        
    # np.zeros返回来一个给定形状和类型的用0填充的数组;
    # np.ones根据所给的形状和类型返回一个元素全部为1的数组, 默认numpy.float64类型
    label_N = np.zeros(N_Segment.shape[0])
    label_SVEB = np.ones(SVEB_Segment.shape[0])
    label_VEB = np.ones(VEB_Segment.shape[0]) * 2
    label_F = np.ones(F_Segment.shape[0]) * 3
    label_Q = np.ones(Q_Segment.shape[0]) * 4
        
    # np.concatenate对多个数组进行拼接:axis = 0数组的第一维度,axis = 1数组的第二维度
    # 要求:一是相同维度的数组,二是除了axis外,数组的其余维度对应相等
    label = np.concatenate((label_N, label_SVEB, label_VEB, label_F), axis = 0)
    data = np.concatenate((N_Segment, SVEB_Segment, VEB_Segment, F_Segment), axis = 0)
                       
    return data, label
  • 7
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是使用wfdb和biosppy库读取MIT-BIH心电信号数据集,提取幅值数据和标签数据,并使用opencv库生成归一化的单色位图关联标签的Python代码。请注意,该代码仅适用于二类分类任务,即正常心跳和异常心跳。 ```python import wfdb import biosppy import cv2 import numpy as np # 读取MIT-BIH心电信号数据集 record = wfdb.rdrecord('mit-bih-arrhythmia-database-1.0.0/100', sampto=5000) annotation = wfdb.rdann('mit-bih-arrhythmia-database-1.0.0/100', 'atr', sampto=5000) # 提取幅值数据和标签数据 signals = record.p_signal[:, 0] labels = annotation.symbol # 分析信号并剪切心拍并标记对应标签 out = biosppy.signals.ecg.ecg(signal=signals, show=False) rpeaks = out['rpeaks'] beat_samples = biosppy.signals.ecg.christov_segmenter(signal=signals, rpeaks=rpeaks)[0] beat_labels = [labels[np.where(annotation.sample == rpeak)[0][0]] for rpeak in rpeaks] # 归一化并生成256*256单色位图关联标签 for i, beat_sample in enumerate(beat_samples): beat = signals[beat_sample[0]:beat_sample[-1]] beat = cv2.resize(beat, (256, 256)) beat = np.uint8((beat - np.min(beat)) / (np.max(beat) - np.min(beat)) * 255) label = beat_labels[i] cv2.imwrite(f'{label}_{i}.png', beat) ``` 该代码首先使用wfdb库读取MIT-BIH心电信号数据集中的一个样本,并使用biosppy库分析信号并剪切心拍并标记对应标签。然后,使用opencv库将每个心拍归一化为256*256单色位图,并将其与其对应的标签保存为文件。请注意,此代码仅处理前5000个样本,您可以更改“sampto”参数以处理整个数据集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值