当前位置:   article > 正文

基于深度学习的心律异常分类算法_心率不齐检测系统基于硬件环境的开发代码

心率不齐检测系统基于硬件环境的开发代码

第一章 研究背景

根据世界卫生组织(WHO)资料显示,由心血管病引起的死亡在全球范围内占1/3,而根据资料,我国现有心血管病患者人数达3.3亿,且患病率不断上升。在城市和乡村,心血管病死亡率分别超过40%和46.66%。心律失常是常见的心血管疾病,分为房性早搏(pulmonary premature)、心室颤动(ventricular fibrillation)和房室传导阻滞(ventricular migraine)等。部分心律失常甚至会危及人的生命安全,而其他的不会危及人生命安全的心律失常类型疾病也需密切观察并治疗。

因此,准确地诊断和预防心律失常,是降低心血管疾病发病率的关键,也是临床上亟待解决的问题。

伴随着科技的持续发展,在生物医学信号的检测与分析、医学图像处理等方面,计算机被持续地用于医学辅助诊断,这不但可以极大地降低医生的工作负担,提升诊断效率,节省时间和人力成本,还可以在一定程度上提升医疗质量。本项目的研究成果将有助于临床医师对病人的 ECG进行实时、准确地诊断,从而提高诊断效率,减少由于人为错误诊断而造成的死亡率。

算法流程

实现对于ECG信号的自动分类,其算法的流程图如下图1.3所示,对心电信号的预处理主要包括去除噪声和心拍分割,之后对分割后得到的单个心节进行特征提取,最后利用softmax完成信号分类。
在这里插入图片描述

本文研究内容

第二章 心电信号分类理论基础

心电信号产生机理

正常的心律,室性心律失常,室上型心律失常及与之相关的一系列心律失常(如双室早,二联律,三联律,室上心动过速,窦性停搏等),是临床上最常见的心律失常。

本论文的重点是:正常的心脏拍动(N),异常的房性早搏(A),室性早搏(V),左束支传导阻滞(L),右束支传导阻滞(R)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

MIT-BIH 心律失常数据库

国麻省理工大学MIT-BIH数据库是目前世界上最受欢迎的 ECG标准数据库。MIT-BIH心率不齐资料库中,有超过4000个从贝斯伊斯雷尔医院收集的长期 Holter记录。MIT-BIH心律失常资料库共有48条记录,每条时间在30分钟左右,取样频率为360赫兹,心拍个数超过100,000个。MIT-BIH心律失常数据库是一种可供科研人员免费获取的公共数据库,它为心电图的研究提供了大量的数据,具有非常广泛的应用前景。
在这里插入图片描述
在这里插入图片描述
MIT-BIH资料库包含了 ECG的所有种类,见表2-3,其中包括 ECG的注释编码,英文名称,注解,心律类型等。

第三章 心电信号预处理

心电信号噪声来源与特点

从 ECG的生成机制来看, ECG是一种很弱的生物电信号。从仪器上获得的心电信号,要通过安装在身体表面的检测电极,然而在收集心电信号的过程中,难免会有各种各样的噪音,而在这些噪音中,最常见的就是基线漂移,工频干扰,以及肌电干扰,下面将会对这些噪音进行详细的介绍。

基线漂移

基线漂移主要由呼吸、肢体活动或运动心电图测试等微弱体动引起。呼吸运动会导致心电图基线发生缓慢波动,频率范围通常在0.05Hz到2Hz之间。同时,人体肢体的活动或运动会导致心电电极与皮肤之间的接触电阻发生变化,进一步引起输入电压的变化,从而产生基线漂移。这种漂移噪声与心电图ST段的频谱非常接近,如果滤除方法不当,容易引起ST段严重失真。下图显示了一个基线偏移的噪音信号。
在这里插入图片描述

工频干扰

工频干扰则是由周围环境中用电设备产生的电磁场所引起。心电信号往往被50Hz及其整数倍的正弦波噪声所污染,这种噪声的幅值大小与周围电磁场强度有关。例如,人体的分布电容就可能引起50Hz的正弦信号及其谐波组成的干扰,其幅值通常与ECG峰峰值相当或更强。工频干扰噪声信号如下图所示。在这里插入图片描述

