心律失常是十分常见的心血管疾病,主要表现为心脏搏动频率或节律的异常。心律失常若得不到及时治疗,可发作导致人死亡。正常心率记为(Normal,N),常见的心律失常疾病主要包括:房性期前收缩( Premature Atrial Contraction,A)、室性期前收缩( Premature Ventricular Contraction,V)、左束支传导阻滞( Left bundle branch block,L)和右束支传导阻滞(Right Bundle Branch Block,R)等。
由于心电信号通常十分微弱,采集过程中容易受到各种因素的干扰,心电信号的噪声种类繁多,所以心电图分类识别的首要步骤就是对信号进行预处理。国内外研究学者针对去噪方面做了很多研究,主要的去噪手段有经典的数字滤波器和基于小波变换的阈值去噪等。经典的数字滤波器根据频率范围的不同对噪声进行去噪:对于基线漂移使用高通滤波器去噪、对于肌电干扰使用低通滤波器去噪、对于工频干扰使用带通滤波器去噪。近年来,小波变换技术的快速发展催生出了一系列基于小波阈值去噪技术。该类技术是根据信号和噪声的频率在不同尺度上的分布,先对信号进行小波变换,再根据阈值对各层小波系数进行处理,最后重构信号实现去噪。小波阈值去噪技术对于非平稳信号具有优秀的处理效果,与传统处理方法相比有显著的优越性。
在对心电信号进行预处理和特征提取的基础之上,使用深度学习对心电信号进行自动分类识别。深度学习的研究与神经网络有着密不可分的联系。2006年,Hinton提出了深度置信网络,成为了深度学习领域的一个里程碑。如今在大数据、计算机算力大幅度增加的背景下,深度学习已经在图像处理、语音识别和NLP等众多领域的研究中取得了巨大进展。而卷积神经网络模型经历了从最早的LeNet模型到现在的GoogleNet、ResNet等不断的演进,识别率已经十分优秀。在研究心电分类算法时,利用深度学习在大量数据处理方面表现出的优势,使得分类效果有着显著的提升。
一、数据库的获取
目前,国际上公认的标准数据库包含四个,分别为美国麻省理工学院提供的MIT-BIH(Massachusetts Institute of Technology-Beth Israel Hospital Database, MIT-BIH)数据库、美国心脏学会提供的AHA( American heart association,AHA)数据库、欧共体CSE( Common Standards for Quantitative Electrocardiograph,CSE)数据库、欧洲ST-T数据库。
当前使用最广泛且被学术界普遍认可的据库为MIT-BIH心律失常数据库。此数据库中囊括了所有类型的心电信号并且数量丰富,为本文关于心电信号的自动分类研究提供了实验数据。下面对该数据库作详细的说明。
MT-BIH心律失常数据库拥有48条心电记录,且每个记录的时长是30分钟。这些记录来自于47名研究对象。这些研究对象包括25名男性和22名女性,其年龄介于23到89岁(其中记录201与202来自于同一个人)。信号的采样率为360赫兹,AD分辨率为11比特。对于每条记录来说,均包含两个通道的信号。第一个通道一般为MLⅡ导联(记录102和104为V5导联);第二个通道一般为V1导联(有些为V2导联或V5导联,其中记录124号为Ⅴ4导联)。为了保持导联的一致性,往往在研究中采用MLⅡ导联。
数据库中的每条记录均包括三个文件,即:头文件、数据文件和注释文件。
(1)头文件头文件[.hea] 通过ASCII码存储方式记录信号的采样频率、采样频率、数据格式使用的导联信息、采样频率、研究者的性别、年龄以及疾病种类等
(2)数据文件数据文件[.dat] 通过二进制的方式存储信号,每三个字节存储两个数值(两导联数据交替存储),每个数值大小是12bit
(3)注释文件注释文件[.atr] 是由专家对信号进行人工标注,并且根据二进制格式进行数据的存储
官方网站的可视化工具读取展示MIT-BIH数据:https://archive.physionet.org/cgi-bin/atm/ATM
二、数据读取
下载数据库到本地后打开,你会发现.dat文件中全部都是乱码,这是由于MIT-BIH数据库采用了自定义的format212格式进行编码。所以在读取心电数据的时候,我们需要用到Python中的一个工具包:wfdb。
pip install wfdb
在Pycharm中新建工程,并将下载好的心电数据集按如图所示的目录结构进行放置。其中ecg_data为心电数据集的文件夹。
record = wfdb.rdrecord('ecg_data/' + 100, channel_names=['MLII'])
data = record.p_signal.flatten()
通过record=wfdb.rdrecord来获取心电数据信息,以及通过annotation=wfdb.rdann来获取心拍类型信息。需要注意的是record的类型是一个(65000,1)的二维数组,需要先将其转换成一维数组才可以对其进行预处理。