基于深度学习的ECG分类(二)

您所在的位置:网站首页 ecg正常图像 基于深度学习的ECG分类(二)

基于深度学习的ECG分类(二)

2024-07-06 15:00| 来源: 网络整理| 查看: 265

基于深度学习的ECG分类(二)——数据集合并及数据预处理 1.世界著名心电数据集

目前国际上最重要的且具有权威性的心电数据库有四个:

MIT-BIH心电数据库:由美国麻省理工学院与Beth Israel医院联合建立; AHA心律失常心电数据库:由美国心脏学会建立(需付费下载); CSE心电数据库:由欧盟建立(需付费下载); 欧盟ST-T心电数据库。

除此之外,国际上被广泛认可的还有Sudden Cardiac DeathHolter Database等心电数据库。

2.数据集的选取与下载 数据集的选取

在搜索了大量的心电数据库之后,最终选取以下四个数据库进行下载、处理、合并:

MIT-BIH心率不齐数据库(https://physionet.org/content/mitdb/1.0.0/) MIT-BIH ST变化数据库(https://physionet.org/content/stdb/1.0.0/) 欧盟ST-T心电数据库(https://physionet.org/content/edb/1.0.0/) 心脏性猝死动态心电数据库(https://physionet.org/content/sddb/1.0.0/) 数据文件 .hea:头文件(可以理解为数据的注释文件),该文件含有记录编号、导联方式、采样频率、采样点数等信息; .atr:标记文件,该文件含有人工标注的心拍位置和类型(如:异常心拍类型的字母标记); .dat:心电信号数据(主体)。 3.数据集详细介绍 数据集名称 MIT-BIH Arrhythmia Database MIT-BIH ST Change Database European ST-T Database Sudden Cardiac Death Holter Database 采样频率 360Hz 360Hz 250Hz 250Hz 导联方式 MLII、V1、V2、V4、V5 ECG MLI、MLIII、V1、V2、V3、V4、V5、D3 ECG 每段数据持续时间 48条半小时两通道动态心电图记录 28条不同长度的记录 90条持续时间为两个小时的动态心电图记录 23条持续时间从7小时到25小时不等的完整的Holter记录 标签情况 均含有人工标注的心拍注释 均含有人工标注的心拍注释 均含有人工标注的心拍注释 其中有12条记录含有人工标注的心拍注释 储存格式 Format 212 Format 212 Format 212 Format 212 其他 - 大多数记录是在运动压力测试期间记录的 79位受试者 包括18例潜在的窦性心律(4例间歇性起搏),1例持续起搏和4例房颤。所有患者均患有持续性室性快速性心律失常,并且大多数患者有实际的心脏骤停

曾经尝试过的其他数据集

PAF Prediction Challenge Database

数据链接:https://physionet.org/content/afpdb/1.0.0/

一个具有双通道的心电图记录数据库,是the Computers in Cardiology Challenge 2001的挑战赛数据集; 数据集共有50组记录,每一组记录包含双通道的持续时间为30分钟的数据; 但是数据主要关于“心房颤动”疾病。

MIT-BIH Atrial Fibrillation Database

数据链接:https://physionet.org/content/afdb/1.0.0/ 一个具有双通道的心电图记录数据库; 该数据库共有25组记录,是25个长期**心房颤动(主要是阵发性)**人体受试者的心电图记录; 记录以每秒250个样本采样,每条记录持续时间为10小时; 部分数据没有心拍注释。

补充说明:导联方式

常规导联包括:肢体导联和胸壁导联两部分;

肢体导联分为三个标准导联(I、II、III)和三个加压单极导联(aVR、aVL、aVF) 胸壁导联共15个(左边V2-V9;右边V1、V3R-V8R)

由于浅层的卷积神经网络能够提取信号粗粒度的特征,因此不同的导联方式能通过卷积来分开,合并时不需要人为额外处理。

4.数据集的读取 4.1 可视化

PhysioNet提供了一个简单方便的网页版转换工具PhysioBank ATM(https://archive.physionet.org/cgi-bin/atm/ATM),可以直接从各个数据库提取数据,以折线的方式显示数据的真实变动情况。

4.2 python读取 使用WFDB读取数据

WFDB是一个用于读取,写入和处理WFDB信号和注释的工具库;

WFDB 软件包的主要组成是WFDB库,用于信号处理和自动分析的WFDB应用程序,以及用于可视化、注释、波形数据交互式分析的软件WAVE。

该软件包是用高度可移植的C语言编写的,可以在所有流行的平台上使用,包括GNU/Linux,MacOS/ X,MS-Windows,及Unix的所有版本。

功能

对波形和注释进行快速显示

可以快速访问记录的任意位置,提高效率并减少网络流量

进行注释模式向前和向后搜索

可以进行图形化的注释编辑,使用标准的或是用户定义的注释方法

变速叠加显示(如模拟触发式示波器持续性的显示)

对用户选择的信号片段进行高精度打印

极其灵活的控制外部信号处理和分析程序(菜单可以由用户在WAVE运行时重新配置)

远程模式:外部程序,例如网页浏览器能控制WAVE 的显示

提供在线帮助

安装方法 Github(https://github.com/MIT-LCP/wfdb-python)安装:可以直接下载zip包到本地研读一下源码,了解其数据结构。 直接安装:命令行输入 pip install wfdb 读取.hea文件 from IPython.display import display import wfdb record = wfdb.rdheader('mit-bih-arrhythmia-database-1.0.0/100') display(record.__dict__)

读取record数据

使用rdrecord函数,该函数的返回值为一个wfdb中定义的record对象。

def rdrecord(record_name, sampfrom=0, sampto=None, channels=None, physical=True, pb_dir=None, m2s=True, smooth_frames=True, ignore_skew=False, return_res=64, force_channels=True, channel_names=None, warn_empty=False):

常用的重要参数:

record_name : 储存心电信号的路径; sampfrom : 起始位置; sampto : 终止位置; channels :optional,选择读取某个通道的数据,默认读取全部通道;

举例

from IPython.display import display import wfdb record=wfdb.rdrecord('mit-bih-arrhythmia-database-1.0.0/100', ) display(record.__dict__)

几个经常使用的属性值

fs:采样频率; n_sig:信号通道数; sig_len:信号长度; p_signal:模拟信号值,储存形式为ndarray或者是list; d_signal:数字信号值,储存形式为ndarray或者是list。

这些属性都能直接进行访问(如:使用record.fs可以直接读取到采样频率)。

读取.art文件 import wfdb annotation=wfdb.rdann('mit-bih-arrhythmia-database-1.0.0/100', 'atr') display(annotation.__dict__)

其中的symbol为心拍注释(包括了正常类型N和各种异常类型)

常见注释举例

Symbol Description N Normal L Left bundle branch block beat R Right bundle branch block beat V Premature ventricular contraction A Atrial premature contraction I Isolated QRS-like artifact B Left or right bundle branch block 5.数据集的合并

合并目标:每条数据为采样频率360Hz的10s数据片段(即每条记录包含3600个数据点),并对应一个标签(节拍注释)值。

5.0 批量读取数据文件

对数据库中的数据文件进行批量处理

type=[] rootdir = 'mit-bih-arrhythmia-database-1.0.0' # 设置根路径 files = os.listdir(rootdir) #列出文件夹下所有的目录与文件 name_list=[] # name_list=[100,101,...234] MLII=[] # 用MLII型导联采集的人 type={} # 标记及其数量 for file in files: if file[0:3] in name_list: # 根据数据库实际情况调整熟知,这里判断的是每个文件的前三个字符 continue else: name_list.append(file[0:3]) for name in name_list: # 遍历每一个数据文件 if name[0] not in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']: # 跳过无用的文件 continue record = wfdb.rdrecord(rootdir+'/'+name) # 读取一条记录(100),不用加扩展名 5.1 对长度不一的数据处理 由于不同数据库的数据长度不一,若要进行数据合并,需要将这些记录裁剪成统一长度,这里统一裁剪成10s长度的数据; 在rdrecord函数中,通过设置参数sampfrom&sampfrom可以直接读取出相应长度的数据,便于进行后续处理。 f=360 # 根据不同的数据库进行更改 segmented_len=10 # 目标:裁剪成10s的数据片段 label_count=0 count=0 segmented_data = [] # 最后数据集中的X segmented_label = [] # 最后数据集中的Y print('begin!') for person in MLII: k = 0 while (k+1)*f*segmented_len


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3