肌电干扰

肌电干扰主要源自人体肌肉的活动,特别是控制骨骼肌收缩较差的人群。当肌肉颤动时,会产生毫伏级的电势,对心电信号的准确检测造成影响。肌电干扰的基线通常不明显,能量主要集中在30Hz到300Hz的范围内,表现为不规则的波形,幅值大小不定。下图显示了肌电波干扰的噪音信号。
在这里插入图片描述
除此之外,ECG信号比较容易受到来自于外界环境所带来的干扰,ECG信号的噪声种类也非常多。例如:测量用到的电极与被检测的人体皮肤之间相互接触而导致出现的运动伪迹;电极接触不良或脱落;电子器件的干扰等。

心电信号读取与加噪

采用原生python波形数据库(WFDB)包。用于读取、写入和处理WFDB信号和注释的工具库。它的目标是用用户友好的API实现尽可能多的核心功能,并包含其他有用的生理信号处理工具。
在本实验中,数据集选自MIT-BIH ECG数据库中的原始ECG数据,选取了编号为101的ECG数据对算法进行一个验证。我们采用第101号数据作为实验数据,因其为正常人的心电数据,我们将此看做纯净的心电信号。模拟三种噪声的频段,通过噪声的叠加,我们可以得到含噪心电信号如下:

y ( n ) = x ( n ) + 0.02 sin ⁡ ( 100 ∗ π t ) + 0.02 sin ⁡ ( π t ) + g ( t ) y(n)=x(n)+0.02\sin(100*\pi t)+0.02\sin(\pi t)+g(t) y(n)=x(n)+0.02sin(100πt)+0.02sin(πt)+g(t)

上式中,g(t)为高斯白噪声,x(n)为不含噪声的心电信号。
Python代码如下:

record = wfdb.rdrecord('../ecg_data/101',sampfrom=0,sampto=2000,channel_names=['MLII'])

fs = record.fs
# 转为数字信号
data = record.p_signal.flatten()
clean=data
# 生成时间轴
t = np.arange(0, len(data)/fs, 1/fs)

# 添加50 Hz正弦波 模拟工频干扰
f_50 = 50
data = data + 0.02*np.sin(2*np.pi*f_50*t)

# 添加0.5 Hz正弦波 模拟基线漂移
f_05 = 0.5
data = data + 0.02*np.sin(2*np.pi*f_05*t)

# 计算信噪比对应的噪声功率
snr = 10  # 信噪比为10 dB
signal_power = np.mean(data**2)
noise_power = signal_power / (10**(snr/10))

# 添加信噪比为10 dB的高斯白噪声 模拟肌电干扰
noise = np.random.randn(len(data)) * np.sqrt(noise_power)
data = data + noise
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

实验数据原心电信号图为:
在这里插入图片描述
加噪后的心电信号图为:
在这里插入图片描述

基于小波阈值去噪技术的应用

心电信号主要包含以下这三种类型的噪声:分别为基线漂移、工频干扰与肌电干扰。而本节的实验内容主要是针对ECG去除其广泛存在的以上三种噪声并且绘制出波形用以直观展示去噪的效果。鉴于这三类噪声各有特点,且在不同频率上的分布不同,本文拟采用小波分解与小波重构的思想,对以上的三类噪声进行去噪处理。在这个阶段,我们的重点研究问题是心电信号及其噪声的频谱分布、小波分解分层、信号有效成分的计算、阈值的选择等问题,最后达到实现心电信号噪声滤除的目的。

小波降噪的基本原理

小波去噪技术具有多分辨特性,是当前心电信号及各类信号去噪的重要手段。通过这种方法,可以把原来的含噪音的信号,按频率带分别分成高、低两类。通过对心电图信号进行小波分析,得到了在不同的分析尺度下,心电图信号与噪音信号在频谱上的差异。
小波变换是一种可以用来分析和处理心电信号中出现的不稳定、不稳定变化的心电信号的一种数据分析方法。小波分解可以很好地克服传统傅里叶变换方法的局限性。下图给出了小波变换的详细过程。
在这里插入图片描述
在小波滤波技术中,阈值滤波是一种重要的滤波算法,它具有操作简便、可获得良好的滤波效果。在处理的时候,根据小波分解后的每一层系数,对其进行有目的处理,将其转化为逆变换,再进行重建,从而获得消除噪音后的心电信号。

