exponenta event banner

Создание кода для модели симулятора глубокого обучения для классификации сигналов ЭКГ

В этом примере показано, как можно использовать мощные методы обработки сигналов и сверточные нейронные сети для классификации сигналов ЭКГ. Мы также покажем, как код CUDA ® может быть создан на основе модели Simulink ®. В этом примере используется предварительно обученная сеть CNN из временного ряда классификации с использованием вейвлет-анализа и примера глубокого обучения вейвлет- Toolbox™ для классификации сигналов ЭКГ на основе изображений из CWT данных временного ряда. Сведения об обучении см. в разделе Классификация временных рядов с использованием вейвлет-анализа и глубокого обучения (инструментарий вейвлет).

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

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

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

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

Предварительные условия для сторонних производителей

Проверка среды графического процессора

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

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

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

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

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

  2. Лица с застойной сердечной недостаточностью (CHF)

  3. Лица с нормальными синусовыми ритмами (СМП)

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

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

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

Модель симулятора глубокого обучения ECG

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

open_system('ecg_dl_cwt');

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

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

open_system('ecg_dl_cwt/ECG Preprocessing');

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

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

  • Создайте представление временной частоты из данных ЭКГ, применив вейвлет-преобразование.

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

  • Преобразуйте скалограмму в изображение размера (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

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

ECG Postprocessing Функциональный блок MATLAB определяет 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

Запуск моделирования

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

На панели «Цель моделирования» выберите ускорение графического процессора. В группе Глубокое обучение выберите целевую библиотеку как cuDNN.

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

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

Создание и построение модели Simulink

На панели «Создание кода» выберите язык C++ и включите функцию «Генерировать код графического процессора».

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

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

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

Созданный код CUDA ®

Вложенная папка с именем ecg_dl_cwt_ert_rtw содержит сгенерированные коды C++, соответствующие различным блокам в модели 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');

См. также

Функции

Связанные темы