Этот пример показывает, как использовать пользовательские функции автомаркировки в Signal Labeler для маркировки комплексов QRS и peaks R сигналов электрокардиограммы (ECG). Одна пользовательская функция использует предварительно обученный рекуррентную нейронную сеть для глубокого обучения, чтобы идентифицировать и определить местоположение комплексов QRS. Другая пользовательская функция использует простой peak finder, чтобы найти peaks R. В этом примере сеть помечает комплексы QRS двух сигналов, которые полностью независимы от процесса сетевого обучения и тестирования.
Комплекс QRS, который состоит из трех отклонений в форме волны ЭКГ, отражает деполяризацию правого и левого желудочков сердца. QRS также является сегментом с самой высокой амплитудой сердцебиения человека. Изучение комплекса QRS может помочь оценить общее состояние здоровья сердца человека и наличие отклонений [1]. В частности, путем определения местоположения peaks R в комплексах QRS и рассмотрения временных интервалов между последовательным peaks, диагностик может вычислить вариабельность сердечного ритма пациента и обнаружить сердечную аритмию.
Нейронная сеть для глубокого обучения в этом примере была введена в сегментацию формы волны с использованием глубокого обучения, где она была обучена с использованием сигналов ECG из общедоступной базы данных QT [2] [3]. Данные состоят из примерно 15 минут записей ЭКГ от в общей сложности 105 пациентов, отобранных с частотой дискретизации 250 Гц. Чтобы получить каждую запись, экзаменаторы поместили два электрода в других местах на груди пациента, что привело к двухканальному сигналу. База данных обеспечивает метки областей сигнала, сгенерированные автоматизированной экспертной системой [1]. Добавленные метки позволяют использовать данные для обучения нейронной сети для глубокого обучения.
Сигналы, помеченные в этом примере, получены из базы данных аритмии MIT-BIH [4]. Каждый сигнал в базе данных нерегулярно дискретизировался со средней частотой 360 Гц и был аннотирован двумя кардиологами, что позволило проверить результаты.
Загружает два сигнала базы данных MIT, соответствующих записям 200 и 203. Повторно отобразите сигналы в равномерную сетку со шаг расчета 1/250 секунды, что соответствует номинальной скорости дискретизации данных базы данных QT.
load mit200 y200 = resample(ecgsig,tm,250); load mit203 y203 = resample(ecgsig,tm,250);
Откройте Signal Labeler. На вкладке Labeler нажмите Import и выберите From workspace
в списке Представители. В диалоговом окне выберите сигналы y200
и y203
. Добавьте информацию о времени: Выберите Time
из раскрывающегося списка и укажите частоту дискретизации 250
Гц. Нажмите кнопку Импорт и закройте диалоговое окно. Сигналы появляются в браузере маркированного набора сигналов. Постройте график сигналов путем установки флажков рядом с их именами.
Задайте метки, чтобы прикрепиться к сигналам.
Определите категориальную видимую область (ROI) метки для комплексов QRS. Щелкните Добавить определение (Add Definition) на вкладке Маркер (Labeler). Укажите имя метки следующим QRSregions
, выберите тип метки ROI
, введите тип данных следующим categorical
, и добавить две категории, QRS
и n/a
, каждый по своей линии.
Задайте подметку QRSregions
как числовую метку точки для peaks. Нажмите QRSregions
в браузере Определений меток», чтобы выбрать его. Нажмите Add Definition и выберите Add sublabel definition
. Укажите имя метки следующим Rpeaks
, выберите LabelType Point
, и введите тип данных следующим numeric
.
Создайте две пользовательские функции маркировки, одну для определения местоположения и маркировки комплексов QRS и другую для определения местоположения и маркировки пика R в каждом комплексе QRS. (Код для findQRS
и findRpeaks
функции появляются позже в примере.) Чтобы создать каждую функцию, на вкладке Labeler, разверните коллекцию Automate Value и выберите Add Custom Function. Signal Labeler показывает диалоговое окно с запросом имени, описания и типа метки функции.
Для функции, которая определяет местоположение комплексов QRS, введите findQRS
в поле имя и выберите ROI
как тип метки. Можно оставить поле Описание пустым или ввести собственное описание.
Для функции, которая определяет местоположение peaks, введите findRpeaks
в поле имя и выберите Point
как тип метки. Можно оставить поле Описание пустым или ввести собственное описание.
Если вы уже написали функции и функции находятся в текущей папке или в пути MATLAB ®, Signal Labeler добавляет функции в галерею. Если вы не написали функции, Signal Labeler открывает пустые шаблоны в редактор, чтобы вы вводили или вставляли код. Сохраните файлы. Как только вы сохраняете файлы, функции появляются в галерее.
Найдите и пометьте комплексы QRS входных сигналов.
В браузере маркированных наборов сигналов установите флажок рядом с y200
.
Выберите QRSregions
в браузере Определений меток».
В галерее Automate Value выберите findQRS
.
Щелкните Автометка (Auto-Label) и выберите Auto-Label All Signals
. В появившемся диалоговом окне введите 250
Выборка Гц в поле аргументы и нажмите OK.
Signal Labeler обнаруживает и помечает комплексы QRS для всех сигналов, но отображает метки только для сигналов, чьи флажки установлены. Комплексы QRS появляются как затененные области на графике и в осях средства просмотра меток. Активируйте панораму, нажав кнопку Panner на вкладке Display и увеличьте изображение области маркированного сигнала.
Найдите и отметьте peaks R, соответствующие комплексам QRS.
Выберите Rpeaks
в браузере Определений меток».
Вернитесь на вкладку Labeler. В галерее Automate Value выберите findRpeaks
.
Щелкните Автометка (Auto-Label) и выберите Auto-Label All Signals
. Нажмите кнопку ОК в появившемся диалоговом окне.
Метки и их числовые значения появляются на графике и в осях средства просмотра меток.
Экспортируйте маркированные сигналы, чтобы сравнить изменчивость сердечного ритма для каждого пациента. На вкладке Labeler нажмите экспорт ▼ и выберите Labeled Signal Set To File
. В появившемся диалоговом окне дайте имя HeartRates.mat
к маркированному набору сигналов и добавить необязательное краткое описание. Нажмите Экспорт.
Вернитесь к Командному окну MATLAB ®. Загрузите маркированный набор сигналов. Для каждого сигнала в наборе вычислите изменчивость сердечного ритма как стандартное отклонение временных различий между последовательными сердцебиениями. Постройте гистограмму различий и отобразите изменчивость сердечного ритма.
load HeartRates nms = getMemberNames(heartrates); for k = 1:heartrates.NumMembers v = getLabelValues(heartrates,k,{'QRSregions','Rpeaks'}); hr = diff(cellfun(@(x)x.Location,v)); subplot(2,1,k) histogram(hr,0.5:0.025:1.5) legend(['hrv = ' num2str(std(hr))]) ylabel(nms(k)) ylim([0 6]) end
findQRS
Функция: Найти комплексы QRSThe findQRS
функция находит и помечает комплексы QRS входных сигналов.
Функция использует вспомогательную функцию, computeFSST
, для изменения формы входных данных и вычисления Synchrosqueezed преобразования Фурье (FSST). Можно либо хранить computeFSST
в отдельном файле в той же директории или вложить его внутрь findQRS
вставив его перед заключительным end
оператор.
findQRS
использует classify
(Deep Learning Toolbox) функцию и обученную сеть глубокого обучения net
для идентификации областей QRS. Нейронная сеть для глубокого обучения выводит категориальный массив, которая помечает каждую точку входного сигнала как принадлежащую P- области, комплексу QRS, T- области или ни одному из них. Эта функция преобразует метки точек, соответствующие комплексу QRS, в области интереса QRS, используя signalMask
и отбрасывает рест. The df
параметр выбирает в качестве областей интереса только те комплексы QRS, чья продолжительность больше 20 отсчетов. Если вы не задаете частоту дискретизации, функция использует значение по умолчанию 250 Гц.
function [labelVals,labelLocs] = findQRS(x,t,parentLabelVal,parentLabelLoc,varargin) % This is a template for creating a custom function for automated labeling % % x is a matrix where each column contains data corresponding to a % channel. If the channels have different lengths, then x is a cell array % of column vectors. % % t is a matrix where each column contains time corresponding to a % channel. If the channels have different lengths, then t is a cell array % of column vectors. % % parentLabelVal is the parent label value associated with the output % sublabel or empty when output is not a sublabel. % parentLabelLoc contains an empty vector when the parent label is an % attribute, a vector of ROI limits when parent label is an ROI or a point % location when parent label is a point. % % labelVals must be a column vector with numeric, logical or string output % values. % labelLocs must be an empty vector when output labels are attributes, a % two column matrix of ROI limits when output labels are ROIs, or a column % vector of point locations when output labels are points. labelVals = cell(2,1); labelLocs = cell(2,1); if nargin<5 Fs = 250; else Fs = varargin{1}; end df = 20; load('trainedQTSegmentationNetwork','net') for kj = 1:size(x,2) sig = x(:,kj); % Reshape input and compute Fourier synchrosqueezed transforms mitFSST = computeFSST(sig,Fs); % Use trained network to predict which points belong to QRS regions netPreds = classify(net,mitFSST,'MiniBatchSize',50); % Create a signal mask for QRS regions and specify minimum sequence length QRS = categorical([netPreds{1} netPreds{2}]',"QRS"); msk = signalMask(QRS,"MinLength",df,"SampleRate",Fs); r = roimask(msk); % Label QRS complexes as regions of interest labelVals{kj} = r.Value; labelLocs{kj} = r.ROILimits; end labelVals = vertcat(labelVals{:}); labelLocs = cell2mat(labelLocs); % Insert computeFSST here if you want to nest it inside findQRS. end
computeFSST
Функция: Изменение формы входных и вычислительных synchrosqueezed преобразований ФурьеЭта функция использует fsst
функция для вычисления Synchrosqueezed преобразования Фурье (FSST) входа. Как обсуждалось в Сегментации Формы Волны Используя Глубокое Обучение, Сеть лучше всего работает, когда задается в качестве входов частотно-временная карта каждого сигнала обучения или тестирования. FSST приводит к набору функций, особенно полезных для рекуррентных сетей, потому что преобразование имеет то же разрешение по времени, что и исходный вход. Функция:
Заполняет входные данные случайными числами и изменяет его форму в стек массива ячеек 2 на 5000, ожидаемый по net
.
Задает окно Кайзера длины 128 и масштабный фактор по умолчанию обеспечить адекватное частотное разрешение.
Извлекает данные в частотной области значений от 0,5 Гц до 40 Гц.
Рассматривает реальную и мнимую части FSST как отдельные функции.
Нормализует данные путем вычитания среднего и деления на стандартное отклонение.
function signalsFsst = computeFSST(xd,Fs) xd = reshape([xd;randn(10000-length(xd),1)/100],5000,2); signalsFsst = cell(1,2); for k = 1:2 [ss,ff] = fsst(xd(:,k),Fs,kaiser(128)); sp = ss(ff>0.5 & ff<40,:); signalsFsst{k} = normalize([real(sp);imag(sp)],2); end end
findRpeaks
Функция: Найти R PeaksЭта функция находит самый заметный пик необходимых областей QRS, найденных findQRS
. Функция применяет MATLAB ® islocalmax
функцию к абсолютному значению сигнала в интервалах, расположенных по findQRS
.
function [labelVals,labelLocs] = findRpeaks(x,t,parentLabelVal,parentLabelLoc,varargin) labelVals = zeros(size(parentLabelLoc,1),1); labelLocs = zeros(size(parentLabelLoc,1),1); for kj = 1:size(parentLabelLoc,1) tvals = t>=parentLabelLoc(kj,1) & t<=parentLabelLoc(kj,2); ti = t(tvals); xi = x(tvals); lc = islocalmax(abs(xi),'MaxNumExtrema',1); labelVals(kj) = xi(lc); labelLocs(kj) = ti(lc); end end
[1] Лагуна, Пабло, Раймон Жане и Пере Каминаль. «Автоматическое обнаружение контуров волн в многоуровневых сигналах ЭКГ: валидация с базой данных CSE». Компьютеры и биомедицинские исследования. Том 27, № 1, 1994, стр. 45-60.
[2] Голдбергер, Ари Л., Луис А. Н. Амарал, Леон Гласс, Джеффри М. Хаусдорф, Пламен Ч. Иванов, Роджер Г. Марк, Джозеф Е. Миетус, Джордж Б. Муди, Чунг-Канг Пенг PhysioBank, PhysioToolkit и PhysioNet: компоненты нового исследовательского ресурса комплексных физиологических сигналов. Циркуляция. Том 101, № 23, 2000, стр. e215-e220. [Электронные страницы тиража: http://circ.ahajournals.org/content/101/23/e215.full].
[3] Лагуна, Пабло, Роджер Г. Марк, Ари Л. Голдбергер и Джордж Б. Муди. «База данных для оценки алгоритмов измерения интервалов QT и других сигналов в ЭКГ». Компьютеры в кардиологии. Том 24, 1997, стр. 673-676.
[4] Moody, George B., and Roger G. Mark. «The влияния of the MIT-BIH Arrhythmia Database». IEEE Engineering in Medicine and Biology Magazine. Том 20, № 3, май-июнь 2001 года, стр. 45-50.