主要内容

部署信号分类器使用小波和深度学习在覆盆子π

这个例子展示了工作流分类人类心电图(ECG)信号使用连续小波变换(CWT)和深卷积神经网络(CNN)。这个例子还提供了如何生成和部署信息预测的代码和CNN覆盆子π目标(手臂®的设备)。

SqueezeNet深CNN最初是为了1000年图像类别进行分类。在这个例子中时间序列分类使用小波分析和深度学习,SqueezeNet重新训练分类根据其心电图波形量图。量图是一种信号的时频表示和的绝对值CWT的信号。我们重复使用重新训练SqueezeNet在这个例子中。

心电图数据描述

在这个例子中,心电图数据生理网使用。心电图数据来自三组人:人与心律失常(ARR),与充血性心力衰竭(CHF)的人,人与正常窦性节律(NSR)。数据集包括96从残疾人ARR录音,与瑞士法郎30录音人,36个录音与NSR的人。162年的心电图记录来自三个生理网数据库:MIT-BIH心律失常数据库[2][3],MIT-BIH正常窦性心律的数据库[3]BIDMC充血性心力衰竭的数据库[1][3]。缩短心电图数据可以从下载上面的引用GitHub库

先决条件

为支持版金宝app本的库和设置环境变量信息,明白了先决条件与MATLAB编码器深度学习(MATLAB编码器)。这个例子不支持在MATLAB在线™。金宝app

生成的代码的功能

核心函数生成的可执行文件,processECG,使用65536样品单精度心电图数据作为输入。功能:

  1. CWT的心电图数据。

  2. 小波系数的获得量图。

  3. 把量图转换为RGB图像的尺寸227 - 227 - 3。这使得图像兼容SqueezeNet网络架构。

  4. 执行预测使用SqueezeNet分类图像。

类型processECG
函数[YPred] = processECG(输入)% processECG函数-转换1 d心电图图像和预测心脏病的综合症% % %这个函数仅仅是为了支持例子:%使用小波信号分类代码生成和%深度学习在覆盆子π。金宝app它可能改变或一个%的未来版本中被删除。% 2020年版权MathWorks公司% colourmap图像转换持续净jetdata;如果(isempty (jetdata)) jetdata = colourmap(128类(输入));结束% Squeezenet训练网络如果(isempty(净))=净coder.loadDeepLearningNetwork (“trainedNet.mat”);结束%小波变换和图像转换cfs = ecg_to_Image(输入);形象= ind2rgb (im2uint8(重新调节(cfs)),单(jetdata));形象= im2uint8 (imresize(形象,[227227]));%图如果isempty (coder.target) imshow(图片);结束%预测[YPred] =预测(净、图像); %% ECG to image conversion function cfs = ecg_to_Image(input) %Wavelet Transformation persistent filterBank [~,siglen] = size(input); if isempty(filterBank) filterBank = cwtfilterbank('SignalLength',siglen,'VoicesPerOctave',6); end %CWT conversion cfs = abs(filterBank.wt(input)); end %% Colourmap function J = colourmap(m,class) n = ceil(m/4); u = [(1:1:n)/n ones(1,n-1) (n:-1:1)/n]'; g = ceil(n/2) - (mod(m,4)==1) + (1:length(u))'; r = g + n; b = g - n; r1 = r(r<=128); g1 = g(g<=128); b1 = b(b >0); J = zeros(m,3); J(r1,1) = u(1:length(r1)); J(g1,2) = u(1:length(g1)); J(b1,3) = u(end-length(b1)+1:end); feval = str2func(class); J = feval(J); end end

创建代码生成配置对象

创建一个代码生成配置对象生成一个可执行的程序。指定生成c++代码。

cfg = coder.config (exe”);cfg。TargetLang =“c++”;

设置配置对象的深度学习代码生成

创建一个coder.ARMNEONConfig对象。指定版本的手臂计算库一样的覆盆子π。指定的架构覆盆子π。

dlcfg = coder.DeepLearningConfig (“arm-compute”);dlcfg。ArmComputeVersion =“19.05”;dlcfg。ArmArchitecture =v7的;

深度学习配置对象附加到代码生成配置对象

设置DeepLearningConfig属性代码生成配置对象的深度学习配置对象。使MATLAB源评论可见的配置对象的代码生成。

cfg。DeepLearningConfig = dlcfg;cfg。MATLABSourceComments = 1;

创建一个连接的覆盆子π

使用MATLAB支持包树莓π支金宝app持包功能,raspi创建一个连接的覆盆子π。在以下代码中,替换:

  • raspiname与你的树莓π名或IP地址

  • 用户名和你的用户名

  • 密码用你的密码

r = raspi (“raspiname”,“用户名”,“密码”);

为树莓π配置代码生成硬件参数

创建一个coder.Hardware对象树莓π和附加的代码生成配置对象。

hw = coder.hardware (“树莓π”);cfg。硬件= hw;

指定构建文件夹树莓π。

buildDir =“~ / remdirECG”;cfg.Hardware。BuildDir = BuildDir;

提供c++代码执行的主要文件

