心电信号分类深度学习Simulink模型的代码生成
这个示例演示了如何使用强大的信号处理技术和卷积神经网络一起对心电信号进行分类。我们还将展示如何从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函数
块对心电数据进行预处理和小波变换。使用图像分类器
块,用于加载预先训练的网络并执行心电数据的分类。为代码生成配置模型。
为Simulink模型生成CUDA可执行文件。
第三方的先决条件
CUDA启用NVIDIA GPU。
NVIDIA CUDA工具包和驱动程序。
英伟达cuDNN图书馆。
编译器和库的环境变量。有关更多信息,请参见第三方硬件而且设置必备产品2022世界杯八强谁会赢?.
验证GPU环境
要验证运行此示例所需的编译器和库是否已正确设置,请使用coder.checkGpuInstall
函数。
envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
心电图数据描述
这个例子使用的是生理网数据库。它包含了三组人的数据:
患有心律失常的人
充血性心力衰竭人士
窦性心律正常者(NSR)
它包括96个ARR患者的录音,30个CHF患者的录音,36个NSR患者的录音。的ecg_signals
mat文件包含时间序列格式的测试心电图数据。本例中的图像分类器区分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
function ecg_image = ecg_to_scalogram(ecg_signal) %版权所有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(形象,[227227]));结束
心电图后处理
的心电图后处理
的MATLAB函数块定义label_prob_image
函数,该函数根据图像分类器输出的分数中的最高分为尺度图图像查找标签。它输出带有标签和置信度的尺度图图像。
类型label_prob_image
The MathWorks, Inc. scores = double(scores);%获得最大置信度[prob,index] = max(分数);信心=概率* 100;获取最大置信度标签= erase(char(labels(index)),'_label');文本=细胞(2,1);text{1} = [' category: ' label];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代码窗格。在子类别库,使cuBLAS,cuSOLVER而且cuFFT.
在主机图形处理器上生成和构建Simulink模型slbuild
命令。代码生成器将文件放在建立文件夹,子文件夹名为ecg_dl_cwt_ert_rtw
在您当前的工作文件夹下。
状态= evalc (“slbuild (ecg_dl_cwt)”);
生成的CUDA®代码
子文件夹命名ecg_dl_cwt_ert_rtw
包含与Simulink模型中的不同块相对应的生成的c++代码,以及在这些块中执行的特定操作。例如,文件trainedNet0_ecg_dl_cwt0.h
包含c++类,该类包含某些属性,例如numLayers
和成员函数,例如getBatchSize ()
,预测()
.这个类代表预先训练过的SqueezeNet
已经加载到Simulink模型中。
清理
关闭Simulink模型。
close_system (“ecg_dl_cwt /心电图预处理”);close_system (“ecg_dl_cwt”);
另请参阅
功能
open_system
(模型)|load_system
(模型)|save_system
(模型)|close_system
(模型)|bdclose
(模型)|get_param
(模型)|set_param
(模型)|sim卡
(模型)|slbuild
(模型)