ECG数据库:解决数据来源问题
1.数据库简介与获取
经过上一章节的介绍,相信你对于我们的研究对象——心电信号ECG已经有了一个初步的认识,也清楚了我们的目标就是使用机器/深度学习算法,能自动识别指定的ECG类型,从而实现“人工智能”式的诊断(汗。。。)。“巧妇难为无米之炊”,我们的“米”(ECG数据)从哪里来呢?当然有喜闻乐见的数据库供我们使用。
首先贴一个网址:https://www.physionet.org/cgi-bin/atm/ATM
这个网站上汇集了许许多多生理信号,除了我们熟悉的ECG,还有脑电信号EEG,心音信号PCG等等。“弱水三千,只取一瓢”,这里我们主要来说一下ECG领域最常用(没有之一)的数据库:MIT-BIH Arrhythmia Database。如上图所示,点击“Input”选择框,下拉选择MIT-BIH Arrhythmia Database(注意,有很多MIT-BIH打头的数据库,不要搞错了),“Input”选择框下面还有几个选择框,可以分别选择记录,信号,标记等等,选定后页面上会有一个区域展示一小段信号。如果想详细了解并下载数据,点击上图右下角红圈中的链接可以跳转至数据库专属页面。
详细的介绍可以自己去看,全英文,英语不好的建议配合有道词典。在这里只说一些重要的信息:MIT-BIH Arrhythmia Database(以下简称MITdb)包含了48条双导联ECG记录,其中,除少数记录外,每条记录的第一个导联都是II导联,每条记录长度为30分钟,采样率360 Hz,算起来有30*60*360=648000个采样点,但其实每条记录都有650000个点,也就是并非严格等于30分钟。不过这没什么很大影响。打开MITdb的专属页面后,很容易就发现了大量数据文件的链接,48条记录(不连续编号100-234),每一条记录对应着3个文件,就像这样:
各个文件的作用,已经展示的很清楚。.atr:标记文件,保存着人工标注的心拍位置和类型。.dat:数据文件,保存着我们需要的心电信号。.hea:头文件,保存着这条记录的附加信息。这三个文件中头文件(.hea)可以直接打开,其余两个不可直接打开,强行记事本打开后看到的都是乱码。打开头文件后,一般看到的是这样的:
第一行含义为:记录编号 导联数 采样率 采样点数。第二、三行则说明了.dat文件的信息,它是212格式编码的等等。其详细的说明请参照文献:(宋喜国, 邓亲恺. MIT-BIH心率失常数据库的识读及应用[J]. 中国医学物理学杂志, 2004, 21(4):230-232.)当然,如果你对这些东西并不关心也可以不看,对我们后面的内容影响不大。至于这个数据库中到底包含了哪些我们感兴趣的类型,作为我们分类识别的目标,这个我们用到的时候再说。
说了半天,似乎我们一直在纸上谈兵,目前手里什么也没有。一个不好的消息:如果你不会一些下载技巧,要下载这48*3=144个文件,你需要每个都点一下,因为官方似乎并没有提供一个完整的包。这一点其实不用担心,本人已经下载好并且打好了包提供给各位下载。方式是大家喜闻乐见的百度网盘:链接:https://pan.baidu.com/s/1BG1sPsWO8Ey2GdAepUa1GQ 密码:z3ey
2.数据库的Matlab读取
如果你阅读了上一段建议的,对于MITdb数据格式说明的论文,十有八九会对读取数据库感到困难。这种格式并不常见,而且对于初学者并不友好。自己编程实现数据库读取的门槛又比较高,不是每个人都能实现,而且我们的目标也不是数据的编解码研究。还好有大佬已经为我们写好了读取数据的代码,我们只需要run一下就基本达成目的了。目前该代码已经放到了我的github上(文后有地址),名为rddata.m:
简单说下怎么用,建议单独建一个文件夹作为我们后续代码的存放处,例如这里我建立了一个名为ECGPrimer的文件夹,路径为:F:\MATLAB\ECGPrimer。把rddata.m文件放入该文件夹。
1)打开matlab(这里为2013a版本,其余版本类似),点击界面偏上方显示路径的框的偏右空白处(例如下图中椭圆处),输入我们刚才的路径,回车。当前路径就成为了我们刚才建立的文件夹,左边可以看到我们之前放入的rddata.m文件,双击打开。
2) 打开rddata.m后,注意一开始的关于数据库文件的存放路径,以及指定文件名的设置,如图:
例如图中我把下载好的144个数据库文件解压,放在了F:\MATLAB\MIT-BIH,然后需要读取编号为234的记录,指定读取的点数为1024。点击控制栏的run按钮,相关数据会被读入到matlab的工作空间workspace中。与此同时,matlab会生成一张信号图,上面同时绘制了两个导联的信号,以及一些标记的数字,这里我们先关掉不理会。
3)然后我们观察matlab的workspace,此时应该如下图所示:
注意,此时变量名为M的矩阵中包含了我们需要的ECG信号,尺寸为1024(指定读取点数)*2(导联数)。我们只关心第一个导联的信号,在matlab命令窗口里输入:plot(M(:,1));grid on;可绘制出第一个导联的信号:
至此,我们已经成功将数据库中的ECG信号读取至matlab中。另外,workspace中其余2个矩阵也值得我们注意。如3)中的workspace截图,一个是ANNOT,存储了该记录中各心拍的人工标注类型代码,例如有:
完整的对比说明表也已经上传至本人github:Data Instructions.txt。ANNOT的意义在于提供给了我们各心拍专家诊断的结果,用于后续深度学习算法的标签。另外一个是ATRTIME,它存储了各心拍的人工标注位置,一般以QRS波为基准。即该记录的几分几秒出现了一个心拍。而这个矩阵的意义在于后续帮助我们评估心拍定位算法的准确性,或是直接根据它提供的人工标注位置截取心拍。
3.小结
本节我们学习了ECG数据库的获取与matlab读取,解决了数据来源问题。如果你对其他数据库也感兴趣,可以在上面介绍的网站中继续了解。然而现在还不宜直接进行机器/深度学习模型的开发,还有那些重要的事情没做?且听下回分解。
** MIT-BIH数据库下载: 链接:https://pan.baidu.com/s/1BG1sPsWO8Ey2GdAepUa1GQ 密码:z3ey
** 相关代码文件下载:https://github.com/Aiwiscal/ECG-ML-DL-Algorithm-Matlab
** 推荐文献:宋喜国, 邓亲恺. MIT-BIH心率失常数据库的识读及应用[J]. 中国医学物理学杂志, 2004, 21(4):230-232.