0.14.0: Tu piel parpadea con cada latido del corazón

5 min de lectura
0.14.0: Tu piel parpadea con cada latido del corazón

Cambios que hemos realizado en @elata-biosciences/rppg-web para crear un sistema de medición de la frecuencia cardíaca mediante webcam sobre el que puedas desarrollar tus propias soluciones.

Medir la frecuencia cardíaca con una cámara web es fácil de demostrar, pero cuesta confiar en los resultados.

La versión de demostración funciona así: observa el canal verde del rostro de una persona, detecta la periodicidad e imprime un número. Parece convincente con buena iluminación y un sujeto inmóvil. Pero en cuanto la persona se gira hacia una ventana, se inclina hacia atrás o el portátil pierde unos cuantos fotogramas, el número sigue actualizándose con total seguridad, aunque en realidad no signifique absolutamente nada.

Esa discrepancia es el quid de la cuestión. Una cifra que es correcta la mayor parte del tiempo y errónea sin que se note el resto del tiempo es peor que no tener ninguna cifra, porque una aplicación basada en ella no tiene forma de distinguir la diferencia.

Entre el 1 y el 5 de junio publicamos once versiones de @elata-biosciences/rppg-web, pasando de la versión 0.4.0 a la 0.14.0. Casi todo se centró en reducir esa diferencia.

Se necesitaba la sincronización del subfotograma de la VFC

Lo primero que corregimos fue la variabilidad de la frecuencia cardíaca, que se había visto silenciosamente afectada por un error aritmético.

A 30 fotogramas por segundo, un fotograma equivale a 33 milisegundos. Si detectas los latidos del corazón seleccionando el valor máximo de una señal filtrada, cada intervalo entre latidos que midas será un múltiplo de 33 ms. Sin embargo, la variación que intentas medir en la VFC se encuentra aproximadamente en ese mismo rango. La cuantificación es tan amplia como la señal.

Dos cambios lo solucionaron. En primer lugar, la interpolación del pico de la submuestra: en lugar de tomar el fotograma del pico, ajustamos el modelo a su alrededor y estimamos dónde se situaba el pico real entre las muestras. En segundo lugar, y lo que resulta más útil, hemos trasladado la sincronización de los latidos a la fase de Hilbert. En lugar de preguntarnos «¿qué fotograma era el pico?», seguimos la fase instantánea de la forma de onda del pulso y determinamos los límites de los latidos a partir de los cruces de fase. Esto proporciona una sincronización continua, en lugar de una sincronización ajustada a una cuadrícula de fotogramas.

También hemos añadido la limpieza de intervalos de redes neuronales, ya que un solo latido perdido o duplicado distorsionará una ventana de VFC mucho más que el ruido que te preocupaba.

Una región de interés no es suficiente

La perfusión cutánea no es uniforme en todo el rostro, y tampoco lo es la iluminación. La frente puede aparecer descolorida mientras que la mejilla se ve nítida, o al revés.

Así pues, ahora tomamos muestras de varias regiones y las fusionamos, ponderadas según la relación señal-ruido, de modo que las regiones que realmente transmiten el pulso predominen en el resultado. En la versión 0.12.0, esta función pasó de ser opcional a estar activada por defecto en el proceso en tiempo real, junto con la geometría unificada, de modo que las regiones fusionadas y la superposición de guía se refieran a lo mismo.

También hemos enviado las piezas que se encuentran debajo. CHROMLas primitivas de ganancia y SNR se exportan directamente, por lo que, si deseas crear un estimador diferente en el mismo front-end, no estás obligado a aceptar el nuestro.

No decir nada es una respuesta válida.

El resto del sprint se centró en negarnos a publicar cifras que no pudiéramos respaldar.

El filtro BPM sin referencia detecta los casos en los que el proceso de tratamiento está registrando algo periódico que no es un pulso. El control de confianza de captura evalúa los propios fotogramas entrantes, de modo que la luz insuficiente o el movimiento intenso se registran como una captura deficiente en lugar de como una frecuencia cardíaca plausible. Un sistema sin cabeza BaselineCalibrator Permite que una aplicación establezca una referencia individual sin necesidad de una interfaz de usuario asociada.

Nada de esto tiene nada de glamuroso. Es la diferencia entre un truco de fiesta y algo que se puede presentar a un usuario.

Puntos de referencia faciales y una señal de estado emocional cautelosa

Sustituimos FaceMesh por FaceLandmarker, lo que nos proporcionó un mejor seguimiento y un conjunto de puntos de referencia más completo, y luego lo utilizamos para dos cosas.

La primera es de carácter práctico: ofrece indicaciones en tiempo real sobre el encuadre del rostro y una superposición de la zona de detección, de modo que el usuario pueda ver cuándo se ha salido de una posición válida, en lugar de preguntarse por qué su lectura ha dado un resultado extraño.

La segunda es una estimación dimensional del afecto —valencia y excitación— obtenida a partir de puntos de referencia faciales y de la señal del pulso. Queremos ser precisos sobre lo que es esto. Se trata de una estimación bidimensional con incertidumbre real, no de un reconocimiento de emociones, y no vamos a etiquetar los sentimientos de nadie a partir de una cámara web. La presentamos como coordenadas con un nivel de confianza asociado, y preferimos ofrecerla tal cual, sin adornarla.

Además, hemos incorporado la respiración con múltiples señales, que obtiene la frecuencia respiratoria a partir de más de una vía de señal, en lugar de basarse únicamente en una sola.

También en la ventana

  • Se ha aplicado un tema blanco y claro en todas las demostraciones y estructuras, ya que el tema predeterminado, exclusivamente oscuro, dificultaba la lectura de las demostraciones en habitaciones con mucha luz.
  • Repetir las pruebas comparativas, de modo que cualquier cambio en el estimador pueda medirse en función de las imágenes grabadas, en lugar de en función de la persona que se encontrara en ese momento frente a la cámara.
  • run.sh dividir en run-lib.sh y un justfile, con link y unlink Recetas para desarrollar a partir de una versión local del SDK.

Pruébala

bash
npm create @elata-biosciences/elata-demo my-app -- --template rppg

Sin cascos, sin hardware, sin cuenta. Solo una cámara web y un navegador.

Todo lo anterior está en @elata-biosciences/rppg-web 0.14.0, y el código fuente se encuentra en github.com/Elata-Biosciences/elata-bio-sdk. Si encuentras algún caso en el que el proceso te proporcione un número que debería haber ocultado, ese es el informe de error que más nos interesa recibir.

Seguir leyendo