主要内容

基于深度学习的波形分割

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

介绍

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

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

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

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

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

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

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

下载并准备数据

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

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

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

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

创建一个信号数据存储来访问文件中的数据。的临时目录中存储了数据集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个区域标签的表。

data =预览(sds)
data =2×1单元阵列{225000×1 double} {3385×2 table}

查看区域标签表的前几行,观察每一行包含区域限制索引和区域类值(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个样品的标签使用asignalMask对象

M=信号掩码(数据{2});plotsigroi(M,数据{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网络的输入是一个心电信号,输出是一个与输入信号长度相同的标签序列或掩码。网络的任务是给每个信号样本贴上它所属区域的名称。因此,需要将数据集上的区域标签转换为每个信号样本包含一个标签的序列。使用转换后的数据存储和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)
转换数据=1×2单元阵列{224993×1 double} {224993×1 categorical}
绘图(转换数据{2}(1:1000))

将很长的输入信号传递到LSTM网络可能会导致估计性能下降和内存过度使用。为避免这些影响,请使用转换后的数据存储和resizeDatahelper函数。helper函数创建尽可能多的5000个样本段,并丢弃剩余的样本。对转换后的数据存储输出的预览显示,第一个心电信号及其标签掩码被分解成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。

您可以跳过培训步骤,并使用下面的选择器下载预培训的网络。如果要按照示例运行来培训网络,请选择“培训网络”。如果要跳过培训步骤,请选择“下载网络”和包含所有三个预培训网络的文件-rawNetfilteredNetfsstNet -将被下载到您的临时目录,其位置由MATLAB®的tempdir命令。如果你想把下载的文件放在一个不同的文件夹tempdir,在后续说明中更改目录名。

actionFlag =“列车网络”如果行动旗==“下载网络”%下载预先训练的网络数据URL='https://ssd.mathworks.com/金宝appsupportfiles/SPT/data/QTDatabaseECGSegmentationNetworks.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网络

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

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

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

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

选项=培训选项(“亚当”...“MaxEpochs”10...“MiniBatchSize”, 50岁,...“InitialLearnRate”, 0.01,...“LearnRateDropPeriod”3,...“LearnRateSchedule”“分段”...“GradientThreshold”,1,...“阴谋”“训练进步”...“洗牌”“每个时代”...“详细”0,...“调度背景”,真正的);

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

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

tallTrainSet =高(trainDs);
正在使用“本地”配置文件启动并行池(parpool)。。。已连接到并行池(工作进程数:8)。
tallTestSet=高(testDs);

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

列车数据=采集(TALLTRANSET);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 11 sec
: trainData (1)
ans =1×2单元阵列{1×5000 double} {1×5000 categorical}
testData =收集(tallTestSet);
通过1 / 1:在2.9秒内完成

列车网络的

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

如果行动旗==“列车网络”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}),“归一化”“column-normalized”);

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

应用滤波方法消除基线漂移和高频噪声

三种搏动形态占据不同的频带。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,...“StopBandattentiation1”现年60岁的“PassbandRipple”, 0.1,“StopbandAttenuation2”现年60岁的...“SampleRate”, 250,“DesignMethod”“埃利普”);%从已转换的数据存储创建高数组并过滤信号tallTrainSet=tall(Trands);tallTestSet=tall(testDs);filteredTrainSignals=gather(cellfun)(@(x)过滤器(hFilt,x),tallTrainSet(:,1),“UniformOutput”、假));
使用Parallel Pool 'local'计算tall表达式

-通过1/1:在13秒内完成评估在14秒内完成
trainLabels=聚集(tallTrainSet(:,2));
使用Parallel Pool 'local'计算tall表达式
filteredTestSignals=gather(cellfun(@(x)filter(hFilt,x)),tallTestSet(:,1),“UniformOutput”、假));
使用Parallel Pool 'local'计算tall表达式
testLabels=gather(tallTestSet(:,2));
使用Parallel Pool 'local'计算tall表达式

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

列车数据=采集(TALLTRANSET);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 4 sec
figure subplot(2,1,1) plot(trainData{95,1}(2001:3000)) title(“生”) grid subplot(2,1,2) plot(filteredTrainSignals{95}(2001:3000)) title(“过滤”网格)

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

滤波心电信号训练网络

使用与之前相同的网络架构,对过滤后的ECG信号进行LSTM网络培训。

如果行动旗==“列车网络”filteredNet=列车网络(filteredTrainSignals、列车标签、图层、选项);结束

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

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

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

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

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

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

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

心电信号的时频表示

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

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

data =预览(trainDs);{1 1}图fsst(数据,250年,凯撒(128),“亚克斯”

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

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

2分35秒完成评估

对测试数据重复此步骤。

fsstTTestDs =变换(testDs @ (x) extractFSSTFeatures (x, 250));fsstTallTestSet =高(fsstTTestDs);fsstTestData =收集(fsstTallTestSet);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 1 min 4 sec

调整网络体系结构

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

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

指定一个序列输入层40个输入特性。保持其他网络参数不变。

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

用心电信号的FSST训练网络

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

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

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

用FSST对测试数据进行分类

使用更新的LSTM网络和提取的FSST特征,对测试数据进行分类。

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

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

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

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

使用一个signalMask目的对单个心电信号的网络预测与地面真值标签进行比较。忽略了“n / a”打印感兴趣区域时使用标签。

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

-通过1/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页。

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:复杂生理信号新研究资源的组成部分”循环。Vol. 21, No. 2, 2000, pp. e215-e220。(循环电子页;http://circ.ahajournals.org/content/101/23/e215.full].

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

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

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

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

另请参阅

功能

相关话题