这篇博客主要是关于Apena-ecg数据库中ECG信号的读取,将数据库中的.dat文件(ECG数据)和.apn文件(标签)做成TXT格式,方便后续的处理。
apnea-ecg信号读取部分代码:https://github.com/zzklove3344/CodeForReadingApneaECG
根据apnea-ecg的官方说明,每个.dat文件中存的是一个晚上的ECG信号,.apn文件存的是ECG信号的标签。标签是对每分钟ECG片段的标注,共2种,A(disordered breathing)和N(normal breathing)。目的是对整个晚上的ECG信号按照每分钟进行划分,与每个标签能够相对应。这样做的好处,一是方便读取,读某一分钟的ECG片段的数据与标签,不需要将整个晚上的ECG数据和整个标签全部读进来;二是方便分类错误定位,可以将每分钟的ECG片段分配一个独立ID,当做分类之后,想要查看分类器将哪些ECG信号错误分类了,可以快读定位到错误的ECG片段,方便后续的优化。
工具:pycharm, wfdb工具包(python环境下的包)
每个ECG片段,除了有ECG片段的数据,标签,为了快速定位,还需要一个全局ID以及一个局部ID(该ECG片段在哪个.dat文件中,在第多少分钟)。为了后续数据集的扩展,加了一个数据库名称的属性。以下代码给出了ECG片段类的属性定义。
class ECGDataSegment:
"""
Minute-by-minute ECG segment.
"""
def __init__(self):
self.data = None # ECG segment data
self.label = None # ECG segment label
self.database = "apnea-ecg" # Database name
self.filename = None # Which file does it belong to?
self.local_id = None # The ID in file
self.global_id = None # global ID in database
在构造完ECG片段的数据结构之后,就可以针对该数据结构写读取函数了。对于每一个ECG记录,我们读出ECG数据和标签,然后利用标签中的采样点的开始位置,顺序读6000个构造ECG片段,再读出标签和一些辅助信息,一起写入TXT文件就可以了,TXT文件以全局ID(global_id)命名。另外还需要写入一个extra-info文件,主要记录ECG segments的总数,方便以后的读取。
在这里训练集和测试集的处理有些不同。训练集中有.dat文件和.apn文件,测试集中有.dat文件,但没有.apn文件,标注文件是一个TXT文件。具体的代码见github链接。
在读取上训练集和测试集就没有写入上的不同了,使用相同的函数就可以读取了。
apnea-ecg数据库官方网站:https://physionet.org/physiobank/database/apnea-ecg/
apnea-ecg(带测试集标签)百度网盘下载链接:
链接:https://pan.baidu.com/s/1GPzUvBWYtKypxO1rYDUGRw
提取码:vxe9
apnea-ecg subjects基础信息统计表:https://physionet.org/physiobank/database/apnea-ecg/additional-information.txt