深層学習を使用した Simulink での ECG 信号の分類
この例では、Simulink (R) モデル内でウェーブレット変換と深層学習ネットワークを使用して ECG 信号を分類する方法を示します。この例では、Wavelet Toolbox™ の "ウェーブレット解析と深層学習を使用した時系列の分類" の例にある事前学習済みの畳み込みニューラル ネットワークを使用して、時系列データの CWT からのイメージを基に ECG 信号を分類します。学習の詳細については、ウェーブレット解析と深層学習を使用した時系列の分類 (Wavelet Toolbox)を参照してください。
ECG データの説明
この例では PhysioNet データベースの ECG データを使用します。これには、3 つの患者グループのデータが含まれています。
心不整脈の患者 (ARR)
鬱血性心不全の患者 (CHF)
正常洞調律の患者 (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_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
の関数シグネチャを以下に示します。
type ecg_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
MATLAB Function ブロック ECG Postprocessing
は、イメージ分類器から出力されるスコアの最高スコアに基づいて、スカログラム イメージのラベルを検出する関数 label_prob_image
を定義します。スカログラム イメージは、ラベルと信頼度がオーバーレイされた状態で出力されます。
type label_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');