主要内容

在树莓派上部署信号分割深度网络

这个例子详细介绍了使用短时间傅里叶变换和双向长短期记忆(BiLSTM)网络对心电图(ECG)信号进行波形分割的工作流程。该示例还提供了如何生成和部署代码和训练过的BiLSTM网络的信息,用于在树莓Pi™目标(基于ARM®的设备)上进行分割。

示例中的预训练网络类似于基于深度学习的波形分割(信号处理工具箱)的例子。

这个例子的细节:

  • 基于处理器在环(PIL)的工作流,以验证生成的代码部署和运行在MATLAB™的树莓派上

  • 生成独立的可执行文件

PIL验证过程是设计周期的一个关键部分,在部署独立的可执行文件之前检查生成代码的行为是否与设计相匹配。

心电图数据集

本例使用了来自公开可用的QT数据库的心电图信号[1] [2].这些数据包括大约15分钟的有标记的心电图记录,抽样频率为250赫兹,共测量了105名患者。

心电信号可分为以下拍形态[3.]:

  • P波- QRS复合体前的小偏转,代表心房去极化

  • QRS复波-心跳的最大振幅部分

  • T波- QRS复合体后的小偏转,代表心室复极

心电波形的这些区域的分割可以为评估人类心脏整体健康状况和是否存在异常提供依据。

先决条件

有关库受金宝app支持的版本以及有关设置环境变量的信息,请参见深度学习与MATLAB编码器的先决条件(MATLAB编码器)(MATLAB编码器)。

生成代码的功能

生成的可执行文件中的核心函数:

  • 使用15000例单精度心电数据作为输入。

  • 计算信号的短时傅里叶变换。

  • 使输出标准化和规范化。

  • 使用预先训练的BiLSTM网络标记信号区域。

  • 生成带有标签的输出文件。

waveformSegmentation函数

一个入口点函数,又称顶级函数,是为代码生成而定义的函数。您必须定义一个入口点函数,该函数调用支持代码生成的函数,并从入口点函数生成C/ c++代码。入口点函数中的所有函数必须支持代码生成。金宝app

在这个例子中,waveformSegmentation为入口点函数。将心电信号作为输入,传递给训练好的BiLSTM网络进行预测。的performPreprocessing函数对原始信号进行预处理,并进行短时傅里叶变换。的genClassifiedResults函数将预处理后的信号传递给网络进行预测,并显示分类结果。

类型waveformSegmentation
function out = waveformSegmentation(in) %#codegen persistent net;net = code . loaddeeplearningnetwork (' training -network- stftbilstm . net . net ');席”、“净”);end preprocesedsignal = performPreprocessing(in);=细胞(3,1);for index = 1:3 out{index,1} = genClassifedResults(net.predict(preprocesedsignal {1, index}));结束结束

创建到树莓派的连接

使用MATLAB支持包的树莓派金宝app函数,raspi,创建与树莓派的连接。在以下代码中,替换:

  • “raspiname”你的树莓派的名字

  • “π”和你的用户名

  • “密码”用你的密码

r = raspi (“raspiname”“π”“密码”);

该示例展示了验证代码和设计,然后创建和部署独立可执行文件的基于pil的工作流。另外,如果您想直接部署独立的可执行文件,您可以跳过PIL执行,转而创建独立的执行。

生成PIL MEX功能

第一步显示了一个基于pil的工作流来为waveformSegmentation函数。

为静态库设置代码生成配置对象

为静态库创建代码配置对象,并将验证模式设置为“公益诉讼”.设置目标语言为“c++”

cfg = coder.config (“自由”“是”,真正的);cfg。VerificationMode =“公益诉讼”;cfg。TargetLang =“c++”

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

创建一个编码器。ARMNEONConfig对象。指定ARM计算库的版本为Raspberry Pi上的版本。指定树莓派的架构。(本例需要ARM计算库v19.05)。

dlcfg =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmComputeVersion =“19.05”;dlcfg。ArmArchitecture =v7的

设置DeepLearningConfig属性将代码生成配置对象转换为深度学习配置对象。在代码生成中使用MATLAB源代码注释设置配置对象。

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

配置树莓派的代码生成硬件参数

创建一个编码器。硬件对象,并将其附加到代码生成配置对象。

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

在树莓派上指定构建文件夹。

cfg.Hardware.BuildDir =“~ / waveformSegmentation”

生成源代码c++代码使用codegen函数

使用codegen函数生成c++代码。当codegen与MATLAB的树莓派硬件支持包一起使用金宝app,生成的代码下载到板上并在那里编译。生成PIL MEX函数,用于MATLAB与运行在树莓派上的生成代码之间的通信。

确保设置了环境变量ARM_COMPUTELIBLD_LIBRARY_PATH在树莓派上。看到深度学习与MATLAB编码器的先决条件(MATLAB编码器)(MATLAB编码器)。

