Автоматизируйте маркировку сигнала пользовательскими функциями

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

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

Нейронная сеть для глубокого обучения в этом примере была введена в Сегментации Формы волны Используя Глубокое обучение, где это было обучено с помощью сигналов ECG от общедоступной Базы данных QT 2[] 3[]. Данные состоят примерно из 15 минут записей ECG от в общей сложности 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. На вкладке Labeler нажмите Import и выберите From workspace в списке членов. В диалоговом окне выберите сигналы y200 и y203. Добавьте время информация: Выберите Time из выпадающего списка и задают частоту дискретизации 250 Гц. Нажмите Import и Close. Сигналы появляются в Помеченном Настроенном Браузере Сигнала. Постройте сигналы путем устанавливания флажков рядом с их именами.

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

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

  1. Задайте категориальную метку видимой области (ROI) для комплексов QRS. Нажмите Add Definition на вкладке Labeler. Задайте Маркировать Name как QRSregions, выберите Label Type of ROI, введите Тип данных как categorical, и добавьте две Категории, QRS и n/a, каждый на его собственной линии.

  2. Задайте подметку QRSregions как числовая метка точки для peaks R. Нажмите QRSregions в Маркировать браузере Definitions, чтобы выбрать его. Нажмите Add Definition и выберите Add sublabel definition. Задайте маркировать Name как Rpeaks, выберите LabelType of Point, и введите Тип данных как numeric.

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

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

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

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

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

Маркируйте QRS Complexes и R Peaks

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

  1. В Помеченном Настроенном Браузере Сигнала установите флажок рядом с y200.

  2. Выберите QRSregions в Маркировать браузере Definitions.

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

  4. Нажмите Auto-Label и выберите Auto-Label All Signals. В диалоговом окне, которое появляется, введите 250 Частота дискретизации Гц в поле Arguments и нажимает ОК.

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

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

  1. Выберите Rpeaks в Маркировать браузере Definitions.

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

  3. Нажмите Auto-Label и выберите Auto-Label All Signals. Нажмите ОК в диалоговом окне, которое появляется.

Метки и их числовые значения появляются в графике и в осях средства просмотра метки.

Экспортируйте помеченные сигналы и вычислите изменчивость сердечного ритма

Экспортируйте помеченные сигналы сравнить изменчивость сердечного ритма для каждого пациента. На вкладке Labeler нажмите Export и выберите Labeled Signal Set To File. В диалоговом окне, которое появляется, дайте имени HeartRates.mat к помеченному набору сигнала и добавляют дополнительное краткое описание. Нажмите Export.

Вернитесь к Командному окну MATLAB®. Загрузите помеченный набор сигнала. Для каждого сигнала в наборе вычислите изменчивость сердечного ритма как стандартное отклонение разницы во времени между последовательными heartbeat. Постройте гистограмму различий и отобразите изменчивость сердечного ритма.

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 objects. Axes object 1 contains an object of type histogram. This object represents hrv = 0.18764. Axes object 2 contains an object of type histogram. This object represents hrv = 0.17064.

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

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

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

findQRS использует classify (Deep Learning Toolbox) функция и обученная нейронная сеть для глубокого обучения net идентифицировать области QRS. Нейронная сеть для глубокого обучения выводит категориальный массив, который помечает каждую точку входного сигнала как принадлежащий области P, комплексу QRS, области T, или ни к одному из них. Эта функция преобразует метки точки, соответствующие комплексу QRS к меткам необходимой области QRS с помощью signalMask и отбрасывания остальные. 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 обеспечить соответствующее разрешение частоты.

  • Данные об извлечениях по частотному диапазону от 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 Функция: найдите Peaks R

Эта функция определяет местоположение самого видного пика необходимых областей 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] Laguna, Пабло, Рэймон Джейне и Пере Каминаль. "Автоматическое обнаружение Контуров Волны в Мультиведущих Сигналах ECG: Валидация с Базой данных CSE". Компьютеры и Биомедицинское Исследование. Издание 27, № 1, 1994, стр 45–60.

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

[3] Laguna, Пабло, Роджер Г. Марк, Ари Л. Голдбергер и Джордж Б. Муди. "База данных для Оценки Алгоритмов для Измерения QT и Других Интервалов Формы волны в ECG". Компьютеры в Кардиологии. Издание 24, 1997, стр 673–676.

[4] Капризный, Джордж Б. и Роджер Г. Марк. "Удар Базы данных Аритмии MIT-BIH". Разработка IEEE в Журнале Медицины и Биологии. Издание 20, № 3, мочь-июнь 2001, стр 45–50.

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

Приложения

Объекты

Связанные примеры

Больше о