主要内容

基于深度学习的波形分割

这个例子展示了如何使用递归深度学习网络和时频分析来分割人体心电图(ECG)信号。

介绍

人类心脏的电活动可以测量为远离基线信号的一系列振幅。对于一个正常的心跳周期,心电信号可以分为以下的拍形态[1]:

  • P波- QRS复合体前的小偏转,代表心房去极化

  • QRS波群-心跳的最大振幅部分

  • T波-代表心室复极的QRS波群后的小偏转

心电图波形的这些区域的分割可以为评估人类心脏的整体健康和异常的存在提供有用的测量基础[2]. 手动注释ECG信号的每个区域可能是一项乏味而耗时的任务。信号处理和深度学习方法可能有助于简化和自动化感兴趣区域注释。

本例使用了来自公开可用的QT数据库的心电图信号[3.] [4].这些数据包括大约15分钟的心电图记录,抽样频率为250赫兹,共测量了105名患者。为了获得每一个记录,检查人员将两个电极放置在病人胸部的不同位置,产生一个双通道信号。该数据库提供由自动专家系统生成的信号区域标签[2]. 本示例旨在使用深度学习解决方案,根据样本所在区域为每个ECG信号样本提供标签。在信号中标记感兴趣区域的过程通常称为波形分割

要训练深度神经网络对信号区域进行分类,可以使用长短期记忆(LSTM)网络。这个例子展示了如何利用信号预处理技术和时频分析来提高LSTM分割性能。特别地,该示例使用傅立叶同步压缩变换来表示心电信号的非平稳行为。

下载并准备数据

105个双通道ECG信号中的每个通道由自动专家系统独立标记,并独立处理,总共210个ECG信号与区域标签一起存储在210个MAT文件中。这些文件位于以下位置://www.tatmou.com/金宝appsupportfiles/SPT/data/QTDatabaseECGData.zip

下载数据文件到您的临时目录,其位置由MATLAB®指定坦普迪尔命令。如果要将数据文件放在不同的文件夹中坦普迪尔,更改后续指令中的目录名称。

%下载数据dataul =.'//www.tatmou.com/金宝appsupportfiles/SPT/data/QTDatabaseECGData1.zip';datasetFolder = fullfile (tempdir,“QTDataset”);zipfile = fullfile(tempdir,“QTDatabaseECGData.zip”);如果〜存在(DataSetFolder,“dir”) websave (zipFile dataURL);解压缩(zipFile tempdir);结束

解压缩操作创建QTDatabaseECGData临时目录中的文件夹,其中包含210个mat文件。每个文件包含变量中的ECG信号ecgSignal以及变量中包含区域标签的表信号区域标签. 每个文件还包含变量中信号的采样率Fs.在这个例子中,所有信号的采样率都是250hz。

创建一个信号数据存储来访问文件中的数据。的临时目录中存储了数据集QTDatabaseECGData文件夹。如果不是这种情况,请将以下代码中的数据的路径更改为下面的数据。指定要使用每个文件读取的信号变量名称使用SignalVariableNames参数

sds = signalDatastore (datasetFolder,“信号变量名称”,[“ecgSignal”“信号区域标签”])
sds=具有以下属性的信号数据存储:文件:{'/tmp/QTDataset/ecg1.mat';'/tmp/QTDataset/ecg10.mat';'/tmp/QTDataset/ecg100.mat'。。。还有207个}AlternateFileSystemRoots:[0×0字符串]ReadSize:1 SignalVariableNames:[“ecgSignal”“signalRegionLabels”]

每次您调用功能。使用预览函数的数据存储看到,第一个文件的内容是一个22.5万个样本长的心电信号和一个包含3385个区域标签的表。

数据=预览(sds)
data =2×1单元阵列{225000×1双表}{3385×2表}

查看区域标签表的前几行,观察每一行都包含区域限制指数和区域类别值(P、T或QRS)。

标题(数据{2})
ans =8×2表rolimitits Value __________ _____ 83 117 P 130 153 QRS 201 246 T 285 319 P 332 357 QRS 412 457 T 477 507 P 524 547 QRS

可视化前1000个样品的标签使用a信号屏蔽目的。

m = signalmask(数据{2});plotsigroi(m,data {1}(1:1000))