c++主要文件读取输入心电数据,调用processECG函数执行预处理和深度学习使用CNN心电图数据,并显示分类概率。

指定的主要文件代码生成配置对象。想要了解更多关于生成和定制main_ecg_raspi.cpp,请参考生成独立的C / c++从MATLAB代码可执行文件(MATLAB编码器)

cfg。CustomSource =“main_ecg_raspi.cpp”;

生成c++代码使用来源codegen

使用codegen函数来生成c++代码。当codegen使用MATLAB支持包的覆盆子π硬件,可执行文件金宝app是建立在覆盆子π。

一定要设置环境变量ARM_COMPUTELIBLD_LIBRARY_PATH覆盆子π。看到先决条件与MATLAB编码器深度学习(MATLAB编码器)

codegen配置cfgprocessECGarg游戏{(1,65536,“单”)}- darm_compute
部署代码。这可能需要几分钟。

获取生成的可执行文件目录

覆盆子π测试生成的代码,复制输入心电信号生成的代码目录中。你能找到这个目录手动或通过使用raspi.utils.getRemoteBuildDirectoryAPI。这个函数列表的目录生成的二进制文件codegen

applicationDirPaths = raspi.utils.getRemoteBuildDirectory (“applicationName”,“processECG”)
applicationDirPaths =1×4单元阵列{1×1 struct} {1×1 struct} {1×1 struct} {1×1 struct}

远程构建目录的完整路径是来源于当前的工作目录。如果你不知道applicationDirPaths条目包含生成的代码,使用helper函数helperFindTargetDir。否则,指定适当的目录。

directoryUnknown = true;如果directoryUnknown targetDirPath = helperFindTargetDir (applicationDirPaths);其他的targetDirPath = applicationDirPaths {1} .directory;结束

输入文件复制到覆盆子π

的文本文件input_ecg_raspi.csv包含了ECG信号样本的代表性。复制文件要求运行可执行程序,使用putFile,可用MATLAB支持包的覆盆子π硬件。金宝app

r.putFile (“input_ecg_raspi.csv”,targetDirPath);

图形表示,前1000个样本可以绘制通过使用这些步骤。

输入= dlmread (“input_ecg_raspi.csv”);情节(输入(1:1000))标题(“ARR信号”)

运行可执行覆盆子π

运行可执行程序的覆盆子πMATLAB和直接输出回MATLAB。输入文件名作为命令行参数传递给可执行文件。

exeName =“processECG.elf”;%可执行文件的名字文件名=“input_ecg_raspi.csv”;%输入心电图文件推到目标命令= [“cd”targetDirPath“。/”exeName' '文件名);输出=系统(r,命令)
输出= '预测值在目标硬件ARR NSR 0.806078 0.193609 0.000313103瑞士法郎

引用

  1. 拜姆,d S。,W. S. Colucci, E. S. Monrad, H. S. Smith, R. F. Wright, A. Lanoue, D. F. Gauthier, B. J. Ransil, W. Grossman, and E. Braunwald. "Survival of patients with severe congestive heart failure treated with oral milrinone."美国心脏病学会杂志》上。第三卷。7日,1986年,页661 - 670。

  2. Goldberger a L。,L. A. N. Amaral, L. Glass, J. M. Hausdorff, P. Ch. Ivanov, R. G. Mark, J. E. Mietus, G. B. Moody, C.-K. Peng, and H. E. Stanley. "PhysioBank, PhysioToolkit,and PhysioNet: Components of a New Research Resource for Complex Physiologic Signals." Circulation. Vol. 101, Number 23: e215–e220. [Circulation Electronic Pages;http://circ.ahajournals.org/content/101/23/e215.full];2000(6月13日)。cir.101.23.e215 doi: 10.1161/01.。

  3. 喜怒无常,g B。,和R. G. Mark. "The impact of the MIT-BIH Arrhythmia Database."IEEE,生物医学工程杂志。20卷。3号,2001年5月- 6月,45 - 50页。(PMID: 11446209)

金宝app支持功能

helperFindTargetDir

函数targetDir = helperFindTargetDir (dirPaths)%%这个函数仅仅是为了支持小波深度学习的例子。金宝app%,它可能改变或在将来的版本中被删除。%找到pwdp = pwd;如果ispc%将空格替换为下划线p = strrep (p,' ',“_”);%文件夹路径分割成组件pSplit = regexp (p filesep“分裂”);%因为Windows使用冒号,删除任何发生的冒号k = 1:元素个数(pSplit) pSplit {k} =擦掉(pSplit {k},“:”);结束%现在使用Linux文件分离构建的路径pLinux =;k = 1:元素个数(pSplit) 1 pLinux = [pLinux, pSplit {k},' / '];结束pLinux = [pLinux pSplit{结束});其他的pLinux = p;结束targetDir =;k = 1:元素个数(dirPaths) d = strfind (dirPaths {k} .directory, pLinux);如果~ isempty (d) targetDir = dirPaths {k} .directory;打破结束结束如果元素个数(targetDir) = = 0 disp (目标目录未找到。);结束结束

另请参阅

相关的话题