Этот пример демонстрирует, как можно использовать мощные методы обработки сигналов и сверточные нейронные сети вместе для классификации сигналов ЭКГ. Мы также покажем, как код 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.
CUDA включает графический процессор NVIDIA.
Инструментарий и драйвер NVIDIA CUDA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Чтобы убедиться, что компиляторы и библиотеки, необходимые для выполнения этого примера, настроены правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Этот пример использует данные ЭКГ из базы данных PhysioNet. Он содержит данные трех групп людей:
Люди с сердечной аритмией (ARR)
Лица с застойным сердечным отказом (ХСН)
Люди с нормальными синусовыми ритмами (NSR)
Он включает 96 записей от лиц с АРР, 30 записей от лиц с ХСН и 36 записей от лиц с СМП. The ecg_signals
MAT-файл содержит тестовые данные ЭКГ в формате временных рядов. Классификатор изображений в этом примере различает ARR, CHF и NSR.
Показан блок алгоритмического рабочего процесса модели Simulink.
Показана модель 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');
На панели Генерация кода выберите Язык как C++ и включите Генерация кода GPU.
Откройте панель «Генерация кода» > «Код графического процессора». В подкатегории Libraries включите 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');