Генерация кода для модели Simulink глубокого обучения для классификации сигналов ECG

Этот пример демонстрирует, как можно использовать мощные методы обработки сигналов и сверточные нейронные сети вместе для классификации сигналов ЭКГ. Мы также покажем, как код CUDA ® может быть сгенерирован из модели Simulink ®. Этот пример использует предварительно обученную сеть CNN из примера Classify Time Series Using Wavelet Analysis and Глубокое Обучение Wavelet Toolbox™, чтобы классифицировать сигналы ECG на основе изображений из CWT данных временных рядов. Для получения информации о обучении смотрите Классификация временных рядов с использованием Wavelet Analysis и Глубокое Обучение (Wavelet Toolbox).

Этот пример иллюстрирует следующие концепции:

  • Моделируйте классификационное приложение в Simulink. Использование MATLAB Function блоки для выполнения предварительной обработки и вейвлет данных ЭКГ. Используйте Image Classifier блок из Deep Learning Toolbox™ для загрузки предварительно обученной сети и выполнения классификации данных ЭКГ.

  • Сконфигурируйте модель для генерации кода.

  • Сгенерируйте исполняемый файл CUDA для модели Simulink.

Необходимые условия для третьих лиц

Проверьте окружение GPU

Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall функция.

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

Описание данных ЭКГ

Этот пример использует данные ЭКГ из базы данных PhysioNet. Он содержит данные трех групп людей:

  1. Люди с сердечной аритмией (ARR)

  2. Лица с застойным сердечным отказом (ХСН)

  3. Люди с нормальными синусовыми ритмами (NSR)

Он включает 96 записей от лиц с АРР, 30 записей от лиц с ХСН и 36 записей от лиц с СМП. The ecg_signals MAT-файл содержит тестовые данные ЭКГ в формате временных рядов. Классификатор изображений в этом примере различает ARR, CHF и NSR.

Алгоритмический рабочий процесс

Показан блок алгоритмического рабочего процесса модели Simulink.

Модель Simulink глубокого обучения ECG

Показана модель Simulink для классификации сигналов ECG. Когда модель запускается, Video Viewer блок отображает классифицированный сигнал ЭКГ.

open_system('ecg_dl_cwt');

Подсистема предварительной обработки ЭКГ

The ECG Preprocessing подсистема содержит MATLAB Function блок, который выполняет CWT, чтобы получить скалограмму сигнала ECG, а затем обрабатывает скалограмму, чтобы получить изображение и Image Classifier блок, который загружает предварительно обученную сеть из trainedNet.mat и выполняет предсказание для классификации изображений на основе SqueezeNet глубокое обучение CNN.

open_system('ecg_dl_cwt/ECG Preprocessing');

The ScalogramFromECG функциональный блок определяет функцию, вызываемую ecg_to_scalogram что:

  • Использует 65536 выборок данных ЭКГ двойной точности в качестве входных данных.

  • Создайте представление временной частоты из данных ECG путем применения преобразования Вейвлета.

  • Получите скалограмму из коэффициентов вейвлета.

  • Преобразуйте скалограмму в изображение размера (227x227x3).

Сигнатура функции 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

Постобработка ЭКГ

The 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

Запуск симуляции

Откройте диалоговое окно Параметры конфигурации.

На панели Simulation Target выберите ускорение графического процессора. В группе Глубокое обучение выберите целевую библиотеку как cuDNN.

Чтобы проверить алгоритм и отобразить метки и оценку достоверности тестового сигнала ЭКГ, загруженного в рабочую область, запустите симуляцию.

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

Сгенерируйте и создайте модель Simulink

На панели Генерация кода выберите Язык как C++ и включите Генерация кода GPU.

Откройте панель «Генерация кода» > «Код графического процессора». В подкатегории Libraries включите cuBLAS, cuSOLVER и cuFFT.

Сгенерируйте и создайте модель Simulink на главном графическом процессоре с помощью slbuild команда. Генератор кода помещает файлы в папку сборки, подпапку с именем ecg_dl_cwt_ert_rtw в текущей рабочей папке.

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

Сгенерированный код CUDA ®

Подпапка с именем ecg_dl_cwt_ert_rtw содержит сгенерированные коды С++, соответствующие различным блокам в модели Simulink и специфическим операциям, выполняемым в этих блоках. Для примера файл trainedNet0_ecg_dl_cwt0.h содержит класс C++, который содержит определенные атрибуты, такие как numLayers и такие функции представителей, как getBatchSize(), predict(). Этот класс представляет предварительно обученную SqueezeNet который был загружен в модель Simulink.

Очистка

Закройте модель Simulink.

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