主要内容

基于深度学习的波形分割

这个例子展示了如何使用循环深度学习网络和时频分析分割人体心电图信号。

介绍

可以测量人心中的电活动作为远离基线信号的幅度序列。对于单个正常心跳周期,ECG信号可分为下列节拍形态[1]:

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

  • QRS复合 - 心跳的最大幅度部分

  • T波 - QRS复合物代表心室重新振荡后的小偏转

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

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

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

下载并准备数据

通过自动专家系统独立地标记了105个双通道ECG信号的每个通道,并独立处理,总共210个ECG信号与210个MAT文件中的区域标签一起存储。这些文件可在以下位置提供://www.tianjin-qmedu.com/万博1manbetxsupportfiles/SPT/data/QTDatabaseECGData.zip

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

%下载数据dataul =.'https://www.mathwands.com/万博1manbetxsupportfiles/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.以及变量中包含区域标签的表signalregion标签。每个文件还包含变量中信号的采样率Fs。在该示例中,所有信号都具有250 Hz的采样率。

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

sds = signalDatastore (datasetFolder,“SignalVariableNames”,[“ecgSignal”“signalregionlabels”])
/tmp/QTDataset/ecg1.mat'; /tmp/QTDataset/ecg1.mat';“/ tmp / QTDataset / ecg10.mat”;“/ tmp / QTDataset / ecg100。垫”……} AlternateFileSystemRoots: [0×0 string] ReadSize: 1 SignalVariableNames: ["ecgSignal" "signalRegionLabels"]

每次调用时,该数据存储都会返回一个带有心电信号和区域标签表的双元素单元阵列函数。使用预览函数的数据存储看到,第一个文件的内容是一个22.5万个样本长的心电信号和一个包含3385个区域标签的表。

数据=预览(SDS)
数据=2×1单元阵列{225000×1 double} {3385×2 table}

查看区域标签表的前几行,并观察每个行包含区域限制指数和区域类值(p,t或qrs)。

{2}(数据)
ans =8×2表Roilimits值__________ _____ 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个样品的标签使用asignalMask目的。

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

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

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

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

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

用70%的数据训练网络,用剩下的30%进行测试。

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

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

在该分割问题中,LSTM网络的输入是ECG信号,输出是标签的序列或掩模,其长度与输入信号相同。网络任务是使用所属区域的名称标记每个信号样本。因此,有必要将数据集上的区域标签转换为每个信号样本的一个标签的序列。使用变换的数据存储和GetMask.转换区域标签的辅助函数。这GetMask.函数添加标签类别,“n / a”,以标记不属于任何地区感兴趣的样品。

类型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 double} {224993×1 categorical}
绘图(TransformedData {2}(1:1000))

将非常长的输入信号传递到LSTM网络中可能导致估计性能下降和过度的内存使用情况。为避免这些效果,使用变换的数据存储和它们的相应标签掩模来打破ECG信号及其相应的标签掩模鉴定帮手功能。辅助功能可以创建尽可能多的5000样本段,并丢弃剩余的样本。变换数据存储的输出的预览显示,第一个ECG信号及其标签掩码分为5000样本段。请注意,转换的数据存储的预览仅显示否则的前8个元素地板(224993/5000)= 44元素单元数组,如果我们调用数据存储函数。

trainDs =变换(trainDs @resizeData);testDs =变换(testDs @resizeData);预览(trainDs)
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。

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

actionFlag =“火车网络”;如果ActionFlag ==.“下载网络”%下载预先训练的网络dataul =.'https://ssd.mathwands.com/万博1manbetxsupportfiles/spt/data/qtdatabaseecgseationnetworks.zip';% #好< * UNRCH >modelsfolder = fullfile(tempdir,“QTDatabaseECGSegmentationNetworks”);modelsfile = fullfile(modelsfolder,'treousnetworks.mat');zipfile = fullfile(tempdir,'qtdatabaseecgseationNetWorks.zip');如果〜存在(型号文件夹,'dir') websave (zipFile dataURL);解压缩(zipFile fullfile (tempdir“QTDatabaseECGSegmentationNetworks”));结束加载(ModelsFile)结束

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

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

首先,利用训练数据集的原始心电信号训练LSTM网络。

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

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

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

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

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

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

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

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

traindata =聚集(塔塔特拉特);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 11 sec
: trainData (1)
ans =1×2单元阵列{1×5000双} {1×5000分类}
testData =收集(tallTestSet);
通过1 / 1:在2.9秒内完成

火车网络

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

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

图中的训练精度和损失子图跟踪了所有迭代的训练进度。利用原始信号数据,该网络正确地将大约77%的样本分类为P波、QRS复波、T波或未标记区域“n / a”

分类测试数据

