主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

ウェ,ブレット解析と深層学習を使用したNVIDIA Jetsonへの信号分類器のデプロ

この例では,連続ウェーブレット変換(CWT)と事前学習済みの畳み込みニューラルネットワーク(CNN)を使用して人間の心電図(ECG)信号を分類するCUDA®実行可能ファイルを生成およびデプロイする方法を説明します。

SqueezeNetは,当1000年初のカテゴリにイメージを分類するために設計された深層CNNです。スカログラムを基にした心电图信号を分類するためにCNNのネットワークアーキテクチャを再利用します。スカログラムは,信号のCWTの絶対値です。心电图信号を分類するようにSqueezeNetを学習させた後,心电图信号のスカログラムを生成してからCNNを使用して信号を分類するCUDA実行可能ファイルを作成します。実行可能ファaapl . cnの両方がaapl . cnハaapl . cn

この例では,ウェ,ブレット解析と深層学習を使用した時系列の分類で使用したのと同じデ,タを使用します。この例では,GoogLeNet と SqueezeNet による転移学習を使用して、ECG 波形を 3 つのカテゴリのうちの 1 つに分類します。便宜上、ここではデータの概要とこのデータを取得する方法について再度説明します。

心电图デ,タの説明とダウンロ,ド

Ecgデタは人の3のグルプから取得されます。具体的には,心不整脈の患者(ARR)鬱血性心不全の患者(瑞士法郎),および正常洞調律の患者(NSR)のグループです。3次のつの生理网データベースから,合162計個の心电图記録を取得します。MIT-BIH心律失常数据库[2][3]、MIT-BIH正常窦性心律数据库[3]、BIDMC充血性心力衰竭数据库[1][3]。具体的には,不整脈の患者の記録は96個鬱血性心不全の患者の記録は30個正常洞調律の患者の記録は36個あります。目標は,arr, chf, nsrを区別するようにモデルに学習させることです。

このデ,タはMathWorksのGitHubリポジトリから入手できます。デ.タをWebサ.トからダウンロ.ドするには,[代码]をクリックして[下载ZIP]を選択します。書き込み権限のあるフォルダに,ファルphysionet_ECG_data-main.zipを保存します。この例の手順では,ファ恭顺器ルを一時ディレクトリ(matlabのtempdir)にダウンロ,ドしているものと仮定します。tempdirとは異なるフォルダーにデータをダウンロードすることを選択した場合は,データの解凍および読み込みに関する後続の手順を変更してください。

デタをGitHubからダウンロドした後,一時ディレクトリでそのファルを解凍します。

解压缩(fullfile (tempdir,“physionet_ECG_data-main.zip”), tempdir)

解凍すると,一時ディレクトリにフォルダphysionet-ECG_data-mainが作成されます。このフォルダには,テキストファルREADME.mdECGData.zipが含まれます。ECGData.zipファ@ @ルには次のものが含まれています。

  • ECGData.mat

  • Modified_physionet_data.txt

  • License.txt

ECGData.matは,この例で使用されるデ,タを保持します。テキストファ@ @ルModified_physionet_data.txt生理网はのコピーポリシーで必要になり,データのソース属性,および心电图の各記録に適用される前処理手順の説明を提供します。

physionet-ECG_data-main内にあるECGData.zipを解凍します。デタファルをmatlabワクスペスに読み込みます。

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

ECGDataは,2 ECGDataのフィ,ルド(数据および标签)をも構造体配列です。数据フィールドは162行65536列の行列で,各行は128 Hzでサンプリングした心电图記録です。标签は162行1列の診断ラベルのcell配列で,それぞれのラベルが数据の各行に対応します。3.つの診断カテゴリは、“加勒比海盗”瑞士法郎的,および“签约”です。

特徴抽出

デ,タをダウンロ,ドした後,信号のスカログラムを生成しなければなりません。スカログラムはCNNへの"入力"メジです。

