主要内容

利用深度学习的波形分割

该示例显示了如何使用经常性深度学习网络和时频分析段分割人体心电图(ECG)信号。

介绍

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

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

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

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

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

本例使用了来自公开可用的QT数据库的心电图信号[3.] [4].该数据由大约15分钟的ECG录制组成,采样率为250 Hz,从总共105名患者中衡量。为了获得每次录音,考官将两个电极放在患者的胸部上的不同位置,导致双通道信号。数据库提供由自动专家系统生成的信号区域标签[2].本例的目的是使用深度学习解决方案,根据样本所在的区域为每个心电信号样本提供一个标签。这种在信号中标记感兴趣区域的过程通常被称为波形分割

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

下载并准备数据

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

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

%下载数据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);结尾

解压缩操作创造了QTDatabaseECGData文件夹中有210个mat文件。每个文件包含一个可变的心电信号ecgSignal以及变量中包含区域标签的表signalRegionLabels.每个文件还包含信号的采样率变量FS..在这个例子中,所有信号的采样率都是250hz。

创建信号数据存储,以访问文件中的数据。此示例假定数据集已存储在临时目录中QTDatabaseECGData文件夹中。如果不是这样,请更改下面代码中数据的路径。属性指定要从每个文件读取的信号变量名SignalVariableNames范围。

SDS = SignalDataStore(DataSetFolder,'signervariamblenames',[“Ecgsignal”“signalRegionLabels”])
SDS =具有属性的信号DataStore:文件:{'/tmp/qtdataset/ecg1.mat';'/tmp/qtdataset/ecg10.mat';'/tmp/qtdataset/ecg100.mat'...和207更多} learstefilesystemroots:[0×0字符串] readsize:1 signalVariaBlenames:[“EcgSignal”“SignalRegionLabels”]

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

data =预览(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个样品的标签使用asignermask.对象。

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

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

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

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

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

网络培训,70%的数据培训并用其余30%进行测试。

为了得到可重复的结果,重置随机数生成器。使用dividerand获取随机索引的函数来破坏文件,以及子集功能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转换区域标签到尺寸标签的掩码等于输入ECG信号的%大小。%% InputCell是一个两个元素单元阵列,其包含ECG信号矢量%和区域标签表。%% OutputCell是一个两个元素单元阵列,其包含与信号相同长度的ECG信号矢量%和一个分类标签向量掩模。%Copyright 2020 MathWorks,Inc.Sig = InputCell {1};Roable = InputCell {2};l =长度(sig);m = signalmask(Roable);%获取分类掩码并在具有重叠掩码= catmask(m,l,'重叠','优先阶段屏幕','prioritylist',[2 1 3]);%将缺失值设置为“n / a”掩码(Ismissing(mask))=“n / a”;OutputCell = {sig,mask}; 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网络会导致估计性能下降和内存占用过多。为了避免这些影响,使用转换后的数据存储和resizeDatahelper函数。helper函数创建尽可能多的5000个样本段,并丢弃剩余的样本。对转换后的数据存储输出的预览显示,第一个心电信号及其标签掩码被分解成5000个样本段。注意,转换后的数据存储的预览只显示了其他数据存储的前8个元素地板(224993/5000)= 44元素单元格数组,如果调用数据存储将会得到这个数组函数。

TrainDS =变换(TrainDS,@ Resizeata);testds =变换(testds,@ resizeata);预览(TrainDS)
ans =8×2个单元阵列{1×5000 double} {1×5000分类} {1×5000 double} {1×5000分类} {1×5000 double} {1×5000分类} {1×5000 double} {1×5000分类} {1×5000 double} {1×5000分类} {1×5000 double} {1×5000分类} {1×5000 double} {1×5000分类} {1×5000 double} {1×5000分类}

选择培训网络或下载预先训练的网络

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

您可以跳过训练步骤,使用下面的选择器下载预先训练过的网络。如果您想在示例运行时训练网络,请选择“训练网络”。如果你想跳过训练步骤,选择“下载网络”和一个包含所有三个预先训练网络的文件rawNetfilteredNet,Fsstnet-将下载到您的临时目录中,其位置由Matlab®指定坦佩尔命令。如果你想把下载的文件放在一个不同的文件夹坦佩尔,请在后续说明中修改目录名称。

ActionFlag =.“列车网络”如果actionFlag = =“下载网络”%下载预先训练的网络dataURL ='https://ssd.mathwands.com/金宝appsupportfiles/spt/data/qtdatabaseecgseationnetworks.zip'%#OK <* verch>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网络。

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

层= [......sequenceInputLayer (1) lstmLayer (200'OutputMode''序列') fulllyconnectedlayer (4) softmaxLayer classificationLayer;

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

选择= trainingOptions ('亚当'......“MaxEpochs”,10,......'迷你atchsize',50,......'italllearnrate', 0.01,......'学习ropperiod'3,......“LearnRateSchedule”'分段'......'gradientthreshold', 1......“阴谋”'培训 - 进步'......'洗牌'“every-epoch”......“详细”,0,......“DispatchInBackground”,真的);

因为整个训练数据集适合于记忆,所以可以使用数据存储函数以并行地转换数据,如果并行计算工具箱™可用,然后将其收集到工作区中。神经网络培训是迭代的。在每次迭代时,数据存储读取来自文件的数据并在更新网络系数之前转换数据。如果数据适合计算机的内存,则将数据导入工作区,使得培训更快,因为数据只读并转换一次。请注意,如果数据不适合内存,则必须将数据存储传递到培训函数中,并且在每个培训时期执行转换。

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

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

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

trainData =收集(tallTrainSet);
使用并行池“本地”评估高表达: - 通过1:在11秒评估中完成的第1条:12秒内完成
TrainData(1,:)
ans =1×2个单元阵列{1×5000 double} {1×5000 categorical}
testdata =聚集(塔塔尔特集);
使用平行池“本地”评估高表达: - 通过1的1:在2.9秒评估中完成3.1秒

列车网络的

使用Trainnetwork.命令来训练LSTM网络。

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

图中的培训准确性和损耗子尺跟踪所有迭代的培训进度。使用原始信号数据,网络正确地将约77%的样本分类为属于P波,QRS复合物,T波或未标记区域“n / a”

分类测试数据

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

predTest =分类(rawNet testData (: 1),'迷你atchsize', 50);

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

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,......“StopbandAttenuation1”,60,“PassbandRipple”, 0.1,“StopbandAttenuation2”,60,......'采样率', 250,'designmethod'“ellip”);%从已转换的数据存储创建高数组并过滤信号tallTrainSet =高(trainDs);tallTestSet =高(testDs);filteredTrainSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTrainSet (: 1),'统一输出',错误的));
使用并行池“本地”评估高表达: - 通过1:0%完整评估0%完成

