Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Etiquetar complejos QRS y picos R de señales ECG utilizando red profunda

Este ejemplo muestra cómo utilizar funciones de etiquetado automatizadas personalizadas para etiquetar complejos QRS y picos R de señales de electrocardiograma (ECG).Etiquetador de señales Una función personalizada utiliza una red de aprendizaje profundo recurrente previamente entrenada para identificar y localizar los complejos QRS. Otra función personalizada utiliza un simple buscador de picos para localizar los picos R. En el ejemplo, la red etiqueta los complejos QRS de dos señales que son completamente independientes del proceso de entrenamiento y prueba de la red.

El complejo QRS, que consta de tres desviaciones en la forma de onda ECG, refleja la despolarización de los ventrículos derecho e izquierdo del corazón. El QRS es también el segmento de mayor amplitud de los latidos humanos humanos. El estudio del complejo QRS puede ayudar a evaluar la salud general del corazón de una persona y la presencia de anomalías [ ].1 En particular, al localizar picos R dentro de los complejos QRS y examinar los intervalos de tiempo entre picos consecutivos, un diagnóstico puede calcular la variabilidad de la frecuencia cardíaca de un paciente y detectar arritmias cardíacas.

La red de aprendizaje profundo en este ejemplo se introdujo en , donde se entrenó utilizando señales ecec (ECG) de la base de datos QT disponible públicamente [ ] [ ].Segmentación de forma de onda mediante aprendizaje profundo23 Los datos consisten en aproximadamente 15 minutos de registros de ECG de un total de 105 pacientes, muestreados a 250 Hz. Para obtener cada grabación, los examinadores colocaron dos electrodos en diferentes lugares en el pecho de un paciente, lo que resultó en una señal de dos canales. La base de datos proporciona etiquetas de región de señal generadas por un sistema experto automatizado [ ].1 Las etiquetas añadidas permiten utilizar los datos para entrenar una red profunda. Consulte para obtener más detalles.Segmentación de forma de onda mediante aprendizaje profundo

Cargar, remuestrear e importar datos en Signal Labeler

Las señales etiquetadas en este ejemplo provienen de la base de datos de arritmia MIT-BIH [ ].4 Cada señal de la base de datos fue muestreada a 360 Hz y fue anotada por dos cardiólogos, lo que permitió la verificación de los resultados.

Cargue dos de las señales de base de datos del MIT, correspondientes a los registros 200 y 203. Remuestrear las señales a 250 Hz, la frecuencia de muestreo de los datos de la base de datos QT.

load mit200 y200 = resample(ecgsig,25,36);  load mit203 y203 = resample(ecgsig,25,36);

Inicie y arrastre las señales a la tabla Signal.Analizador de señales Seleccione las señales. Añadir información de tiempo: en la pestaña, haga clic en , seleccione y especifique una frecuencia de muestreo de 250 Hz.AnalizadorValores de tiempoSample Rate and Start Time En la pestaña, haga clic en .AnalizadorEtiqueta Las señales aparecen en el navegador.Conjunto de señales etiquetadas

Definir etiquetas

Defina las etiquetas que desea adjuntar a las señales.

  1. Defina una etiqueta categórica de región de interés (ROI) para los complejos QRS. Haga clic en la pestaña.Añadir definiciónEtiqueta Especifique as , seleccione a de , escriba el valor como y agregue dos y , cada uno en su propia línea.Nombre de la etiquetaQRSregionsLabelTypeROITipo de datoscategoricalCategoríasQRSn/a

  2. Defina una etiqueta de punto numérico para los picos R y establézcala como una subetiqueta de .QRSregions Haga clic en el navegador para seleccionarlo.QRSregionsDefiniciones de etiquetas Haga clic en el botón de selección y seleccione .Añadir definiciónAdd sublabel definition Especifique as , seleccione a de , e introduzca as .Nombre de la etiquetaRpeaksLabelTypePointTipo de datosnumeric

Crear funciones de etiquetado automático personalizadas

