主要内容

人类健康监测使用连续波雷达和深度学习

这个例子展示了如何重构心电图(ECG)信号通过连续波(CW)雷达信号使用深度学习神经网络。

雷达是目前用于生命体征监测。这种方法提供了许多优势可穿戴设备。它允许非接触式测量,优先用于日常使用长期监测的情况下。然而,面临的挑战是,我们需要将雷达信号转换成生命体征或有意义的生物,可以解读为医生。当前传统方法基于信号变换和相关分析可以捕获周期性心跳但未能重建的ECG信号雷达的回报。这个例子显示了人工智能,特别是深入学习网络,可以用来重建ECG信号单独从雷达测量。

这个例子使用一个混合卷积autoencoder和双向长期短期记忆(BiLSTM)网络模型。小波多分辨率分解层,极大重叠离散小波变换(MODWT)层,介绍了改善性能。这个例子比较了网络使用一维卷积层和网络使用MODWT层。

数据描述

数据集[1]中给出这个例子包括从连续波雷达和心电图同步数据由参考信号同时测量设备健康受试者30日。实现的连续波雷达系统是基于六端口技术和运营24 GHz工业科学和医学(ISM)乐队。

由于大量的原始数据集,训练效率的模型,只有一小部分的数据是本例中使用。具体来说,数据从三个场景,休息,呼吸暂停,并发操作,被选中。此外,课题1 - 5的数据用于训练和验证模型。主题6是用于测试的数据训练模型。

此外,由于心电信号中包含的主要信息通常位于一个频带低于100赫兹,所有的信号都是downsampled 200 Hz,分为段1024点,即信号大约5 s。

下载和准备数据

数据已经上传到这个位置:https://ssd.mathworks.com/万博1manbetxsupportfiles/SPT/data/SynchronizedRadarECGData.zip

下载数据集使用download万博1manbetxSupportFile函数。整个数据集的大小是大约16 MB。它包含两个文件夹,trainVal培训和验证数据测试为测试数据。在他们每个人,心电信号和雷达信号存储在两个单独的文件夹,心电图雷达

datasetZipFile = matlab.internal.examples.download万博1manbetxSupportFile (“SPT”,“数据/ SynchronizedRadarECGData.zip”);datasetFolder = fullfile (fileparts (datasetZipFile),“SynchronizedRadarECGData”);如果~存在(datasetFolder“dir”)解压缩(datasetZipFile datasetFolder);结束

创建信号数据存储访问文件中的数据。

radarTrainValDs = signalDatastore (fullfile (datasetFolder“trainVal”,“雷达”));radarTestDs = signalDatastore (fullfile (datasetFolder“测试”,“雷达”));ecgTrainValDs = signalDatastore (fullfile (datasetFolder“trainVal”,“心电图”));ecgTestDs = signalDatastore (fullfile (datasetFolder“测试”,“心电图”));

视图中包含的种类和分布数据训练集和测试集。注意GDN000X从主题代表测量数据X而不是每个科目都有数据为所有三个场景。

trainCats = filenames2labels (radarTrainValDs,“ExtractBefore”,“_radar”);总结(trainCats)
GDN0001_Resting 59 GDN0001_Valsalva 97 GDN0002_Resting 60 GDN0002_Valsalva 97 GDN0003_Resting 58 GDN0003_Valsalva 103 GDN0004_Apnea 14 GDN0004_Resting 58 GDN0004_Valsalva 106 GDN0005_Apnea 14 GDN0005_Resting 59 GDN0005_Valsalva 105
testCats = filenames2labels (radarTestDs,“ExtractBefore”,“_radar”);总结(testCats)
GDN0006_Apnea 14 GDN0006_Resting 59 GDN0006_Valsalva 127

应用归一化对心电图信号。中心每个信号减去其值和重新调节,最大的峰值是1。

ecgTrainValDs =变换(ecgTrainValDs @helperNormalize);ecgTestDs =变换(ecgTestDs @helperNormalize);

结合雷达和心电图信号数据存储。然后,进一步把训练数据集和验证。90%的数据进行训练和10%用于验证。设置随机种子,以便数据分割和可视化结果是可再生的。

