Détecter la Toux avec TinyML sur Arduino Nano pour Détection Précoce de la Grippe
Composants et fournitures
| Arduino Nano 33 BLE Sense | × | 1 |
Applications et services en ligne
| Edge Impulse Studio |
À propos de ce projet
Il existe un énorme besoin de solutions peu coûteuses et facilement déployables pour la détection précoce du COVID-19 et d'autres grippes. En collaboration avec l'ONU, Hackster, Edge Impulse et bien d'autres, nous avons récemment lancé le Défi UN Covid Detect & Protect visant à créer des solutions facilement déployables pour la prévention et la détection de la grippe dans les pays en développement. Dans ce tutoriel, nous montrons comment utiliser l'apprentissage automatique Edge Impulse sur un Arduino Nano BLE Sense pour détecter la présence de toux en temps réel dans l'audio. Nous avons construit un ensemble de données d'échantillons de toux et de bruit de fond, et appliqué un modèle TinyML hautement optimisé, pour construire un système de détection de toux qui s'exécute en temps réel en moins de 20 Ko de RAM sur le Nano BLE Sense. Cette même approche s'applique à de nombreuses autres applications de correspondance de motifs audio embarqués, par exemple les soins aux personnes âgées, la sécurité et la surveillance des machines. Ce projet et cet ensemble de données ont été initialement lancés par Kartik Thakore pour aider dans l'effort contre le COVID-19.
Pour commencer
Ce tutoriel a les prérequis suivants :
- Compréhension de base du développement logiciel et d'Arduino
- Arduino IDE ou CLI installé
- Téléphone mobile Android ou iOS
- Arduino Nano BLE Sense ou carte équivalente Cortex-M4+ avec microphone (optionnel)
Nous utiliserons Edge Impulse, une plateforme de développement en ligne pour l'apprentissage automatique sur appareils embarqués. Créez un compte gratuit en vous inscrivant ici. Connectez-vous à votre compte, et donnez un nom à votre nouveau projet en cliquant sur le titre. Nous appelons le nôtre « Arduino Cough Tutorial ».
Collecte du jeu de données
La première étape de tout projet d'apprentissage automatique est de collecter un jeu de données représentant des échantillons connus de données que nous voudrions pouvoir faire correspondre sur notre appareil Arduino. Pour commencer, nous avons créé un petit jeu de données avec 10 minutes d'audio en deux classes, « cough » (toux) et « noise » (bruit). Nous montrerons comment importer ce jeu de données dans votre projet Edge Impulse, ajouter vos propres échantillons ou même démarrer votre propre jeu de données à partir de zéro. Ce jeu de données est petit et a un nombre limité d'échantillons de toux et de bruit de fond doux. Ainsi, il est approprié seulement pour l'expérimentation, et le modèle produit dans ce tutoriel ne peut différencier que le bruit de fond calme et une petite gamme de toux. Nous vous encourageons à étendre le jeu de données avec une plus large gamme de toux, bruits de fond et d'autres classes comme la parole humaine pour améliorer les performances.
Note : Se forcer à tousser est très dur pour les cordes vocales, soyez prudent lors de la collecte de données et des tests !
Tout d'abord, téléchargez notre jeu de données de toux et extrayez le fichier sur votre PC à l'emplacement de votre choix : https://cdn.edgeimpulse.com/datasets/cough.zip
Vous pouvez importer ce jeu de données dans votre projet Edge Impulse en utilisant l'Edge Impulse CLI Uploader. Installez le Edge Impulse CLI en suivant ces instructions d'installation.
Ouvrez un terminal ou une invite de commande, et naviguez vers le dossier où vous avez extrait le fichier.
Exécutez :
$ edge-impulse-uploader --clean
$ edge-impulse-uploader --category training training/*
$ edge-impulse-uploader --category testing testing/*
Vous serez invité à entrer votre nom d'utilisateur Edge Impulse, mot de passe, et le projet où vous souhaitez ajouter le jeu de données. Les échantillons du jeu de données seront maintenant visibles sur la page Acquisition de données. En cliquant sur un échantillon, nous pouvons voir à quoi ressemble l'échantillon, et entendre l'audio en cliquant sur le bouton de lecture sous chaque graphique.
10 minutes de données de toux et de bruit sont suffisantes pour commencer. Vous pouvez optionnellement étendre le jeu de données avec vos propres échantillons de toux et de bruit de fond. Nous pouvons collecter de nouveaux échantillons de données directement depuis les appareils depuis la page Acquisition de données. Les échantillons audio au format WAV peuvent également être téléversés en utilisant l'Edge Impulse CLI Uploader.
Le moyen le plus simple pour commencer est de collecter des données audio en utilisant votre téléphone mobile (tutoriel complet ici). Allez sur la page Appareils, et cliquez sur le bouton « + Connecter un nouvel appareil » en haut à droite. Sélectionnez « Utiliser votre téléphone mobile ». Cela produira un code QR unique pour ouvrir une application web sur votre navigateur de téléphone. Prenez une photo du code QR, et sélectionnez pour ouvrir le lien.
L'application web se connectera à votre projet Edge Impulse, et devrait ressembler à ceci :
Nous pouvons maintenant collecter des échantillons de données audio directement depuis le téléphone depuis la page Acquisition de données d'Edge Impulse. Dans la section « Enregistrer de nouvelles données », tapez un label soit « cough » soit « noise », assurez-vous que « Microphone » est sélectionné comme Capteur, et cliquez sur « Démarrer l'échantillonnage ». Votre téléphone collectera maintenant un échantillon audio, et l'ajoutera à votre jeu de données.
La collecte de données audio directement depuis la carte Nano BLE Sense est également prise en charge. Suivez ces instructions pour installer le firmware et le démon Edge Impulse. Une fois l'appareil connecté à Edge Impulse, vous pouvez collecter des échantillons de données comme avec votre téléphone mobile ci-dessus.
Création de votre impulsion
Ensuite, nous allons sélectionner les blocs de traitement de signal et d'apprentissage automatique, sur la page Créer une impulsion. L'impulsion commencera vide, avec les blocs Raw data et Output feature. Laissez les paramètres par défaut d'une taille de fenêtre de 1000 ms et d'une augmentation de fenêtre de 500 ms. Cela signifie que nos données audio seront traitées 1 seconde à la fois, en commençant chaque 0,5 s. L'utilisation d'une petite fenêtre économise de la mémoire sur l'appareil embarqué, mais signifie que nous avons besoin de données d'échantillon de toux sans grandes pauses entre les toux.
Cliquez sur « Ajouter un bloc de traitement » et sélectionnez le bloc Audio (MFCC). Ensuite, cliquez sur « Ajouter un bloc d'apprentissage » et sélectionnez le bloc Réseau de neurones (Keras). Cliquez sur « Enregistrer l'impulsion ». Le bloc audio extraira un spectrogramme pour chaque fenêtre audio, et le bloc réseau de neurones sera entraîné pour classer le spectrogramme comme « cough » ou « noise » en fonction de notre jeu de données d'entraînement. Votre impulsion résultante ressemblera à ceci :
Ensuite, nous générerons les caractéristiques à partir du jeu de données d'entraînement sur la page MFCC. Cette page montre à quoi ressemble le spectrogramme extrait pour chaque fenêtre de 1 seconde de n'importe quel échantillon du jeu de données. Nous pouvons laisser les paramètres à leurs valeurs par défaut.
Cliquez ensuite sur le bouton « Générer les caractéristiques », qui traitera alors tout le jeu de données d'entraînement avec ce bloc de traitement. Cela crée l'ensemble complet des caractéristiques qui sera utilisé pour entraîner notre Réseau de Neurones à l'étape suivante. Appuyez sur le bouton « Générer les caractéristiques » pour démarrer le traitement, cela prendra quelques minutes.
Nous pouvons maintenant passer à la configuration et l'entraînement de notre réseau de neurones sur la page Classifieur NN. Le réseau de neurones par défaut fonctionne bien pour les sons continus comme l'eau qui coule. La détection de toux est plus compliquée, donc nous allons configurer un réseau plus riche en utilisant la convolution 2D à travers le spectrogramme de chaque fenêtre. La convolution 2D traite le spectrogramme audio d'une manière similaire à la classification d'images. Appuyez sur le coin supérieur droit de la section « Paramètres du réseau de neurones », et sélectionnez « Passer en mode Keras (expert) ».
Remplacez la définition de l'« Architecture du réseau de neurones » par le code suivant et réglez le paramètre « Note de confiance minimale » sur « 0.70 ». Puis cliquez sur le bouton « Démarrer l'entraînement ». L'entraînement prendra quelques secondes.
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
// architecture du modèle
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)))
// ceci contrôle le taux d'apprentissage
opt = Adam(lr=0.005, beta_1=0.9, beta_2=0.999)
// entraîner le réseau de neurones
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 page affichera les performances d'entraînement et les performances sur appareil, qui devraient ressembler à ceci selon votre jeu de données :
Notre algorithme de détection de toux Arduino est maintenant prêt à être testé !
Entraînement et test
La page Classification en direct nous permet de tester l'algorithme à la fois avec les données de test existantes qui venaient avec le jeu de données, ou en diffusant des données audio depuis votre téléphone mobile ou appareil Arduino. Nous pouvons commencer par un test simple en choisissant n'importe quel échantillon de test, et en appuyant sur « Charger l'échantillon ». Cela classera l'échantillon de test et montrera les résultats :
Nous pouvons aussi tester l'algorithme avec des données en direct. Commencez avec votre téléphone mobile en rafraîchissant la page du navigateur sur votre téléphone que nous avons ouverte plus tôt. Puis sélectionnez votre appareil dans la section « Classifier de nouvelles données » et appuyez sur « Démarrer l'échantillonnage ». Vous pouvez similarly diffuser des échantillons audio depuis votre Nano BLE Sense quand il est connecté au projet via edge-impulse-daemon comme à l'étape de collecte de données.
Déploiement
Nous pouvons facilement déployer notre algorithme de détection de toux sur le téléphone mobile. Allez sur la fenêtre du navigateur sur votre téléphone et rafraîchissez, puis appuyez sur le bouton « Passer en mode classification ». Cela construira automatiquement le projet en un paquet WebAssembly et l'exécutera sur votre téléphone en continu (plus de cloud requis après cela, même en mode avion !)
Ensuite, nous pouvons déployer l'algorithme sur le Nano BLE Sense en allant sur la page Déploiement. Sélectionnez « Arduino Nano 33 BLE Sense » sous « Construire le firmware » et cliquez sur « Construire ».
Cela construira un firmware complet pour le Nano BLE Sense incluant votre dernier algorithme. Suivez les instructions à l'écran pour flasher votre carte Arduino avec le binaire.
Une fois l'Arduino flashé, nous pouvons ouvrir un port série vers l'appareil بينما il est branché en USB à 115 200 bauds. Une fois le port série ouvert, appuyez sur Entrée pour obtenir une invite et puis :
> AT+RUNIMPULSE
Paramètres d'inférence :
Intervalle : 0,06 ms.
Taille de trame : 16000
Longueur d'échantillon : 1000 ms.
Nombre de classes : 2
Démarrage de l'inférence, appuyez sur 'b' pour arrêter
Enregistrement...
Enregistrement terminé
Prédictions (DSP: 495 ms., Classification: 84 ms., Anomalie: 0 ms.) :
cough: 0.01562
noise: 0.98438
Démarrage de l'inférence dans 2 secondes...
Enregistrement...
Enregistrement terminé
Prédictions (DSP: 495 ms., Classification: 84 ms., Anomalie: 0 ms.) :
cough: 0.01562
noise: 0.98438
Démarrage de l'inférence dans 2 secondes...
Enregistrement...
Enregistrement terminé
Prédictions (DSP: 495 ms., Classification: 84 ms., Anomalie: 0 ms.) :
cough: 0.86719
noise: 0.13281
Démarrage de l'inférence dans 2 secondes...
Enregistrement...
Enregistrement terminé
Prédictions (DSP: 495 ms., Classification: 84 ms., Anomalie: 0 ms.) :
cough: 0.01562
noise: 0.98438
Travaux futurs
Le ciel est la limite avec TinyML, les capteurs et Edge Impulse sur Arduino, voici quelques idées pour aller plus loin :
- Étendre le jeu de données par défaut avec vos propres sons de toux et de fond, n'oubliez pas de réentraîner périodiquement et de tester. Vous pouvez configurer des tests unitaires sous la page Test pour vous assurer que le modèle fonctionne toujours alors qu'il est étendu.
- Ajouter une nouvelle classe et des données pour les sons humains qui ne sont pas de la toux, comme la parole de fond, les bâillements, etc.
- Commencer avec un nouveau jeu de données, en collectant des échantillons audio pour détecter quelque chose de nouveau. Astuce : Vous pouvez téléverser juste les données de la classe bruit de ce jeu de données pour commencer !
- Depuis ces instructions, déployer vers Bibliothèque Arduino comme partie d'un Sketch Arduino pour afficher la détection de toux en utilisant la LED ou un écran.
- Utiliser d'autres capteurs comme l'accéléromètre 3 axes du Nano BLE Sense en suivant ce tutoriel.
Processus de fabrication
- Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
- Faciliter la communication sourd-aveugle avec 1Sheeld et Arduino
- Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Intégrer un capteur d'empreintes capacitif DFRobot (ID809) avec Arduino ou ESP8266
- Station météo interactive Nextion HMI avec Arduino Mega et capteurs
- Bras robotique 6 DoF piloté par Nunchuk Wii – Kit Arduino Mega
- Évaluer la santé des plantes avec TinyML : guide pratique
- Système de surveillance d'incendie forestier en temps réel avec alertes SMS