主要内容

利用小波分析和深度学习在NVIDIA Jetson上部署信号分类器

这个例子展示了如何生成和部署CUDA®可执行程序,该程序使用连续小波变换(CWT)和预训练卷积神经网络(CNN)提取的特征对人类心电图(ECG)信号进行分类。

SqueezeNet是CNN的一个深度频道,最初的设计是将图像分为1000个类别。我们利用CNN的网络结构,根据ECG信号的标度图对其进行分类。标度图是信号CWT的绝对值。在训练SqueezeNet对心电信号进行分类之后,您可以创建一个CUDA可执行程序,生成心电信号的标度图,然后使用CNN对信号进行分类。可执行文件和CNN都部署到NVIDIA硬件上。

这个例子使用的数据与使用小波分析和深度学习分类时间序列.在这个例子中,使用GoogLeNet和SqueezeNet的迁移学习将心电波形分为三类之一。为了方便,这里重复了数据的描述和获取方法。

心电数据描述及下载

ECG数据是从三组的人获得:心脏心律失常(ARR)的人,具有充血性心力衰竭(CHF)的人,以及具有正常窦性心律(NSR)的人。总共有三个PhysioIoneT数据库的162个ECG录制:MIT-BIH心律失常数据库[2] [3],MIT-BIH普通窦律数据库[3],和BIDMC充血性心力衰竭数据库[1] [3]。更具体地说,从心律失常的人的96次录音,30人从具有充血性心力衰竭的人的录音,36人从正常的窦性心律的人的录音。目标是培训模型以区分ARR,CHF和NSR。

您可以从MathWorks获取此数据github存储库.要从网站下载数据,请单击代码并选择下载zip..保存文件physionet_ECG_data-main.zip在有写权限的文件夹中。本例的说明假设您已经将文件下载到临时目录,Tempdir.,在matlab。修改后续说明解压缩并加载数据如果您选择在不同的文件夹中下载数据Tempdir.

从github下载数据后,将文件解压缩在临时目录中。

解压缩(fullfile (tempdir,'physionet_ecg_data-main.zip'),Tempdir)

解压缩创建文件夹PhysioIoneT-ECG_DATA-MAIN在您的临时目录中。此文件夹包含文本文件readme.md.ECGData.zip.这ECGData.zip文件包含:

  • Ecgdata.mat

  • modified_physionet_data.txt.xt.

  • license.txt.

Ecgdata.mat保持此示例中使用的数据。文本文件modified_physionet_data.txt.xt.Physioneet的复制策略是必需的,并为数据提供数据的源属性以及应用于每个ECG录制的预处理步骤的描述。

解压缩ECGData.zipPhysioIoneT-ECG_DATA-MAIN.将数据文件加载到MATLAB工作区中。

