Main Content

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

ECG 信号を分類する深層学習 Simulink モデルのコード生成

この例では、強力な信号処理手法と畳み込みニューラル ネットワークを組み合わせて使用して ECG 信号を分類する方法を示します。また、Simulink® モデルから CUDA® コードを生成する方法も紹介します。この例では、Wavelet Toolbox™ の "ウェーブレット解析と深層学習を使用した時系列の分類" の例の事前学習済み CNN ネットワークを使用して、時系列データの CWT からのイメージを基に ECG 信号を分類します。学習の詳細については、ウェーブレット解析と深層学習を使用した時系列の分類 (Wavelet Toolbox)を参照してください。

この例では以下の概念を説明します。

  • ECG データの前処理とウェーブレット変換を実行し、Deep Learning Toolbox™ の Image Classifier ブロックで事前学習済みのネットワークの読み込みと ECG データの分類の実行することで、Simulink で分類アプリケーションをモデル化。

  • コード生成用にモデルを構成。

  • Simulink モデルの CUDA 実行可能ファイルの生成。

サードパーティの必要条件

GPU 環境の検証

この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数 coder.checkGpuInstall を使用します。

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

ECG データの説明

この例では PhysioNet データベースの ECG データを使用します。これには、3 つのグループに分類された人のデータが含まれています。

  1. 心不整脈の患者 (ARR)

  2. 鬱血性心不全の患者 (CHF)

  3. 正常洞調律の患者 (NSR)

ARR の患者の記録は 96 個、CHF の患者の記録は 30 個、NSR の患者の記録は 36 個あります。ecg_signals MAT ファイルには、テスト ECG データが時系列形式で含まれています。この例のイメージ分類器は、ARR、CHF、および NSR を区別します。

アルゴリズム ワークフロー

この Simulink モデルのアルゴリズム ワークフローのブロック線図を以下に示します。

ECG 深層学習 Simulink モデル

ECG 信号分類のための Simulink モデルを以下に示します。このモデルを実行すると、分類された ECG 信号がVideo Viewer ブロックにより表示されます。

open_system('ecg_dl_cwt');

ECG Preprocessing サブシステム

ECG Preprocessing サブシステムには、CWT を実行して ECG 信号のスカログラムを取得し、スカログラムを処理してイメージを取得する MATLAB Function ブロックと、trainedNet.mat から事前学習済みネットワークを読み込み、SqueezeNet 深層学習 CNN に基づくイメージ分類の予測を実行する Image Classifier ブロックが含まれています。

open_system('ecg_dl_cwt/ECG Preprocessing');

ScalogramFromECG 関数ブロックは、次の操作を行う関数 ecg_to_scalogram を定義します。

  • 65536 個の倍精度 ECG データ サンプルを入力として使用。

  • ウェーブレット変換を適用して ECG データから時間周波数表現を作成。

  • ウェーブレット係数からスカログラムを取得。

  • スカログラムをサイズ (227 x 227 x 3) のイメージに変換。

ecg_to_scalogram の関数シグネチャを以下に示します。

type ecg_to_scalogram
function ecg_image  = ecg_to_scalogram(ecg_signal)

% Copyright 2020 The MathWorks, Inc.

persistent jetdata;
if(isempty(jetdata))
    jetdata = colourmap(128,'single');
end
% Obtain wavelet coefficients from ECG signal
cfs = cwt_ecg(ecg_signal);  
% Obtain scalogram from wavelet coefficients
image = ind2rgb(im2uint8(rescale(cfs)),jetdata);
ecg_image = im2uint8(imresize(image,[227,227]));

end

ECG Postprocessing

ECG Postprocessing MATLAB Function ブロックは、イメージ分類器から出力されるスコアの最高スコアに基づいて、スカログラム イメージのラベルを検出する関数 label_prob_image を定義します。スカログラム イメージが、このイメージに表示されているラベルと信頼度とともに出力されます。

type label_prob_image
function final_image = label_prob_image(ecg_image, scores, labels)

% Copyright 2020 The MathWorks, Inc.

scores = double(scores);
% Obtain maximum confidence 
[prob,index] = max(scores);
confidence = prob*100;
% Obtain label corresponding to maximum confidence
label = erase(char(labels(index)),'_label');
text = cell(2,1);
text{1} = ['Classification: ' label];
text{2} = ['Confidence: ' sprintf('%0.2f',confidence) '%'];
position = [135 20 0 0; 130 40 0 0];
final_image = insertObjectAnnotation(ecg_image,'rectangle',position,text,'TextBoxOpacity',0.9,'FontSize',9);

end

シミュレーションの実行

[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

[シミュレーション ターゲット] ペインで [GPU による高速化] を選択します。[深層学習] グループで、ターゲット ライブラリとして [cuDNN] を選択します。

アルゴリズムを検証し、ワークスペースに読み込まれたテスト ECG 信号のラベルと信頼度スコアを表示するため、シミュレーションを実行します。

set_param('ecg_dl_cwt', 'SimulationMode', 'Normal');
sim('ecg_dl_cwt');

Simulink モデルの生成とビルド

[コード生成] ペインで言語として [C++] を選択し、[GPU コードの生成] を有効にします。

[コード生成]、[GPU コード] ペインを開きます。サブカテゴリ [ライブラリ] で、[cuBLAS][cuSOLVER]、および [cuFFT] を有効にします。

rtwbuild コマンドを使用して、ホスト GPU で Simulink モデルを生成してビルドします。コード ジェネレーターは実行可能ファイルを "ビルド フォルダー" (現在の作業フォルダーの中の ecg_dl_cwt_ert_rtw という名前のサブフォルダー) に配置します。

status = evalc("rtwbuild('ecg_dl_cwt')");

生成された CUDA® コード

ecg_dl_cwt_ert_rtw という名前のサブフォルダーには、Simulink モデルの各種ブロックに対応して生成された C++ コードと、これらのブロックで実行される特定の演算が含まれています。たとえば、trainedNet0_ecg_dl_cwt0.h ファイルには、numLayers などの特定の属性を含む C++ クラスと、getBatchSize()predict() などのメンバー関数が含まれています。これらのクラスは、Simulink モデルに読み込まれている事前学習済みの SqueezeNet を表します。

クリーンアップ

Simulink モデルを閉じます。

close_system('ecg_dl_cwt/ECG Preprocessing');
close_system('ecg_dl_cwt');