使用培训的LSTM网络对测试数据进行分类分类命令。指定迷你批量大小为50以匹配培训选项。

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

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

ConfusionChart([predtest {:}],[testdata {:,2}],“归一化”'列 - 归一化');

将原始心电信号作为网络的输入,只有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”'stopbandfrequency1', 0.4215,“PassbandFrequency1”,0.5,...“PassbandFrequency2”,40,“StopbandFrequency2”,53.345,...'stopbandattenuation1'现年60岁的'passbandropple',0.1,'stopbandattenuation2'现年60岁的...“SampleRate”, 250,“DesignMethod”'椭圆');%从已转换的数据存储创建高数组并过滤信号塔特拉特赛=高(TrainDS);talltestset = tall(testds);filteredtrainsignals = group(cellfun(@(x)筛选器(hfilt,x),塔特拉洛特(:1),'统一输出'、假));
使用Parallel Pool 'local'计算tall表达式

- 通过1的1:13秒评估完成14秒
Trainlabels =聚集(塔特拉特特(:,2));
使用并行池“本地”评估高表达: -  PASS 1为1:3.6秒评估完成4秒
filteredtestsignals = group(cellfun(@(x)筛选器(hfilt,x),talltestset(:,1),'统一输出'、假));
使用并行池“本地”评估高表达: - 通过1:在2.4秒评估中完成的2.5秒完成
testlabels =聚集(Talltestset(:,2));
使用并行池“本地”评估高表达: -  PASS 1为1:在1.9秒的评估中完成2秒

为典型情况绘制原始和过滤的信号。

traindata =聚集(塔塔特拉特);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 4 sec
图形子图(2,1,1)绘图(TrainData {95,1}(2001:3000))标题(“生”) grid subplot(2,1,2) plot(filteredTrainSignals{95}(2001:3000)) title(“过滤”网格)

尽管滤波信号的基线可能会使用于在医疗设备上用于传统ECG测量的医生,但是该网络实际上将从徘徊的去除中受益。

滤波心电信号训练网络

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

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

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

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

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

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

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

FigumenceChart([predfilteredtest {:}],[testlabels {:}],“归一化”'列 - 归一化');

简单的预处理可使t波分类提高约15%,QRS-complex和p波分类提高约10%。

ECG信号的时频表示

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

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

数据=预览(TrainDS);图FSST(数据{1,1},250,Kaiser(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) extractFSSTFeatures (x, 250));fsstTallTestSet =高(fsstTTestDs);fsstTestData =收集(fsstTallTestSet);
使用并行池“本地”评估高表达: -  PASS 1为1:1分钟内完成4秒评估,在1分4秒内完成

调整网络架构

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

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

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

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

用心电信号的FSST训练网络

使用Transformed DataSet列车更新的LSTM网络。

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

使用时频功能提高了培训精度,现在超过90%。

使用FSST进行分类测试数据

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

predfssttest = classify(fsstnet,f​​ssttestdata(:,1),“MiniBatchSize”,50);

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

ConfusionChart([predfssttest {:}],[fssttestdata {:,2}],“归一化”'列 - 归一化');

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

使用一个signalMask对象将网络预测与地面真相标签进行比较,以获得单个ECG信号。忽略“n / a”绘制感兴趣区域时的标签。

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

- 通过1:37秒评估完成37秒
太= signalMask (testData {1,2} (3000:4000));太。SpecifySelectedCategories = true;太。选择edCategories = find(Mtest.Categories ~=“n / a”);图形子图(2,1,1)plotsigroi(mtest,testdata {1,1}(3000:4000))标题('真相') Mpred = signalMask(predFsstTest{1}(3000:4000));mpr。SpecifySelectedCategories = true;mpr。SelectedCategories =找到(mpr)。类别~ =“n / a”);次要情节(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页。

[3] Goldberger,Ary L.,Luis A. N. Amaral,Leon Glass,Jeffery M. Hausdorff,Plamen Ch。Ivanov,Roger G. Mark,Joseph E. Mietus,George B. Coody,Chung-Kang Peng和H. Eugene Stanley。“Physiobank,PhysioLoolkit和PhysioIoneet:复杂生理信号的新研究资源的组成部分。”循环。卷。101,23,2000,PP。E215-E220。[循环电子页面;http://circ.ahajournals.org/content/101/23/e215.full].

[4] Laguna,Pablo,Roger G. Mark,Ary L. Goldberger和George B. Moody。“一个用于评估心电图QT和其他波形间隔测量算法的数据库。电脑在心脏病。Vol.24,1997,PP。673-676。

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

[6]科勒,B-U。那Carsten Hennig, and Reinhold Orglmeister. "The principles of software QRS detection."医学与生物工程杂志。卷。21,第1,2002,PP。42-57。

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

也可以看看

功能

相关话题