通常的机器学习分类程序如下:

  1. 将数据库划分为培训和测试数据集。

  2. 使用训练数据集训练网络。

  3. 使用培训的网络对测试数据集进行预测。

使用70%的数据对网络进行训练,并使用剩余的30%进行测试。

为了得到可重复的结果,重置随机数生成器。使用分开函数获取随机索引以洗牌文件,以及子集的函数信号数据存储将数据划分为训练和测试数据存储。

RNG.违约[trainIdx ~, testIdx] = dividerand(元素个数(sds.Files), 0.7, 0, 0.3);trainDs =子集(sds、trainIdx);testDs =子集(sds、testIdx);

在这个分割问题中,LSTM网络的输入是一个心电信号,输出是一个与输入信号长度相同的标签序列或掩码。网络的任务是给每个信号样本贴上它所属区域的名称。因此,需要将数据集上的区域标签转换为每个信号样本包含一个标签的序列。使用转换后的数据存储和getmask用于变换区域标签的辅助函数。这个getmask函数添加标签类别,“不适用”,以标记不属于任何地区感兴趣的样品。

类型getmask.m
函数outputCell = getmask(inputCell) % getmask将区域标签转换为与输入心电信号的%大小相等的标签掩码。% % inputCell是一个包含心电信号向量%和区域标签表的二元单元阵列。% % outputCell是一个包含心电信号向量%和与信号长度相同的分类标签向量掩码的二元单元阵列。% Copyright 2020 The MathWorks, Inc. sig = inputCell{1};roiTable = inputCell {2};L =长度(团体);M = signalMask (roiTable);%获取分类掩码,当有重叠掩码时给QRS区域优先级= catmask(M,L,'OverlapAction',' priorities bylist ','PriorityList',[2 1 3]);%设置缺失值为"n/a"掩码(ismissing(mask)) = "n/a";outputCell ={团体,面膜}; end

预览转换后的数据存储,可以看到它返回长度相等的信号向量和标签向量。绘制类别掩码向量的前1000个元素。

trainDs = transform(trainDs, @getmask);testDs = transform(testDs, @getmask);transformedData =预览(trainDs)
变换Data =1×2单元阵列{224993×1双}{224993×1分类}
绘图(TransformedData {2}(1:1000))

将非常长的输入信号传递到LSTM网络中可能导致估计性能下降和过度的内存使用情况。为避免这些效果,使用变换的数据存储和它们的相应标签掩模来打破ECG信号及其相应的标签掩模resizeDatahelper函数。helper函数创建尽可能多的5000个样本段,并丢弃剩余的样本。对转换后的数据存储输出的预览显示,第一个心电信号及其标签掩码被分解成5000个样本段。注意,转换后的数据存储的预览只显示了其他数据存储的前8个元素地板(224993/5000)=44个元素的单元格数组,如果调用数据存储,则会产生该数组函数。

trands=变换(trands,@resizeData);testDs=transform(testDs,@resizeData);预览(列车)
ans =8×2单元阵列{1×5000双}{1×5000分类}{1×5000双}{1×5000分类}{1×5000双}{1×5000分类}{1×5000双}{1×5000分类}{1×5000双}{1×5000分类}{1×5000双}{1×5000分类}{1×5000双}{1×5000分类}{1×5000双}{1×5000分类}

选择训练网络或下载预训练网络

此示例的下一部分比较三种不同的方法来训练LSTM网络。由于数据集的大尺寸,每个网络的培训过程可能需要几分钟。如果您的机器具有GPU和并行计算工具箱™,则Matlab会自动使用GPU进行更快的培训。否则,它使用CPU。

您可以使用下面的选择器跳过训练步骤并下载预培训的网络。如果要将网络培训为示例运行,请选择“火车网络”。如果要跳过培训步骤,请选择“下载网络”和包含所有三个预先训练网络的文件 -rawNetfilteredNet, 和fsstNet-将被下载到您的临时目录,其位置由MATLAB®的坦普迪尔命令。如果你想把下载的文件放在一个不同的文件夹坦普迪尔,更改后续指令中的目录名称。

