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

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

Предварительно обученная сеть в примере аналогична примеру Waveform Segmentation Using Deep Learning (Signal Processing Toolbox).

Этот пример подробно описывает:

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

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

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

Набор данных ЭКГ

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

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

  • P-волна - небольшой прогиб перед комплексом QRS, представляющий деполяризацию предсердий

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

  • Т-волна - небольшой прогиб после комплекса QRS, представляющего реполяризацию желудочков

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

Prerequistes

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

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

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

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

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

  • Стандартизация и нормализация выхода.

  • Маркирует области сигнала, используя предварительно обученную сеть BiLSTM.

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

waveformSegmentation Функция

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

В этом примере w aveformSegmentation - функция точки входа. Он принимает сигнал ECG как вход и передает его в обученную сеть BiLSTM для предсказания. The 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');

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

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

Первый шаг показывает рабочий процесс на основе 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 Compute Library v19.05).

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

Установите DeepLearningConfig свойство объекта строения генерации кода объекту строения глубокого обучения. Установите объект строения с MATLAB Source Comments, видимым в кодегене.

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 Support Package for Raspberry Pi Hardware, сгенерированный код загружается на плату и компилируется там. Функция PIL MEX генерируется для связи между 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. Файл хранит пример сигнала ЭКГ, на котором можно протестировать сгенерированный код.

Запуск сгенерированного 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')

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

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

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

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

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

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

Нажмите кнопку Далее, чтобы перейти на страницу Задать входные типы.

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

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

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

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

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

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

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

  • Установите аппаратную плату следующим Raspberry Pi

2. Нажмите кнопку «Дополнительные настройки»:

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

  • На панели « Оборудовании» задайте имя пользователя и пароль для платы Raspberry Pi.

  • На панели «Глубокое обучение» установите значение Целевой библиотеки ARM Compute. Укажите версию ARM Compute Library и ARM Compute Architecture.

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

4. Нажмите кнопку Далее, чтобы перейти на страницу Готово рабочего процесса.

Извлечение исполняемой директории, сгенерированного

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

applicationDirPaths =...

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

targetDirPath = applicationDirPaths{1}.directory;

Копирование входных файлов в Raspberry Pi

Чтобы скопировать файлы, необходимые для запуска исполняемой программы, используйте putFile, который доступен с пакетом поддержки MATLAB для оборудования Raspberry Pi. The 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] McSharry, Patrick E., et al. Динамическая модель для генерации синтетических электрокардиограммных сигналов. Транзакции IEEE ® по биомедицинской инженерии. Том 50, № 3, 2003, стр. 289-294.

[2] Лагуна, Пабло, Раймон Жане и Пере Каминаль. «Автоматическое обнаружение контуров волны в многоуровневых сигналах ЭКГ: валидация с базой данных CSE». Компьютеры и биомедицинские исследования. Том 27, № 1, 1994, стр. 45-60.

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

См. также

Приложения

Функции

  • (MATLAB Coder) | (Signal Processing Toolbox) | (Набор Signal Processing Toolbox)

Похожие темы