1中通过1:13秒内完成评估14秒内完成
trainLabels =收集(tallTrainSet (:, 2));
使用Parallel Pool 'local'计算tall表达式
filteredTestSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTestSet (: 1),'统一输出',错误的));
使用Parallel Pool 'local'计算tall表达式
testLabels =收集(tallTestSet (:, 2));
使用Parallel Pool 'local'计算tall表达式

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

trainData =收集(tallTrainSet);
使用平行池“本地”评估高表达: - 通过1:在4秒评估中完成的4.2秒完成
figure subplot(2,1,1) plot(trainData{95,1}(2001:3000)) title(“生”)网格子图(2,1,2)图(FilteredTrainsignals {95}(2001:3000))标题('过滤'网格)

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

用过滤的ECG信号列车网络

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

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

预处理信号将训练精度提高到优于80%。

分类过滤的ECG信号

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

predFilteredTest =分类(filteredNet filteredTestSignals,'迷你atchsize', 50);

可视化分类性能作为混淆矩阵。

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

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

心电信号的时频表示

成功分类时间序列数据分类的常见方法是提取时频特征并将它们馈送到网络而不是原始数据。然后,网络同时跨越时间和频率学习模式[7].

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

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

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

fsstTrainDs =变换(trainDs @ (x) extractFSSTFeatures (x, 250));fsstTallTrainSet =高(fsstTrainDs);fsstTrainData =收集(fsstTallTrainSet);
使用并行池“本地”评估高表达: - 通过1:0%完整评估0%完成

2分35秒完成评估

对测试数据重复此步骤。

fssttttests =变换(testds,@(x)zhotherfsstfeatures(x,250));fssttalltestset = tall(fssttttesds);fssttestdata =收集(fssttalltestset);
使用Parallel Pool 'local'计算tall表达式:- Pass 1 of 1: Completed in 1 min 4 sec

调整网络体系结构

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

大小(fssttraindata {1,1})
ANS =.1×240 5000.

指定一个sequenceInputlayer.40个输入功能。保持其余的网络参数不变。

层= [......SequenceInputLayer(40)LSTMLAYER(200,'OutputMode''序列') fulllyconnectedlayer (4) softmaxLayer classificationLayer;

用ECG信号的FSST列车网络

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

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

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

用FSST对测试数据进行分类

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

predFsstTest =分类(fsstNet fsstTestData (: 1),'迷你atchsize', 50);

可视化分类性能作为混淆矩阵。

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

与原始数据结果相比,使用时间频率表示将T波分类提高约25%,P波分类,QRS复杂分类为30%。

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

testdata =聚集(高(testds));
使用并行池“本地”评估高表达: - 通过1:0%完整评估0%完成

37秒内完成评估
mtest = signalmask(testdata {1,2}(3000:4000));MTEST.SpecifyyElectedCategories = True;mtest.selectedcategories =查找(mtest.Categories〜=“n / a”);图subplot(2,1,1) plotsigroi(Mtest,testData{1,1}(3000:4000)) title(“地面实况”)MPRED =信号掩码(PredFSSTTEST {1}(3000:4000));mpred.specifyyselectedcategories = true;mpred.selectedcategories =查找(mpred.Categories〜=“n / a”);次要情节(2,1,2)plotsigroi (mpr, testData{1 1}(3000:4000))标题(“预测”

结论

该示例显示了信号预处理和时频分析的信号如何提高LSTM波形分段性能。带通滤波和基于傅立叶的同步性调节导致所有输出类的平均改善从55%到约85%。

参考文献

[1] McSharry,Patrick E.等。“一种用于产生合成心电图信号的动态模型。”生物医学工程学报。卷。50,第3,2003,PP。289-294。

[2] Laguna,Pablo,RaimonJané和Pere Caminal。“自动检测多放宽ECG信号中的波边界:使用CSE数据库验证。”计算机和生物医学研究。卷。27,第1,1994,第45-60页。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和其他波形间隔测量算法的数据库。电脑在心脏病。Vol.24, 1997, pp. 673-676。

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

[6] Kohler,B-U.,Carsten Hennig和Reinholt Orglemerister。“软件QRS检测原则。”医学与生物学杂志的IEEE工程.第21卷,第1期,2002年,42-57页。

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

另请参阅

功能

相关的话题