主要内容

基于深度学习的波形分割

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

介绍

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

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

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

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

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

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

要培训深度神经网络来分类信号区域,您可以使用长短期内存(LSTM)网络。此示例显示了信号预处理技术和时频分析的方式如何用于提高LSTM分段性能。特别是,该示例使用傅立叶同步调节转换来表示ECG信号的非标准行为。

下载并准备数据

105个双通道心电信号由自动化专家系统独立标记并独立处理,共210个心电信号与区域标签一起存储在210个mat -文件中。这些档案可在以下地点获得://www.tatmou.com/金宝appsupportfiles/SPT/data/QTDatabaseECGData.zip

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

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

un操作创建qtdatabaseecgdata.文件夹中有210个mat文件。每个文件包含一个可变的心电信号EcgSignal.和变量中的区域标签表signalRegionLabels.每个文件还包含信号的采样率变量Fs.在该示例中,所有信号都具有250 Hz的采样率。

创建一个信号数据存储来访问文件中的数据。的临时目录中存储了数据集qtdatabaseecgdata.文件夹中。如果不是这样,请更改下面代码中数据的路径。属性指定要从每个文件读取的信号变量名signalvariamblenames.参数。

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"]

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

data =预览(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

使用a可视化前1000个样本的标签signalMask对象。

M = signalMask数据({2});plotsigroi (M,数据{1}(1:1000))

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

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

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

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

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

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

rng默认的[trainidx,〜,testidx] = divierand(numel(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 =变换(TrainDS,@GetMask);testds =变换(testds,@getmask);TransformedData =预览(TrainDS)
transformedData =1×2单元阵列{224993×1 double} {224993×1 categorical}
情节(transformedData {2} (1:1000))

将很长的输入信号传递到LSTM网络会导致估计性能下降和内存占用过多。为了避免这些影响,使用转换后的数据存储和鉴定辅助功能。辅助功能尽可能多为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 = =“下载网络”%下载预先训练的网络dataURL =“https://ssd.mathworks.com/金宝appsupportfiles/SPT/data/QTDatabaseECGSegmentationNetworks.zip”;% #好< * UNRCH >modelsfolder = fullfile(tempdir,'qtdatabaseecgsegationnetworks');modelsfile = fullfile(modelsfolder,'treousnetworks.mat');zipFile = fullfile (tempdir,'qtdatabaseecgseationNetWorks.zip');如果〜存在(型号文件夹,“dir”) websave (zipFile dataURL);解压缩(Zipfile,Fullfile(Tempdir,'qtdatabaseecgsegationnetworks'));结束加载(ModelsFile)结束

下载的网络和新训练的网络之间的结果可能略有不同,因为网络是使用随机初始权值训练的。

将原始ECG信号直接输入到LSTM网络中

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

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

层= [...sequenceInputLayer(1)LSTMLAYER(200,“OutputMode”“序列”) fulllyconnectedlayer (4) softmaxLayer classificationLayer;

选择培训过程的选项,以确保良好的网络性能。参考trainingOptions(深度学习工具箱)每个参数的描述文档。

选择= trainingOptions (“亚当”...“MaxEpochs”10...“MiniBatchSize”, 50岁,...“InitialLearnRate”,0.01,...“LearnRateDropPeriod”,3,...'学习chedule'“分段”...“GradientThreshold”,1,...'plots'“训练进步”...“洗牌”“every-epoch”...'verbose',0,...“DispatchInBackground”,真正的);

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

为培训和测试集创建高阵列。根据您的系统,Matlab创建的并行池中的工人数量可能不同。

tallTrainSet =高(trainDs);
使用“local”配置文件启动并行池(parpool)…连接到并行池(工作人员数量:8)。
tallTestSet =高(testDs);

现在所说的收集高数组的函数,用于计算整个数据集的转换,并获得具有训练和测试信号和标签的单元数组。

trainData =收集(tallTrainSet);
使用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网络对测试数据进行分类分类命令。指定mini批量大小为50以匹配培训选项。

predtest = classify(rawnet,testdata(:,1),“MiniBatchSize”, 50);

混淆矩阵为可视化分类性能提供了直观和翔实的手段。使用confusionchart命令来计算测试数据预测的总体分类精度。对于每个输入,将类别标签的单元格数组转换为行向量。指定列规范化显示,以查看每个类的样本百分比的结果。

ConfusionChart([predtest {:}],[testdata {:,2}],'正常化''列标准化');

使用原始的ECG信号作为输入到网络的输入,只有约60%的T波样品,40%的P波样品,60%的QRS复数样品是正确的。为了提高性能,在输入到深度学习网络之前应用ECG信号特性的一些了解,例如由患者呼吸运动引起的基线徘徊。

采用滤波方法去除基线漂移和高频噪声

三种拍形态占据不同的频段。QRS复相频谱的中心频率通常在10-25 Hz左右,其分量在40 Hz以下。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”“ellip”);%从已转换的数据存储创建高数组并过滤信号tallTrainSet =高(trainDs);tallTestSet =高(testDs);filteredTrainSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTrainSet (: 1),“UniformOutput”、假));
使用Parallel Pool 'local'计算tall表达式

1中通过1:13秒内完成评估14秒内完成
trainLabels =收集(tallTrainSet (:, 2));
使用并行池“本地”评估高表达: -  PASS 1为1:3.6秒评估完成4秒
filteredTestSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTestSet (: 1),“UniformOutput”、假));
使用并行池“本地”评估高表达: -  PASS 1为1:2.4秒评估完成2.5秒
testLabels =收集(tallTestSet (:, 2));
使用平行池“本地”评估高表达: - 通过1:1:在1.9秒评估中完成,在2秒内完成

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

