Разверните сегментацию сигнала глубокая сеть на Raspberry Pi

Этот пример детализирует рабочий процесс для сегментации формы волны электрокардиограммы (ECG) использование сигнала кратковременного преобразования Фурье и двунаправленной длинной краткосрочной сети (BiLSTM) памяти. Пример также предоставляет информацию о том, как сгенерировать и развернуть код и обученную сеть BiLSTM для сегментации на цели Raspberry Pi™ (устройство ARM®-based).

Предварительно обученная сеть в примере похожа на Сегментацию Формы волны Используя пример Глубокого обучения.

Этот пример детали:

  • Процессор в цикле (PIL) основывал рабочий процесс, чтобы проверить развернутый сгенерированный код и работа Raspberry Pi от MATLAB™

  • Генерация независимого исполняемого файла

Процесс проверки PIL является ключевой ролью рабочего цикла, чтобы проверять, что поведение сгенерированного кода совпадает с проектом прежде, чем развернуть независимый исполняемый файл.

Набор данных ECG

Этот пример использует сигналы ECG от общедоступной Базы данных QT 1[] 2[]. Данные состоят примерно из 15 минут помеченных записей ECG, с частотой дискретизации 250 Гц, измеренных от в общей сложности 105 пациентов.

Сигнал ECG может быть разделен на следующую морфологию удара [3]:

  • P волна — маленькое отклонение перед комплексом QRS представление предсердной деполяризации

  • Комплекс QRS — Самый большой амплитудный фрагмент heartbeat

  • T волна — маленькое отклонение после комплекса QRS представление желудочковой реполяризации

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

Необходимые условия

Для поддерживаемых версий библиотек и для получения информации о подготовке переменных окружения, смотрите Необходимые условия для Глубокого обучения для MATLAB Coder (MATLAB Coder) (MATLAB Coder).

Функциональность сгенерированного кода

Базовая функция в сгенерированном исполняемом файле:

  • Использование 15 000 выборок данных о ECG с одинарной точностью, как введено.

  • Вычисляет кратковременное преобразование Фурье сигнала.

  • Стандартизирует и нормирует выход.

  • Области меток сигнала с помощью предварительно обученной сети BiLSTM.

  • Генерирует выходной файл с метками.

waveformSegmentation Функция

Функция точки входа, также известная как или первичную функцию верхнего уровня, является функцией, которую вы задаете для генерации кода. Необходимо задать функцию точки входа, которая вызывает включенные генерацией кода функции и генерирует код C/C++ от функции точки входа. Все функции в функции точки входа должны поддержать генерацию кода.

В этом примере, waveformSegmentation функция точки входа. Это берет сигнал ECG в качестве входа и передает его обученной сети BiLSTM для предсказания. performPreprocessing функция предварительно обрабатывает необработанный сигнал и применяет кратковременное преобразование Фурье. The genClassifiedResults функционируйте передает предварительно обработанный сигнал сети для предсказания и отображает результаты классификации.

type waveformSegmentation
function out = waveformSegmentation(in)
%#codegen
persistent net;

if isempty(net)
    net = coder.loadDeepLearningNetwork('trained-network-STFTBILSTM.mat', 'net');
end


preprocessedSignal = performPreprocessing(in);
out = cell(3,1);


for indx = 1:3
  out{indx,1} =  genClassifedResults(net.predict(preprocessedSignal{1,indx}));
end



end

Создайте связь с Raspberry Pi

Используйте Пакет поддержки MATLAB для функции Raspberry Pi, raspi, создать связь с Raspberry Pi. В следующем коде, замене:

  • 'raspiname' с именем вашего Raspberry Pi

  • 'pi' с вашим именем пользователя

  • 'password' с вашим паролем

r = raspi('raspiname','pi','password');

Пример показывает основанный на PIL рабочий процесс для верификации кода и проекта и затем создает и развертывает независимый исполняемый файл. Опционально, если вы хотите непосредственно развернуть независимый исполняемый файл, можно пропустить выполнение PIL и перейти к созданию автономного выполнения.

Сгенерируйте MEX-функцию PIL

Первый шаг показывает основанный на PIL рабочий процесс, чтобы сгенерировать MEX-функцию для waveformSegmentation функция.

Настройте объект настройки генерации кода для статической библиотеки

Создайте объект настройки кода для статической библиотеки и установите режим верификации на 'PIL'. Установите выходной язык на 'C++'.

cfg = coder.config('lib','ecoder',true);
cfg.VerificationMode = 'PIL';
cfg.TargetLang = 'C++'; 