trainValDs =结合(radarTrainValDs ecgTrainValDs);testDs =结合(radarTestDs ecgTestDs);rng (“默认”)splitIndices = splitlabels (trainCats, 0.90);numTrain =长度(splitIndices {1})
numTrain = 747
numVal =长度(splitIndices {2})
numVal = 83
numTest =长度(testCats)
numTest = 200
trainDs =子集(trainValDs splitIndices {1});valDs =子集(trainValDs splitIndices {2});

因为这里使用的数据集并不大,阅读训练、测试和验证数据到内存中。

trainData = readall (trainDs);valData = readall (valDs);testData = readall (testDs);

预览数据

情节的代表每种类型的信号。注意,它几乎是不可能识别雷达信号之间的任何关联和心电图测量相应的参考。

numCats = cumsum (countcats (testCats));previewindices =[兰迪([1,numCats(1)]),兰迪([numCats (1) + 1, numCats(2)]),兰迪([numCats (2) + 1, numCats (3))));helperPlotData (testDs previewindices);

火车卷积Autoencoder和BiLSTM模型

建立一个混合卷积autoencoder和BiLSTM网络重建心电信号。第一个一维卷积信号层过滤器。然后,卷积autoencoder消除大部分的高频噪声和整个信号捕获的高级模式。随后BiLSTM层进一步精细图形信号的细节。

layers1 = [sequenceInputLayer(1,最小长度= 1024)convolution1dLayer(4、3、填充=“相同”步= 1)convolution1dLayer(64、8、填充=“相同”步= 8)batchNormalizationLayer () tanhLayer maxPooling1dLayer(2,填充=“相同”)convolution1dLayer(32 8填充=“相同”步= 4)batchNormalizationLayer tanhLayer maxPooling1dLayer(2,填充=“相同”)transposedConv1dLayer(32 8种植=“相同”步= 4)tanhLayer transposedConv1dLayer(64、8,裁剪=“相同”步= 8)tanhLayer bilstmLayer (8) fullyConnectedLayer (8) dropoutLayer (0.2) fullyConnectedLayer (4) dropoutLayer (0.2) fullyConnectedLayer (1) regressionLayer];

定义培训选项参数:使用一个亚当改组优化和选择数据在每一个时代。同时,指定radarValecgVal作为验证的源数据。使用trainNetwork功能训练模型。同时,培训信息记录,它将用于以后的性能分析和比较。

火车在GPU如果一个是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)(并行计算工具箱)。

选择= trainingOptions (“亚当”,MaxEpochs = 600,MiniBatchSize = 600,InitialLearnRate = 0.001,ValidationData = {valData (: 1), valData (:, 2)},ValidationFrequency = 100,VerboseFrequency = 100,Verbose = 1,洗牌=“every-epoch”,情节=“没有”,DispatchInBackground = true);[net1, info1] = trainNetwork (trainData (: 1), trainData (:, 2), layers1,选项);
培训单一的GPU。| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | | |时代迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习| | | | | (hh: mm: ss) RMSE | RMSE | | |损失损失速率| | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | 1 | 1 | 00:00:01 | 0.19 | 0.18 | 0.0180 | 0.0171 | 0.0010 | 100 | 100 | | 00:00:57 | 0.18 | 0.18 | 0.0166 | 0.0163 | 0.0010 | 200 | 200 | | 00:01:54 | 0.18 | 0.18 | 0.0165 | 0.0164 | 0.0010 | 300 | 300 | | 00:02:50 | 0.18 | 0.18 | 0.0161 | 0.0160 | 0.0010 | 400 | 400 | | 00:03:46 | 0.17 | 0.17 | 0.0151 | 0.0148 | 0.0010 | 500 | 500 | | 00:04:42 | 0.17 | 0.17 | 0.0144 | 0.0140 | 0.0010 | 600 | 600 | | 00:05:38 | 0.17 | 0.16 | 0.0138 | 0.0133 | 0.0010 | | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |培训完成:马克思时代完成。

训练模型的分析性能

随机选择一个代表性的每种类型的测试数据集可视化并得到一个初始直觉的准确性训练模型的重建。

testindices =[兰迪([1,numCats(1)]),兰迪([numCats (1) + 1, numCats(2)]),兰迪([numCats (2) + 1, numCats (3))));helperPlotData (testDs testindices net1);

比较测量和重建的心电图信号,可以看出,该模型已经能够开始学习一些雷达和心电图信号之间的相关性。但是结果不是很令人满意。一些山峰不符合实际的山峰和波形形状不像那些测量心电图。几个山峰甚至完全丧失。

