主要内容

用于心电信号分类的深度学习Simulink模型的代码生成

这个例子演示了如何使用强大的信号处理技术和卷积神经网络一起对ECG信号进行分类。我们还将展示如何从Simulink®模型生成CUDA®代码。这个例子使用了预先训练好的CNN网络基于小波分析和深度学习的时间序列分类基于时间序列数据的CWT图像对心电信号进行分类的小波工具箱的例子。有关培训的信息,请参见基于小波分析和深度学习的时间序列分类(小波工具箱)

有关如何执行软件在环(SIL)、处理器在环(PIL)模拟以及将此示例部署到NVIDIA Jetson®板的视频演示,请参见//www.ru-cchi.com/videos/deep-learning-in-simulink-for-nvidia-gpus-classification-of-ecg-signals-1621401016961.html

本例说明了以下概念:

  • 在Simulink中对分类应用进行建模。使用MATLAB函数块对心电数据进行预处理和小波变换。使用图像分类器块,用于加载预训练的网络并执行ECG数据的分类。

  • 为代码生成配置模型。

  • 为Simulink模型生成一个CUDA可执行文件。

第三方的先决条件

检查GPU环境

要验证运行此示例所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall函数。

envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

心电图数据说明

本例使用来自生理网数据库。它包含了三组人的数据:

  1. 心律失常患者(ARR)

  2. 充血性心力衰竭(CHF)患者

  3. 鼻窦节律正常者

其中包括急性呼吸道反应患者的96次录音,慢性心力衰竭患者的30次录音,以及轻微呼吸道反应患者的36次录音。的ecg_signalsMAT-file包含时间序列格式的测试心电数据。本例中的图像分类器区分ARR、CHF和NSR。

算法流程

给出了Simulink模型的算法工作流框图。

心电图深度学习Simulink模型

给出了用于心电信号分类的Simulink模型。当模型运行时,视频查看器块显示分类心电信号。

open_system (“ecg_dl_cwt”);

心电预处理子系统

心电图预处理子系统包含MATLAB函数块,该块执行CWT以获得心电信号的标量图,然后对标量图进行处理以获得图像和信号图像分类器块,从该块加载预训练的网络trainedNet.mat并基于SqueezeNet深度学习CNN对图像分类进行预测。

open_system (“ecg_dl_cwt /心电图预处理”);

ScalogramFromECG函数块定义了一个名为ecg_to_scalogram:

  • 使用65536个双精度心电数据样本作为输入。

  • 应用小波变换从心电数据中创建时频表示。

  • 由小波系数得到尺度图。

  • 将标量图转换为大小(227x227x3)的图像。

的函数签名ecg_to_scalogram显示。

类型ecg_to_scalogram
版权所有2020 The MathWorks, Inc. persistent jetdata;if(isempty(jetdata)) jetdata = ecgColorMap(128,'single');从心电信号cfs = cwt_ecg(ecg_signal)获取小波系数;从小波系数中获取尺度图image = ind2rgb(im2uint8(rescale(cfs)),jetdata);Ecg_image = im2uint8(imresize(image,[227,227]));结束

心电图后处理

心电图后处理MATLAB函数块定义label_prob_image函数,该函数根据图像分类器输出的分数中的最高分为标量图图像查找标签。它输出带有标签和置信度的标量图图像。

类型label_prob_image
The MathWorks, Inc. scores = double(scores);获得最大置信度[prob,index] = max(分数);置信度=概率*100;%获取最大置信度标签对应的标签= erase(char(labels(index)),'_label');Text = cell(2,1);text{1} =['分类:'标签];text{2} = ['Confidence: ' sprintf('%0.2f', Confidence)' % ');位置= [135 20 0 0;130 40 0 0]; final_image = insertObjectAnnotation(ecg_image,'rectangle',position,... text,'TextBoxOpacity',0.9,'FontSize',9); end

运行模拟

打开配置参数对话框。

模拟目标窗格中,选择GPU加速.在深度学习组,选择目标库为cuDNN

为了验证该算法,并显示加载在工作空间中的测试心电信号的标签和置信度评分,请运行仿真。

set_param (“ecg_dl_cwt”“SimulationMode”“正常”);sim卡(“ecg_dl_cwt”);

生成和构建Simulink模型

代码生成窗格中,选择语言作为c++并使生成GPU代码

开放代码生成> GPU代码窗格。在子类别中,使cuBLAScuSOLVER而且cuFFT

在主机图形处理器上生成和构建Simulink模型slbuild命令。代码生成器将文件放在建立文件夹的子文件夹ecg_dl_cwt_ert_rtw在当前工作文件夹下。

状态= evalc(“slbuild (ecg_dl_cwt)”);

生成CUDA®代码

子文件夹名为ecg_dl_cwt_ert_rtw包含生成的c++代码,对应于Simulink模型中的不同块,以及在这些块中执行的特定操作。例如,文件trainedNet0_ecg_dl_cwt0.h包含c++类,该类包含某些属性,例如numLayers以及成员函数,比如getBatchSize ()预测().这个类表示预训练的对象SqueezeNet已加载在Simulink模型中。

清理

关闭Simulink模型。

close_system (“ecg_dl_cwt /心电图预处理”);close_system (“ecg_dl_cwt”);

另请参阅

功能

相关的话题

Baidu
map