解压缩(fullfile (tempdir,“physionet_ECG_data-main”“ECGData.zip”),......fullfile(tempdir,“physionet_ECG_data-main”)加载(fullfile (tempdir“physionet_ECG_data-main”“ECGData.mat”))

ECGData是一个有两个字段的结构数组:数据标签.这数据字段是一个162×65536矩阵,其中每行是在128赫兹采样的ECG录制。标签是一个162×1个单元格诊断标签,每行标签数据.三个诊断类别是:“加勒比海盗”'chf', 和“签约”

特征提取

下载数据后,必须生成信号的标量图。标量图是CNN的“输入”图像。

要存储每个类别的缩放图,首先创建ECG数据目录'数据'里面Tempdir..然后创建三个子目录'数据'以每个心电图类别命名。辅助功能HelpercreateCgdirectories为你做这个。HelpercreateCgdirectories接受EcgData., ECG数据目录的名称,以及父目录的名称作为输入参数。你可以换Tempdir.使用您具有写入权限的另一个目录。您可以找到此辅助功能的源代码金宝app支持功能小节。

parentdir = tempdir;datadir =.'数据';HelpercreateCgdirectories(Ecgdata,Parentdir,Datadir)

在制作文件夹后,将ECG信号的缩放标记为RGB图像,并将其写入相应的子目录datadir..要创建标量图,首先要预计算CWT滤波器组。在使用相同的参数获取多个信号的小波变换时,预计算滤波器组是首选的方法。辅助功能Helpercreatergbfromtf.这是否。这source code for this helper function is in the金宝app支持功能小节。要与Screezenet架构兼容,每个RGB图像是大小227-×227-3的数组。

helperCreateRGBfromTF (ECGData parentDir dataDir)

将数据集分为训练数据和验证数据

将缩放图像加载为图像数据存储。这imageDatastore功能根据文件夹名称自动标记图像,并将数据存储为imageageAtastore.目的。图像数据存储使您能够存储大图像数据,包括不适合内存的数据,并在培训CNN时有效地读取批次图像。

Allimages = ImageageAtastore(fullfile(tempdir,datadir),......'insertumbfolders',真的,......'labelsource''foldernames');

随机将图像分为两组,一个用于训练,另一组用于验证。使用80%的图像进行培训和剩余的验证。出于可重复性的目的,我们将随机种子设置为默认值。

RNG.默认[imgstrain,imgsvalidation] = spliteachLabel(Allimages,0.8,'随机');DISP(['培训次数:',num2str(numel(imgstrain.files))]);
训练数量:130
DISP(['验证数量:'num2str(元素个数(imgsValidation.Files))));
验证数量图像:32

挤压

SqueezeNet是一个经过训练的CNN,可以将图像分为1000个类别。你得重新训练一下"挤压网"来处理心电图分类问题。再培训之前,您需要修改几个网络层并设置各种培训选项。再培训完成后,您保存CNN在一个。垫文件。CUDA可执行文件将使用。垫文件。

指定一个试验索引和一个结果目录。如果需要,创建目录。

审判= 1;ResultDir ='结果'如果〜存在(结果Dir,“dir”)MKDIR(结果德尔)结束matfile = fullfile(结果Dir,Sprintf(“SqueezeNet_Trial % d.mat”,审判));

加载sqeezenet。提取图层图并检查最后五层。

sqz = squeezenet;lgraph = layerGraph (sqz);Lapraph.Layers(结束4:结束)
ANS = 5×1层阵列,图层:1'CONV10'卷积1000 1×1×512卷绕卷曲[1 1]和填充[0 0 0 0] 2'Relu_Conv10'Creu Relu 3'Pool10'全局平均池全局平均池4'Prob'Softmax Softmax 5'ClassificationLayer_PreDictions'分类输出CrossentRopyex与“Tench”和999其他课程

恢复挤压Zenet以分类三类的心电图信号,更换'conv10'带有新卷积层的层,具有滤波器数量等于ECG类的数量。用没有类标签的新一个替换分类层。

numClasses =元素个数(类别(imgsTrain.Labels));new_conv10_WeightLearnRateFactor = 1;new_conv10_BiasLearnRateFactor = 1;numClasses newConvLayer = convolution2dLayer (1,......'名称''new_conv10'......“WeightLearnRateFactor”,new_conv10_weightlearnratefactor,......'biaslearnratefactor', new_conv10_BiasLearnRateFactor);lgraph = replaceLayer (lgraph,'conv10',newconvlayer);newclasslayer = classificationlayer('名称'“new_classoutput”);lgraph = replaceLayer (lgraph,“ClassificationLayer_predictions”,newclasslayer);Lapraph.Layers(结束4:结束)
ans = 5×1 Layer array with layers: 1 'new_conv10' Convolution 3 1×1 convolutions with stride [1 1] and padding [0 0 0] 2 'relu_conv10' ReLU ReLU 3 'pool10' Global Average Pooling Global Average Pooling 4 ' prox ' Softmax Softmax 5 'new_classoutput' Classification Output crossentropyex . jpg (46.86 kb,下载时间:10分钟

创建一套使用SqueezeNet的培训选项。

Optimsolver =.“个”;minibatchsize = 15;maxepochs = 20;initiallearnrate = 1e-4;动量= 0.9;executionenvironment ='中央处理器';选项= TrainingOptions(Optimsolver,......'minibatchsize'MiniBatchSize,......'maxepochs'MaxEpochs,......“InitialLearnRate”InitialLearnRate,......'vightationdata',imgsvalidation,......'验证职业'10,......'executionenvironment'ExecutionEnvironment,......“动量”,势头);

保存结构中的所有参数。经过训练的网络和结构将在以后保存在。垫文件。

TrialParameter。new_conv10_WeightLearnRateFactor = new_conv10_WeightLearnRateFactor;TrialParameter。new_conv10_BiasLearnRateFactor = new_conv10_BiasLearnRateFactor;TrialParameter。Optimsolver =.OptimSolver; TrialParameter.MiniBatchSize = MiniBatchSize; TrialParameter.MaxEpochs = MaxEpochs; TrialParameter.InitialLearnRate = InitialLearnRate; TrialParameter.Momentum = Momentum; TrialParameter.ExecutionEnvironment = ExecutionEnvironment;

将随机种子设置为默认值,训练网络。保存包含验证图像的训练网络、试验参数、训练运行时间和图像数据存储。在桌面CPU上,培训过程通常需要1-5分钟。如果你想使用一个训练有素的CNN从以前的试验,设置审判该试验的指数数量和LoadModel.真的

LoadModel = false;如果~ LoadModel rng默认抽搐;trainedModel = trainNetwork (imgsTrain、lgraph选项);trainingTime = toc;fprintf(总训练时间:%。2 e秒\ n”,训练时间);保存(Matfile,'TrialParameter''trousmodel'“trainingTime”'imgsvalidation');其他的disp (从文件中加载ML模型)负载(MATFILE,'trousmodel''imgsvalidation');结束
初始化输入数据规范化。|======================================================================================================================| | 时代| |迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习  | | | | ( hh: mm: ss) | | |精度精度损失| | |率损失|======================================================================================================================| | 1 | 1 | 00:00:02 | | 26.67% 25.00% | 4.1769 | 2.9883 | 1.0000 e-04 | | 2 | 10 | 00:00:12 | | 73.33% 59.38% | 0.9877 | 1.1559 | 1.0000 e-04 | | 3 | 20 | 00:00:21 | | 60.00% 56.25% | 0.9164 | 0.9182 | 1.0000 e-04 | | 4 | 30 |00:00:31 | | 86.67% 68.75% | 0.6698 | 0.7883 | 1.0000 e-04 | | 5 | 40 | 00:00:40 | | 66.67% 68.75% | 0.9053 | 0.7489 | 1.0000 e-04 | | 7 | 50 | 00:00:50 | | 80.00% 78.13% | 0.5422 | 0.6781 | 1.0000 e-04 | | 8 | | 60 00:00:59 | | 100.00% 81.25% | 0.4187 | 0.6124 | 1.0000 e-04 | | 70 | | 00:01:08 | | 93.33% 84.38% | 0.3561 | 0.5471 | 1.0000 e-04 | | 10| 80 | 00:01:18 | | 73.33% 84.38% | 0.5141 | 0.4765 | 1.0000 e-04 | | 90 | | 00:01:27 | | 86.67% 84.38% | 0.4220 | 0.4038 | 1.0000 e-04 | | 100 | | 00:01:36 | | 93.33% 90.63% | 0.1923 | 0.3476 | 1.0000 e-04 | | 110 | | 00:01:46 | | 100.00% 90.63% | 0.1472 | 0.3125 | 1.0000 e-04 | | 120 | | 00:01:55 | | 100.00% 93.75% | 0.0791 | 0.2777 |1.0000 e-04 | | 130 | | 00:02:04 | | 86.67% 93.75% | 0.2486 | 0.2833 | 1.0000 e-04 | | 140 | | 00:02:14 | | 100.00% 93.75% | 0.0386 | 0.2288 | 1.0000 e-04 | | 19 | 150 | 00:02:23 | | 100.00% 93.75% | 0.0487 | 0.2397 | 1.0000 e-04 | | 160 | | 00:02:32 | | 100.00% 93.75% | 0.0224 | 0.2041 | 1.0000 e-04 ||======================================================================================================================|
总训练时间:1.61e+02秒

仅在单独的网络中保存培训的网络。垫文件。CUDA可执行文件将使用此文件。

ModelFile = fullfile (ResultDir sprintf (“SqueezeNet_Trial % d.mat”,审判));Outmatfile = fullfile('ecg_model.mat');data = load(modeloile,'trousmodel');net = data.trainedmodel;保存(outmatfile,'网');

使用经过训练的网络来预测验证集的类。

[ypred,probs] =分类(TrougherModel,IMGSValidation);精度=均值(Ypred == imgsvalidation.labels)
精度= 0.9375

用混淆图总结训练网络在验证集上的性能。通过使用列和行摘要显示每个类的精度和召回率。保存图。混淆图底部的表格显示了精度值。混淆图右侧的表格显示了召回值。

figure confusimat = confusimat (imgsvalidate . labels,YPred);confusionchart (imgsValidation。标签,YPred,......“标题”sprintf ('验证的混乱矩阵(总体准确性:%.4f)'、准确性),......'placeSummary''列 - 归一化'“RowSummary”“row-normalized”);

AccFigfile = FullFile(结果Dir,Sprintf('scrizzenet_validationAccuracy_trial%d.fig',审判));SaveAs(GCF,AccFigfile);

显示训练网络的大小。

信息= whos('trousmodel');ModelMemSize = info.bytes / 1024;fprintf('培训的网络大小:%g kb \ n',modelmemsize)
训练网络大小:2981.55 kB

确定网络对图像进行分类的平均时间。

numtestforpredtime = 20;TrialParameter.NumtestforPredtime = NumTestforPredtime;fprintf(“测试预测时间(测试数量:%d)…”,numtestforpredtime)
测试预测时间(测试次数:20次)…
图像智能= troughermodel.layers(1).Inputsize;predtime = zeros(numtestforpredtime,1);为了i = 1:numtestforpredtime x = randn(象色);抽搐;[ypred,probs] =分类(TrougherModel,x,'executionenvironment', ExecutionEnvironment);PredTime (i) = toc;结束AvgPredTimePerImage =意味着(PredTime);fprintf('平均预测时间(执行环境:%s):%.2e sec \ n'......executionEnvironment,avgpredtimeperimage);
平均预测时间(执行环境:CPU):2.94E-02秒

保存结果。

如果~ LoadModel保存(MatFile'准确性'“confusionMat”'predtime'“ModelMemSize”......'avgpredtimeperimage'“添加”结束

GPU代码生成-定义函数

信号的缩放标数是输入“图像”到深度CNN。创建一个函数,cwt_ecg_jetson_ex,计算输入信号的缩放标准并以用户指定的维度返回图像。图像使用喷气机(128)Colormap。这%#codegen.指示函数中用于代码生成的函数。当使用coder.gpu.kernelfun.Pragma,代码生成尝试映射计算cwt_ecg_jetson_ex函数到GPU。

类型cwt_ecg_jetson_ex.m.
该函数仅用于支持小波深度学习示例。金宝app%它可能会在未来的版本中改变或被删除。coder.gpu.kernelfun ();%%创建Scalogram cfs = cwt(timeserisignal, 'morse', 1, 'VoicesPerOctave', 12);cfs = abs (cfs);%%图像生成cmapj128 = code .load('cmapj128');imx = ind2rgb_custom_ecg_jetson_ex(圆(255 *重新调节(cfs)) + 1, cmapj128.cmapj128);% resize to proper size and convert to uint8 data type im = im2uint8(imresize(imx, ImgSize));结束

创建入口点函数,model_predict_ecg.m,用于代码生成。该功能将ECG信号作为输入拍摄并调用cwt_ecg_jetson_ex函数创建标量图的图像。这model_predict_ecg函数使用包含在的网络ecg_model.mat对心电信号进行分类。

类型model_predict_ecg.m
函数predclassprobb = model_predict_ecg(timeserisignal) %#codegen %金宝app%它可能会在未来的版本中改变或被删除。coder.gpu.kernelfun ();% parameters ModFile = 'ecg_model.mat';%保存神经网络模型的文件ImgSize = [227 227];% sanity check signal is a row vector of correct length assert(isequal(size(timeseriesssignal), [1 65536])) %% cwt transform for signal im = cwt_ecg_jetson_ex(timeseriesssignal, ImgSize);%%模型预测持久模型;如果是空的(模型)模型=编码器。loadDeepLearningNetwork (ModFile mynet);end PredClassProb = predict(model, im); end

要生成可以部署到NVIDIA目标的CUDA可执行文件,请创建自定义主文件(main_ecg_jetson_ex.cu.)和标题文件(main_ecg_jetson_ex.h).您可以生成一个示例主文件并使用它作为模板来重写新的主和头文件。有关更多信息,请参阅GenerateExampleMain的属性coder.codeConfig(MATLAB编码器).主文件调用为Matlab入门点函数生成的代码。主文件首先从文本文件读取ECG信号,将数据传递给入口点函数,并将预测结果写入文本文件(predclassprob.txt.).为了在GPU上最大化计算效率,可执行文件处理单精度数据。

类型main_ecg_jetson_ex.cu.
// //文件:main_ecg_jetson_ex。cu // //此文件仅用于支持小波深度学习示例。金宝app//它可能会在未来的版本中更改或删除。//*********************************************************************** // 包含文件# Include“rt_nonfinite.h”#包括“model_predict_ecg.h”#包括“main_ecg_jetson_ex.h”#包括“model_predict_ecg_terminate.h”#包括“model_predict_ecg_initialize.h”# Include < stdio . h > # Include < stdlib.h > # Include < time.h > / / / *函数定义从文件中读取数据*/ int readData_real32_T(const char * const file_in, real32_T data[65536]);if (fp1 == 0) {printf("错误:无法读取数据从%s\n", file_in);退出(0);} (int i = 0;我< 65536;I ++) {fscanf(fp1, "%f", &data[I]); } fclose(fp1); return 0; } /* Write data to a file*/ int writeData_real32_T(const char * const file_out, real32_T data[3]) { FILE* fp1 = fopen(file_out, "w"); if (fp1 == 0) { printf("ERROR: Unable to write data to %s\n", file_out); exit(0); } for(int i=0; i<3; i++) { fprintf(fp1, "%f\n", data[i]); } fclose(fp1); return 0; } // model predict function static void main_model_predict_ecg(const char * const file_in, const char * const file_out) { real32_T PredClassProb[3]; // real_T b[65536]; real32_T b[65536]; // readData_real_T(file_in, b); readData_real32_T(file_in, b); model_predict_ecg(b, PredClassProb); writeData_real32_T(file_out, PredClassProb); } // main function int32_T main(int32_T argc, const char * const argv[]) { const char * const file_out = "predClassProb.txt"; // Initialize the application. model_predict_ecg_initialize(); // Run prediction function main_model_predict_ecg(argv[1], file_out); // argv[1] = file_in // Terminate the application. model_predict_ecg_terminate(); return 0; }
类型main_ecg_jetson_ex.h
// // File: main_ecg_jetson_ex.h // //此文件仅用于支持小波深度学习示例。金宝app//它可能会在未来的版本中更改或删除。// //*********************************************************************** # 如果未定义MAIN_H # define MAIN_H / /包含文件# Include < stddef.h > # Include < stdlib.h > # Include“rtwtypes.h”# Include " model_predict_ecg_types.h " / /函数声明走读生int32_T主要(int32_T argc, const char * const argv []);#endif // //文件拖车main_ecg_jetson_ex.h // // [EOF] //

GPU代码生成 - 指定目标

创建可以部署到目标设备的可执行文件,设置CodeGenMode等于1。如果要创建本地运行并远程连接到目标设备的可执行文件,请设置CodeGenMode等于2。

主要的函数从指定的文本文件中读取数据signalFile并将分类结果写入结果水.集ExampleIndex选择代表性的ECG信号。您将使用此信号来测试可执行文件分类功能。Jetson_Builddir.指定用于在目标上执行远程构建过程的目录。如果目标上不存在指定的构建目录,则该软件将创建具有给定名称的目录。

CodeGenMode =1;signalfile ='signaldata.txt';结果文件='predclassprob.txt'%与“main_ecg_jetson_ex.cu”一致Jetson_BuildDir =“~ / projectECG”;ExampleIndex = 1;%1,4:rote arr;2,5:CHF型;3,6:类型NSRfunction_to_gen =.“model_predict_ecg”;modfile =.'ecg_model.mat'%保存神经网络模型的文件;符合“main_ecg_jetson_ex.cu”Imgsize = [227 227];ML模型的输入图像大小转变ExampleIndex情况下1%arr 7.Samplesignalidx = 7;情况下2%CHF 97.Samplesignalidx = 97;情况下3.% NSR 132samplesignalidx = 132;情况下4.%的ARR 31Samplesignalidx = 31;情况下5.%CHF 101.Samplesignalidx = 101;情况下6.% NSR 131samplesignalidx = 131;结束signal_data = sing(ecgdata.data(samplesignalidx,:));ecgtype = ecgdata.labels {sampleignalidx};

GPU代码生成-连接到硬件

要与NVIDIA硬件通信,您可以使用杰森功能。您必须知道目标板的主机名或IP地址,用户名和密码以创建实时硬件连接对象。

为Jetson硬件创建活动硬件连接对象。在硬件活对象创建检查硬件,IO服务器安装和收集外设信息的目标。此信息将显示在“命令窗口”中。

hwobj =杰森('gpucoder-nano-2''ubuntu''ubuntu');
检查目标上的CUDA可用性...检查目标系统路径中的“NVCC”...检查目标上的CUDN N库可用性...检查目标上的TensorR库可用性...检查先决条件库是完全的。收集硬件详细信息...检查目标的第三方库可用性...
收集硬件详细信息已完成。板名称:NVIDIA JETSON TX1 CUDA版本:10.0 CUDNN版本:7.3张力特版本:5.0 GStreamer版本:1.14.5 V4L2版本:1.14.5 V4L2版本:1.14.2-1 SDL版本:1.2可用网络摄像头:可用GPU:NVIDIA TEGRA X1

使用Coder.CheckGPuInstall.(GPU编码器)函数并验证运行此示例所需的编译器和库是否在硬件上正确设置。

envCfg = coder.gpuEnvConfig ('jetson');envcfg.deeplibtarget =.“cudnn”;envCfg。DeepCodegen = 1;envCfg。HardwareObject = hwobj;envCfg。安静= 1;coder.checkGpuInstall (envCfg)
ans =结构体字段:GPU:1 CUDA:1 CUDNN:1 TENTORT:0 BasicCodegen:0 BasicCodeExec:0 DeepCodeGEN:1 DeepCodeExec:0 TensorRDatatype:0分析:0

GPU代码生成-编译

创建编译所需的GPU代码配置对象。使用编码器。硬件功能为Jetson平台创建配置对象并将其分配给硬件属性CFG..使用'nvidia jetson'用于Jetson TX1或TX2单板。自定义主文件是一个包装器,在生成的代码中调用入口点函数。部署的可执行文件需要自定义文件。

使用编码器。DeepLearningConfig(GPU编码器)函数创建CUDNN.深度学习配置对象并将其分配给DeepLearningConfig图形处理器代码配置对象的属性。代码生成器利用NVIDIA®CUDA®深神经网络库(cuDNN)为NVIDIA gpu。cuDNN是一个gpu加速的深度神经网络原语库。

如果CodeGenMode == 1 cfg = code . gpuconfig ('可执行程序');cfg。硬件= coder.hardware ('nvidia jetson');cfg.hardware.builddir = jetson_builddir;cfg.deeplearningconfig = coder.deeplearningconfig(“cudnn”);cfg。CustomSource = fullfile (“main_ecg_jetson_ex.cu”);eleesifcodegenmode == 2 cfg = coder.gpuconfig('lib');cfg。VerificationMode =“公益诉讼”;cfg。硬件= coder.hardware ('nvidia jetson');cfg.hardware.builddir = jetson_builddir;cfg.deeplearningconfig = coder.deeplearningconfig(“cudnn”);结束

要生成CUDA代码,使用Codegen.功能并通过GPU代码配置以及输入的输入的大小和类型model_predict_ecg入口点函数。在主机上完成代码生成后,将复制生成的文件并在目标上构建。

Codegen(“配置”,cfg,function_to_gen,'-args',{signal_data},“报告”);
代码成功:查看报告

GPU代码生成 - 执行

如果编译了要部署到目标的可执行文件,则将示例ECG信号写入文本文件。使用putFile ()硬件对象的功能将文本文件放在目标上。这Workspacedir.属性包含到的路径Codegen.目标文件夹。

如果codegenmode == 1 fid = fopen(信号文件,' w ');为了i = 1:长度(signal_data)fprintf(fid,'%f \ n',signal_data(i));结束文件关闭(fid);hwobj.putFile (signalFile hwobj.workspaceDir);结束

运行可执行文件。

在运行部署的可执行文件时,如果前面的结果文件存在,请删除它。使用runapplication()函数在目标硬件上启动可执行文件,然后getFile ()函数来检索结果。因为结果可能不立即存在runapplication()函数调用返回,并允许通信延迟,设置将结果获取到90秒的最长时间。使用evalc.函数抑制命令行输出。

如果CodegenMode == 1%运行部署可执行文件maxfetchtime = 90;结果文件_hw = fullfile(hwobj.workspacedir,结果文件);如果ispc resultFile_hw = strrep(resultFile_hw,'\''/');结束ta =抽搐;hwobj.deleteFile (resultFile_hw) hwobj.runApplication (Function_to_Gen signalFile);tf =抽搐;成功= false;尽管toc(tf)尝试evalc(“hwobj.getFile (resultFile_hw)”);成功=真;结束如果成功休息结束结束fprintf('获取时间=%.3e sec \ n',toc(tf));断言(成功,'无法获取预测')predclassprob = readmatrix(结果文件);PredTime = toc (ta);eleesifcodegenmode == 2%运行PIL可执行文件ta =抽搐;eval(Sprintf(' PredClassProb = % s_pil (signal_data);“Function_to_Gen));PredTime = toc (ta);eval(Sprintf(“清楚% s_pil;”Function_to_Gen));%终止pil执行结束
###在目标上启动可执行文件…可执行文件已成功启动,进程ID为5672。显示可执行文件的简单运行时日志…系统(hwobj,'cat /home/ubuntu/ projectecg / matlab_ws / r2021a / c / users / pkosteele / onedrive_ -_MathWorks/Documents/MATLAB/Examples/deeplearning_shared-ex54874305/model_predict_ecg.log')
读取时间= 9.743e+00秒

使用分类函数来预测示例信号的类标签。

moddata = load(modfile,'网');我= cwt_ecg_jetson_ex (signal_data ImgSize);[ModPred, ModPredProb] = classification (ModData.net,im);PredCat =类别(ModPred) ';

比较结果。

PredTableJetson = array2table (PredClassProb (:),'variablenames',matlab.lang.makevalidname(predcat));fprintf('tpred =%.3e sec \ nexample ecg类型:%s \ n'、PredTime ECGtype)
Tpred = 1.288E + 01秒示例ECG类型:ARR
disp(predtablejetson)
由瑞士法郎NSR  _______ ________ ________ 0.99872 0.001131 0.000153
predtablematlab = array2table(modpredprob(:)','variablenames',matlab.lang.makevalidname(predcat));disp(predtablematlab)
ARR CHF NSR _______ ___________________0.099872 0.0011298 0.00015316

关闭硬件连接。

清晰的hwobj.

总结

此示例显示如何创建和部署使用CNN来对ECG信号进行分类的CUDA可执行文件。您还可以选择在本地创建可执行的运行并连接到远程目标。此示例中介绍了一个完整的工作流程。下载数据后,CWT用于从ECG信号中提取特征。然后刷新挤压Zenet以基于其缩放分类信号。在目标NVIDIA设备上创建和编译两个用户定义的函数。将可执行文件的结果与MATLAB进行比较。

参考文献

  1. Baim, D. S., W. S. Colucci, E. S. Monrad, H. S. Smith, R. F. Wright, A. Lanoue, D. F. Gauthier, B. J. Ransil, W. Grossman, E. Braunwald。口服米力农治疗严重充血性心力衰竭患者的生存率美国心脏病学学院学报.1986年第7卷第3期,第661-670页。

  2. Goldberger A. L.,L. A. N.Maral,L.玻璃,J.M.Hausdorff,P. Ch。Ivanov,R.G.Mark,J.E.Mietus,G. B.Coody,C. -K。彭和H. E. Stanley。“Physiobank,PhysioLoolkit和PhysioIoneet:复杂生理信号的新研究资源的组成部分。”循环。卷。101,第23号:E215-E220。[循环电子页面;http://circ.ahajournals.org/content/101/23/e215.full.];2000年(6月13日)。DOI:10.1161 / 01.CIR.101.23.E215。

  3. 穆迪,g。B。和r。g。马克。" MIT-BIH心律失常数据库的影响"医学与生物工程杂志.20卷。第3页,2001年5 - 6月,第45-50页。(PMID: 11446209)

金宝app支持功能

HelpercreateCgdirectories

功能HelpercreateEcGDirectories(EcgData,ParentFolder,DataFolder)%此功能仅旨在支持小波深度学习示例。金宝app%它可能会在将来的释放中更改或被删除。rootfolder = parentfolder;localfolder = datafolder;mkdir(fullfile(rootfolder,localfolder))folderlabels =唯一(ecgdata.labels);为了i = 1:numel(folderlabels)mkdir(fullfile(rootfolder,localfolder,char(folderlabels(i))));结束结束

螺旋伸点

功能helperPlotReps (ECGData)%此功能仅旨在支持小波深度学习示例。金宝app%它可能会在将来的释放中更改或被删除。folderLabels =独特(ECGData.Labels);为了k = 1:3 ecgtype = folderlabels {k};IND =查找(ISMEMBER(ECGDATA.LABELS,ECGTYPE));子图(3,1,k)绘图(EcgData.data(Ind(1),1:1000));网格标题(ECGTYPE)结束结束

Helpercreatergbfromtf.

功能Helpercreatergbfromtf(EcgData,Parentfolder,Childfolder)%此功能仅旨在支持小波深度学习示例。金宝app%它可能会在将来的释放中更改或被删除。imageRoot = fullfile (parentFolder childFolder);数据= ECGData.Data;标签= ECGData.Labels;[~, signalLength] =大小(数据);fb = cwtfilterbank ('signallength'signalLength,'voicesperoctave',12);r =大小(数据,1);为了II = 1:R CFS = ABS(FB.WT(数据(II,:)));IM = IND2RGB(IM2UINT8(Rescale(CFS)),Jet(128));imgloc = fullfile(ImageRoot,char(标签(ii)));imfilename = strcat(char(标签(ii)),'_'num2str (ii),'.jpg');imwrite (imresize (im, 227年[227]),fullfile (imgLoc imFileName));结束结束

也可以看看

||(GPU编码器)

相关话题