利用多分辨率分析和MODWT层提高性能

特征提取常被用来捕捉关键信息的信号,降低数据的维数和冗余,帮助模型实现更好的结果。考虑到心电信号的有效信息存在于一定的频率范围。使用MODWT分解雷达信号和多分辨率分析(MRA)的特性。

它可以发现一些组件的雷达信号由MODWTMRA来分解,比如四级的组件,有类似的周期性与测量心电图信号模式。几乎与此同时,一些组件包含完整的噪声。灵感,到模型引入MODWT层组件并选择只有少数水平可能有助于网络更关注相关信息,同时也减少无关的干扰。

ds =子集(trainDs, 1);(~,名字,~)= fileparts (ds.UnderlyingDatastores {1} .Files {1});data =阅读(ds);雷达数据= {1};心电图数据= {2};列弗= 1:6;idx = 100:800;m = modwt(雷达、“sym2”马克斯(lev));nplot =长度(lev) + 2;mra = modwtmra (m);图tiledlayout (nplot 1) nexttile情节(ecg (idx))标题([“心电图信号和雷达信号MODWTMRA”,“样品”+ regexprep(名字,{“_”,“雷达”},)))ylabel (“测量心电图”网格)d = 1;我=列弗d = d + 1;nexttile情节(mra(我idx) ylabel ([“雷达”,“MODWTMRA”,“水平”+我'])网格结束nexttile情节(mra (i + 1, idx)) ylabel ([“雷达”,“MODWTMRA”,“缩放”,“系数”])集(gcf,“位置”[0 0 700800))

替换第一个convolution1dLayermodwtLayer。MODWT层配置为具有相同的滤波器输出通道的大小和数量保持学习参数的数量。基于观测之前,只保存组件的一个特定的频率范围,即3到5级,有效地去除不必要的信号信息无关的心电图重建。指modwtLayer(小波工具箱)文档了解更多细节modwtLayer而这些参数。

一个flattenLayer也是后插入吗modwtLayer使后续convolution1dLayer缠绕在时间维度,使后续的输出格式兼容bilstmLayer

layers2 = [sequenceInputLayer(1,最小长度= 1024)modwtLayer (“水平”5,“IncludeLowpass”假的,“SelectedLevels”3:5,“小波”,“sym2”)flattenLayer convolution1dLayer(64、8、填充=“相同”步= 8)batchNormalizationLayer () tanhLayer maxPooling1dLayer(2,填充=“相同”)convolution1dLayer(32 8填充=“相同”步= 4)batchNormalizationLayer tanhLayer maxPooling1dLayer(2,填充=“相同”)transposedConv1dLayer(32 8种植=“相同”步= 4)tanhLayer transposedConv1dLayer(64、8,裁剪=“相同”步= 8)tanhLayer bilstmLayer (8) fullyConnectedLayer (8) dropoutLayer (0.2) fullyConnectedLayer (4) dropoutLayer (0.2) fullyConnectedLayer (1) regressionLayer];

使用相同的培训方案。

选择= trainingOptions (“亚当”,MaxEpochs = 600,MiniBatchSize = 600,InitialLearnRate = 0.001,ValidationData = {valData (: 1), valData (:, 2)},ValidationFrequency = 100,VerboseFrequency = 100,Verbose = 1,洗牌=“every-epoch”,情节=“没有”,DispatchInBackground = true);[net2, info2] = trainNetwork (trainData (: 1), trainData (:, 2), layers2,选项);
培训单一的GPU。| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | | |时代迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习| | | | | (hh: mm: ss) RMSE | RMSE | | |损失损失速率| | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | 1 | 1 | 00:00:01 | 0.19 | 0.19 | 0.0180 | 0.0172 | 0.0010 | 100 | 100 | | 00:01:10 | 0.15 | 0.14 | 0.0112 | 0.0100 | 0.0010 | 200 | 200 | | 00:02:19 | 0.12 | 0.11 | 0.0074 | 0.0064 | 0.0010 | 300 | 300 | | 00:03:28 | 0.11 | 0.11 | 0.0063 | 0.0061 | 0.0010 | 400 | 400 | | 00:04:37 | 0.11 | 0.11 | 0.0058 | 0.0059 | 0.0010 | 500 | 500 | | 00:05:46 | 0.10 | 0.11 | 0.0053 | 0.0059 | 0.0010 | 600 | 600 | | 00:06:57 | 0.10 | 0.11 | 0.0051 | 0.0061 | 0.0010 | | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |培训完成:马克思时代完成。

比较两个模型的训练和验证的损失。培训损失和损失模型的验证与MODWT层下降得更快、更顺利。

图绘制(info1.TrainingLoss)散射(1:长度(info1.ValidationLoss) info1.ValidationLoss)情节(info2.TrainingLoss)散射(1:长度(info2.ValidationLoss), info2.ValidationLoss)传奇([“培训ConvAE损失+ LSTM”,“验证ConvAE损失+ LSTM”,“培训ConvAE损失+ LSTM + modwtLayer”,“确认损失ConvAE + LSTM + modwtLayer”),“位置”,“eastoutside”)包含(“时代”)标题(“培训信息”)设置(gcf“位置”,0 0 1000,500);

进一步比较重构信号在相同的测试数据样本。的模型modwtLayer可以捕获峰值的位置,大小和形状的ECG信号很好休息和并发场景。即使在呼吸暂停的情况下,用相对较少的训练样本,它仍然可以捕捉的主要山峰和重建信号。

helperPlotData (testDs testindices、net1 net2)

比较两个模型的重构信号误差分布在整个测试集。进一步说明使用MODWT层提高了重建的准确性。

ecgTestRe1 =预测(net1 testData (: 1));loss1 = cellfun (@mse、ecgTestRe1 testData (:, 2));ecgTestRe2 =预测(net2 testData (: 1));loss2 = cellfun (@mse、ecgTestRe2 testData (:, 2));图h1 =直方图(loss1);持有h2 =直方图(loss2);持有h1。归一化=“概率”;h1。BinWidth = 0.003;h2。归一化=“概率”;h2。BinWidth = 0.003;ylabel (“概率”)包含(“测量和重建的ECG信号之间的均方误差”)标题(“测试为了分布”)传说([“没有modwtLayer模型”,“与modwtLayer模型”])

结论

这个例子实现了一个卷积autoencoder和BiLSTM网络重建心电信号从连续波雷达信号。这个例子分析模型的性能并没有MODWT层。这表明MODWT层的引入提高了重建的ECG信号的质量。

参考

[1]Schellenberger, S。施,K。,Steigleder, T. et al. A dataset of clinically recorded radar vital signs with synchronised reference sensor signals. Sci Data 7, 291 (2020). https://doi.org/10.1038/s41597-020-00629-5

附录——辅助函数

helperNormalize——这个函数可实现输入信号减去中间值和除以最大值。

函数x = helperNormalize (x)%这个函数仅仅是为了支持这个例子。万博1manbetx它可能改变了%或删除在未来版本。x = x-median (x);x = {x / max (x)};结束

helperPlotData——这个函数块雷达和心电图信号。

函数helperPlotData (DS,指标,net1 net2)%这个函数仅仅是为了支持这个例子。万博1manbetx它可能改变了%或删除在未来版本。参数DS指数net1 = [] net2 = []结束fs = 200;N =元素个数(指标);M = 2;如果~ isempty (net1) M = M + 1;结束如果~ isempty (net2) M = M + 1;结束tiledlayout (M, N,“填充”,“没有”,“TileSpacing”,“紧凑”);i = 1: N idx =指数(i);ds =子集(ds, idx);(~,名字,~)= fileparts (ds.UnderlyingDatastores {1} .Files {1});data =阅读(ds);雷达数据= {1};心电图数据= {2};t = linspace(0,长度(雷达)/ fs,长度(雷达));nexttile (i)情节(t,雷达)标题(“样本”regexprep(名字,{“_”,“雷达”},)))包含([“雷达信号”,“时间(s)”])网格nexttile (N + i)情节(t,心电图)包含([“测量心电图信号”,“时间(s)”])ylim([-0.3, 1])网格如果~ isempty (net1) nexttile (2 * N + i) y =预测(net1、雷达);情节(t, y)网格ylim(-0.3[1])包含([“重建ECG信号”,“时间(s)”])结束如果~ isempty (net2) nexttile (3 * N + i) y =预测(net2、雷达);持有情节(t, y)网格ylim(-0.3[1])包含([“重建ECG信号”,“modwtLayer”,“时间(s)”])结束结束集(gcf,“位置”,(0 0 300 * N, 150 * M])结束

另请参阅

功能

对象

相关的话题