小波阈值去噪

本论文拟利用小波的多分辨率特性,采用小波去噪方法,将心电数据层层分解,提取出不同频率范围内的子信号,并根据子信号的频谱特性去噪,最后由子信号重构得到去噪后的心电信号。下图显示了 ECG信号的频段及其噪声。
在这里插入图片描述
根据上表所示,心电信号中,最重要的是其频段在0.7-40 Hz之间,为了消除噪声,其频段又分为低频部分和高频部分。针对 ECG信号及其噪声特性,无法从 ECG信号中实现彻底分离的问题,本项目拟采用小波分解方法,在保持 ECG信号大部分有效成分的前提下,采用小波阈值滤除其它频段的 ECG,从而降低 ECG信号中的有效成分。

小波分解层数

ECG信号以低频为主,对其进行小波分析时,首先要考虑的就是如何对其进行有效的降噪处理,而小波分析的层数是 ECG信号处理的基础。本文所使用的 ECG信号取样频率为360赫兹,根据奈奎斯特采样原理, ECG信号的取样频率为0-180赫兹。通过小波变换,并对其频域进行二次分割,提取出近似系数和细节系数。根据 ECG信号的频谱和有效成分,我们可以得出,分解的层数应为 log ⁡ 2 ( 180 ÷ 0.7 ) ≈ 8 。 \log_2{\left(180\div0.7\right)\approx8}。 log2(180÷0.7)8
在这里插入图片描述

由上表3-2可以看出,在对ECG信号进行小波八层分解,分解后我们看出子信号频率分布的说明,其中的cDi代表在第i尺度中的近似系数,cAj代表在第j尺度下的细节系数。

小波基函数的选取

小波基函数有多种类型,本实验利用Sym8小波本身的对称性,将其应用于心电信号的分解和重建中,以Sym8小波为例,研究其在心电信号中的应用。首先,通过对第一和第二尺度细节系数cD1和cD2和第八尺度近似系数cA8置0去噪,并对其它尺度信号进行阈值去噪、迭代和重建,从而实现小波降噪算法。

阈值与阈值函数

阈值的选择至关重要。阈值设置的过于小,会造成去噪的不彻底;如果阈值设置的过于大,就会使得有用的信号被舍弃。传统的硬、软阈值函数分别是:
硬阈值函数的定义:
在这里插入图片描述
软阈值函数的定义:
在这里插入图片描述
式中 s i g n ( ω j , k ) sign(\omega_{j,k}) sign(ωj,k)为符号函数, λ = σ 2 ln ⁡ N \lambda=\sigma\sqrt{2\ln{N}} λ=σ2lnN σ = M x 0.6745 \sigma = \frac{M_x}{0.6745} σ=0.6745Mx
M(x)是cD1层小波系数的中位数。在上述公式中,每一层的小波系数门限被设定为固定,但是,与噪声相对应的小波系数会随其层数而改变,所以我们使用了自适应阈值的方法,阈值为:

λ = σ j × 2 ln ⁡ N j ln ⁡ ( j + 1 ) \lambda = \sigma_j \times \frac{\sqrt{2 \ln{N_j}}}{\ln{(j + 1)}} λ=σj×ln(j+1)2lnNj

j为进行阈值去噪的小波系数所在的层数, σ j \sigma_j σj第j层小波分解系数中的噪声标准方差,Nj为第j层小波分解的系数个数。
小波去噪函数完整实现python代码如下:

def denoise(data): 
    signals = pywt.wavedec(data=data, wavelet='sym8', level=8)
    cA8,cD8,cD7, cD6, cD5, cD4, cD3, cD2, cD1 = signals
    thre=np.zeros(len(signals))
    for i in range(1,len(signals)):
        sigma=np.median(np.abs(signals[i])) / 0.6745
        thre[i]=sigma * np.sqrt(2 * np.log(len(signals[i])))/np.log(10-i)
        print(thre[i])
    cD1.fill(0)
    cD2.fill(0)
    cA8.fill(0)
    for i in range(1, len(signals)-2):
        signals[i] = pywt.threshold(signals[i], thre[i])
    rdata = pywt.waverec(coeffs=signals, wavelet='sym8')
    return rdata

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

评价去噪效果

应选用与心电图波形最为接近的小波函数,以使得相应的小波系数和噪声小波系数之间的差别尽可能地显著化。用去噪后重建的信号的信噪比和均方误差来衡量去噪能力。
信噪比和均方误差分别定义如下:

S N R   =   20 log ⁡ { ∑ n = 1 N a 2 ( n ) ∑ n = 1 N [ a ( n )   −   b ( n ) ] 2 } SNR\ =\ 20\log{\left\{\frac{\sum_{n=1}^{N}{a^2(n)}} {\sum_{n=1}^{N}\left[a(n)\ -\ b(n)\right]^2}\right\}} SNR = 20log{n=1N[a(n)  b(n)]2n=1Na2(n)}

M S E   =   ∑ n = 1 N [ a ( n )   −   b ( n ) ] 2 N MSE\ =\ \frac{\sum_{n=1}^{N}\left[a(n)\ -\ b(n)\right]^2}{N} MSE = Nn=1N[a(n)  b(n)]2

式中,a(n)为原始的实验心电信号,b(n)为小波降噪后得到的重构信号。
在模拟噪声的加入后,经过软阈值去噪处理,得到的自适应阈值和固定阈值的图像差别、信噪比与均方误差如下:

自适应阈值去噪图像:
自适应阈值去噪图像
固定阈值去噪图像:
在这里插入图片描述

通过图像可以看出,两种阈值的选取都极大程度过滤了噪声,还原了心电图像,但是从图像无法直观看出两种阈值选择的优劣,我们通过计算信噪比(SNR)和均方误差(MSE)来评价两种阈值选择的优劣。
在这里插入图片描述

本章小结

本章从 ECG的基本原理出发,按顺序对 ECG的生理特征和噪声源进行了分析,为深入了解 ECG的基本原理奠定了基础;其次,使用 WFD软件对 ECG数据进行了读出,并对原始 ECG数据进行了噪声处理,以达到对降噪效果的客观定量的评估;对心电信号进行小波八层分解,选择sym8小波基函数,并选择自适应阈值进行阈值去噪,依次展示了自适应阈值法对噪声的去除效果并对比了固定阈值法的去噪结果,最后用信噪比(SNR)和均方误差(MSE)进行量化评价对比。本章的研究内容为后续的工作提供了基础。

第四章 基于1-D CNN的心律失常分类算法

卷积神经网络作为一种热门的分类算法,该算法无需对输入的数据进行人工的预处理,而是将其直接输入到CNN中,由CNN进行特征的提取。在我们的论文中,由于输入的心电信号是一维数据,因此二维CNN模型已经被修改和优化为一维网络结构。

以R峰位基准点进行心拍分割

Python的WFDB包中的annotation标记了R峰所在的位置以及单段心电信号的类型,通过读取并标记可以看出R峰的位置,如下图所示。
在这里插入图片描述
在心电信号的预处理完成后,我们开始进行心拍分割的操作,即将整段的心电信号分割为一段段单个的心拍。R波是 ECG中最显著的一种,它是 ECG中发现其他波形的基础,对 ECG中的心律失常等疾病的诊断具有指导意义,并为 ECG图像的心拍分割提供了重要的参考。在MIT-BIH心律失常数据库中,我们可以从annotation中得到精确的R峰值坐标。本文将降噪后的心电信号选用了R峰点前60、后70个采样点作为单段心电图截取,截取后的单个完整心电信号如下图所示。
在这里插入图片描述
截取时,去掉整条记录中前10个以及最后5个心电信号,以保持截取信号的稳定性。R峰点位心拍分割的处理函数代码如下:

def get_data_set(number, X_data, Y_data):
    ecgClassSet = ['N', 'A', 'V', 'L', 'R']
    print("loading the ecg data of No." + number)
    record = wfdb.rdrecord('ecg_data/' + number, channel_names=['MLII'])
    data = record.p_signal.flatten()
    rdata = denoise(data)#小波去噪函数
    annotation = wfdb.rdann('ecg_data/' + number, 'atr')
    Rlocation = annotation.sample
    Rclass = annotation.symbol
    start = 10
    end = 5
    i = start
    j = len(annotation.symbol) - end
    while i < j:
        try:
            lable = ecgClassSet.index(Rclass[i])
            x_train = data[Rlocation[i] - 60:Rlocation[i] + 70]
            X_data.append(x_train)
            Y_data.append(lable)   
            i += 1
        except ValueError:
            i += 1
    return
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在对图像进行切分之后,采用留出法,选取其中的30%作为待测样本,剩余的70%作为训练样本,将其输入到卷积神经网络中。

卷积神经网络

传统的卷积神经网络结构如下图4.3所示:
在这里插入图片描述

神经网络简介

神经元是神经网络的基础操作单元。它接受外部或内部的信息,并经过加工后输出。每一个输入都有一个对应的权值,该权值反映了输入之间的重要程度。神经元是用每个输入和对应的权重的加权和来计算的,神经元计算方式下所示:
y = f { ∑ i = 1 n ω i a i − b } y=f\left\{\sum_{i=1}^{n}{\omega_ia_i-b}\right\} y=f{i=1nωiaib}
其中, a i a_i ai是第i个元素信息的输入, ω i \omega_i ωi是当前神经元与下一个神经元之间的权重,   b \ b  b为偏置, f ( ) f() f()是激活函数, y y y为输出。加入激活函数使线性的内容经过神经元转变为非线性的内容,以下的三种激活函数为最常使用的。

  1. S i g m o i d Sigmoid Sigmoid激活函数
    Sigmoid\ 函数的公式如下所示,其可以将神经网络的输出映射到(0,1)之中,公式如下所示。
    s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)=\frac{1}{1+e^{-x}} sigmoid(x)=1+ex1
    函数图像如下:
    在这里插入图片描述
    如图上图所示,当输入的值趋于正无穷或负无穷时,梯度会趋近零,神经网络学习不到特征,从而导致深度神经网络无法进行训练。
  2. T a n h Tanh Tanh激活函数
    Tanh 激活函数与 Sigmoid 函数的区别在于将网络的输出映射在(-1,1)之间。公式如下所示:
    tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex
    函数图像如下:
    在这里插入图片描述
    Tanh 函数以0为中心的对称函数,收敛迅速,但是同样容易出 现梯度消失的现象。
  3. R e L U ReLU ReLU激活函数
    R e L U ReLU ReLU 函数的特点是,当输入小或等于0,则返回0,当输入大于0时,则返回输入值,公式如下所示。
    r e l u ( x ) = { 0 , x ≤ 0 x , x ≥ 0 relu(x) =
    {0,x0x,x0
    relu(x)={0,x,x0x0

    函数图像如下:
    在这里插入图片描述
    如上图所示,在x≤0的范围内,梯度为0,在x>0的部分梯度为常数,所以不会出现梯度消失的问题,而且同一时间只有部分神经元会被激活,使网络具有稀疏性,从而更好的挖掘特征。

卷积层

卷积的过程实际上是对特征进行提取的过程,是卷积神经网络最为重要的一个部 分。对于输入的数据,将其按照一定规律分为若干个和卷积核相同大小的矩阵,每个 矩阵和卷积核进行相应的运算,得到特征图,公式如下所示:

f i l = g ( z l ) = g ( ∑ j ∈ M j f j l − 1 ∗ K i l + b i l ) f_i^l=g(z^l)=g(\sum_{j\in M_j}{f_j^{l-1}\ast K_i^l+b_i^l}) fil=g(zl)=g(jMjfjl1Kil+bil)

其中, f i l f_i^l fil

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/749837
推荐阅读
相关标签