各カテゴリのスカログラムを保存するには,最初にtempdir内にecgデ,タディレクトリ“数据”を作成します。その後,各ecgカテゴリに由来した“数据”に3のサブディレクトリを作成します。これは,補助関数helperCreateECGDirectoriesによって実行されます。helperCreateECGDirectoriesは,ECGData, ecgデ,タディレクトリの名前,親ディレクトリの名前を入力引数として受け入れます。tempdirを書き込み権限のある別のディレクトリと置き換えることができます。この補助関数のソ,スコ,ドは,この例の最後にあるサポ,ト関数の節で見けることができます。

parentDir = tempdir;dataDir =“数据”;helperCreateECGDirectories (ECGData parentDir dataDir)

フォルダーを作成した後,心电图信号のスカログラムをRGBイメージとして作成し,これらのイメージをdataDir内の適切なサブディレクトリに書き込みます。スカログラムを作成するには,まずCWTフィルタ,バンクを事前に計算します。フィルターバンクの事前計算は,同じパラメーターを使用して多数の信号のCWTを取得するときに推奨される方法です。これを実行するのは補助関数helperCreateRGBfromTFです。この補助関数のソ,スコ,ドは,この例の最後にあるサポ,ト関数の節に記載されています。SqueezeNetアーキテクチャと互換性をもたせるために、各 RGB イメージは 227 x 227 x 3 のサイズの配列になります。

helperCreateRGBfromTF (ECGData parentDir dataDir)

学習デ,タと検証デ,タへのデ,タセットの分割

スカログラム▪▪メ▪ジを▪▪メ▪ジデ▪タストアとして読み込みます。関数imageDatastoreは、フォルダ、名に基づいて、メ、ジに自動的にラベルを付け、このデ、タをImageDatastoreオブジェクトとして格納します。イメージデータストアを使用すると,メモリに収まらないデータなどのサイズが大きいイメージデータを格納して,CNNの学習中にイメージをバッチ単位で効率的に読み取ることができます。

allImages = imageDatastore(fullfile(tempdir,dataDir),“IncludeSubfolders”,真的,“LabelSource”“foldernames”);

イメージを2つのグループ(学習用と検証用)にランダムに分割します。。再現性を得るために,乱数シ,ドを既定値に設定します。

rng默认的[imgsTrain,imgsValidation] = splitEachLabel(allImages,0.8,“随机”);disp (['训练图像数量:'num2str(元素个数(imgsTrain.Files))));
训练图像数量:130张
disp ([验证图像的数量:num2str(元素个数(imgsValidation.Files))));
验证图像数量:32

SqueezeNet

1000年SqueezeNetは,イメージをのカテゴリに分類できる事前学習済みのCNNです。ECG分類問題に対応するように,SqueezeNetに再学習させる必要があります。再学習を行う前に,いくかのネットワク層を変更し,各種の学習オプションを設定します。再学習が完了したら,cnnを.matファ@ @ルに保存します。Cuda実行可能ファ苹果苹果ルはこの.matファ@ @ルを使用します。

実験用の試行@ @ンデックスと結果ディレクトリを指定します。このディレクトリがなければ作成します。

