在树莓派上部署信号分割深度网络
本示例详细介绍了使用短时傅里叶变换和双向长短时记忆(BiLSTM)网络对心电图信号进行波形分割的工作流程。该示例还提供了如何在树莓派目标(基于ARM®的设备)上生成和部署代码和经过训练的BiLSTM网络进行分割的信息。
示例中的预训练网络类似于基于深度学习的波形分割的例子。
这个例子的细节:
基于循环中处理器(PIL)的工作流,用于验证从MATLAB™部署并运行在树莓派上的生成代码
生成一个独立的可执行文件
PIL验证过程是设计周期的一个关键部分,在部署独立的可执行程序之前,检查生成代码的行为是否与设计相匹配。
心电图数据集
本例使用公开的QT数据库中的心电信号[1] [2].该数据由大约15分钟的标记心电图记录组成,采样率为250赫兹,从总共105名患者中测量。
心电信号可分为以下搏动形态[3.]:
P波- QRS复合体前的小偏移,代表心房去极化
QRS复合体-心跳幅度最大的部分
T波- QRS复合体后的小偏转,代表心室复极
心电波形的这些区域的分割可以为评估人类心脏的整体健康和异常的存在提供测量的基础。
先决条件
支持NEON扩展的ARM处理器
ARM计算库(在目标ARM硬件上)
MATLAB®编码器™
嵌入式编码器™
深度学习工具箱™
有关受支持的库版本和有关设置环境变量的信息,请参见用MATLAB编码器进行深度学习的先决条件(MATLAB编码器)(MATLAB编码器)。
生成代码的功能
生成的可执行文件中的核心函数:
使用15,000个单精度心电图数据样本作为输入。
计算信号的短时傅里叶变换。
标准化和规范化输出。
使用预训练的BiLSTM网络标记信号的区域。
生成带有标签的输出文件。
waveformSegmentation
函数
一个入口点函数,也称为顶级或主要的函数,是为代码生成而定义的函数。您必须定义一个入口点函数,该函数调用支持代码生成的函数,并从入口点函数生成C/ c++代码。入口点函数中的所有函数都必须支持代码生成。
在这个例子中,waveformSegmentation
为入口点函数。它将心电信号作为输入,并将其传递到经过训练的BiLSTM网络进行预测。的performPreprocessing
函数对原始信号进行预处理,并应用短时傅里叶变换。的genClassifiedResults
函数将预处理后的信号传递给网络进行预测,并显示分类结果。
类型waveformSegmentation
函数out = waveformSegmentation(in) %#codegen persistent net;如果isempty(net) net = code . loaddeeplearningnetwork (' training -network- stftbilstm . net)。席”、“净”);end preprocessedSignal = performPreprocessing(in);=细胞(3,1);for indx = 1:3 out{indx,1} = genClassifedResults(net.predict(preprocessedSignal{1,indx}));结束结束
创建到树莓派的连接
使用MATLAB支持包实现树莓派函数,raspi
,以创建到树莓派的连接。在以下代码中,替换:
“raspiname”
加上树莓派的名字“π”
和你的用户名“密码”
用你的密码
r = raspi (“raspiname”,“π”,“密码”);
该示例展示了验证代码和设计的基于pil的工作流,然后创建和部署一个独立的可执行文件。如果您想直接部署一个独立的可执行文件,那么您可以跳过PIL执行,直接创建一个独立的执行文件。
生成PIL MEX函数
的生成MEX函数的基于pil的工作流waveformSegmentation
函数。
为静态库设置代码生成配置对象
为静态库创建代码配置对象,并将验证模式设置为“公益诉讼”
.将目标语言设置为“c++”
.
cfg = coder.config (“自由”,“是”,真正的);cfg。VerificationMode =“公益诉讼”;cfg。TargetLang =“c++”;
设置深度学习代码生成的配置对象
创建一个编码器。ARMNEONConfig
对象。指定ARM计算库的版本为树莓派上的版本。指定树莓派的架构。(本例需要ARM计算库v19.05)。
dlcfg =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmComputeVersion =“19.05”;dlcfg。ArmArchitecture =v7的;
设置DeepLearningConfig
属性为深度学习配置对象的代码生成配置对象。用代码生成中可见的MATLAB Source Comments设置配置对象。
cfg。DeepLearningConfig = dlcfg;cfg。MATLABSourceComments = 1;
配置树莓派代码生成硬件参数
创建一个编码器。硬件
对象,并将其附加到代码生成配置对象。
hw = coder.hardware (“树莓π”);cfg。硬件= hw;
指定树莓派上的构建文件夹。
cfg.Hardware.BuildDir =“~ / waveformSegmentation”;
生成源c++代码使用codegen
函数
使用codegen
函数来生成c++代码。当codegen
与MATLAB的树莓派硬件支持包一起使用,生成的代码下载到板上编译。生成一个PIL MEX函数,在MATLAB和树莓派上运行的生成代码之间进行通信。
确保设置了环境变量ARM_COMPUTELIB
而且LD_LIBRARY_PATH
在树莓派上看到用MATLAB编码器进行深度学习的先决条件(MATLAB编码器)(MATLAB编码器)。
codegen配置cfgwaveformSegmentationarg游戏{coder.typeof(单((15000)),[15000],[0])}报告
目标设备没有本地通信支持。正在检查连通性配置注册…部署代码。这可能需要几分钟。目标设备没有本地通信支持。正在检查连通性配置注册…生成的elf的位置:/home/ Pi /waveformSegmentation/MATLAB_ws/R2020b/C/Users/eshashah/OneDrive_-_MathWorks/Documents/MATLAB/Examples/deeplearning_shared-ex28372959/codegen/lib/waveformSegmentation/pil代码生成成功:查看报告
在树莓派上运行可执行程序
加载MAT-fileecgsignal_test
.该文件存储了一个心电信号样本,您可以在其上测试生成的代码。
运行生成的waveformSegmentation_pil
MEX功能对测试信号。
负载ecgsignal_test.mat;= waveformSegmentation_pil(测试);
##启动应用程序:'codegen\lib\waveformSegmentation\pil\waveformSegmentation. 'elf'终止执行:clear waveformSegmentation_pil ### Launching application waveformSegmentation.elf…
显示带有预测标签的信号。
标签=分类(从{1}(2000:3000));msk = signalMask(标签);2000:3000 plotsigroi (msk、测试(1))标题(“预测标签”)
在验证了PIL MEX函数的输出之后,您可以为waveformSegmentation
函数。
下一部分将展示代码生成工作流,使用MATLAB Coder App在代码中生成和部署一个独立的可执行文件,以便在树莓派上进行预测。
使用MATLAB Coder App创建一个独立的可执行程序
的MATLAB编码器app从MATLAB®代码生成C或c++代码。基于工作流的用户界面引导您完成代码生成过程。下面的步骤描述了一个使用MATLAB Coder应用程序的简单工作流。更多细节,请参见MATLAB编码器(MATLAB编码器)而且使用MATLAB Coder App生成C代码(MATLAB编码器).
选择入口点函数文件
在应用程序选项卡,单击工具条最右边的向下箭头以展开应用程序库。下代码生成,点击MATLAB编码器.应用程序打开选择源文件页面。输入或选择入口点函数的名称,waveformSegmentation
.
点击下一个去定义输入类型页面。
定义输入类型
1.选择让我直接输入输入或全局类型并设置输入的值在
成一个(1 x15000)
.
2.点击下一个去生成代码的一步。跳过检查运行时问题步骤,因为使用ARM计算库生成代码时不支持MEX生成。
生成代码
1.在生成代码对话框中设置值:
集构建类型来
可执行文件(. exe)
集语言来
c++
集硬件板作为
覆盆子π
2.单击更多的设置按钮:
在自定义代码窗格,在其他源文件中,浏览并选择
ecgsegmentation_main.cpp
.有关编写C/ c++主函数的更多信息,请参阅生成示例C/ c++ Main函数的结构(MATLAB编码器).在硬件窗格中,设置用户名而且密码树莓派板。
在深度学习窗格中,设置目标库来
臂计算
.指定ARM计算库版本而且ARM计算架构.
3.关闭Settings窗口并生成代码。
4.点击下一个去完成工作流程页面。
获取生成的可执行目录
一旦代码生成完成,您就可以在树莓派上测试生成的代码。第一步,将输入的心电信号复制到生成的代码目录中。方法可以手动或使用raspi.utils.getRemoteBuildDirectory
API。方法生成的二进制文件的目录codegen
函数。假设二进制文件只在一个目录中找到,输入:
applicationDirPaths =…
raspi.utils.getRemoteBuildDirectory(“applicationName”、“waveformSegmentation”);
targetDirPath = applicationDirPaths {1} .directory;
复制输入文件到树莓派
要复制运行可执行程序所需的文件,请使用putFile
,它可与树莓派硬件的MATLAB支持包一起使用。的input.csv
文件包含一个示例心电信号,用于测试部署的代码。
r.putFile (input.csv, targetDirPath);
输入= dlmread(“input.csv”);
在树莓派上运行可执行程序
在MATLAB中运行树莓派上的可执行程序,将输出文件输出到MATLAB中。输入文件名应该作为可执行文件的命令行参数传递。
exeName =“waveformSegmentation.elf”;%可执行文件的名字
command = ['cd ' targetDirPath ';]/ ' exeName];
系统(r,命令)
outputPath = strcat (targetDirPath, / * . txt);
getFile (r, outputPath)
显示带有预测标签的信号。输出如图所示。
加载ecgsignal_test.mat;
标签=分类(textread (' out.txt ', ' % s ') ');
msk = signalMask(标签(1,2000:3000));
2000:3000 plotsigroi (msk、测试(1))
标题(“预测标签”)
参考文献
[1] McSharry, Patrick E.等。生成合成心电图信号的动力学模型IEEE生物医学工程汇刊。2003年第3期,第50卷,第289-294页。
[2]拉古纳,巴勃罗,雷蒙Jané,还有卡米纳尔神父。多导联心电信号波边界的自动检测:CSE数据库的验证。计算机和生物医学研究。1994年第27卷第1期,第45-60页。
[3] Goldberger, Ary L., Luis A. N. Amaral, Leon Glass, Jeffery M. Hausdorff, Plamen Ch. Ivanov, Roger G. Mark, Joseph E. miietus, George B. Moody, chung kang Peng, H. Eugene Stanley。PhysioBank, PhysioToolkit和PhysioNet:复杂生理信号新研究资源的组成部分。循环。第101卷第23期,2000年,第e215-e220页。(循环电子页;http://circ.ahajournals.org/content/101/23/e215.full].
另请参阅
应用程序
- MATLAB编码器(MATLAB编码器)
功能
codegen
(MATLAB编码器)|fsst
|signalMask
相关的话题
- 长-短时记忆网络(深度学习工具箱)
- 使用MATLAB Coder App生成C代码(MATLAB编码器)
- 用MATLAB编码器进行深度学习的先决条件(MATLAB编码器)
- 生成示例C/ c++ Main函数的结构(MATLAB编码器)