actionFlag =“列车网络”如果ActionFlag ==.“下载网络”%下载预先训练的网络dataul =.'https://ssd.mathwands.com/金宝appsupportfiles/spt/data/qtdatabaseecgseationnetworks.zip'%#好的<*UNRCH>modelsFolder = fullfile (tempdir,“QTDatabaseECGSegmentationNetworks”);modelsFile = fullfile (modelsFolder,“trainedNetworks.mat”);zipfile = fullfile(tempdir,“QTDatabaseECGSegmentationNetworks.zip”);如果~存在(modelsFolder“dir”) websave (zipFile dataURL);解压缩(zipFile fullfile (tempdir“QTDatabaseECGSegmentationNetworks”));结束加载(modelsFile)结束

由于使用随机初始权重,所下载的网络和新培训的网络之间的结果可能略有不同。

直接将原始心电信号输入LSTM网络

首先,使用训练数据集中的原始ECG信号训练LSTM网络。

在培训前定义网络架构。指定A.sequenceInputlayer.以接受一维时间序列。属性指定一个LSTM层“序列”输出模式,为信号中的每个样本提供分类。使用200个隐藏节点以获得最佳性能。指定一个fullyConnectedLayer输出大小为4,每个波形类一个。添加一个softmaxLayerA.分类层输出估计的标签。

层= [...sequenceInputLayer (1) lstmLayer (200“输出模式”“序列”)全连接层(4)SoftMaxLayer分类层];

为培训过程选择确保良好网络性能的选项。指的是培训选项(深度学习工具箱)用于描述每个参数的描述。

选项=培训选项(“亚当”...'maxepochs',10,...“MiniBatchSize”, 50岁,...“InitialLearnRate”, 0.01,...'学习ropperiod'3,...“LearnRateSchedule”“分段”...“GradientThreshold”, 1...“阴谋”“培训进度”...“洗牌”'每个时代'...“详细”0,...'disparctinbackground',对);

因为整个训练数据集适合于记忆,所以可以使用函数来并行转换数据(如果parallel Computing Toolbox™可用),然后将其收集到工作区中。神经网络训练是迭代的。在每次迭代中,数据存储从文件中读取数据,并在更新网络系数之前转换数据。如果数据与计算机的内存匹配,那么将数据导入工作空间可以加快训练速度,因为数据只被读取和转换一次。注意,如果数据不能装入内存,则必须将数据存储传递给训练函数,并在每个训练阶段执行转换。

为训练集和测试集创建高数组。根据您的系统,MATLAB创建的并行池中工作人员的数量可能不同。

塔特拉特赛=高(TrainDS);
使用“本地”配置文件启动并行池(Parpool)连接到并行池(工人数:8)。
talltestset = tall(testds);

现在打电话给收集高阵列的功能来计算整个数据集上的变换,并使用训练和测试信号和标签获取单元格阵列。

traindata =聚集(塔塔特拉特);
使用并行池“local”计算tall表达式:-通过1/1:在11秒内完成计算在12秒内完成
: trainData (1)
ans =1×2单元阵列{1×5000 double} {1×5000 categorical}
testData =收集(tallTestSet);
通过1 / 1:在2.9秒内完成

列车网络的

使用trainNetwork命令来训练LSTM网络。

如果ActionFlag ==.“列车网络”rawNet = trainNetwork (trainData (: 1), trainData(:, 2),层,选项);结束

图中的训练精度和损失子批次跟踪所有迭代的训练进度。使用原始信号数据,网络将约77%的样本正确分类为P波、QRS波群、T波或未标记区域“不适用”

分类测试数据

使用训练的LSTM网络和分类命令。指定小批量大小为50,以匹配培训选项。

predTest =分类(rawNet testData (: 1),“MiniBatchSize”,50);

混淆矩阵提供了直观和信息的手段来可视化分类性能。使用混淆图命令计算测试数据预测的整体分类准确性。对于每个输入,将小组阵列的分类标签转换为行向量。指定列标准化的显示,以将结果视为每个类的样本百分比。

confusionchart ([predTest{:}]、[testData {: 2}),“归一化”“column-normalized”);

将原始心电信号作为网络的输入,只有60%的t波样本、40%的p波样本和60%的qrs复波样本是正确的。为了提高性能,在输入深度学习网络之前,应用一些心电信号特征的知识,例如患者呼吸运动引起的基线漂移。

应用过滤方法以删除基线漫游和高频噪声