Настройте объект настройки для генерации кода глубокого обучения

Создайте coder.ARMNEONConfig объект. Задайте версию библиотеки ARM Compute как та на Raspberry Pi. Задайте архитектуру Raspberry Pi. (Этот пример требует, чтобы ARM Вычислил Библиотеку v19.05).

dlcfg = coder.DeepLearningConfig('arm-compute');
dlcfg.ArmComputeVersion = '19.05';
dlcfg.ArmArchitecture = 'armv7';

Установите DeepLearningConfig свойство настройки генерации кода возражает против объекта настройки глубокого обучения. Установите объект настройки с Исходными Комментариями MATLAB, видимыми в генерации кода.

cfg.DeepLearningConfig = dlcfg;
cfg.MATLABSourceComments = 1;

Сконфигурируйте аппаратные параметры генерации кода для Raspberry Pi

Создайте coder.Hardware объект для Raspberry Pi и присоединения это к объекту настройки генерации кода.

hw = coder.hardware('Raspberry Pi');
cfg.Hardware = hw;

Задайте папку сборки на Raspberry Pi.

cfg.Hardware.BuildDir = '~/waveformSegmentation';

Сгенерируйте исходный код С++ Используя codegen Функция

Используйте codegen функция, чтобы сгенерировать Код С++. Когда codegen используется с Пакетом поддержки MATLAB для Оборудования Raspberry Pi, сгенерированный код загружен на плату и скомпилирован там. MEX-функция PIL сгенерирована, чтобы связаться между MATLAB и сгенерированным кодом, работающим на Raspberry Pi.

Убедитесь, что установили переменные окружения ARM_COMPUTELIB и LD_LIBRARY_PATH на Raspberry Pi. Смотрите необходимые условия для глубокого обучения для MATLAB Coder (MATLAB Coder) (MATLAB Coder).

codegen -config cfg waveformSegmentation -args {coder.typeof(single(ones(1,15000)),[1,15000],[0,0])} -report
### Target device has no native communication support. Checking connectivity configuration registrations...
 Deploying code. This may take a few minutes. 
### Target device has no native communication support. Checking connectivity configuration registrations...
### Connectivity configuration for function 'waveformSegmentation': 'Raspberry Pi'
Location of the generated elf : /home/pi/waveformSegmentation/MATLAB_ws/R2020b/C/Users/eshashah/OneDrive_-_MathWorks/Documents/MATLAB/Examples/deeplearning_shared-ex28372959/codegen/lib/waveformSegmentation/pil
Code generation successful: View report

Запустите исполняемую программу на Raspberry Pi

Загрузите MAT-файл ecgsignal_test. Хранилища файлов, о которых сигнализирует демонстрационный ECG, на котором можно протестировать сгенерированный код.

Запустите сгенерированный waveformSegmentation_pil MEX-функция на тестовом сигнале.

load ecgsignal_test.mat;
out = waveformSegmentation_pil(test);
### Starting application: 'codegen\lib\waveformSegmentation\pil\waveformSegmentation.elf'
    To terminate execution: clear waveformSegmentation_pil
### Launching application waveformSegmentation.elf...

Отобразите сигналы с предсказанными метками.

labels = categorical(out{1}(1,2000:3000));
msk = signalMask(labels);
plotsigroi(msk,test(1,2000:3000))
title('Predicted Labels')

После проверки выхода MEX-функции PIL можно создать независимый исполняемый файл для waveformSegmentation функция.

Следующая часть показывает рабочий процесс генерации кода, чтобы создать генерировать и развернуть независимый исполняемый файл в коде для предсказания на Raspberry Pi с помощью Приложения MATLAB Coder.

Создайте независимый исполняемый файл Используя приложение MATLAB Coder

Приложение MATLAB Coder генерирует код C or C++ из кода MATLAB®. Основанный на рабочем процессе пользовательский интерфейс продвигается вы посредством процесса генерации кода. Следующие шаги описывают краткий рабочий процесс с помощью приложения MATLAB Coder. Для получения дополнительной информации смотрите MATLAB Coder (MATLAB Coder) и Сгенерируйте код С при помощи Приложения MATLAB Coder (MATLAB Coder).

Выберите файл функции точки входа

На вкладке Apps кликните по стрелке вниз на ультраправой из панели инструментов, чтобы расширить галерею Apps. Под Генерацией кода нажмите MATLAB Coder. Приложение открывает страницу Select Source Files. Введите или выберите имя функции точки входа, waveformSegmentation.

