Маркируйте комплексы QRS и Peaks R сигналов ECG, используя нейронную сеть для глубокого обучения

Этот пример показывает, как использовать пользовательские функции автомаркировки в Signal Labeler для маркировки комплексов QRS и peaks R сигналов электрокардиограммы (ECG). Одна пользовательская функция использует предварительно обученный рекуррентную нейронную сеть для глубокого обучения, чтобы идентифицировать и определить местоположение комплексов QRS. Другая пользовательская функция использует простой peak finder, чтобы найти peaks R. В этом примере сеть помечает комплексы QRS двух сигналов, которые полностью независимы от процесса сетевого обучения и тестирования.

Комплекс QRS, который состоит из трех отклонений в форме волны ЭКГ, отражает деполяризацию правого и левого желудочков сердца. QRS также является сегментом с самой высокой амплитудой сердцебиения человека. Изучение комплекса QRS может помочь оценить общее состояние здоровья сердца человека и наличие отклонений [1]. В частности, путем определения местоположения peaks R в комплексах QRS и рассмотрения временных интервалов между последовательным peaks, диагностик может вычислить вариабельность сердечного ритма пациента и обнаружить сердечную аритмию.

Эта нейронная сеть для глубокого обучения в этом примере был вводима в сегментацию формы волны с использованием глубокого обучения (Signal Processing Toolbox), где он был обучен с использованием сигналов ECG из общедоступной базы данных QT [2] [3]. Данные состоят из примерно 15 минут записей ЭКГ от в общей сложности 105 пациентов, отобранных с частотой дискретизации 250 Гц. Чтобы получить каждую запись, экзаменаторы поместили два электрода в других местах на груди пациента, что привело к двухканальному сигналу. База данных обеспечивает метки областей сигнала, сгенерированные автоматизированной экспертной системой [1]. Добавленные метки позволяют использовать данные для обучения нейронной сети для глубокого обучения.

Загрузка, повторная выборка и импорт данных в Signal Labeler

Сигналы, помеченные в этом примере, получены из базы данных аритмии 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 (Signal Processing Toolbox). На вкладке Labeler нажмите Import и выберите From workspace в списке Представители. В диалоговом окне выберите сигналы y200 и y203. Добавьте информацию о времени: Выберите Time из раскрывающегося списка и укажите частоту дискретизации 250 Гц. Нажмите кнопку Импорт и закройте диалоговое окно. Сигналы появляются в браузере маркированного набора сигналов. Постройте график сигналов путем установки флажков рядом с их именами.

Задайте метки

Задайте метки, чтобы прикрепиться к сигналам.

  1. Определите категориальную видимую область (ROI) метки для комплексов QRS. Щелкните Добавить определение (Add Definition) на вкладке Маркер (Labeler). Укажите имя метки следующим QRSregions, выберите тип метки ROI, введите тип данных следующим categorical, и добавить две категории, QRS и n/a, каждый по своей линии.

  2. Задайте подметку QRSregions как числовую метку точки для peaks. Нажмите QRSregions в браузере Определений меток», чтобы выбрать его. Нажмите Add Definition и выберите Add sublabel definition. Укажите имя метки следующим Rpeaks, выберите LabelType Point, и введите тип данных следующим numeric.

Создайте пользовательские функции автоматической маркировки

Создайте две пользовательские функции маркировки (Signal Processing Toolbox), одну для определения местоположения и маркировки комплексов QRS, а другую - для определения местоположения и маркировки пика R в каждом комплексе QRS. (Код для findQRS и findRpeaks функции появляются позже в примере.) Чтобы создать каждую функцию, на вкладке Labeler, разверните коллекцию Automate Value и выберите Add Custom Function. Signal Labeler показывает диалоговое окно с запросом имени, описания и типа метки функции.

  1. Для функции, которая определяет местоположение комплексов QRS, введите findQRS в поле имя и выберите ROI как тип метки. Можно оставить поле Описание пустым или ввести собственное описание.

  2. Для функции, которая определяет местоположение peaks, введите findRpeaks в поле имя и выберите Point как тип метки. Можно оставить поле Описание пустым или ввести собственное описание.

Если вы уже написали функции и функции находятся в текущей папке или в пути MATLAB ®, Signal Labeler добавляет функции в галерею. Если вы не написали функции, Signal Labeler открывает пустые шаблоны в редактор, чтобы вы вводили или вставляли код. Сохраните файлы. Как только вы сохраняете файлы, функции появляются в галерее.

Маркируйте комплексы QRS и Peaks R

Найдите и пометьте комплексы QRS входных сигналов.

  1. В браузере маркированных наборов сигналов установите флажок рядом с y200.

  2. Выберите QRSregions в браузере Определений меток».

  3. В галерее Automate Value выберите findQRS.

  4. Щелкните Автометка (Auto-Label) и выберите Auto-Label All Signals. В появившемся диалоговом окне введите 250 Выборка Гц в поле аргументы и нажмите OK.

Signal Labeler обнаруживает и помечает комплексы QRS для всех сигналов, но отображает метки только для сигналов, чьи флажки установлены. Комплексы QRS появляются как затененные области на графике и в осях средства просмотра меток. Активируйте панораму, нажав кнопку Panner на вкладке Display и увеличьте изображение области маркированного сигнала.

Найдите и отметьте peaks R, соответствующие комплексам QRS.

  1. Выберите Rpeaks в браузере Определений меток».

  2. Вернитесь на вкладку Labeler. В галерее Automate Value выберите findRpeaks.

  3. Щелкните Автометка (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

Figure contains 2 axes. Axes 1 contains an object of type histogram. This object represents hrv = 0.18764. Axes 2 contains an object of type histogram. This object represents hrv = 0.17064.

findQRS Функция: Найти комплексы QRS

The findQRS функция находит и помечает комплексы QRS входных сигналов.

Функция использует вспомогательную функцию, computeFSST, для изменения формы входных данных и вычисления Synchrosqueezed преобразования Фурье (FSST). Можно либо хранить computeFSST в отдельном файле в той же директории или вложить его внутрь findQRS вставив его перед заключительным end оператор.

findQRS использует classify функция и обученная нейронная сеть для глубокого обучения 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 (Signal Processing Toolbox) функция для вычисления synchrosqueezed преобразования Фурье (FSST) входа. Как обсуждалось в Waveform Segmentation Using Deep Learning (Signal Processing Toolbox), сеть работает лучше всего, если она задана как входная частотно-временная карта каждого сигнала обучения или тестирования. FSST приводит к набору функций, особенно полезных для рекуррентных сетей, потому что преобразование имеет то же разрешение по времени, что и исходный вход. Функция:

  • Заполняет входные данные случайными числами и изменяет его форму в стек массива ячеек 2 на 5000, ожидаемый по net.

  • Задает окно Кайзера длины 128 и масштабный фактор по умолчанию β=0.5 обеспечить адекватное частотное разрешение.

  • Извлекает данные в частотной области значений от 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.

См. также

|

Похожие темы