三个节拍形态占据不同的频段。QRS复合物的光谱通常具有约10-25Hz的中心频率,其组件低于40Hz。p和t波发生在较低的频率下:p波分量低于20 hz,t波组分低于10 hz [5].

基线漂移是由患者呼吸运动引起的低频(< 0.5 Hz)振荡。这种振荡与拍频形态无关,不提供有意义的信息[6].

设计一个通频带范围为[0.5,40]Hz的带通滤波器,以消除漂移和任何高频噪声。去除这些成分可以改善LSTM训练,因为网络不会学习不相关的特征。使用cellfun在高数据单元格阵列上以并行过滤数据集。

%带通滤波器设计hFilt = designfilt (“bandpassiir”“阻带频率1”, 0.4215,“PassbandFrequency1”, 0.5,...“PassbandFrequency2”,40,“StopbandFrequency2”, 53.345,...'stopbandattenuation1'现年60岁的“PassbandRipple”, 0.1,“StopbandAttenuation2”现年60岁的...“采样器”, 250,“设计方法”'椭圆');%从转换后的数据存储中创建高阵列并过滤信号塔特拉特赛=高(TrainDS);talltestset = tall(testds);filteredtrainsignals = group(cellfun(@(x)筛选器(hfilt,x),塔特拉洛特(:1),'统一输出',假);
使用Parallel Pool 'local'计算tall表达式

- 通过1的1:13秒评估完成14秒
Trainlabels =聚集(塔特拉特特(:,2));
使用Parallel Pool 'local'计算tall表达式
filteredtestsignals = group(cellfun(@(x)筛选器(hfilt,x),talltestset(:,1),'统一输出',假);
使用Parallel Pool 'local'计算tall表达式
testlabels =聚集(Talltestset(:,2));
使用Parallel Pool 'local'计算tall表达式

绘制一个典型案例的原始和过滤信号。

traindata =聚集(塔塔特拉特);
使用并行池“local”评估tall表达式:-通过1/1:在4秒内完成评估在4.2秒内完成
figure subplot(2,1,1) plot(trainData{95,1}(2001:3000)) title(“生”) grid subplot(2,1,2) plot(filteredTrainSignals{95}(2001:3000)) title(“过滤”网格)

尽管过滤信号的基线可能会让医生感到困惑,因为医生习惯于在医疗设备上进行传统的心电图测量,但网络实际上将受益于移动的移除。

滤波心电信号训练网络

使用与以前相同的网络架构一起在过滤的ECG信号上列车。

如果ActionFlag ==.“列车网络”filterednet = trainnetwork(FilteredTrateIngals,trainlabels,图层,选项);结束

对信号进行预处理后,训练准确率达到80%以上。

对滤波后的心电信号进行分类

用更新后的LSTM网络对预处理后的测试数据进行分类。

predFilteredTest =分类(filteredNet filteredTestSignals,“MiniBatchSize”,50);

将分类性能可视化为一个混淆矩阵。

figure confusionchart([predFilteredTest{:}],[testLabels{:}],“归一化”“column-normalized”);

简单的预处理将T波分类提高约15%,QRS波群和P波分类提高约10%。

ECG信号的时频表示

时间序列数据成功分类的常用方法是提取时频特征,并将其输入网络,而不是原始数据。然后网络同时学习时间和频率上的模式[7].

傅里叶同步压缩变换(FSST)为每个信号样本计算一个频谱,所以它是理想的分割问题,我们需要保持与原始信号相同的时间分辨率。使用fsst函数检查其中一个训练信号的转换。指定长度为128的Kaiser窗口,以提供足够的频率分辨率。

data =预览(trainDs);{1 1}图fsst(数据,250年,凯撒(128),'yaxis'

计算训练数据集中每个信号在感兴趣的频率范围[0.5,40]Hz上的FSST。将FSST的实部和虚部作为单独的特征,并将它们都输入到网络中。此外,通过减去平均值并除以标准差来标准化训练特征。使用已转换的数据存储extractFSSTFeatures辅助函数,以及函数并行处理数据。

fssttrainds =变换(trainds,@(x)提取物fsstfeatures(x,250));fssttalltrainset = tall(fssttrainds);fssttraindata =聚集(fssttalltrainset);
使用Parallel Pool 'local'计算tall表达式

2分35秒完成评估

重复测试数据的过程。

fsstTTestDs=转换(testDs,@(x)提取fsstfeatures(x250));fsstTallTestSet=高(fsstTTestDs);fsstTestData=gather(fsstTallTestSet);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 1 min 4 sec

调整网络架构

修改LSTM体系结构,使网络接受每个样本的频谱,而不是单个值。检查FSST的大小,查看频率的数量。

大小(fsstTrainData{1,1})
ans =1×240 5000

指定A.sequenceInputlayer.40个输入特性。保持其他网络参数不变。

层= [...sequenceInputLayer(40)lstmLayer(200,“输出模式”“序列”)全连接层(4)SoftMaxLayer分类层];

用心电信号的FSST训练网络

使用转换后的数据集训练更新后的LSTM网络。

如果ActionFlag ==.“列车网络”fsstNet = trainNetwork (fsstTrainData (: 1), fsstTrainData(:, 2),层,选项);结束

使用时频特征提高了训练的准确率,目前已超过90%。

用FSST对测试数据进行分类

使用更新的LSTM网络并提取了FSST功能,对测试数据进行分类。

predFsstTest =分类(fsstNet fsstTestData (: 1),“MiniBatchSize”,50);

将分类性能可视化为一个混淆矩阵。

混淆图([predfsttest{:}],[fsstTestData{:,2}],“归一化”“column-normalized”);

与原始数据结果相比,使用时频表示可将t波分类提高约25%,p波分类提高约40%,qrs复合分类提高30%。

使用一个信号屏蔽目的对单个心电信号的网络预测与地面真值标签进行比较。忽略了“不适用”绘制感兴趣区域时的标签。

testData=聚集(高度(testDs));
使用Parallel Pool 'local'计算tall表达式

- 通过1:37秒评估完成37秒
太= signalMask (testData {1,2} (3000:4000));太。SpecifySelectedCategories = true;太。挑选edCategories = find(Mtest.Categories ~=“不适用”);图形子图(2,1,1)plotsigroi(mtest,testdata {1,1}(3000:4000))标题(“基本事实”)Mpred=信号掩码(predfsttest{1}(3000:4000));Mpred.SpecifySelectedCategories=true;Mpred.SelectedCategories=查找(Mpred.Categories~=“不适用”);次要情节(2,1,2)plotsigroi (mpr, testData{1 1}(3000:4000))标题('预料到的'

结论

本例说明了信号预处理和时频分析如何提高LSTM波形分割性能。带通滤波和基于傅里叶的同步压缩使所有输出类别的平均改善率从55%提高到85%左右。

工具书类

McSharry, Patrick E.等。"产生合成心电图信号的动力学模型"生物医学工程学报。第50卷第3期,2003年,289-294页。

[2]拉古纳,巴勃罗,雷蒙Jané,还有佩雷·卡米纳尔。多导联心电图信号的波边界自动检测:CSE数据库验证计算机和生物医学研究。第27卷,第1期,1994年,45-60页。

Goldberger, Ary L., Luis A. N. Amaral, Leon Glass, Jeffery M. Hausdorff, Plamen Ch. Ivanov, Roger G. Mark, Joseph E. miietus, George B. Moody, Chung-Kang Peng,和H. Eugene Stanley。“PhysioBank, PhysioToolkit和PhysioNet:复杂生理信号新研究资源的组成部分”循环。第101卷,第23期,2000年,第e215-e220页[发行电子版;http://circ.ahajournals.org/content/101/23/e215.full].

[4]拉古纳、巴勃罗、罗杰·g·马克、阿里·l·戈德伯格和乔治·b·穆迪。”一个用于评估心电图QT和其他波形间隔测量算法的数据库。电脑在心脏病。Vol.24,1997,PP。673-676。

[5] Sörnmo, Leif和Pablo Laguna。“心电图信号处理”。生物医学工程的Wiley百科全书,2006.

[6] 科勒、B-U、卡斯滕·亨尼格和莱因霍尔德·奥格梅斯特。”软件QRS检测原理。”IEEE医学和生物学工程杂志.第21卷,第1期,2002年,42-57页。

Salamon, Justin和Juan Pablo Bello。“用于环境声音分类的深度卷积神经网络和数据增强。”IEEE信号处理信件。第24卷,第3期,2017年,279-283页。

另请参阅

功能

相关话题