Main Content

深層学習を使用した Simulink での ECG 信号の分類

この例では、Simulink (R) モデル内でウェーブレット変換と深層学習ネットワークを使用して ECG 信号を分類する方法を示します。この例では、Wavelet Toolbox™ の"ウェーブレット解析と深層学習を使用した時系列の分類" の例にある事前学習済みの畳み込みニューラル ネットワークを使用して、時系列データの CWT からのイメージを基に ECG 信号を分類します。学習の詳細については、ウェーブレット解析と深層学習を使用した時系列の分類(Wavelet Toolbox)を参照してください。

ECG データの説明

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

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

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

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

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

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

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

ECG 深層学習 Simulink モデル

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

open_system('ecg_dl_cwtMDL');

ECG Preprocessing サブシステム

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

open_system('ecg_dl_cwtMDL/ECG Preprocessing');

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

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

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

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

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

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

typeecg_to_scalogram
function ecg_image = ecg_to_scalogram(ecg_signal) % Copyright 2020 The MathWorks, Inc. persistent jetdata; if(isempty(jetdata)) jetdata = ecgColorMap(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 PostprocessingMATLAB Function ブロックは、イメージ分類器から出力されるスコアの最高スコアに基づいて、スカログラム イメージのラベルを検出する関数label_prob_imageを定義します。スカログラム イメージは、ラベルと信頼度がオーバーレイされた状態で出力されます。

typelabel_prob_image
function final_image = label_prob_image(ecg_image, scores, labels) % Copyright 2020-2021 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

シミュレーションの実行

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

set_param('ecg_dl_cwtMDL',“SimulationMode”,'Normal'); sim('ecg_dl_cwtMDL');

コード生成

GPU Coder™ を使用すれば、NVIDIA® GPU でのモデルの実行を高速化し、モデルについての CUDA® コードを生成できます。詳細については、ECG 信号を分類する深層学習 Simulink モデルのコード生成(GPU Coder)を参照してください。

クリーンアップ

Simulink モデルを閉じます。

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