codegen配置cfgwaveformSegmentationarg游戏{coder.typeof(单((15000)),[15000],[0])}报告
###目标设备没有本机通信支持。金宝app检查连接配置注册…部署代码。这可能需要几分钟。###目标设备没有本机通信支持。金宝app检查连接配置注册…# # #连接配置功能“waveformSegmentation”:“树莓π”生成的精灵的位置:/home/pi/waveformSegmentation / MATLAB_ws R2020b / C /用户/ eshashah / OneDrive_ -_MathWorks /文件/ MATLAB /例子/ deeplearning_shared-ex28372959 codegen / lib / waveformSegmentation /公益诉讼成功代码生成:查看报告

在树莓派上运行可执行程序

加载MAT-fileecgsignal_test.该文件存储了一个ECG信号样本,您可以在该样本上测试生成的代码。

运行生成的waveformSegmentation_pil测试信号上的MEX功能。

负载ecgsignal_test.mat;= waveformSegmentation_pil(测试);
###启动应用程序:'codegen\lib\waveformSegmentation\pil\waveformSegmentation。###启动应用程序waveformSegmentation.elf…

显示带有预测标签的信号。

标签=分类(从{1}(2000:3000));msk = signalMask(标签);2000:3000 plotsigroi (msk、测试(1))标题(“预测标签”

在验证PIL MEX函数的输出之后,可以为waveformSegmentation函数。

接下来的部分展示了代码生成工作流,使用MATLAB Coder应用程序在代码中创建一个生成并部署一个独立的可执行程序,用于在树莓派上进行预测。

创建一个独立的可执行程序使用MATLAB编码器应用程序

MATLAB编码器app从MATLAB®代码生成C或c++代码。基于工作流的用户界面引导您完成代码生成过程。以下步骤描述了使用MATLAB Coder应用程序的简短工作流MATLAB编码器(MATLAB编码器)使用MATLAB Coder App生成C代码(MATLAB编码器)

选择入口点函数文件

应用程序选项卡,单击工具条最右边的向下箭头以扩展应用程序库。下代码生成,点击MATLAB编码器.应用程序打开选择源文件页面。输入或选择入口点函数的名称,waveformSegmentation

点击下一个去…定义输入类型页面。

定义输入类型

1.选择让我直接输入输入类型或全局类型并设置输入的值成一个(1 x15000)

2.点击下一个去…生成代码的一步。跳过检查运行时问题步骤,因为使用ARM计算库生成代码时不支持MEX生成。金宝app

生成代码

1.在生成代码对话框中设置值:

  • 构建类型可执行文件(. exe)

  • 语言c++

  • 硬件板作为覆盆子π

2.单击更多的设置按钮:

  • 自定义代码窗格中,在其他源文件中,浏览并选择ecgsegmentation_main.cpp.有关编写C/ c++主函数的更多信息,请参阅结构生成的例子C/ c++主函数(MATLAB编码器)

  • 硬件窗格中,设置用户名密码树莓派的董事会

  • 深度学习窗格中,设置目标库臂计算.指定ARM计算库版本ARM计算架构

3.关闭Settings窗口并生成代码。

4.点击下一个去…完成工作流程页面。

获取生成的可执行目录

一旦代码生成完成,下面几行代码将在树莓派上测试生成的代码,将输入的ECG信号复制到生成的代码目录中。您可以手动或使用raspi.utils.getRemoteBuildDirectoryAPI。方法生成的二进制文件的目录codegen函数。假设二进制文件只在一个目录中找到,输入:

applicationDirPaths =…

raspi.utils.getRemoteBuildDirectory(“applicationName”、“waveformSegmentation”);

targetDirPath = applicationDirPaths {1} .directory;

复制输入文件到树莓派

要复制运行可执行程序所需的文件,请使用putFile,它可与MATLAB支持包的树莓派硬件。金宝app的input.csv文件包含用于测试部署代码的ECG信号示例。

r.putFile (input.csv, targetDirPath);

输入= dlmread(“input.csv”);

在树莓派上运行可执行程序

在MATLAB的树莓派上运行可执行程序,并将输出文件获取到MATLAB。输入文件名应该作为可执行文件的命令行参数传递。

exeName =“waveformSegmentation.elf”;%可执行文件的名字

命令= ['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))

标题(“预测标签”)

参考文献

McSharry, Patrick E.等。"产生合成心电图信号的动力学模型"生物医学工程学报。第50卷第3期,2003年,289-294页。

[2]拉古纳,巴勃罗,雷蒙Jané,还有佩雷·卡米纳尔。多导联心电图信号的波边界自动检测:CSE数据库验证计算机和生物医学研究。第27卷,第1期,1994年,45-60页。

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:复杂生理信号新研究资源的组成部分”循环。Vol. 21, No. 2, 2000, pp. e215-e220。(循环电子页;http://circ.ahajournals.org/content/101/23/e215.full].

另请参阅

应用程序

功能

相关的话题