このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
この例では、強力な信号処理手法と畳み込みニューラル ネットワークを組み合わせて使用して ECG 信号を分類する方法を示します。また、Simulink® モデルから CUDA® コードを生成する方法も紹介します。この例では、Wavelet Toolbox™ の "ウェーブレット解析と深層学習を使用した時系列の分類"の例の事前学習済み CNN ネットワークを使用して、時系列データの CWT からのイメージを基に ECG 信号を分類します。学習の詳細については、ウェーブレット解析と深層学習を使用した時系列の分類(Wavelet Toolbox)を参照してください。
この例では以下の概念を説明します。
Simulink での分類アプリケーションのモデル化。MATLAB Function
ブロックを使用して、ECG データの前処理とウェーブレット変換を実行します。事前学習済みのネットワークの読み込みと ECG データの分類に、Deep Learning Toolbox™ のImage Classifier
ブロックを使用します。
コード生成用にモデルを構成。
Simulink モデルの CUDA 実行可能ファイルの生成。
CUDA 対応 NVIDIA GPU。
NVIDIA CUDA ツールキットおよびドライバー。
NVIDIA cuDNN ライブラリ。
コンパイラおよびライブラリの環境変数。詳細は、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、関数coder.checkGpuInstall
を使用します。
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget ='cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
この例ではPhysioNetデータベースの ECG データを使用します。これには、3 つの患者グループのデータが含まれています。
心不整脈の患者 (ARR)
鬱血性心不全の患者 (CHF)
正常洞調律の患者 (NSR)
ARR の患者の記録は 96 個、CHF の患者の記録は 30 個、NSR の患者の記録は 36 個あります。ecg_signals
MAT ファイルには、テスト ECG データが時系列形式で含まれています。この例のイメージ分類器は、ARR、CHF、および NSR を区別します。
この仿金宝app真软件モデルのアルゴリズムワークフローのブロック線図を以下に示します。
ECG 信号分類のための Simulink モデルを以下に示します。このモデルを実行すると、分類された ECG 信号がVideo Viewer
ブロックにより表示されます。
open_system('ecg_dl_cwt');
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
の関数シグネチャを以下に示します。
typeecg_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
MATLAB函数ブロックECG Postprocessing
は、イメージ分類器から出力されるスコアの最高スコアに基づいて、スカログラム イメージのラベルを検出する関数label_prob_image
を定義します。スカログラム イメージが、このイメージに表示されているラベルと信頼度とともに出力されます。
typelabel_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');
[コード生成]ペインで言語として[C++]を選択し、[GPU コードの生成]を有効にします。
[コード生成]、[GPU コード]ペインを開きます。サブカテゴリ[ライブラリ]で、[cuBLAS]、[cuSOLVER]、および[cuFFT]を有効にします。
slbuild
コマンドを使用して、ホスト GPU で Simulink モデルを生成してビルドします。コード ジェネレーターは実行可能ファイルを "ビルド フォルダー"(現在の作業フォルダーの中のecg_dl_cwt_ert_rtw
という名前のサブフォルダー) に配置します。
status = evalc("slbuild('ecg_dl_cwt')");
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');