- Componentes requeridos
- Diagrama de circuito
- Creación del conjunto de datos para la máquina de detección de tos
- Entrenamiento del modelo y ajuste del código
COVID19 es realmente una pandemia histórica que afecta mucho al mundo entero y la gente está construyendo muchos dispositivos nuevos para combatirla. También hemos construido una máquina de desinfección automática y una pistola térmica para la detección de temperatura sin contacto. Hoy construiremos un dispositivo más para ayudar a combatir el coronavirus. Es un sistema de detección de tos, que puede distinguir entre ruido y sonido de tos y puede ayudar a encontrar a Corona sospechoso. Utilizará técnicas de aprendizaje automático para eso.
En este tutorial, vamos a construir un sistema de detección de tos usando Arduino 33 BLE Sense y Edge Impulse Studio. Puede diferenciar entre el ruido de fondo normal y la tos en audio en tiempo real. Usamos Edge Impulse Studio para entrenar un conjunto de datos de muestras de tos y ruido de fondo y construir un modelo TInyML altamente optimizado, que puede detectar un sonido de tos en tiempo real.
Componentes requeridos
Hardware
- Arduino 33 BLE Sense
- LED
- Cables de puente
Software
- Estudio Edge Impulse
- IDE de Arduino
Hemos cubierto un tutorial detallado sobre Arduino 33 BLE Sense.
Diagrama de circuito
El diagrama de circuito para la detección de tos con Arduino 33 BLE Sense se muestra a continuación. La parte Fritzing para Arduino 33 BLE no estaba disponible, así que usé Arduino Nano ya que ambos tienen el mismo pin-out.
El cable positivo del LED está conectado al pin digital 4 de Arduino 33 BLE sense y el cable negativo está conectado al pin GND de Arduino.
Creación del conjunto de datos para la máquina de detección de tos
Como se mencionó anteriormente, estamos usando Edge Impulse Studio para entrenar nuestro modelo de detección de tos. Para eso, tenemos que recopilar un conjunto de datos que tenga las muestras de datos que nos gustaría poder reconocer en nuestro Arduino. Dado que el objetivo es detectar la tos, deberá recolectar algunas muestras de eso y algunas otras muestras de ruido, para que pueda distinguir entre la tos y otros ruidos.
Crearemos un conjunto de datos con dos clases "tos" y "ruido". Para crear un conjunto de datos, cree una cuenta de Edge Impulse, verifique su cuenta y luego comience un nuevo proyecto. Puede cargar las muestras usando su teléfono móvil, su placa Arduino o puede importar un conjunto de datos a su cuenta de impulso de borde. La forma más sencilla de cargar las muestras en su cuenta es utilizando su teléfono móvil. Para eso tienes que conectar tu móvil con Edge Impulse.
Para conectar su teléfono móvil, haga clic en ' Dispositivos ' y luego haga clic en ' Conectar un nuevo dispositivo' .
Ahora, en la siguiente ventana, haga clic en ' Usar su teléfono móvil' y aparecerá un código QR. Escanee el código QR con su teléfono móvil usando Google Lens u otra aplicación de escáner de código QR.
Esto conectará su teléfono con Edge Impulse Studio.
Con su teléfono conectado con Edge Impulse Studio, ahora puede cargar sus muestras. Para cargar las muestras, haga clic en ' Adquisición de datos' . Ahora en la página de adquisición de datos, ingrese el nombre de la etiqueta, seleccione el micrófono como sensor e ingrese la longitud de la muestra. Haga clic en ' Iniciar muestreo' para comenzar a muestrear una muestra de 40 segundos. En lugar de obligarse a toser, puede utilizar muestras de tos en línea de diferentes longitudes. Registre un total de 10 a 12 muestras de tos de diferentes longitudes.
Después de cargar las muestras de tos, ahora configure la etiqueta en 'ruido' y recolecte otras 10 a 12 muestras de ruido.
Estas muestras son para entrenar el módulo, en los próximos pasos, recopilaremos los datos de prueba. Los datos de la prueba deben ser al menos el 30% de los datos de entrenamiento, así que recolecte las 3 muestras de 'ruido' y de 4 a 5 muestras de 'tos'.
En lugar de recopilar sus datos, puede importar nuestro conjunto de datos a su cuenta de Edge Impulse utilizando el cargador CLI de Edge Impulse.
Para instalar CLI Uploader, primero, descargue e instale Node.js en su computadora portátil. Después de eso, abra el símbolo del sistema e ingrese el siguiente comando:
npm install -g edge-impulse-cli
Ahora descargue el conjunto de datos (Enlace del conjunto de datos) y extraiga el archivo en la carpeta de su proyecto. Abra el símbolo del sistema, navegue hasta la ubicación del conjunto de datos y ejecute los siguientes comandos:
edge-impulse-uploader --clean edge-impulse-uploader --category training training / *. json edge-impulse-uploader --category training training / *. cbor edge-impulse-uploader --category testing testing / *. json edge-impulse-uploader: prueba de categoría prueba / *. cbor
Entrenamiento del modelo y ajuste del código
Cuando el conjunto de datos esté listo, ahora crearemos un impulso para los datos. Para eso, vaya a la página ' Crear impulso '.
Ahora en la página ' Crear impulso' , haga clic en ' Agregar un bloque de procesamiento' . En la siguiente ventana, seleccione el bloque Audio (MFCC). Después de eso, haga clic en ' Agregar un bloque de aprendizaje' y seleccione el bloque Red neuronal (Keras). Luego haga clic en ' Guardar impulso' .
En el siguiente paso, vaya a la página MFCC y luego haga clic en ' Generar características' . Generará bloques MFCC para todas nuestras ventanas de audio.
Después de eso, vaya a la página 'Clasificador NN' y haga clic en los tres puntos en la esquina superior derecha de la ' Configuración de red neuronal' y seleccione ' Cambiar al modo Keras (experto)' .
Reemplace el original con el siguiente código y cambie el ' Índice de confianza mínimo' a '0.70'. Luego haga clic en el botón ' Iniciar entrenamiento' . Comenzará a entrenar su modelo.
importar tensorflow como tf de tensorflow.keras.models importar Sequential de tensorflow.keras.layers importar Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D de tensorflow.keras.optimizers importras Adam de tensorflow.keras.optimizers import MaxNorm # modelo de arquitectura modelo = Sequential () model.add (InputLayer (input_shape = (X_train.shape,), name = 'x_input')) model.add (Reshape ((int (X_train.shape / 13), 13, 1), input_shape = (X_train.shape,))) model.add (Conv2D (10, kernel_size = 5, activación = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (tamaño_piscina = 2, relleno = 'mismo')) modelo.add (Conv2D (5, tamaño_del_ kernel = 5, activación = 'relu', relleno = 'mismo', kernel_constraint = MaxNorm (3))) model.add (PromedioPooling2D (tamaño_piscina = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (clases, activación = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # esto controla la tasa de aprendizaje opt = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # entrenar la red neuronal model.compile (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), detallado = 2)detallado = 2)detallado = 2)
Después de entrenar el modelo, mostrará el rendimiento del entrenamiento. Para mí, la precisión fue del 96,5% y la pérdida fue de 0,10, por lo que es bueno continuar.
Ahora que nuestro modelo de detección de tos esté listo, implementaremos este modelo como biblioteca Arduino. Antes de descargar el modelo como biblioteca, puede probar el rendimiento yendo a la página ' Clasificación en vivo '.
Vaya a la página ' Implementación ' y seleccione ' Biblioteca Arduino' . Ahora desplácese hacia abajo y haga clic en 'Construir' para comenzar el proceso. Esto creará una biblioteca Arduino para su proyecto.
Ahora agregue la biblioteca en su IDE de Arduino. Para eso, abra el IDE de Arduino y luego haga clic en Sketch> Incluir biblioteca> Agregar biblioteca ZIP.
Luego, cargue un ejemplo yendo a Archivo> Ejemplos> Nombre de su proyecto - Edge Impulse> nano_ble33_sense_microphone.
Realizaremos algunos cambios en el código para que podamos hacer un sonido de alerta cuando el Arduino detecte tos. Para eso, se conecta un zumbador con Arduino y cada vez que detecta tos, el LED parpadeará tres veces.
Los cambios se realizan en las funciones void loop () donde imprime los valores de ruido y tos. En el código original, se imprimen las etiquetas y sus valores juntos.
para (tamaño_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Vamos a guardar los valores de ruido y tos en diferentes variables y comparar los valores de ruido. Si el valor del ruido es inferior a 0,50, significa que el valor de tos es superior a 0,50 y emitirá el sonido. Reemplace el código original for loop () con esto:
para (tamaño_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (result.classification.value); Float Data = result.classification.value; if (Datos <0.50) {Serial.print ("Detectado tos"); alarma(); }}
Después de realizar los cambios, cargue el código en su Arduino. Abra el monitor en serie a 115200 baudios.
Entonces, así es como se puede construir una máquina de detección de tos, no es un método muy efectivo para encontrar a ningún sospechoso de COVID19, pero puede funcionar bien en un área concurrida.
A continuación se muestra un video completo de trabajo con biblioteca y código: