基于深度学习的心律异常分类系统设计——算法设计

news2024/11/13 15:35:25

基于深度学习的心律异常分类系统——算法设计

  • 第一章 研究背景
    • 算法流程
    • 本文研究内容
  • 第二章 心电信号分类理论基础
    • 心电信号产生机理
    • MIT-BIH 心律失常数据库
  • 第三章 心电信号预处理
    • 心电信号噪声来源与特点
      • 基线漂移
      • 工频干扰
      • 肌电干扰
    • 心电信号读取与加噪
    • 基于小波阈值去噪技术的应用
      • 小波降噪的基本原理
      • 小波阈值去噪
        • 小波分解层数
        • 小波基函数的选取
        • 阈值与阈值函数
      • 评价去噪效果
      • 本章小结
  • 第四章 基于1-D CNN的心律失常分类算法
    • 以R峰位基准点进行心拍分割
    • 卷积神经网络
      • 神经网络简介
      • 卷积层
      • 池化层
      • 全连接层
    • 卷积神经网络
      • 本文1-D CNN结构
      • 模型的搭建
    • 实验结果分析
  • 第五章 总结与展望
    • 对未来展望
    • 参考文献

第一章 研究背景

根据世界卫生组织(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

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

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

心电信号主要包含以下这三种类型的噪声:分别为基线漂移、工频干扰与肌电干扰。而本节的实验内容主要是针对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

评价去噪效果

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

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

在对图像进行切分之后,采用留出法,选取其中的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) = \begin{cases} 0, & \text{} x \leq 0 \\ x, & \text{} x ≥ 0 \end{cases} 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为𝑙层的第𝑖个卷积核得到的特征图, f j l − 1 f_j^{l-1} fjl1为第𝑙 − 1层通过运算得到的第𝑗个特征图, M j M_j Mj为第𝑙 − 1层得到的特征图的集, K i l K_i^l Kil为𝑙层的第𝑖个卷积核, b i l b_i^l bil代表偏置值,激活函数由𝑔(*)表示
卷积运算可以看作矩阵之间相乘再相加的一个过程,对输入数据进行卷积运算时,往往从输入数据的第0行第0列开始,即(0,0)点坐标的位置。本文中以5×5 的一个输入数据矩阵为例,卷积核设置为 3×3,步长为1,即卷积核在卷积过程中,从左到右、从上到下都依次移动一个位置进行卷积运算。每一次的卷积运算都按照如下公式计算,一次卷积运算过程如下图所示。

e = ∑ i ∑ j x i j y i j e=\sum_{i}\sum_{j}{x_{ij}y_{ij}} e=ijxijyij

以上公式中, x i j x_{ij} xij表示卷积核, y i j y_{ij} yij表示输入数据, e e e为卷积运算后的结果。
1234
上图中按照滑动步长为1移动,最终得到一个 3×3 的特征图,具体地,第一个特征图计算如下:
𝑒 = 0×0+1×1+2×0+2×2+4×0+3×1+5×1+0×0+2×1=15
经过以上一系列计算得到完整的特征图后,该特征图即为下一层的输入数据。

池化层

池化层也称采样层,可以降低特征维度,减少网络复杂度,同时也可以减少训练 的参数数量。一般情况下,最大池化和平均池化是最为常用的池化操作。最大池化是 在指定范围内选择出数值最大的一个作为池化操作的输出;平均池化是将计算出的指 定范围内的平均值作为池化操作的输出。最大池化过程和平均池化过程分别如下图所示。
在这里插入图片描述
在这里插入图片描述
图4.5和4.6分别展示了最大池化和平均池化的操作过程,对于一个 4×4 的特征图,采用22的滑动窗口,设置步长为 2,最终得到22的结果矩阵,体现出了池化层可降低特征维度的作用。

全连接层

