波形分割使用深度学习

这个例子展示了如何段人体心电图(ECG)信号使用反复深入学习网络和时频分析。

介绍

人类心脏的电活动可以测量振幅偏离基线的序列信号。对于一个正常的心跳周期,心电图信号可以分为以下击败形态(1]:

  • P波——一个小挠度在QRS波群代表心房去极化

  • QRS波群——Largest-amplitude部分的心跳

  • 后T波——一个小挠度QRS波群代表心室复极化

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

这个示例使用心电图信号从公开的QT数据库(3][4]。大约15分钟的数据由心电图记录,采样率为250 Hz,测量从共有105名患者。获得每个记录,审查员把两个电极放在不同的位置在一个病人的胸部,导致双通道信号。数据库提供了信号区域标签由一个自动生成专家系统(2]。这个例子的目的是使用一个深度学习解决方案提供一个标签为每个ECG信号样本根据样本所在地区。这个标签的过程感兴趣的区域在一个信号通常被称为波形分割。

训练一个深层神经网络分类信号区域,您可以使用很长一段短期记忆(LSTM)网络。这个例子展示了如何使用信号预处理技术和时频分析改善LSTM分割性能。特别是,示例使用傅里叶synchrosqueezed变换代表ECG信号的非平稳的行为。

下载和准备数据

每个通道的105双通道心电图信号被自动标记为独立专家系统和独立处理,总共210心电图信号存储与该地区在210年mat文件标签。文件可以在以下位置://www.tianjin-qmedu.com/万博1manbetxsupportfiles/SPT/data/QTDatabaseECGData.zip

下载数据文件到临时目录的位置是由MATLAB®的规定tempdir命令。如果你想把数据文件放在不同的文件夹tempdir在随后的指令,改变目录的名字。

%下载数据dataURL =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/SPT/data/QTDatabaseECGData.zip”;datasetFolder = fullfile (tempdir,“QTDataset”);zipFile = fullfile (tempdir,“QTDatabaseECGData.zip”);如果~存在(datasetFolder“dir”)websave (zipFile dataURL);结束%解压数据解压缩(zipFile tempdir)

解压缩操作创建QTDatabaseECGData文件夹在您的临时目录210 mat文件。每个文件包含一个心电图信号变量ecgSignal和地区表标签变量signalRegionLabels。每个文件也包含在变量信号的采样率Fs。在这个例子中所有信号的采样率为250 Hz。

创建一个信号数据存储访问文件中的数据。这个例子假设数据集已经储存在你的临时目录下QTDatabaseECGData文件夹中。如果情况不是这样,改变在下面的代码的路径数据。指定信号变量名称要读取每个文件使用SignalVariableNames参数。

sds = signalDatastore (datasetFolder,“SignalVariableNames”,(“ecgSignal”,“signalRegionLabels”])
sds与属性= signalDatastore:文件:{“/ tmp / QTDataset / ecg1.mat”;“/ tmp / QTDataset / ecg10.mat”;“/ tmp / QTDataset / ecg100。垫”……和207}AlternateFileSystemRoots:[0×0的字符串]ReadSize: 1 SignalVariableNames: [“ecgSignal”“signalRegionLabels”]

双元素单元阵列数据存储返回的ECG信号和一个表区域标签每次调用函数。使用预览数据存储的函数,第一个文件的内容是一个长225000样品ECG信号和一个表包含3385个地区的标签。

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

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

{2}(数据)
ans =8×2表ROILimits价值__________ _____ 83 117 130页153 QRS 201 246 285 319 332页357 QRS 412 457 T QRS 477 507 524页547

可视化标签第一1000样品使用displayWaveformLabelshelper函数。

displayWaveformLabels(数据,真的,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网络是一个心电图信号的输入和输出是一个序列长度相同或标签的面具作为输入信号。网络任务是标签每个信号样本所属地区的名称。由于这个原因,该地区需要变换标签数据集包含一个序列标签/信号样本。使用一个数据存储和转换roi2maskhelper函数将标签。预览转换后的数据存储来观察,它返回一个向量和一个标签向量相等长度的信号。情节的前1000个元素分类掩码向量。的roi2mask函数添加一个标签的类别,n /一个标签样本,不属于任何感兴趣的地区。

trainDs =变换(trainDs @roi2mask);testDs =变换(testDs @roi2mask);transformedData =预览(trainDs)
transformedData =1×2单元阵列{224993×1双}{224993×1分类}
情节(transformedData {2} (1:1000))

经过很长的输入信号到LSTM网络会导致估计性能退化和过度的内存使用。为了避免这些影响,打破ECG信号及其对应的标签面具使用数据存储和转换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分类}

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

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

培训之前定义网络体系结构。指定一个sequenceInputLayer尺寸1接受一维时间序列。指定一个LSTM层的“序列”输出模式为每个样本提供分类的信号。使用200隐藏节点的最优性能。指定一个fullyConnectedLayer的输出尺寸4,一个为每个波形类。添加一个softmaxLayer和一个classificationLayer输出估计标签。

