То В этом примере показано, как использовать пользовательскую автомаркировку, функционирует в Signal Labeler к комплексам метки QRS и peaks R электрокардиограммы (ECG) сигналы. Одна пользовательская функция использует ранее обученную текущую нейронную сеть для глубокого обучения, чтобы идентифицировать и определить местоположение комплексов QRS. Другая пользовательская функция использует простое пиковое средство поиска, чтобы определить местоположение peaks R. В этом примере сеть помечает комплексы QRS двух сигналов, которые абсолютно независимы от сетевого обучения и процесса тестирования.
Комплекс QRS, который состоит из трех отклонений в форме волны ECG, отражает деполяризацию правых и левых желудочков основы. QRS является также самым высоким амплитудным сегментом человеческого heartbeat. Исследование комплекса QRS может помочь оценить полное здоровье основы человека и присутствие отклонений [1]. В частности, путем определения местоположения R peaks в комплексах QRS и взгляда в то время интервалы между последовательным peaks, диагност может вычислить изменчивость сердечного ритма пациента и обнаружить сердечную аритмию.
Нейронная сеть для глубокого обучения в этом примере была введена в Сегментации Формы волны Используя Глубокое обучение (Signal Processing Toolbox), где это было обучено с помощью сигналов ECG от общедоступной Базы данных QT 2[] 3[]. Данные состоят примерно из 15 минут записей ECG от в общей сложности 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 ▼ и выберите Members From Workspace. В диалоговом окне выберите сигналы y200
и y203
. Добавьте время информация: Выберите Time
из выпадающего списка и задают частоту дискретизации 250 Гц. Нажмите Import и закройте диалоговое окно. Сигналы появляются в Помеченном Настроенном браузере Сигнала. Постройте сигналы путем устанавливания флажков рядом с их именами.
Задайте метки, чтобы присоединить к сигналам.
Задайте категориальную метку видимой области (ROI) для комплексов QRS. Нажмите Add Definition на вкладке Labeler. Задайте Маркировать Name как QRSregions
, выберите Label Type of ROI
, введите Тип данных как categorical
, и добавьте две Категории, QRS
и n/a
, каждый на его собственной линии.
Задайте подметку QRSregions
как числовая метка точки для peaks R. Нажмите QRSregions в Маркировать браузере Definitions, чтобы выбрать его. Нажмите Add Definition ▼ и выберите Add sublabel definition
. Задайте маркировать Name как Rpeaks
, выберите LabelType of Point
, и введите Тип данных как numeric
.
Создайте два Пользовательских Functions (Signal Processing Toolbox) Маркировки, один, чтобы определить местоположение и пометить комплексы QRS и другого, чтобы определить местоположение и пометить пик R в каждом комплексе QRS. (Код для findQRS
, computeFSST
, p2qrs
, и findRpeaks
функции появляются позже в примере.), Чтобы создать каждую функцию, во вкладке Labeler, нажимают Automate Value ▼ и выбирают Add Custom Function. Signal Labeler показывает диалоговое окно, просящее имя, описание и тип метки функции.
Для функции, которая определяет местоположение комплексов QRS, введите findQRS
в Поле имени и выбирают ROI
как Маркировать Type. Можно оставить поле Description пустым, или можно ввести собственное описание.
Для функции, которая определяет местоположение peaks R, введите findRpeaks
в Поле имени и выбирают Point
как Маркировать Type. Можно оставить поле Description пустым, или можно ввести собственное описание.
Если вы уже записали функции, и функции находятся в текущей папке или в пути MATLAB®, Signal Labeler добавляет функции в галерею. Если вы не записали функции, Signal Labeler открывает пустые шаблоны в Редакторе для вас, чтобы ввести или вставить код. Сохраните файлы. Если вы сохранили файлы, функции появляются в галерее.
Найдите и пометьте комплексы QRS входных сигналов.
В Помеченном Настроенном браузере Сигнала установите флажок рядом с y200
.
Выберите QRSregions
в Маркировать браузере Definitions.
В галерее Automate Value выберите findQRS
.
Нажмите Auto-Label и выберите Auto-Label Signals
. Нажмите ОК в диалоговом окне, которое появляется.
Signal Labeler определяет местоположение и помечает комплексы QRS для всех сигналов, но отображает метки только для сигналов, флажки которых устанавливаются. Комплексы QRS появляются как заштрихованные области в графике и в осях средства просмотра метки. Активируйте регулятор панорамы путем нажатия на Panner на вкладке Display и увеличьте масштаб области помеченного сигнала.
Найдите и пометьте peaks R, соответствующий комплексам QRS.
Выберите Rpeaks
в Маркировать браузере Definitions.
Вернитесь к вкладке Labeler. В галерее Automate Value выберите findRpeaks
.
Нажмите Auto-Label и выберите Auto-Label 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:.025:1.5) legend(['hrv = ' num2str(std(hr))]) ylabel(nms(k)) ylim([0 6]) end
findQRS
Функция: найдите комплексы QRSfindQRS
функция находит и помечает комплексы QRS входных сигналов.
Функция использует две вспомогательных функции, computeFSST
и p2qrs
. (Код для обеих вспомогательных функций появляется позже в примере.) Можно или сохранить функции в отдельных файлах в той же директории или вложить их в findQRS
функция путем вставки их перед итоговым end
оператор.
Между вызовами computeFSST
и p2qrs
, findQRS
использует classify
функционируйте и обученная нейронная сеть для глубокого обучения net
идентифицировать области QRS. Прежде, чем вызвать classify
, findQRS
преобразует данные в формат, ожидаемый net
, как объяснено в Сегментации Формы волны Используя Глубокое обучение (Signal Processing Toolbox):
Каждый сигнал должен быть произведен на уровне 250 Гц и разделен в стек 2 N массивами ячеек, где каждая строка соответствует каналу, и N является кратным 5 000. Фактическое разделение и укладка сделаны в computeFSST
функция.
Каждый из передискретизируемых сигналов MIT имеет 6 945 выборок, номер, который не является кратным 5 000. Чтобы сохранить все данные в каждом сигнале, заполните сигнал случайными числами. Позже в процессе, p2qrs
функционируйте помечает случайные числа, когда не принадлежащий QRS объединяет и отбрасывает их.
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 = []; labelLocs = []; Fs = 250; load('trainedQTSegmentationNetwork','net') for kj = 1:size(x,2) sig = x(:,kj); % Create 10000-sample signal expected by the deep network sig = [sig;randn(10000-length(sig),1)/100]'; % Resize input and compute synchrosqueezed Fourier transforms mitFSST = computeFSST(sig,Fs); % Use trained network to predict which points belong to QRS regions netPreds = classify(net,mitFSST,'MiniBatchSize',50); % Convert stack of cell arrays into a single vector Location = [1:length(netPreds{1}) length(netPreds{1})+(1:length(netPreds{2}))]'; Value = [netPreds{1} netPreds{2}]'; % Label QRS complexes as regions of interest and discard non-QRS data [Locs,Vals] = p2qrs(table(Location,Value)); labelVals = [labelVals;Vals]; labelLocs = [labelLocs;Locs/Fs]; end % Insert computeFSST and p2qrs here if you want to nest them inside % queryQRS instead of including them as separate functions in the folder. end
computeFSST
Функция: измените размер входа и вычислите преобразования Фурье SynchrosqueezedЭта функция изменяет входные данные в форму, ожидаемую net
и затем использует fsst
функция, чтобы вычислить synchrosqueezed преобразование Фурье (FSST) входа. В Сегментации Формы волны Используя Глубокое обучение (Signal Processing Toolbox) сеть выполняет лучше всего, когда вы используете карту частоты времени каждого обучения или тестирующий сигнал как вход. FSST приводит к набору функций, особенно полезных для текущих сетей, потому что преобразование имеет то же разрешение времени как исходный вход. Функция:
Задает окно Кайзера длины 128, чтобы обеспечить соответствующее разрешение частоты.
Данные об извлечениях по частотному диапазону от 0,5 Гц до 40 Гц.
Вычитает среднее значение каждого сигнала и делится на стандартное отклонение.
Обрабатывает действительные и мнимые части FSST как отдельные функции.
function signalsFsst = computeFSST(xd,Fs) targetLength = 5000; signalsOut = {}; for sig_idx = 1:size(xd,1) current_sig = xd(sig_idx,:)'; % Compute the number of targetLength-sample chunks in the signal numSigs = floor(length(current_sig)/targetLength); % Truncate to a multiple of targetLength current_sig = current_sig(1:numSigs*targetLength); % Create a matrix with as many columns as targetLength signals xM = reshape(current_sig,targetLength,numSigs); % Vertically concatenate into cell arrays signalsOut = [signalsOut; mat2cell(xM.',ones(numSigs,1))]; end signalsFsst = cell(size(signalsOut)); for idx = 1:length(signalsOut) [s,f] = fsst(signalsOut{idx},Fs,kaiser(128)); % Extract data over the frequency range from 0.5 Hz to 40 Hz f_indices = (f > 0.5) & (f < 40); signalsFsst{idx}= [real(s(f_indices,:)); imag(s(f_indices,:))]; % Subtract the mean and divide by the standard deviation signalsFsst{idx} = (signalsFsst{idx}-mean(signalsFsst{idx},2)) ... ./std(signalsFsst{idx},[],2); end end
p2qrs
Функция: маркируйте QRS Complexes как необходимые областиГлубокие сетевые выходные параметры категориальный массив, который помечает каждую точку входного сигнала как принадлежащий области P, комплексу QRS, области T, или ни к одному из тех. Эта функция преобразует те метки точки в метки необходимой области QRS.
Чтобы выполнить преобразование, функция присваивает целочисленные численные значения категориям и использует findchangepts
функционируйте, чтобы найти точки, где числовой массив изменяет значение.
Каждый из тех changepoints является левой конечной точкой категориальной области и точкой, которая предшествует, это в массиве - правильная конечная точка предыдущей области.
Алгоритм добавляет 1e-6
к правильным конечным точкам, чтобы препятствовать тому, чтобы области с одной выборкой имели нулевую длительность.
df
параметр выбирает как необходимые области только те комплексы QRS, длительность которых больше df
выборки.
function [locs,vals] = p2qrs(k) fc = 1e-6; df = 20; ctgs = categories(k.Value); levs = 1:length(ctgs); for jk = levs cat2num(k.Value == ctgs{jk}) = levs(jk); end chpt = findchangepts(cat2num,'MaxNumChanges',length(cat2num)); locs = [[1;chpt'] [chpt'-1;length(cat2num)]+fc]; vals = categorical(cat2num(locs(:,1))',levs,ctgs); locs = locs+round(k.Location(1))-1; qrs = find(vals=='QRS' & diff(locs,[],2)>df); vals = categorical(string(vals(qrs)),["QRS" "n/a"]); locs = locs(qrs,:); 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.
trainNetwork
| trainingOptions