全连接层通常为卷积神经网络的最后一层,位于卷积层和池化层之后,作用主要是将特征进行非线性组合来得到最终的输出。全连接层实际上是其每个神经元和上一层的全部神经元进行连接的过程,网络结构见下图
在这里插入图片描述
从图 3.8 中可以看出,需要将每个神经元进行连接,因此在网络中计算量最大、参数最多的部分便是全连接层。在全连接层中采用的激活函数有多种,比如 Sigmoid函数、tanh 函数、ReLU 函数,但是为了使网络拥有更加优越的性能,多数情况下将ReLU 函数作为激活函数。对于多分类研究来说,全连接层的输出将是多分类函数的输入,在此常采用 Softmax 函数作为分类器,以完成最终的分类。

卷积神经网络

本文1-D CNN结构

在这里插入图片描述
卷积层处理之后输出的特征向量X的计算公式为:

X = W − F + 2 P S + 1 X=\frac{W-F+2P}{S}+1 X=SWF+2P+1

其中W是输入的信号的长度,F是卷积核的大小,P的值的选取时根据全零填充确定, S为我们选择的滑动步长大小。
池化层输出的特征向量的长度Y计算公式如下:

Y = W − F S + 1 Y=\frac{W-F}{S}+1 Y=SWF+1

其中W是输入信号的长度,F是池化核的大小,S为池化核每步步长。
我们搭建的网络所使用的卷积核大小为3,滑动步长为1,采用最大值池化的方式。池化核大小为2,选择的滑动步长为2,我们将心电信号输入为1维的长度为130的numpy数组,其中每层的运算如下表所示:
在这里插入图片描述

模型的搭建

本实验所采用的1- D CNN结构如图上图所示,该模型包括输入层1个,卷积层5个,下采样层4个,BN层5个,全连通层1个。第一层到第四层是卷积层后面跟着一个下采样层以及BN层,在第五个卷积层之后直接跟着的是一个BN层。激活函数采用ReLU函数。
模型的建立和参数的训练是采用 TensorFlow框架完成的。其中,优化器选择的是 Adam自适应最优器,学习率是自适应的学习率,损失函数是crossentropy,网络的评估指标是 accuracy。
实现代码如下:

newModel = tf.keras.models.Sequential([
    tf.keras.layers.InputLayer(input_shape=(130,)),
    tf.keras.layers.Reshape(target_shape=(130, 1)),
    tf.keras.layers.Conv1D(filters=28, kernel_size=3, strides=1, padding='SAME', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=2, strides=2, padding='SAME'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Conv1D(filters=28, kernel_size=3, strides=1, padding='SAME', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=2, strides=2, padding='SAME'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Conv1D(filters=28, kernel_size=3, strides=1, padding='SAME', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=2, strides=2, padding='SAME'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Conv1D(filters=28, kernel_size=3, strides=1, padding='SAME', activation='relu'),
    tf.keras.layers.MaxPool1D(pool_size=2, strides=2, padding='SAME'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Conv1D(filters=28, kernel_size=3, strides=1, padding='SAME', activation='relu'),
    tf.keras.layers.BatchNormalization(),
    tf.keras.layers.Flatten(),
tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(5, activation='softmax')
])

实验结果分析

本实验的操作环境为:Intel® Core™ i5-9300H CPU @ 2.40GHz处理器、NVIDIA GTX1660Ti 6G GDDR6独立显卡、Windows10 系统、8GB 内存、笔记本计算机。使用的语言为 Python,深度学习框架为TensorFlow,数据处理工具为Python语言的WFDB数据包。在 CNN 网络特征提取部分,学习率设置为自适应,批次大小设置为128,Dropout 值为0.2,迭代训练次数为30次。
为测试本文所提模型的性能,使用灵敏度(Se)、阳性预测值(PPV)、分类准确率(Acc)3 种评估指标来衡量模型的性能。三个评估指标所对应的计算过程如下所示:

S e = T P T P + F N Se=\frac{TP}{TP+FN} Se=TP+FNTP

P P V = T P F P + T P PPV=\frac{TP}{FP+TP} PPV=FP+TPTP

A c c = T P + T N T P + F P + T N + F N Acc=\frac{TP+TN}{TP+FP+TN+FN} Acc=TP+FP+TN+FNTP+TN

在上述公式中,TP、TN、FP和FN的含义见下表:
在这里插入图片描述
心电信号自动分类实验结果的混淆矩阵如下图所示。
在这里插入图片描述
根据混淆矩阵可计算出模型的评价指标,本文实验使用1D-CNN模型进行特征的提取与识别,最后利用Softmax完成分类,本文模型的分类准确率较高,达到了 97.5%;N、A、V、L、R五类心跳的灵敏度(Se)分别为99.26%、71.50%、93.89%、97.03%、94.16%,阳性预测值(PPV)分别为98.49%、79.00%、96.64%、97.54%、96.04%。

第五章 总结与展望

伴随人们对心脏疾病相关危害的深入了解,对心脑的重视程度也不断提高,越来越多的学者开始了对心律异常自动判别的研究,同时也提出各种分类方法。本文的主要研究工作如下:
(1)针对 ECG信号中的各种噪声干扰,本文提出了一种自适应阈值的降噪算法。为客观量化评价去噪效果,我们采用mit-bih数据库编号为101的数据中的MLII导联作为为纯净的ECG信号。然后,在纯净信号的基础上分别加入50Hz正弦波模拟工频干扰、0.5Hz正弦波模拟基线漂移和信噪比为10dB的高斯白噪声模拟肌电干扰。加噪心电信号以后,经过实验对比自适应阈值法和固定阈值法的去噪效果,通过去噪的图像难以分辨出孰优孰劣。由此引入信噪比(SNR)和均方误差(MSE)量化评价,经过实验对比,两种方法均能有效降噪,还原纯净心电信号波形。但自适应阈值法更优,因此选用自适应阈值法作为数据预处理阶段的方法。
(2)针对 ECG信号的特征抽取与分类问题,本项目拟采用一维 CNN实现 ECG信号的自动分类。心电信号的自动分类主要由四个步骤组成:预处理、心拍分割、特征提取和分类。心电信号预处理使用本文所提出的小波自适应阈值法,对心电信号进行八层分解并选用sym8小波基函数,特征提取和分类则采用基于1-D CNN网络的方法实现。心电信号分段读取annotation中的R峰点位,之后在R峰点位前、后各截取60、70个采样点。利用一维 CNN对 ECG信号进行特征提取,其中包括5个卷积层、4个池化层、5个标准化层以及1个完全连通层。最后,利用 Softmax 函数完成所需分类。通过实验可以看出,本文所提方法的分类准确率达到了97%以上。

对未来展望

对未来的展望
本文完整地对心电信号的预处理以及特征提取、分类做了详细的研究,可以大大地减轻医护人员的工作量,提高医疗水平上的工作效率。但本论文研究还存在一些局限性,故还需对以下问题进行改善:
(1)本论文使用的数据集是MIT-BIH数据集,该数据集十分权威,在国内外也享有盛誉。但仍存在一定的局限性:本数据库中心律失常的样本较少。故接下来的工作首先是对训练的数据集进行补充,在这一点上可以和广大的医院进行合作。医院每天都要进行大量的心电数据监测,其中也不乏心律失常的大量样本。故通过实地的考察研究,用生活中的大量数据作为训练数据的补充,对于模型的训练以及评价都十分的具有实际的意义。
(2)本论文采用的方法是小波变换并采用自适应阈值的小波硬阈值去噪方法,通过大量的实验,可以有效的去除心电信号中广泛存在的三种噪声并且极大程度的保留了已有的有效信息成分。但本实验仍有不足,即为心电信号还含有其他类型的噪声,后续的工作应在于了解和认识其他类型的噪声、了解多种去噪方法,通过大量的实验得出最适用的去噪方法。
(3)对于心拍分割后的单个心拍的长度,本文还需要通过大量实验,对比从R-峰点位左右截取的数据段长度的变化对实验结果带来的影响,选择最适合本文提出的去噪方法和模型的心拍截取长度。
(3)本论文提出的1-D CNN模型在本文的数据集上表现良好,且高于列出的其他文献中模型方法的准确率。但本文的心电数据采用单导联,其适用范围相对较窄,为提升临床 ECG诊断的适应性,本课题将重点关注多导联 ECG的自动识别,并进一步增强分类模型的实际应用价值。

参考文献

胡盛寿, 高润林, 刘力生, 等. 中国心血管病报告2018概要. 中国循环杂志 [J], 2019, 34(3): 209-220
刘昱昕,张延华,杨睿哲. 基于小波去噪和深度学习的含噪声心电信号分类
盛志强等 心电分析系统的设计与实现
刘昱昕,张延华 ,杨睿哲基于小波去噪和深度学习的含噪声心电信号分类
郑敏敏、高小榕、 谢海鹤心电信号小波去噪的改进算法研究
代码参考:
Python中的WFDB库使用
使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类(四)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1535288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题记录:(13)N皇后(难题不难)

leetcode传送通道 传说中的N皇后&#xff0c;不难&#xff0c;进来了就看完吧 注释序号代表鄙人写代码的顺序和思考逻辑&#xff0c;供参考 class Solution {// 1.定义结果数组List<List<String>> result new ArrayList<>();public List<List<String&…

.NET EF Core(Entity Framework Core)

文章目录 EF Core与其他ORM比较EF Core与EF比较Migration数据库迁移反向工程Migrations其他命令修改表结构 EF Core操作数据库插入数据查询数据修改、删除其他数据库 EF Core实体的配置Data Annotation配置方式Fluent API配置方式Fluent API 通过代码查看EF Core的sql语句方法1…

分布式链上随机数和keyless account

1. 引言 相关论文见&#xff1a; Aptos团队2024年论文 Distributed Randomness using Weighted VRFs 相关代码实现见&#xff1a; https://github.com/aptos-labs/aptos-core&#xff08;Rust&#xff09; 在链中生成和集成共享随机数&#xff0c;以扩展应用和强化安全。该…

基于python+vue体育场馆设施预约系统flask-django-php-nodejs

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;体育场馆设施预约系统当然不能排除在外。整体设计包括系统的功能、系统总体结构、系统数据结构和对系统安全性进行设计&#xff1b;最后要对系统…

Tomcat启动报错 因为在清除过期缓存条目后可用空间仍不足

在Tomcat部署路径下的./conf/context.xml配置文件的标签内添加如下内容&#xff1a; <Resources cachingAllowed"true" cacheMaxSize"100000" />

图解 LFU 缓存淘汰算法以及在 Redis 中的应用(附带个人完整代码实现)

文章目录 LFU 算法理论介绍算法实现数据结构查询操作插入/更新操作 Redis 缓存淘汰算法缓存污染难题Redis LFU缓存淘汰策略 本篇博客的主要内容&#xff1a; 以图解的方式&#xff0c;介绍 LFU 算法的一种实现&#xff1b;介绍 LFU 算法在 Redis 中的应用。 LFU 算法 理论介…

Docker 搭建私人仓库

docker 搭建私人仓库有下面几种方式&#xff1a; 1、docker hub 官方私人镜像仓库2、本地私有仓库 官方私人镜像仓库搭建很简单(就是需要有魔法&#xff0c;否则就异步到第二种方法吧)&#xff0c;只需要 login、pull、tag、push 几种命令就完事了。而本地私人镜像仓库则比较麻…

探究BufferedOutputStream的奥秘

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java IO相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

[音视频学习笔记]六、自制音视频播放器Part1 -新版本ffmpeg,Qt +VS2022,都什么年代了还在写传统播放器?

前言 参考了雷神的自制播放器项目&#xff0c;100行代码实现最简单的基于FFMPEGSDL的视频播放器&#xff08;SDL1.x&#xff09; 不过老版本的代码参考意义不大了&#xff0c;我现在准备使用Qt VS2022 FFmpeg59重写这部分代码&#xff0c;具体的代码仓库如下&#xff1a; …

本地化语音识别、视频翻译和配音工具:赋能音频和视频内容处理

随着人工智能技术的飞速发展&#xff0c;语音识别、视频翻译和配音等任务已经变得更加容易和高效。然而&#xff0c;许多现有的工具和服务仍然依赖于互联网连接&#xff0c;这可能会导致延迟、隐私问题和成本问题。为了克服这些限制&#xff0c;我们介绍了一种本地化、离线运行…

RCE漏洞

RCE漏洞概述 远程命令执行/代码注入漏洞&#xff0c;英文全称为Reote Code/CommandExecute&#xff0c;简称RCE漏洞。PHPJava等Web开发语言包含命令执行和代码执行函数,攻击者可以直接向后台服务器远程执行操作系统命今或者运行注入代码&#xff0c;进而获取系统信息、控制后台…

社交媒体的未来:探讨Facebook的发展趋势

引言 在数字化时代&#xff0c;社交媒体已经成为人们日常生活中不可或缺的一部分。作为全球最大的社交媒体平台之一&#xff0c;Facebook一直在不断地追求创新&#xff0c;以满足用户日益增长的需求和适应科技发展的变革。本文将探讨Facebook在未来发展中可能面临的挑战和应对…

10W字解析 SpringBoot技术内幕文档,实战+原理齐飞,spring事务实现原理面试

第3章&#xff0c;Spring Boot构造流程源码分析&#xff0c;Spring Boot的启动非常简单&#xff0c;只需执行一个简单的main方法即可&#xff0c;但在整个main方法中&#xff0c;Spring Boot都做了些什么呢&#xff1f;本章会为大家详细讲解Spring Boot启动过程中所涉及的源代码…

Linux下Docker部署中间件(Mysql、Redis、Nginx等)

我的自备文件 文件传输 内网下直接上传很慢 使用scp命令将另一台服务器上的文件传输过来&#xff1b;在已有文件的服务器往没有文件的服务器传输 scp -r 传输的文件夹/文件 root要传输的地址:放置的地址 scp -r tools root172.xx.x.xxx:/data/ 安装二进制文件、脚本及各中间件…

《深入解析 C#》—— C# 3 部分

文章目录 第三章 C#3&#xff1a;LINQ及相关特性3.1 自动实现属性&#xff08;*&#xff09;3.2 隐式类型 var&#xff08;*&#xff09;3.3 对象和集合初始化3.3.1 对象初始化器3.3.2 集合初始化器 3.4 匿名类型3.4.1 基本语法和行为3.4.2 编译器生成类型3.4.3 匿名类型的局限…

Hive和Hadoop版本对应关系

通过 Downloads (apache.org) 即可查看

MySQL的基本操作

目录 引言 一、SQL语句简介 &#xff08;一&#xff09;SQL通用语法 &#xff08;二&#xff09;SQL分类 &#xff08;三&#xff09;数据类型 1.数值类型 2.字符串类型 3.日期/时间类型 4.修饰符 二、登录mysql服务 三、SQL语句操作 &#xff08;一&#xff09;DD…

vue3 + ts +element-plus + vue-router + scss + axios搭建项目

本地环境&#xff1a; node版本&#xff1a;20.10.0 目录 一、搭建环境 二、创建项目 三、修改页面 四、封装路由vue-router 五、element-plus 六、安装scss 七、封装axios 一、搭建环境 1、安装vue脚手架 npm i -g vue/cli 2、查看脚手架版本 vue -V3、切换路径到需…

Studio One 6 Mac中文版破解版下载(附Mac版注册机)

Studio One 6 Mac版是一款强大的音乐创作与制作软件&#xff0c;其可通过更简单的方式来录制音频及进行MIDI制作&#xff0c;并提供丰富的专业功能。它具备音乐创作、录音混缩、MIDI编辑、音频处理、Loops拼接、视频配乐和母带与专辑制作等功能。软件提供了强大的音频性能&…

在iOS中安装

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;使用CUDA 为Tegra构建OpenCV-CSDN博客 下一篇&#xff1a; 警告&#xff01; 本教程可以包含过时的信息。 所需软件包 CMake 2.8.8 或更高版本Xcode 4.2 或更高版本 从 G…