试验= 1;ResultDir =“结果”如果~存在(ResultDir“dir”mkdir (ResultDir)结束MatFile = fullfile(ResultDir,sprintf(“SqueezeNet_Trial % d.mat”、试验));

SqeezeNetを読み込みます。層グラフを抽出し,最後の5の層を検査します。

SQZ =挤压板;lgraph = layerGraph(sqz);lgraph.Layers (end-4:结束)
ans = 5×1带有图层的层数组:1 'conv10' Convolution 1000 1×1×512 convolutions with stride[1 1]和padding [0 000 0] 2 'relu_conv10' ReLU ReLU 3 'pool10' Global Average Pooling Global Average Pooling 4 'prob' Softmax Softmax 5 'ClassificationLayer_predictions' Classification Output crossentropyex with 'tench'和999个其他类

ECG信号の3のクラスを分類するようにSqueezeNetに再学習させるには,“conv10”層を,ecgクラスの数と同じ数のフィルタをも新しい畳み込み層で置き換えます。分類層をクラスラベルがない新しい分類層に置き換えます。

numClasses = numel(categories(imgsTrain.Labels));new_conv10_weightlearnatefactor = 1;new_conv10_biaslearnatefactor = 1;newConvLayer = convolution2dLayer(1,numClasses,“名字”“new_conv10”“WeightLearnRateFactor”new_conv10_WeightLearnRateFactor,“BiasLearnRateFactor”, new_conv10_BiasLearnRateFactor);lgraph =替换层(lgraph,“conv10”, newConvLayer);newClassLayer = classificationLayer(“名字”“new_classoutput”);lgraph =替换层(lgraph,“ClassificationLayer_predictions”, newClassLayer);lgraph.Layers (end-4:结束)
ans = 5×1带有图层的层数组:1 'new_conv10' Convolution 3 1×1 convolutions with stride[1 1]和padding [0 0 0 0 0] 2 'relu_conv10' ReLU ReLU 3 'pool10' Global Average Pooling Global Average Pooling 4 'prob' Softmax Softmax 5 'new_classoutput' Classification Output crossentropyex

SqueezeNetで使用する一連の学習オプションを作成します。

OptimSolver =“个”;MiniBatchSize = 15;MaxEpochs = 20;InitialLearnRate = 1e-4;动量= 0.9;ExecutionEnvironment =“cpu”;选项= trainingOptions(OptimSolver,“MiniBatchSize”MiniBatchSize,“MaxEpochs”MaxEpochs,“InitialLearnRate”InitialLearnRate,“ValidationData”imgsValidation,“ValidationFrequency”10“ExecutionEnvironment”ExecutionEnvironment,“动量”、动力);

すべてのパラメタを1の構造体内に保存します。学習済みネットワ,クと構造体は後で.matファ@ @ルに保存します。

TrialParameter。new_conv10_weightlearnatefactor = new_conv10_weightlearnatefactor;TrialParameter。new_conv10_biaslearnatefactor = new_conv10_biaslearnatefactor;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,options);trainingTime = toc;流(’总训练时间:%。2 e秒\ n”, trainingTime);保存(MatFile,“TrialParameter”“trainedModel”“trainingTime”“imgsValidation”);其他的disp (从文件中加载ML模型)负载(MatFile“trainedModel”“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.0000e-04 | | 3 | 20 | 00:00:21 | 60.00% | 56.25% | 0.9164 | 0.9182 | 1.0000e-04 | | 4 | 30 | 00:00:31 | 86.67% | 68.75% | 0.6698 | 0.7883 | 1.0000e-04 | | 5 | 40 | 00:00:40 | 66.67% | 68.75% | 0.9053 | 0.7489 | 1.0000e-04 | | 7 | 50 | 00:00:50 | 80.00% | 78.13% | 0.5422 | 0.6781 | 1.0000e-04 | | 8 | 60 | 00:00:59 | 100.00% | 81.25% | 0.4187 | 0.6124 | 1.0000e-04 | | 9 | 70 | 00:01:08 | 93.33% | 84.38% | 0.3561 | 0.5471 | 1.0000e-04 | | 10 | 80 | 00:01:18 | 73.33% | 84.38% | 0.5141 | 0.4765 | 1.0000e-04 | | 12 | 90 | 00:01:27 | 86.67% | 84.38% | 0.4220 | 0.4038 | 1.0000e-04 | | 13 | 100 | 00:01:36 | 93.33% | 90.63% | 0.1923 | 0.3476 | 1.0000e-04 | | 14 | 110 | 00:01:46 | 100.00% | 90.63% | 0.1472 | 0.3125 | 1.0000e-04 | | 15 | 120 | 00:01:55 | 100.00% | 93.75% | 0.0791 | 0.2777 | 1.0000e-04 | | 17 | 130 | 00:02:04 | 86.67% | 93.75% | 0.2486 | 0.2833 | 1.0000e-04 | | 18 | 140 | 00:02:14 | 100.00% | 93.75% | 0.0386 | 0.2288 | 1.0000e-04 | | 19 | 150 | 00:02:23 | 100.00% | 93.75% | 0.0487 | 0.2397 | 1.0000e-04 | | 20 | 160 | 00:02:32 | 100.00% | 93.75% | 0.0224 | 0.2041 | 1.0000e-04 | |======================================================================================================================|
总训练时间:1.61e+02秒

学習済みのネットワ,クのみを別個の.matファ@ @ルに保存します。このファaapl . exeルはcuda実行可能ファaapl . exeルで使用されます。

ModelFile = fullfile(ResultDir,sprintf(“SqueezeNet_Trial % d.mat”、试验));OutMatFile = fullfile(“ecg_model.mat”);数据=加载(ModelFile,“trainedModel”);net = data.trainedModel;保存(OutMatFile,“净”);

学習済みのネットワ,クを使用して,検証セットのクラスを予測します。

[YPred, probs] = classid (trainedModel,imgsValidation);accuracy = mean(YPred==imgsValidation.Labels)
准确度= 0.9375

検証セットに対する学習済みネットワ,クのパフォ,マンスを混同チャ,トに要約します。列と行の要約を使用して,各クラスの適合率と再現率を表示します。图を保存します。混同チャ,トの下にあるテ,ブルに,精度が示されます。混同チャ,トの右側にあるテ,ブルに,再現率が示されます。

figure confusionMat = confusionMat (imgsValidation.Labels,YPred);confusionchart (imgsValidation。标签,YPred,“标题”sprintf (验证上的混淆矩阵(总体准确度:%.4f)、准确性),“ColumnSummary”“column-normalized”“RowSummary”“row-normalized”);

AccFigFile = fullfile(ResultDir,sprintf(“SqueezeNet_ValidationAccuracy_Trial % d.fig”、试验));saveas (gcf AccFigFile);

学習済みネットワクのサズを表示します。

信息= whoos (“trainedModel”);ModelMemSize = info.bytes/1024;流('训练的网络大小:%g kB\n'ModelMemSize)
训练网络大小:2981.55 kB

ネットワクがメジの分類に費やす平均時間を求めます。

NumTestForPredTime = 20;TrialParameter。NumTestForPredTime = NumTestForPredTime;流(“测试预测时间(测试次数:%d)…”NumTestForPredTime)
测试预测时间(测试次数:20)…
imageSize = trainedModel.Layers(1).InputSize;= 0 (NumTestForPredTime,1);i = 1:NumTestForPredTime x = randn(imageSize);抽搐;[YPred, probs] = category (trainedModel,x,“ExecutionEnvironment”, ExecutionEnvironment);PredTime(i) = toc;结束AvgPredTimePerImage = mean(PredTime);流('平均预测时间(执行环境:%s): %。2e SEC \n'ExecutionEnvironment AvgPredTimePerImage);
平均预测时间(执行环境:cpu): 2.94 -02秒

結果を保存します。

如果~ LoadModel保存(MatFile“准确性”“confusionMat”“PredTime”“ModelMemSize”“AvgPredTimePerImage”“添加”结束

Gpuコド生成—関数の定義

信号のスカログラムは,深層CNNへの入力" aapl .メ.ジ"です。関数cwt_ecg_jetson_exを作成します。この関数は,入力信号のスカログラムを計算し,ユザが指定した次元でメジを返します。この▪▪メ▪▪ジは飞机(128)カラ,マップを使用します。この関数の% # codegen命令は,この関数がコ,ド生成用であることを指定します。coder.gpu.kernelfunプラグマを使用すると,コ,ド生成時に関数cwt_ecg_jetson_exの計算をgpuにマッピングしようとします。

类型cwt_ecg_jetson_ex.m
function im = cwt_ecg_jetson_ex(timeseriesssignal, ImgSize) %#codegen %此函数仅用于支持小波深度学习示例。金宝app它可能会在未来的版本中被更改或删除。。coder.gpu.kernelfun ();%%创建cfs = cwt(timeseriesssignal, 'morse', 1, 'VoicesPerOctave', 12);CFS = abs(CFS);%%图像生成cmapj128 = code .load('cmapj128');Imx = ind2rgb_custom_ecg_jetson_ex(round(255*rescale(cfs))+1,cmapj128.cmapj128);%调整大小到适当的大小,并转换为uint8数据类型im = im2uint8(imresize(imx, ImgSize));结束

コド生成用に,エントリポント関数model_predict_ecg.mを作成します。この関数はecg信号を入力として受け取り,関数cwt_ecg_jetson_exを呼び出してスカログラムの▪▪メ▪▪ジを作成します。関数model_predict_ecgは,ecg_model.matファ转换器ルに含まれているネットワ转换器クを使用して,ecg转换器信号を分類します。

类型model_predict_ecg.m
function PredClassProb = model_predict_ecg(timeseriesssignal) %#codegen %此函数仅用于支持小波深度学习示例。金宝app它可能会在未来的版本中被更改或删除。。coder.gpu.kernelfun ();% parameters ModFile = 'ecg_model.mat';ImgSize = [227 227];%完整性检查信号是一个正确长度的行向量assert(isequal(size(timeseriesssignal), [1 65536])) %% cwt转换为信号im = cwt_ecg_jetson_ex(timeseriesssignal, ImgSize);%%模型预测持久模型;如果为空(模型)模型=编码器。loadDeepLearningNetwork (ModFile mynet);end PredClassProb = predict(model, im); end

英伟达ターゲットにデプロイできるCUDA実行可能ファイルを生成するには,カスタムのメインファイル(main_ecg_jetson_ex.cu)とヘッダファル(main_ecg_jetson_ex.h)を作成します。メインファイルの例を生成し,それをテンプレートとして使用して新しいメインファイルとヘッダーファイルを再作成できます。詳細にいては,编码器。代码Config(MATLAB编码器)GenerateExampleMainプロパティを参照してください。メe @ e @ e @ e @ e @ e @ e @ e @ e @ e @ e @ eメインファイルは最初にテキストファイルから心电图信号を読み取り,そのデータをエントリポイント関数に渡し,予測結果をテキストファイル(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数据[65536]){文件* fp1 = fopen (file_in,“r”);if (fp1 == 0) {printf("ERROR:无法读取数据从%s\n", file_in);退出(0);} for(int i=0;我< 65536;I ++) {fscanf(fp1, "%f", &data[I]);}文件关闭(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
// //文件: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で指定されたテキストファresultFileに書き込みます。ExampleIndexを設定して,代表的なecg信号を選択します。この信号を使用して,関数分类に対して実行可能ファ@ @ルをテストします。Jetson_BuildDirで,タ,ゲット上でリモ,トビルドプロセスを実行するディレクトリを指定します。指定したビルドディレクトリがターゲットに存在しない場合は,指定した名前でディレクトリが作成されます。

CodeGenMode =1;signalFile =“signalData.txt”;resultFile =“predClassProb.txt”% consistent with "main_ecg_jetson_ex.cu"Jetson_BuildDir =“~ / projectECG”;ExampleIndex = 1;% 1,4: ARR型;2,5: CHF型;3,6: NSR型Function_to_Gen =“model_predict_ecg”;ModFile =“ecg_model.mat”%文件,保存神经网络模型;与"main_ecg_jetson_ex.cu"一致ImgSize = [227 227];ML模型的输入图像大小开关ExampleIndex情况下1% arr 7SampleSignalIdx = 7;情况下2%瑞士法郎97SampleSignalIdx = 97;情况下3.% NSR 132SampleSignalIdx = 132;情况下4% arr 31SampleSignalIdx = 31;情况下5%瑞士法郎101SampleSignalIdx = 101;情况下6% NSR 131SampleSignalIdx = 131;结束signal_data = single(ECGData.Data(SampleSignalIdx,:));ECGtype = ECGData.Labels{SampleSignalIdx};

Gpuコ,ド生成-ハ,ドウェアへの接続

Nvidiaハ,ドウェアと通信するために,関数杰森を使用してラ▪▪ブハ▪▪ドウェア接続オブジェクトを作成します。ライブハードウェア接続オブジェクトを作成するには,ターゲットボードのホスト名またはIPアドレス,ユーザー名,およびパスワードを知っている必要があります。

Jetsonハドウェア用のラブハドウェア接続オブジェクトを作成します。ハードウェアのライブオブジェクトの作成中に,ハードウェアのチェック,IOサーバーのインストールのチェック,およびターゲット上の周辺機器情報の収集が行われます。この情報はコマンドウィンドウに表示されます。

Hwobj = jetson(“gpucoder-nano-2”ubuntu的ubuntu的);
检查目标上的CUDA可用性…正在检查目标系统路径中的“nvcc”…检查目标上的cuDNN库可用性…在目标上检查TensorRT库的可用性…检查前提库已经完成。收集硬件细节…检查目标上的第三方库可用性…
完成硬件详细信息收集。单板名称:NVIDIA Jetson TX1 CUDA版本:10.0 cuDNN版本:7.3 TensorRT版本:5.0 GStreamer版本:1.14.5 V4L2版本:1.14.2-1 SDL版本:1.2可用网络摄像头:可用gpu: NVIDIA Tegra X1

関数coder.checkGpuInstall(GPU编码器)を使用して,この例を実行するのに必要なコンパイラおよびライブラリがハードウェア上に適切に設定されていることを検証します。

envCfg = code . gpuenvconfig (“杰森”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。HardwareObject = hwobj;envCfg。安静= 1;coder.checkGpuInstall (envCfg)
ans =带字段的结构:Gpu: 1 cuda: 1 cudnn: 1 tensorrt: 0 basiccodegen: 0 basiccodeexec: 0 deepcodegen: 1 deepcodeexec: 0 tensorrtdatatype: 0 profiling: 0

Gpuコド生成—コンパル

コンパ▪▪ルに必要なgpuコ▪▪ド構成オブジェクトを作成します。関数coder.hardwareを使用して杰森プラットフォーム用の構成オブジェクトを作成し,それをコード構成オブジェクトcfg硬件プロパティに割り当てます。Jetson TX1またはTX2ボ,ドには英伟达杰森的を使用します。カスタムメンファルは,生成されたコド内でエントリポント関数を呼び出すラッパです。このカスタムファ▪▪ルはデプロ▪▪済みの実行可能ファ▪▪ルに必要となります。

関数编码器。DeepLearningConfig(GPU编码器)を使用してCuDNN深層学習構成オブジェクトを作成し,それをgpuコ,ド構成オブジェクトのDeepLearningConfigプロパティに割り当てます。コードジェネレーターは,NVIDIA GPU対応のNVIDIA CUDA技术®®深层神经网络库(cuDNN)を利用します。cuDNNは深層ニューラルネットワークに対するプリミティブの,GPUで高速化されたライブラリです。

如果CodeGenMode == 1 cfg = code . gpuconfig (exe”);cfg。硬件= code . Hardware (英伟达杰森的);cfg.Hardware.BuildDir = Jetson_BuildDir;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);cfg。CustomSource = fullfile(“main_ecg_jetson_ex.cu”);elseifCodeGenMode == 2 cfg = code . gpuconfig (“自由”);cfg。VerificationMode =“公益诉讼”;cfg。硬件= code . Hardware (英伟达杰森的);cfg.Hardware.BuildDir = Jetson_BuildDir;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);结束

Cudaコ,ドを生成するには,関数codegenを使用して,gpuコド構成およびエントリポント関数model_predict_ecgの入力のサ@ @ズと型を渡します。ホスト上でコド生成が完了した後,生成されたファルがタゲットにコピされてビルドされます。

codegen (“配置”cfg Function_to_Gen,“参数”{signal_data},“报告”);
代码生成成功:查看报告

Gpuコド生成—実行

ターゲットにデプロイされる実行可能ファイルをコンパイルする場合,このサンプルの心电图信号をテキストファイルに書き込みます。ハ,ドウェアオブジェクトの関数putFile ()を使用して,そのテキストファ。workspaceDirプロパティにはタ,ゲットのcodegenフォルダ,へのパスが含まれています。

如果CodeGenMode == 1 fid = fopen(signalFile,' w ');I = 1:length(signal_data) fprintf(fid)“% f \ n”signal_data(我));结束文件关闭(fid);hwobj.putFile (signalFile hwobj.workspaceDir);结束

実行可能ファ@ @ルを実行します。

デプロイ済みの実行可能ファイルを実行するときに前の結果ファイルが存在する場合には,そのファイルを削除します。関数runApplication ()を使用してタゲットハドウェア上の実行可能ファルを起動してから,関数getFile ()を使用して結果を取得します。関数runApplication ()の呼び出しによって返された直後に結果を取得できるとは限らないため,また通信の遅延を許容できるようにするため,結果取得の最大時間を90秒に設定します。関数evalcを使用してコマンドラ@ @ン出力を行わないようにします。

如果CodeGenMode == 1%运行已部署可执行文件maxFetchTime = 90;resultFile_hw = fullfile(hwobj.workspaceDir,resultFile);如果ispc resultFile_hw = strrep(resultFile_hw,“\”' / ');结束Ta = tic;hwobj.deleteFile (resultFile_hw) hwobj.runApplication (Function_to_Gen signalFile);Tf = tic;成功=错误;toc(tf) < maxFetchTime . txt试一试evalc (“hwobj.getFile (resultFile_hw)”);成功=真实;结束如果成功打破结束结束流('获取时间= %。3 e秒\ n”toc (tf));断言(成功,“无法获取预测”) PredClassProb = readmatrix(resultFile);PredTime = toc(ta);elseifCodeGenMode == 2%运行PIL可执行文件Ta = tic;eval (sprintf ('PredClassProb = %s_pil(signal_data);'Function_to_Gen));PredTime = toc(ta);eval (sprintf (“清楚% s_pil;”Function_to_Gen));%终止PIL执行结束
###启动目标上的可执行文件可执行文件成功启动,进程ID为5672。显示可执行文件的简单运行时日志…注:完整日志需要在MATLAB命令窗口中执行如下命令:system(hwobj,'cat /home/ubuntu/ projectecg / matlab_ws / r2021a / c / users / pkostelee / onedrive_ -_MathWorks/Documents/MATLAB/Examples/ deeplearning_共享-ex54874305/ model_predict_ect .log')
获取时间= 9.743e+00秒

関数分类を使用して,このサンプルの信号のクラスラベルを予測します。

ModData = load(ModFile,“净”);im = cwt_ecg_jetson_ex(signal_data,ImgSize);[ModPred, ModPredProb] = category (ModData.net,im);PredCat =类别(ModPred)';

結果を比較します。

= array2table(PredClassProb(:)',“VariableNames”matlab.lang.makeValidName (PredCat));流('tPred = %。3.e sec\nExample ECG Type: %s\n'、PredTime ECGtype)
tPred = 1.288e+01 sec
disp (PredTableJetson)
由瑞士法郎NSR  _______ ________ ________ 0.99872 0.001131 0.000153
array2table(ModPredProb(:)',“VariableNames”matlab.lang.makeValidName (PredCat));disp (PredTableMATLAB)
由瑞士法郎NSR  _______ _________ __________ 0.99872 0.0011298 0.00015316

ハ,ドウェア接続を終了します。

清晰的hwobj

まとめ

この例では,CNNを使用して心电图信号を分類するCUDA実行可能ファイルを作成してデプロイする方法を説明しています。ロカルで実行してリモトタゲットに接続する実行可能ファルを作成することもできます。ワ,クフロ,全体はこの例で紹介されています。デ,タのダウンロ,ド後に,cwtを使用してecg信号から特徴が抽出されます。続いて,スカログラムに基づいて信号を分類するようにSqueezeNetに再学習させます。2つのユーザー定義関数が作成されて、ターゲットの NVIDIA デバイス上でコンパイルされます。実行可能ファイルの結果が MATLAB で比較されます。

参考文献

  1. 拜姆,D. S.科鲁奇,E. S.蒙拉德,H. S.史密斯,R. F.赖特,A.拉努,D. F.戈蒂耶,B. J.兰西尔,W.格罗斯曼和E.布劳恩瓦尔德。"口服米力农治疗严重充血性心力衰竭患者的存活率"美国心脏病学会杂志.Vol。7,第3期,1986,第661-670页。

  2. 戈德伯格A. L, L. A. N.阿马拉尔,L.格拉斯,J. M.豪斯多夫,P. Ch.伊万诺夫,R. G.马克,J. E.米耶图斯,G. B.穆迪,c . k。彭先生和斯坦利先生。“PhysioBank, PhysioToolkit,和PhysioNet:复杂生理信号新研究资源的组成部分。”循环。卷101,第23号:e215-e220。[流通电子页;http://circ.ahajournals.org/content/101/23/e215.full];二年(六月十三日)。cir.101.23.e215 doi: 10.1161/01.。

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

サポ,ト関数

helperCreateECGDirectories

函数helperCreateECGDirectories (ECGData parentFolder dataFolder)此函数仅用于支持小波深度学习示例。金宝app它可能会在未来的版本中被更改或删除。。rootFolder = parentFolder;localFolder = dataFolder;mkdir(fullfile(rootFolder,localFolder)) folderLabels = unique(ECGData.Labels);i = 1:numel(folderLabels) mkdir(fullfile(rootFolder,localFolder,char(folderLabels(i))));结束结束

helperPlotReps

函数helperPlotReps (ECGData)此函数仅用于支持小波深度学习示例。金宝app它可能会在未来的版本中被更改或删除。。folderLabels =唯一的(ECGData.Labels);k=1:3 ecgType = folderLabels{k};ind = find(ismember(ECGData.Labels,ecgType));次要情节(3 1 k)情节(ECGData.Data(印第安纳州(1)1:1000));网格标题(ecgType)结束结束

helperCreateRGBfromTF

函数helperCreateRGBfromTF (ECGData parentFolder childFolder)此函数仅用于支持小波深度学习示例。金宝app它可能会在未来的版本中被更改或删除。。imageRoot = fullfile(parentFolder,childFolder);data = ECGData.Data;labels = ECGData.Labels;[~,signalLength] = size(data);Fb = cwtfilterbank(“SignalLength”signalLength,“VoicesPerOctave”12);R = size(data,1);Ii = 1:r CFS = abs(fb.wt(data(Ii,:)));Im = ind2rgb(im2uint8(rescale(cfs)),jet(128));imgLoc = fullfile(imageRoot,char(labels(ii)));imFileName = strcat(char(labels(ii)),“_”num2str (ii),“jpg”);imwrite (imresize (im, 227年[227]),fullfile (imgLoc imFileName));结束结束

参考

(GPU编码器)||

関連するトピック