Detección de Tos con TinyML en Arduino Nano para Detección Temprana de Gripe
Componentes y Suministros
| Componente | Cantidad |
|---|---|
| Arduino Nano 33 BLE Sense | 1 |
Aplicaciones y Servicios Online
- Edge Impulse Studio
Descripción del Proyecto
Existe una enorme necesidad de soluciones económicas y fácilmente desplegables para la detección temprana de COVID-19 y otras gripes. Junto con la ONU, Hackster, Edge Impulse y muchos otros, lanzamos recientemente el "UN Covid Detect & Protect Challenge" para crear soluciones fácilmente desplegables para la prevención y detección de gripe en países en desarrollo. En este tutorial mostramos cómo usar Edge Impulse machine learning en un Arduino Nano BLE Sense para detectar la presencia de tos en audio en tiempo real. Construimos un dataset de muestras de tos y ruido de fondo, y aplicamos un modelo TinyML altamente optimizado, para construir un sistema de detección de tos que se ejecuta en tiempo real en menos de 20 kB de RAM en el Nano BLE Sense. Este mismo enfoque se aplica a muchas otras aplicaciones de reconocimiento de patrones de audio embebido, como cuidado de ancianos, seguridad y monitorización de máquinas. Este proyecto y dataset fue iniciado originalmente por Kartik Thakore para ayudar en el esfuerzo contra el COVID-19.
Primeros Pasos
Este tutorial requiere:
- Comprensión básica de desarrollo de software y Arduino
- Arduino IDE o CLI instalado
- Teléfono móvil Android o iOS
- Arduino Nano BLE Sense o placa equivalente Cortex-M4+ con micrófono (opcional)
Usaremos Edge Impulse, una plataforma de desarrollo online para machine learning en dispositivos edge. Cree una cuenta gratuita registrándose aquí. Inicie sesión y dé un nombre a su nuevo proyecto haciendo clic en el título. Llamaremos al nuestro "Arduino Cough Tutorial".
Recopilación del Dataset
El primer paso en cualquier proyecto de machine learning es recopilar un dataset que represente muestras conocidas de datos que queremos poder igualar en nuestro dispositivo Arduino. Para empezar, hemos creado un pequeño dataset con 10 minutos de audio en dos clases: "tos" y "ruido". Mostraremos cómo importar este dataset a su proyecto Edge Impulse, añadir sus propias muestras o incluso empezar su propio dataset desde cero.
Nota: Forzarse a toser es muy duro para las cuerdas vocales, ¡tenga cuidado al recopilar datos y probar!
- Descargue nuestro dataset de tos y extraiga el archivo en su PC: https://cdn.edgeimpulse.com/datasets/cough.zip
- Importe el dataset usando Edge Impulse CLI Uploader. Instale Edge Impulse CLI siguiendo las instrucciones de instalación.
- Abra una terminal, navegue a la carpeta donde extrajo el archivo y ejecute:
$ edge-impulse-uploader --clean
$ edge-impulse-uploader --category training training/*
$ edge-impulse-uploader --category testing testing/*
Se le pedirá su usuario, contraseña y proyecto de Edge Impulse. Las muestras del dataset serán visibles en la página Adquisición de datos. Al hacer clic en una muestra, puede ver su aspecto y escuchar el audio.
10 minutos de datos de tos y ruido son suficientes para empezar. Opcionalmente, puede ampliar el dataset con sus propias muestras. Puede recopilar nuevas muestras directamente desde dispositivos en la página Adquisición de datos. Las muestras de audio en formato WAV también pueden subirse usando Edge Impulse CLI Uploader.
La forma más fácil es recopilar datos de audio usando su móvil. Vaya a la página Dispositivos y haga clic en "+ Conectar un nuevo dispositivo". Seleccione "Usar su móvil". Esto generará un código QR único para abrir una aplicación web en el navegador de su teléfono. Escanee el código QR y abra el enlace.
La aplicación web se conectará con su proyecto Edge Impulse. En la sección "Grabar nuevos datos", escriba una etiqueta "tos" o "ruido", asegúrese de que "Micrófono" está seleccionado como Sensor y haga clic en "Iniciar muestreo". Su teléfono recopilará una muestra de audio y la añadirá a su dataset.
La recopilación directa desde la placa Nano BLE Sense también es compatible. Siga estas instrucciones para instalar el firmware y daemon de Edge Impulse. Una vez conectado el dispositivo, puede recopilar muestras igual que con el móvil.
Crear su Impulso
Seleccionaremos bloques de procesamiento de señal y machine learning en la página Crear impulso. El impulso comienza vacío, con bloques Raw data y Output feature. Mantenga la configuración por defecto: ventana de 1000 ms e incremento de ventana de 500 ms. Esto significa que nuestros datos de audio se procesarán de 1 segundo en 1 segundo, comenzando cada 0.5 segundos. Una ventana pequeña ahorra memoria en el dispositivo embebido, pero requiere muestras de tos sin grandes pausas entre toses.
- Haga clic en "Añadir bloque de procesamiento" y seleccione Audio (MFCC).
- Haga clic en "Añadir bloque de aprendizaje" y seleccione Red Neuronal (Keras).
- Haga clic en "Guardar impulso".
El bloque de audio extraerá un espectrograma para cada ventana de audio, y el bloque de red neuronal se entrenará para clasificar el espectrograma como "tos" o "ruido" basado en nuestro dataset de entrenamiento.
Generaremos características del dataset de entrenamiento en la página MFCC. Esta página muestra el espectrograma extraído para cada ventana de 1 segundo de cualquier muestra del dataset. Puede dejar los parámetros por defecto.
Haga clic en "Generar características" para procesar todo el dataset de entrenamiento. Esto tardará un par de minutos.
Configure y entrene la red neuronal en la página Clasificador NN. La red neuronal por defecto funciona bien para sonidos continuos como agua corriendo. La detección de tos es más compleja, así que configuraremos una red más rica usando convolución 2D a través del espectrograma de cada ventana. La convolución 2D procesa el espectrograma de audio de forma similar a la clasificación de imágenes.
Presione la esquina superior derecha de "Configuración de red neuronal" y seleccione "Cambiar a modo Keras (experto)". Reemplace la "Arquitectura de red neuronal" con el siguiente código y establezca "Calificación mínima de confianza" en "0.70". Luego haga clic en "Iniciar entrenamiento". El entrenamiento tardará unos segundos.
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.constraints import MaxNorm
model = Sequential()
model.add(InputLayer(input_shape=(X_train.shape[1], ), name='x_input'))
model.add(Reshape((int(X_train.shape[1] / 13), 13, 1), input_shape=(X_train.shape[1], )))
model.add(Conv2D(10, kernel_size=5, activation='relu', padding='same', kernel_constraint=MaxNorm(3)))
model.add(AveragePooling2D(pool_size=2, padding='same'))
model.add(Conv2D(5, kernel_size=5, activation='relu', padding='same', kernel_constraint=MaxNorm(3)))
model.add(AveragePooling2D(pool_size=2, padding='same'))
model.add(Flatten())
model.add(Dense(classes, activation='softmax', name='y_pred', kernel_constraint=MaxNorm(3)))
opt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(X_train, Y_train, batch_size=32, epochs=9, validation_data=(X_test, Y_test), verbose=2)
La página mostrará el rendimiento del entrenamiento y el rendimiento en dispositivo.
Entrenamiento y Pruebas
La página Clasificación en vivo permite probar el algoritmo con los datos de prueba existentes o transmitiendo audio desde su móvil o dispositivo Arduino. Elija cualquier muestra de prueba y presione "Cargar muestra". Esto clasificará la muestra y mostrará los resultados.
También puede probar con datos en vivo. Refresque la página del navegador en su móvil, seleccione su dispositivo en "Clasificar nuevos datos" y presione "Iniciar muestreo". Igualmente puede transmitir muestras desde su Nano BLE Sense cuando está conectado al proyecto via edge-impulse-daemon.
Despliegue
Puede desplegar fácilmente el algoritmo de detección de tos en el móvil. Vaya a la ventana del navegador en su teléfono, refresque y presione "Cambiar a modo clasificación". Esto construirá automáticamente el proyecto en un paquete WebAssembly y lo ejecutará en su teléfono continuamente (¡no se requiere nube después de eso, incluso modo avión!).
Para desplegar en el Nano BLE Sense, vaya a la página Despliegue. Seleccione "Arduino Nano 33 BLE Sense" bajo "Construir firmware" y haga clic en "Construir".
Esto construirá un firmware completo para el Nano BLE Sense incluyendo su último algoritmo. Siga las instrucciones en pantalla para flashear su placa Arduino con el binario.
Una vez flasheado el Arduino, abra un puerto serie al dispositivo mientras está conectado por USB a 115,200 baudios. Una vez abierto el puerto serie, presione Enter para obtener un prompt y luego:
> AT+RUNIMPULSE
Inferencing settings:
Interval: 0.06 ms.
Frame size: 16000
Sample length: 1000 ms.
No. of classes: 2
Starting inferencing, press 'b' to break
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
cough: 0.01562
noise: 0.98438
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
cough: 0.86719
noise: 0.13281
Starting inferencing in 2 seconds...
Recording...
Recording done
Predictions (DSP: 495 ms., Classification: 84 ms., Anomaly: 0 ms.):
cough: 0.01562
noise: 0.98438
Trabajo Futuro
El límite es el cielo con TinyML, sensores y Edge Impulse en Arduino. Algunas ideas:
- Amplíe el dataset por defecto con sus propios sonidos de tos y fondo, recuerde reentrenar periódicamente y probar. Puede configurar pruebas unitarias en la página Testing para asegurar que el modelo sigue funcionando al ampliarse.
- Añada una nueva clase y datos para sonidos humanos que no sean tos, como habla de fondo, bostezos, etc.
- Empiece con un nuevo dataset, recopilando muestras de audio para detectar algo nuevo. Pista: ¡puede subir solo los datos de la clase ruido de este dataset para empezar!
- Desde estas instrucciones, despliegue como Librería Arduino como parte de un Sketch Arduino para mostrar detección de tos usando el LED o una pantalla.
- Use otros sensores como el acelerómetro de 3 ejes del Nano BLE Sense siguiendo este tutorial.
Proceso de manufactura
- Sensor K30 CO₂: Monitorización en tiempo real de la calidad del aire interior
- Facilitar la comunicación sordo‑ciego usando 1Sheeld y Arduino
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Integración del sensor de huella capacitivo DFRobot (ID809) con Arduino o ESP8266
- Proyecto HMI Interactivo con Nextion, Arduino Mega y Múltiples Sensores
- Brazo Robótico de 6 Grados de Libertad Controlado por Nunchuk con Arduino
- Evaluación de la salud de plantas con TinyML: Guía práctica
- Sistema de monitorización de incendios forestales en tiempo real con alertas SMS
- Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet
- Sistema Radar Compacto con Arduino Nano, Sensor HC-SR04 y Pantalla 1.8"