Этот пример демонстрирует, как можно использовать мощные методы обработки сигналов и Сверточные нейронные сети вместе, чтобы классифицировать сигналы ECG. Мы также продемонстрируем, как код CUDA® может быть сгенерирован из модели Simulink®. Этот пример использует предварительно обученную сеть CNN от Классифицировать Временных рядов Используя пример Анализа и Глубокого обучения Вейвлета Wavelet Toolbox™, чтобы классифицировать сигналы ECG на основе изображений от CWT данных временных рядов. Для получения информации об обучении смотрите, Классифицируют Временные ряды Используя Анализ Вейвлета и Глубокое обучение (Wavelet Toolbox).
Этот пример иллюстрирует следующие концепции:
Смоделируйте приложение классификации в Simulink. Используйте MATLAB Function блоки, чтобы выполнить предварительную обработку и преобразования вейвлета данных о ECG. Используйте Image Classifier блок из Deep Learning Toolbox™ для загрузки предварительно обученной сети и выполнения классификации данных о ECG.
Сконфигурируйте модель для генерации кода.
Сгенерируйте исполняемый файл CUDA для модели Simulink.
CUDA включил NVIDIA графический процессор.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Стороннее Оборудование и Подготовку Необходимых как условие продуктов.
Чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно, используйте coder.checkGpuInstall функция.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Этот пример использует данные о ECG из Физиосетевой базы данных. Это содержит данные из трех групп людей:
Люди с сердечной аритмией (ARR)
Люди с застойной сердечной недостаточностью (CHF)
Люди с нормальными ритмами пазухи (NSR)
Это включает 96 записей от людей с ARR, 30 записей от людей со швейцарским франком и 36 записей от людей с NSR. ecg_signals MAT-файл содержит тестовые данные о ECG в формате временных рядов. Классификатор изображений в этом примере различает ARR, швейцарский франк и NSR.
Блок-схему для алгоритмического рабочего процесса модели Simulink показывают.

Модель Simulink для классификации сигналов ECG показывают. Когда модель запускается, Video Viewer блок отображает классифицированный сигнал ECG.
open_system('ecg_dl_cwt');

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

ScalogramFromECG функциональный блок задает функцию под названием ecg_to_scalogram это:
Использование 65 536 выборок данных о ECG с двойной точностью, как введено.
Создайте представление частоты времени от данных о ECG путем применяния преобразования Вейвлета.
Получите scalogram из коэффициентов вейвлета.
Преобразуйте scalogram в изображение размера (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 function задает label_prob_image функция, которая находит метку для изображения scalogram на основе самого высокого счета от баллов выведенной классификатором изображений. Это выводит изображение scalogram с меткой и доверием, распечатанным на нем.
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
Открытое диалоговое окно Configuration Parameters.
В Целевой панели Симуляции выберите ускорение GPU. В группе Глубокого обучения выберите целевую библиотеку как cuDNN.
Чтобы проверить алгоритм и отобразить метки и оценку достоверности тестового сигнала ECG, загруженного в рабочей области, запустите симуляцию.
set_param('ecg_dl_cwt', 'SimulationMode', 'Normal'); sim('ecg_dl_cwt');

В панели Генерации кода выберите Language как C++ и включите, Генерируют код графического процессора.

Генерация Открытого кода> панель графического процессора Кода. В Библиотеках подкатегории включите cuBLAS, cuSOLVER и cuFFT.
Сгенерируйте и создайте модель Simulink на хосте графический процессор при помощи slbuild команда. Генератор кода помещает файлы в папку сборки, подпапку под названием ecg_dl_cwt_ert_rtw под вашей текущей рабочей папкой.
status = evalc("slbuild('ecg_dl_cwt')");

Подпапка под названием 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');