trainData =收集(tallTrainSet);
使用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测量的医生,但网络实际上将从徘徊的去除中受益。

滤波心电信号训练网络

使用与之前相同的网络结构对滤波后的心电信号训练LSTM网络。

如果actionFlag = =“火车网络”filteredNet = trainNetwork (filteredTrainSignals、trainLabels层,选择);结束

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

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

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

predfilteredtest = classify(filterednet,f​​ilteredtestsignals,“MiniBatchSize”, 50);

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

图confusionchart ([predFilteredTest {:}], [testLabels {}):,'正常化''列标准化');

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

心电信号的时频表示

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

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

数据=预览(TrainDS);图FSST(数据{1,1},250,Kaiser(128),“桠溪”的)

在频率范围内计算训练数据集中的每个信号的FSST,[0.5,40] Hz。将FSST的实部和虚部视为单独​​的功能,并将两个组件馈送到网络中。此外,通过减去均值并除以标准偏差来标准化训练特征。使用变换的数据存储,提取物品辅助函数,以及函数并行处理数据。

fsstTrainDs =变换(trainDs @ (x) extractFSSTFeatures (x, 250));fsstTallTrainSet =高(fsstTrainDs);fsstTrainData =收集(fsstTallTrainSet);
使用Parallel Pool 'local'计算tall表达式

- 第1条:1:在2分35秒的评估中完成,在25分35秒内完成

对测试数据重复此步骤。

fsstTTestDs =变换(testDs @ (x) extractFSSTFeatures (x, 250));fsstTallTestSet =高(fsstTTestDs);fsstTestData =收集(fsstTallTestSet);
使用并行池“本地”评估高表达: - 通行证1:1分1分4秒评估完成1分4秒

调整网络体系结构

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

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

指定一个sequenceInputLayer40个输入特性。保持其他网络参数不变。

层= [...sequenceInputLayer (40) lstmLayer (200,“OutputMode”“序列”) fulllyconnectedlayer (4) softmaxLayer classificationLayer;

用心电信号的FSST训练网络

用转换后的数据集训练更新后的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表达式

37秒内完成评估
太= signalMask (testData {1,2} (3000:4000));太。SpecifySelectedCategories = true;太。选择edCategories = find(Mtest.Categories ~=“n / a”);图subplot(2,1,1) plotsigroi(Mtest,testData{1,1}(3000:4000)) title(“地面实况”) Mpred = signalMask(predFsstTest{1}(3000:4000));mpr。SpecifySelectedCategories = true;mpr。SelectedCategories =找到(mpr)。类别~ =“n / a”);子图(2,1,2)plotsigroi(mpred,testdata {1,1}(3000:4000))标题(“预测”的)

结论

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

参考文献

McSharry, Patrick E.等。"产生合成心电图信号的动力学模型"IEEE®论生物医学工程交易。第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。伊万诺夫,罗杰尔G. Mark,Joseph E. Mietus,乔治B.穆迪,涌康彭和H. Eugene Stanley。“Physiobank,PhysioToolkit和PhysioIoneet:复杂生理信号的新研究资源的组成部分。”循环。Vol. 21, No. 2, 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。“用于评估ECG中QT和其他波形间隔的算法的数据库。心脏病学的计算机。Vol.24, 1997, pp. 673-676。

[5]Sörnmo,leif和Pablo Laguna。“心电图(ECG)信号处理。”怀利生物医学工程百科全书,2006.

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

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

也可以看看

职能

相关的话题