Crea dos funciones personalizadas, una para localizar y etiquetar los complejos QRS y otra para localizar y etiquetar el pico R dentro de cada complejo QRS. (Código para el findQRS, computeFSST, p2qrsY findRpeaks funciones aparece más adelante en el ejemplo.) Para crear cada función, en la pestaña, haga clic en . muestra un cuadro de diálogo que pide el nombre, la descripción y el tipo de etiqueta de la función que se va a agregar.AnalizadorAutomatizar el valorAñadir función personalizadaEtiquetador de señales

  1. Para la función que localiza los complejos QRS, introduzca en el campo y seleccione como archivo .findQRSNombreROITipo de etiqueta Puede dejar el campo vacío o puede introducir su propia descripción.Descripción

  2. Para la función que localiza los picos R, introduzca en el campo y seleccione como .findRpeaksNombrePointTipo de etiqueta Puede dejar el campo vacío o puede introducir su propia descripción.Descripción

Si ya ha escrito las funciones y las funciones están en la carpeta actual o en la ruta DE ® MATLAB, añade las funciones a la galería.Etiquetador de señales Si no ha escrito las funciones, abre plantillas en blanco en el Editor para que escriba o pegue el código.Etiquetador de señales Guarde los archivos. Las funciones aparecen en la galería.

Etiquetar Complejos QRS y Picos R

Busque y etiquete los complejos QRS de las señales de entrada.

  1. En el explorador, active la casilla de verificación situada junto a .Conjunto de señales etiquetadasy200

  2. Seleccione en el navegador.QRSregionsDefiniciones de etiquetas

  3. En la galería, seleccione .Automatizar el valorfindQRS

  4. Haga clic y haga clic en el cuadro de diálogo que aparece.Auto-EtiquetaDe acuerdo

localiza y etiqueta los complejos QRS para todas las señales, pero muestra solo las de la señal cuya casilla de verificación ha seleccionado.Etiquetador de señales Los complejos QRS aparecen como regiones sombreadas en el trazado y en los ejes del visor de etiquetas. Active el panoramizador haciendo clic en la pestaña y acerque una región de la señal etiquetada.PannerMonitor

Encuentre y etiquete los picos R correspondientes a los complejos QRS.

  1. Seleccione en el navegador.RpeaksDefiniciones de etiquetas

  2. Vuelve a la pestaña.Etiqueta En la galería, seleccione .Automatizar el valorfindRpeaks

  3. Haga clic y haga clic en el cuadro de diálogo que aparece.Auto-EtiquetaDe acuerdo

Las etiquetas y sus valores numéricos aparecen en el trazado y en los ejes del visor de etiquetas.

Exportar señales etiquetadas y calcular la variabilidad de la frecuencia cardíaca

Exporte las señales etiquetadas para comparar la variabilidad de la frecuencia cardíaca para cada paciente. En la pestaña, haga clic en .EtiquetaGuardar etiquetas En el cuadro de diálogo que aparece, asigne el nombre al conjunto de señales etiquetadas.heartrates Haga clic para volver a .De acuerdoAnalizador de señales En la tabla Señal, seleccione y haga clic con el botón derecho para exportarlo a un archivo llamado .heartratesHeartRates.mat

Cargue el conjunto de señales etiquetadas. Para cada señal del conjunto, calcule la variabilidad de la frecuencia cardíaca como la desviación estándar de las diferencias de tiempo entre latidos cardíacos consecutivos. Trazar un histograma de diferencias y mostrar la variabilidad de la frecuencia cardíaca.

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

Función:findQRS Encontrar Complejos QRS

La función encuentra y etiqueta los complejos QRS de las señales de entrada.findQRS

La función utiliza dos funciones auxiliares y .computeFSSTp2qrs (El código para ambas funciones auxiliares aparece más adelante en el ejemplo.) Puede almacenar las funciones en archivos independientes en el mismo directorio o anidarlas dentro insertándolas antes de la instrucción final.findQRSend

Entre llamadas a y , utiliza la función y la red profunda entrenada para identificar las regiones QRS.computeFSSTp2qrsfindQRSclassifynet Antes de llamar , convierte los datos al formato esperado por , como se explica en :classifyfindQRSnetSegmentación de forma de onda mediante aprendizaje profundo

  • Cada señal debe ser muestreada a 250 Hz y particionada en una pila de matrices de 2 por celda, donde cada fila corresponde a un canal y es un múltiplo de 5000.NN El particionamiento y apilamiento real se realiza en la función.computeFSST

  • Cada una de las señales remuestreadas del MIT tiene 6945 muestras, un número que no es un múltiplo de 5000. Para mantener todos los datos en cada señal, acolche la señal con números aleatorios. Más adelante en el proceso, la función etiqueta los números aleatorios como no pertenecientes a los complejos QRS y los descarta.p2qrs

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