层= [sequenceInputLayer (1) lstmLayer (200“OutputMode”,“序列”)fullyConnectedLayer (4) softmaxLayer classificationLayer];

选择选项训练过程,确保良好的网络性能。指的是trainingOptions文档的每个参数的描述。

选择= trainingOptions (“亚当”,“MaxEpochs”10“MiniBatchSize”,50岁,“InitialLearnRate”,0.01,“LearnRateDropPeriod”3,“LearnRateSchedule”,“分段”,“GradientThreshold”,1“阴谋”,“训练进步”,“洗牌”,“every-epoch”,“详细”0,“DispatchInBackground”,真正的);

因为整个训练数据集适合在内存中,可以使用数据存储的函数并行转换数据,如果并行计算工具箱™可用,然后收集到工作区中。神经网络训练是迭代。在每次迭代中,数据存储从文件中读取数据,并将数据在更新网络系数。如果数据适用于您的计算机的内存,将数据导入到工作区允许更快的训练因为数据读取和改变了只有一次。注意,如果数据不符合在内存中,您必须将数据存储到训练函数,和执行的转换是在每一个培训时代。

创建高数组为训练集和测试集。取决于您的系统,工人在并行池MATLAB创建可能不同。

tallTrainSet =高(trainDs);
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:8)。
tallTestSet =高(testDs);

现在所说的收集高大的数组的函数来计算在整个数据集的转换和获取细胞阵列,并培训和测试信号和标签。

trainData =收集(tallTrainSet);
评估高表达式使用并行池“当地”:通过1对1:0%完成评估0%完成
-通过1对1:在28秒评估完成在28秒完成
:trainData (1)
ans =1×2单元阵列{1×5000双}{1×5000分类}
testData =收集(tallTestSet);
评估高表达式使用并行池“当地”:通过1对1:在9.8秒完成评估在10秒完成

列车网络的

使用trainNetwork命令训练LSTM网络。由于大型数据集的大小,这个过程可能需要几分钟。如果你的机器有GPU并行计算工具箱™,然后用MATLAB自动使用GPU进行训练。否则,它使用CPU。

训练精度和损失次要情节图中所有迭代跟踪培训的进展。正确使用原始信号数据,网络分类约77%的样品属于一个P波,QRS波群、T波,或N / a。

网= trainNetwork (trainData (: 1), trainData(:, 2),层,选项);

分类测试数据

分类使用LSTM网络训练和测试数据分类命令。指定一个mini-batch 50的大小来匹配训练选项。

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

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

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

使用原始ECG信号作为网络的输入,只有约60%的让样本,纵波样本的40%,和60%的qrs波群样品是正确的。提高性能,应用一些知识ECG信号的特点深入学习网络的输入,例如基线的病人的呼吸运动造成的。

过滤方法适用于去除基线漂移和高频噪音

三个击败形态占据不同的频段。QRS波群的光谱通常有一个中心频率在10到25赫兹,和其组件40 Hz以下。P和T-waves出现在更低的频率:纵波分量低于20赫兹,让组件是低于10赫兹(5]。

基线漂移是一种低频(< 0.5 Hz)振荡引起病人的呼吸运动。这个振荡是独立于击败形态和不提供有意义的信息6]。

设计一个带通滤波器的通带频率范围(0.5,40)赫兹移除漫步和任何高频噪音。删除这些组件提高LSTM训练,因为网络不学习无关的特性。使用cellfun在高数据单元并行阵列来过滤数据集。

%带通滤波器设计hFilt = designfilt (“bandpassiir”,“StopbandFrequency1”,0.4215,“PassbandFrequency1”,0.5,“PassbandFrequency2”现年40岁的“StopbandFrequency2”,53.345,“StopbandAttenuation1”现年60岁的“PassbandRipple”,0.1,“StopbandAttenuation2”现年60岁的“SampleRate”,250,“DesignMethod”,“ellip”);%从转换后的数据存储和过滤创建高阵列信号tallTrainSet =高(trainDs);tallTestSet =高(testDs);filteredTrainSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTrainSet (: 1),“UniformOutput”、假));
评估高表达式使用并行池“当地”:通过1对1:0%完成评估0%完成
-通过1对1:19秒评估完成于19秒完成
trainLabels =收集(tallTrainSet (:, 2));
评估高表达式使用并行池“当地”:通过1对1:19秒评估完成于19秒完成
filteredTestSignals =收集(cellfun (@ (x)过滤器(hFilt x), tallTestSet (: 1),“UniformOutput”、假));
评估高表达式使用并行池“当地”:通过1对1:在8.5秒完成评估在8.6秒完成
testLabels =收集(tallTestSet (:, 2));
评估高表达式使用并行池“当地”:通过1对1:在8.3秒完成评估在8.5秒完成