Нажмите Далее, чтобы перейти к странице Define Input Types.

Определите входные типы

1. Выберите Let меня, вводят вход или глобальные типы непосредственно и устанавливают значение входа in как один (1x15000).

2. Нажмите Далее, чтобы перейти к Сгенерировать шагу Кода. Пропустите Проверку на шаг Проблем Во время выполнения, потому что генерация MEX не поддерживается для генерации кода с ARM, Вычисляют Библиотеку.

Сгенерируйте код

1. Установите значения в сгенерировать диалоговом окне кода:

  • Установите тип сборки на Executable (.exe)

  • Установите язык на C++

  • Установите аппаратный Совет как Raspberry Pi

2. Нажмите кнопку More Settings:

  • В панели Пользовательского кода, в дополнительных исходных файлах, обзоре и выбирают ecgsegmentation_main.cpp. Для получения дополнительной информации о записи C/C++ основной функции отошлите к Структуре Сгенерированного Примера C/C++ Основная Функция (MATLAB Coder).

  • В Аппаратной панели, набор имя пользователя и пароль для платы Raspberry Pi.

  • В панели Глубокого обучения, библиотеке Target набора к ARM Compute. Укажите, что ARM Вычисляет версию Библиотеки, и ARM Вычисляют Архитектуру.

3. Закройте окно Settings и сгенерируйте код.

4. Нажмите Далее, чтобы перейти к странице Finish Workflow.

Выберите сгенерированную исполняемую директорию

Если генерация кода завершается следующие строки кода, чтобы протестировать сгенерированный код на Raspberry Pi, скопировать сигнал входа ECG в директорию сгенерированного кода. Можно найти эту директорию вручную или при помощи raspi.utils.getRemoteBuildDirectory API. Эта функция перечисляет директории двоичных файлов, которые сгенерированы при помощи codegen функция. Предположение, что двоичный файл найден только в одной директории, введите:

applicationDirPaths =...

raspi.utils.getRemoteBuildDirectory('applicationName','waveformSegmentation');

targetDirPath = applicationDirPaths{1}.directory;

Скопируйте входные файлы в Raspberry Pi

Чтобы скопировать файлы, требуемые запускать исполняемую программу, используйте putFile, который доступен с Пакетом поддержки MATLAB для Оборудования Raspberry Pi. input.csv файл содержит демонстрационный сигнал ECG, который используется, чтобы протестировать развернутый код.

r.putFile('input.csv', targetDirPath);

input = dlmread('input.csv');

Запустите Исполняемую программу на Raspberry Pi

Запустите исполняемую программу на Raspberry Pi из MATLAB и получите выходной файл к MATLAB. Входное имя файла должно быть передано как параметр командной строки для исполняемого файла.

exeName = 'waveformSegmentation.elf'; % Executable name

command = ['cd ' targetDirPath ';./' exeName];

system(r,command)

outputPath = strcat(targetDirPath,'/*.txt');

getFile(r,outputPath)

Отобразите сигналы с предсказанными метками. Выход изображен на рисунке.

load ecgsignal_test.mat;

labels = categorical(textread('out.txt','%s')');

msk = signalMask(labels(1,2000:3000));

plotsigroi(msk,test(1,2000:3000))

title('Predicted Labels')

Ссылки

[1] Макшарри, Патрик Э., и др. "Динамическая модель для генерации синтетических сигналов электрокардиограммы". IEEE® Transactions на Биоинженерии. Издание 50, № 3, 2003, стр 289–294.

[2] Laguna, Пабло, Рэймон Джейне и Пере Каминаль. "Автоматическое обнаружение контуров волны в мультиведущих сигналах ECG: Валидация с базой данных CSE". Компьютеры и Биомедицинское Исследование. Издание 27, № 1, 1994, стр 45–60.

[3] Голдбергер, Ари Л., Луис А. Н. Амараль, Леон Гласс, Джеффри М. Гаусдорф, Plamen Ch. Иванов, Роджер Г. Марк, Джозеф Э. Митус, Джордж Б. Муди, Чанг-Канг Пенг и Х. Юджин Стэнли. "PhysioBank, PhysioToolkit и PhysioNet: Компоненты Нового Ресурса Исследования для Комплексных Физиологических Сигналов". Циркуляция. Издание 101, № 23, 2000, стр e215–e220. [Циркуляция Электронные Страницы; http://circ.ahajournals.org/content/101/23/e215.full].

Смотрите также

Приложения

Функции

Похожие темы