Función:computeFSST Cambiar el tamaño de las transformaciones de Fourier sincrosqueezed de entrada y cómputo

Esta función remodela los datos de entrada en el formulario esperado y, a continuación, utiliza la función para calcular la transformación sincronizada de Fourier (FSST) de la entrada.netfsst En , la red funciona mejor cuando se da como entrada un mapa de frecuencia de tiempo de cada señal de entrenamiento o prueba.Segmentación de forma de onda mediante aprendizaje profundo El FSST da como resultado un conjunto de características especialmente útiles para redes recurrentes porque la transformación tiene la misma resolución de tiempo que la entrada original. La función:

  • Especifica una ventana Kaiser de longitud 128 para proporcionar una resolución de frecuencia adecuada.

  • Extrae datos en el rango de frecuencias de 0,5 Hz a 40 Hz.

  • Resta la media de cada señal y divide por la desviación estándar.

  • Trate las partes reales e imaginarias del FSST como características separadas.

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,:))];     signalsFsst{idx} = (signalsFsst{idx}-mean(signalsFsst{idx},2)) ...        ./std(signalsFsst{idx},[],2);  end  end

Función:p2qrs Etiquetar los complejos QRS como regiones de interés

La red profunda genera una matriz categórica que etiqueta cada punto de la señal de entrada como una región P, un complejo QRS, una región T o ninguna de esas. Esta función convierte esas etiquetas de punto en etiquetas de región de interés QRS.

  • Para realizar la conversión, la función asigna valores numéricos enteros a las categorías y utiliza la función para buscar los puntos donde la matriz numérica cambia de valor.findchangepts

  • Cada uno de esos puntos de cambio es el punto de conexión izquierdo de una región categórica y el punto que la precede en la matriz es el punto de conexión derecho de la región anterior.

  • El algoritmo se agrega a los puntos de conexión correctos para evitar que las regiones de una muestra tengan una duración cero.1e-6

  • El parámetro selecciona como regiones de interés solo aquellos complejos QRS cuya duración es mayor que las muestras.dfdf

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

Función:findRpeaks Encontrar R Peaks

Esta función localiza el pico más prominente de las regiones QRS de interés encontradas por .findQRS La función aplica la función MATLAB® al valor absoluto de la señal en los intervalos localizados por .islocalmaxfindQRS

function [labelVals,labelLocs] = findRpeaks(x,t,parentLabelVal,parentLabelLoc,varargin)  Fs = 250;  if isempty(t)     t = (0:length(x)-1)'/Fs; end  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

Referencias

[1] Laguna, Pablo, Raimon Jané y Pere Caminal. "Detección automática de límites de onda en señales ECG multilead: Validación con la base de datos CSE." Vol. 27, No 1, 1994, págs. 45–60.Computadoras e Investigación Biomédica.

[2] Goldberger, Ary L., Luis A. N. Amaral, Leon Glass, Jeffery M. Hausdorff, Plamen Ch. Ivanov, Roger G. Mark, Joseph E. Mietus, George B. Moody, Chung-Kang Peng y H. Eugene Stanley. "PhysioBank, PhysioToolkit y PhysioNet: Componentes de un nuevo recurso de investigación para señales fisiológicas complejas." Vol. 101, No. 23, 2000, pp. e215–e220. [Páginas electrónicas de circulación: ].Circulación.http://circ.ahajournals.org/content/101/23/e215.full

[3] Laguna, Pablo, Roger G. Mark, Ary L. Goldberger y George B. Moody. "A Database for Evaluation of Algorithms for Measurement of QT and Other Waveform Intervals in the ECG.Vol. 24, 1997, págs. 673–676."Computers in Cardiology.

[4] Moody, George B., y Roger G. Mark. "El impacto de la base de datos de arritmias del MIT-BIH." .IEEE Engineering in Medicine and Biology Magazine Vol. 20, No. 3, mayo–junio de 2001, págs. 45–50.

Consulte también

Apps

Funciones

Ejemplos relacionados

Más acerca de