亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

在 Arduino 上使用 TinyML 进行咳嗽检测

组件和用品

Arduino Nano 33 BLE Sense
× 1

应用和在线服务

Edge Impulse Studio

关于这个项目

对于 COVID-19 和其他流感相关的早期检测,非常需要廉价、易于部署的解决方案。我们最近与联合国、Hackster、Edge Impulse 和许多其他组织一起发起了联合国 Covid 检测和保护挑战赛,旨在为发展中国家的流感预防和检测创建易于部署的解决方案。在本教程中,我们将展示如何在 Arduino Nano BLE Sense 上使用 Edge Impulse 机器学习来检测实时音频中是否存在咳嗽。我们构建了咳嗽和背景噪声样本数据集,并应用高度优化的 TInyML 模型,在 Nano BLE Sense 上构建了一个在 20 kB RAM 以下实时运行的咳嗽检测系统。这种相同的方法适用于许多其他嵌入式音频模式匹配应用,例如老年人护理、安全和机器监控。该项目和数据集最初由 Kartik Thakore 发起,以帮助应对 COVID-19。

开始使用

本教程有以下要求:

  • 对软件开发和 Arduino 的基本了解
  • 已安装 Arduino IDE 或 CLI
  • Android 或 iOS 手机
  • Arduino Nano BLE Sense 或带麦克风的同等 Cortex-M4+ 板(可选)

我们将使用 Edge Impulse,这是一个用于在边缘设备上进行机器学习的在线开发平台。通过在此处注册来创建一个免费帐户。登录您的帐户,然后单击标题为您的新项目命名。我们称我们的为“Arduino 咳嗽教程”。

收集数据集

任何机器学习项目的第一步都是收集一个数据集,该数据集代表我们希望能够在我们的 Arduino 设备上匹配的已知数据样本。首先,我们创建了一个包含 10 分钟音频的小型数据集,分为“咳嗽”和“噪音”两类。我们将展示如何将此数据集导入您的 Edge Impulse 项目,添加您自己的样本,甚至从头开始创建您自己的数据集。该数据集很小,并且咳嗽和软背景噪声样本数量有限。因此,该数据集仅适用于实验,本教程中生成的模型只能区分安静的背景噪音和小范围的咳嗽。我们鼓励您使用更广泛的咳嗽、背景噪音和其他类别(如人类语音)来扩展数据集,以提高性能。

注意: 强迫自己咳嗽对声带来说很困难,收集数据和测试时要小心!

首先下载我们的咳嗽数据集并在您选择的位置在您的 PC 上提取文件:https://cdn.edgeimpulse.com/datasets/cough.zip

您可以使用 Edge Impulse CLI 上传器将此数据集导入您的 Edge Impulse 项目。按照这些安装说明安装 Edge Impulse CLI。

打开终端或命令提示符,然后导航到解压缩文件的文件夹。

运行:

$ edge-impulse-uploader --clean
$ edge-impulse-uploader --category training training/*
$ edge-impulse-uploader --category testing testing/*

系统将提示您输入 Edge Impulse 用户名、密码以及要添加数据集的项目。数据集样本现在将在 数据采集 上可见 页。通过点击样本,我们可以看到样本的样子,并通过点击每个图表下方的播放按钮来收听音频。

10 分钟的咳嗽和噪音数据样本足以开始使用。您可以选择使用自己的咳嗽和背景噪声样本扩展数据集。我们可以通过数据采集直接从设备收集新的数据样本 页。也可以使用 Edge Impulse CLI Uploader 上传 WAV 格式的音频样本。

最简单的入门方法是使用手机收集音频数据(此处为完整教程)。转到设备 页面,然后单击右上角的“+ 连接新设备”按钮。选择“使用您的手机”。这将生成一个唯一的二维码,用于在您的手机浏览器上打开 Web 应用程序。给二维码拍照,选择打开链接。

Web 应用程序将与您的 Edge Impulse 项目连接,并且应如下所示:

我们现在可以从数据采集直接从手机收集音频数据样本 Edge Impulse 的页面。在“记录新数据”部分,输入“咳嗽”或“噪音”标签,确保选择“麦克风”作为传感器,然后单击“开始采样”。您的手机现在将收集音频样本,并将其添加到您的数据集中。

还支持直接从 Nano BLE Sense 板收集音频数据。按照这些说明安装 Edge Impulse 固件和守护程序。一旦设备连接到 Edge Impulse,您就可以像上面的手机一样收集数据样本。

创造你的冲动

接下来我们将选择信号处理和机器学习模块,在创建脉冲 页。脉冲将从空白开始,带有原始数据和输出功能块。保留 1000 毫秒窗口大小和 500 毫秒窗口增加的默认设置。这意味着我们的音频数据将一次处理 1 秒,每 0.5 秒开始。使用小窗口可以节省嵌入式设备的内存,但意味着我们需要咳嗽样本数据,在咳嗽之间没有大的中断。

单击“添加处理块”并选择 音频 (MFCC) 堵塞。接下来点击“添加学习块”并选择神经网络(Keras) 堵塞。点击“保存冲动”。音频块将为每个音频窗口提取一个频谱图,并且神经网络块将被训练以根据我们的训练数据集将频谱图分类为“咳嗽”或“噪音”。你产生的冲动看起来像这样:

接下来,我们将从 MFCC 上的训练数据集生成特征 页。此页面显示了从任何数据集样本中提取的每 1 秒窗口的频谱图的样子。我们可以将参数保留为默认值。

接下来单击“生成特征”按钮,然后使用此处理块处理整个训练数据集。这将创建完整的特征集,将用于在下一步中训练我们的神经网络。按“生成特征”按钮开始处理,这将需要几分钟才能完成。

我们现在可以继续在 NN 分类器上设置和训练我们的神经网络 页。默认神经网络适用于连续的声音,如流水声。咳嗽检测更复杂,因此我们将在每个窗口的频谱图上使用 2D 卷积配置更丰富的网络。 2D 卷积以类似于图像分类的方式处理音频频谱图。按右上角的“神经网络设置”部分,然后选择“切换到 Keras(专家)模式”。

将“神经网络架构”定义替换为以下代码,并将“最低置信等级”设置为“0.70”。然后继续单击“开始训练”按钮。训练需要几秒钟。

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_co nstraint=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) , 详细=2)

该页面将显示训练性能和设备上的性能,具体取决于您的数据集:

我们的 Arduino 咳嗽检测算法现在可以试用了!

训练和测试

直播分类 页面允许我们使用数据集附带的现有测试数据或通过从您的手机或 Arduino 设备流式传输音频数据来测试算法。我们可以通过选择任何测试样本并按“加载样本”来开始一个简单的测试。这将对测试样本进行分类并显示结果:

我们还可以使用实时数据测试算法。通过刷新我们之前打开的手机浏览器页面从您的手机开始。然后在“分类新数据”部分选择您的设备,然后按“开始采样”。当通过边缘脉冲守护程序连接到项目时,您可以类似地从 Nano BLE Sense 流式传输音频样本,就像在数据收集步骤中一样。

部署

我们可以轻松地将我们的咳嗽检测算法部署到手机上。转到手机上的浏览器窗口并刷新,然后按“切换到分类模式”按钮。这将自动将项目构建成 WebAssembly 包并在您的手机上连续执行(之后无需云,甚至可以进入飞行模式!)

接下来,我们可以通过转到部署将算法部署到 Nano BLE Sense 页。在“构建固件”下选择“Arduino Nano 33 BLE Sense”,然后单击“构建”。

这将为 Nano BLE Sense 构建完整的固件,包括您的最新算法。按照屏幕上的说明使用二进制文件刷新您的 Arduino 板。

一旦 Arduino 被刷新,我们就可以打开一个串行端口到设备,同时它以 115、200 波特率插入 USB。串口打开后,按回车键得到提示,然后:

> AT+RUNIMPULSE
推理设置:
间隔:0.06 ms。
帧大小:16000
样本长度:1000 ms。
No.类别数:2
开始推理,按“b”键中断
记录...
记录完成
预测(DSP:495 毫秒,分类:84 毫秒,异常:0 毫秒):
咳嗽:0.01562
噪音:0.98438
在 2 秒后开始推理...
正在录制...
录制完成
预测(DSP:495 毫秒,分类:84 毫秒,异常:0 毫秒):
咳嗽:0.01562
噪音:0.98438
在 2 秒内开始推理...
记录...
记录完成
预测(DSP:495毫秒,分类:84毫秒,异常:0毫秒):
咳嗽:0.86719
噪音:0.13281
在 2 秒内开始推理...
记录...
记录完成
预测(DSP:495 毫秒,分类:84 毫秒,异常:0 毫秒。) :
咳嗽:0.01562
噪音:0.98438

未来工作

Arduino 上的 TinyML、传感器和 Edge Impulse 是无限的,以下是进一步工作的一些想法:

  • 使用您自己的咳嗽声和背景声音扩展默认数据集,记得定期重新训练和测试。您可以在“测试”页面下设置单元测试,以确保模型在扩展时仍能正常工作。
  • 为非咳嗽的人类声音(如背景语音、打哈欠等)添加新的类和数据。
  • 从一个新数据集开始,收集音频样本以检测新事物。提示:您可以仅上传此数据集中的噪声类数据以开始使用!
  • 根据这些说明,作为 Arduino Sketch 的一部分部署到 Arduino 库,以使用 LED 或显示器显示咳嗽检测
  • 按照本教程使用其他传感器,例如 Nano BLE Sense 的 3 轴加速度计。

制造工艺

  1. 使用 K30 传感器监测二氧化碳
  2. 聋盲通信与 1Sheeld/Arduino
  3. 使用 Arduino 控制硬币接收器
  4. Arduino 带蓝牙控制 LED!
  5. 带有 Arduino 或 ESP8266 的电容式指纹传感器
  6. 玩 Nextion Display
  7. Nunchuk 控制机械臂(使用 Arduino)
  8. 使用 TinyML 确定植物健​​康
  9. 森林火灾监测和探测系统(带短信警报)
  10. 使用 Arduino 测量太阳辐射
  11. 带 Arduino 的迷你雷达
  12. 基于Arduino的碰撞检测预警系统