基于深度学习的心律异常分类系统——算法设计
- 第一章 研究背景
- 算法流程
- 本文研究内容
- 第二章 心电信号分类理论基础
- 心电信号产生机理
- 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)]2∑n=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 = N∑n=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ωiai−b}
其中,
a
i
a_i
ai是第i个元素信息的输入,
ω
i
\omega_i
ωi是当前神经元与下一个神经元之间的权重,
b
\ b
b为偏置,
f
(
)
f()
f()是激活函数,
y
y
y为输出。加入激活函数使线性的内容经过神经元转变为非线性的内容,以下的三种激活函数为最常使用的。
-
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+e−x1
函数图像如下:
如图上图所示,当输入的值趋于正无穷或负无穷时,梯度会趋近零,神经网络学习不到特征,从而导致深度神经网络无法进行训练。 -
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+e−xex−e−x
函数图像如下:
Tanh 函数以0为中心的对称函数,收敛迅速,但是同样容易出 现梯度消失的现象。 -
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,x≤0x≥0
函数图像如下:
如上图所示,在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(∑j∈Mjfjl−1∗Kil+bil)
其中,
f
i
l
f_i^l
fil为𝑙层的第𝑖个卷积核得到的特征图,
f
j
l
−
1
f_j^{l-1}
fjl−1为第𝑙 − 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=∑i∑jxijyij
以上公式中,
x
i
j
x_{ij}
xij表示卷积核,
y
i
j
y_{ij}
yij表示输入数据,
e
e
e为卷积运算后的结果。
上图中按照滑动步长为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=SW−F+2P+1
其中W是输入的信号的长度,F是卷积核的大小,P的值的选取时根据全零填充确定, S为我们选择的滑动步长大小。
池化层输出的特征向量的长度Y计算公式如下:
Y = W − F S + 1 Y=\frac{W-F}{S}+1 Y=SW−F+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心电信号识别分类(四)