情节的原始和过滤信号的典型案例。

trainData =收集(tallTrainSet);
评估高表达式使用并行池“当地”:通过1对1:19秒评估完成于19秒完成
图次要情节(2,1,1)情节(trainData{1} 95年(2001:3000))标题(“生”)网格次要情节(2,1,2)情节(filteredTrainSignals{95}(2001:3000))标题(“过滤”网格)

列车网络过滤ECG信号

火车LSTM网络过滤后的心电图信号使用相同的网络体系结构。

filteredNet = trainNetwork (filteredTrainSignals、trainLabels层,选择);

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

过滤后的心电图信号进行分类

分类与更新的LSTM预处理测试数据网络。

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

想象作为一个混淆矩阵的分类性能。

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

简单预处理改善让分类约15%,和10%的qrs波群的分类。纵波分类精度并没有改变。

心电信号的时频表示

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

傅里叶synchrosqueezed变换(FSST)计算每个信号的频谱样品这是理想的分割问题,我们需要保持原始信号的时间分辨率。使用fsst函数检查变换训练的信号。指定一个Kaiser窗长度128提供足够的频率分辨率。

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

计算每个信号的FSST训练数据集在感兴趣的频率范围内,0.5,40 Hz。治疗FSST的实部和虚部作为独立的特性和饲料这两个组件在网络。此外,规范培训功能减去均值和除以标准差。使用一个转换数据存储,extractFSSTFeatures辅助功能,并行处理数据的函数。

fsstTrainDs =变换(trainDs @ (x) extractFSSTFeatures (x, 250));fsstTallTrainSet =高(fsstTrainDs);fsstTrainData =收集(fsstTallTrainSet);
评估高表达式使用并行池“当地”:通过1对1:0%完成评估0%完成
-通过1的1:完成2分35秒评价在2分35秒完成

对测试数据重复这个过程。

fsstTTestDs =变换(testDs @ (x) extractFSSTFeatures (x, 250));fsstTallTestSet =高(fsstTTestDs);fsstTestData =收集(fsstTallTestSet);
评估高表达式使用并行池“当地”:通过1对1:在1分23秒内完成评估在1分23秒内完成

调整网络体系结构

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

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

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

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

列车网络的FSST ECG信号

培训更新LSTM网络与转换后的数据集。

fsstNet = trainNetwork (fsstTrainData (: 1), fsstTrainData(:, 2),层,选项);

使用时频特性提高了训练精度,目前已超过90%。

分类与FSST测试数据

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

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

想象作为一个混淆矩阵的分类性能。

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

使用时频表示改善让分类约20%,p波分类约40%,相比和qrs波群分类30%,原始数据的结果。

使用displayWaveformLabelshelper函数比较网络预测地面实况标签为单个ECG信号。

testData =收集(高(testDs));
评估高表达式使用并行池“当地”:通过1对1:在8.3秒完成评估在8.5秒完成
图次要情节(2,1,1)displayWaveformLabels ({testData {1 1} (3000:4000) testData {1,2} (3000:4000)}, false)标题(“地面实况”次要情节(2,1,2)displayWaveformLabels ({testData {1 1} (3000:4000) predFsstTest {1} (3000:4000)}, false)标题(“预测”)

结论

这个例子展示了信号预处理和时频分析可以提高LSTM波形分割性能。带通滤波和Fourier-based synchrosqueezing导致平均改善所有输出类从55%到85%左右。

引用

[1]创造帕特里克·E。,等。“生成合成动力学模型心电图信号。”在生物医学工程IEEE®事务。50卷,3号,2003年,页289 - 294。

[2]拉古纳,巴勃罗,Raimon简,Pere Caminal。“自动波边界的检测多引入线的心电图信号:与CSE数据库验证。”计算机和生物医学研究。1号卷。27日,1994年,45 - 60页。

[3]不氩L。,Luis A. N. Amaral, Leon Glass, Jeffery M. Hausdorff, Plamen Ch. Ivanov, Roger G. Mark, Joseph E. Mietus, George B. Moody, Chung-Kang Peng, and H. Eugene Stanley. "PhysioBank, PhysioToolkit, and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals."循环。2000年101卷,不。23日,pp. e215-e220。(循环电子页;http://circ.ahajournals.org/content/101/23/e215.full]。

[4]拉古纳,巴勃罗,罗杰·g·马克,必要l . Goldberger和乔治·b·穆迪。”数据库的评价算法测量心电图QT和其他波形的间隔。电脑在心脏病。1997年第5期,第673 - 676页。

[5]Sornmo、列夫和巴勃罗·拉古纳。“心电图(ECG)信号处理”。威利的百科全书,生物医学工程,2006年。

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

[7]班子、贾斯汀和胡安-帕布鲁贝罗。“卷积神经网络和数据增加环境声音分类。”IEEE信号处理信件。3号卷。24日,2017年,页279 - 283。

另请参阅

功能

相关的话题