COVID19确实是一个历史性的大流行病,对整个世界的影响非常严重,人们正在建造许多新的设备来应对它。我们还建造了自动消毒机和热风枪,用于非接触式温度筛查。今天,我们将再制造一种设备来帮助抵抗冠状病毒。它是一种咳嗽检测系统,可以区分噪音和咳嗽声,并有助于找到可疑的Corona。为此,它将使用机器学习技术。
在本教程中,我们将使用Arduino 33 BLE Sense和Edge Impulse Studio构建咳嗽检测系统。它可以区分正常的背景噪音和实时音频的咳嗽声。我们使用Edge Impulse Studio训练了咳嗽和背景噪音样本的数据集,并建立了高度优化的TInyML模型,该模型可以实时检测咳嗽声。
所需组件
硬件
- Arduino 33 BLE感应
- LED
- 跳线
软件
- 边缘冲动工作室
- Arduino IDE
我们已经介绍了有关Arduino 33 BLE Sense的详细教程。
电路原理图
下面给出了使用Arduino 33 BLE Sense进行咳嗽检测的电路图。没有可用的Arduino 33 BLE的Fritzing部件,所以我使用了Arduino Nano,因为两者的引出线相同。
LED的正极引线连接到Arduino 33 BLE感测的数字引脚4,负极引线连接到Arduino的GND引脚。
为咳嗽检测机创建数据集
如前所述,我们正在使用Edge Impulse Studio训练咳嗽检测模型。为此,我们必须收集一个数据集,其中包含我们希望能够在Arduino上识别的数据样本。由于目标是检测咳嗽,因此您需要收集该咳嗽的一些样本和其他一些噪音样本,以便可以区分咳嗽和其他噪音。
我们将创建一个具有“咳嗽”和“噪音”两个类别的数据集。要创建数据集,请创建一个Edge Impulse帐户,验证您的帐户,然后启动一个新项目。您可以使用移动设备,Arduino开发板来加载样本,也可以将数据集导入到边缘脉冲帐户中。将样本加载到您的帐户中最简单的方法是使用手机。为此,您必须将手机与Edge Impulse连接。
要连接您的手机,请单击“ 设备 ”,然后单击“ 连接新设备” 。
现在,在下一个窗口中,单击“ 使用您的手机” ,然后将显示QR码。使用Google Lens或其他QR码扫描仪应用程序,用手机扫描QR码。
这会将您的手机与Edge Impulse工作室连接。
通过将手机与Edge Impulse Studio连接,您现在可以加载示例。要加载样品,请单击“ 数据采集” 。现在,在“数据采集”页面上,输入标签名称,选择麦克风作为传感器,然后输入采样长度。单击“ 开始采样” ,开始采样40秒样品。您可以使用不同长度的在线咳嗽样本来代替强迫自己咳嗽。记录总共10到12个不同长度的咳嗽样本。
上传咳嗽样本后,现在将标签设置为“ noise”并收集另外10到12个噪声样本。
这些样本用于培训模块,在接下来的步骤中,我们将收集测试数据。测试数据应至少为训练数据的30%,因此请收集3个“噪音”样本和4至5个“咳嗽”样本。
您可以使用Edge Impulse CLI上传器将数据集导入到您的Edge Impulse帐户中,而不必收集数据。
要安装CLI Uploader,首先,在笔记本电脑上下载并安装Node.js。之后,打开命令提示符并输入以下命令:
npm install -g edge-impulse-cli
现在下载数据集(“数据集链接”)并将文件提取到项目文件夹中。打开命令提示符并导航到数据集位置,然后运行以下命令:
边缘脉冲上传--clean 边缘脉冲上传--category培训培训/ *。JSON 边缘脉冲上传--category培训培训/ *。CBOR 边缘脉冲上传--category测试测试/ *。JSON 边缘脉冲上载器-类别测试testing / *。cbor
训练模型并调整代码
数据集准备就绪后,现在我们将为数据创建脉冲。为此,请转到“创建脉冲”页面。
现在,在“ 创建脉冲” 页面上,单击“ 添加处理块” 。在下一个窗口中,选择音频(MFCC)块。之后,单击“ 添加学习块”, 然后选择“神经网络(Keras)”块。然后点击“ 保存脉冲” 。
在下一步中,转到MFCC页面,然后单击“ 生成功能” 。它将为我们所有的音频窗口生成MFCC块。
之后,转到“ NN分类器” 页面,然后单击“ 神经网络设置” 右上角的三个点,然后选择“ 切换到Keras(专家)模式” 。
用以下代码替换原稿,并将“ 最低置信度” 更改为“ 0.70”。然后点击“ 开始训练” 按钮。它将开始训练您的模型。
从tensorflow.keras.models导入tf作为tf,从tensorflow.keras.layers导入顺序。导入MaxNorm#模型体系结构模型= 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,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)))#这可以控制学习率= Adam(lr = 0.005,beta_1 = 0.9,beta_2 = 0.999)#训练神经网络模型。compile(loss ='categorical_crossentropy',optimizer = opt,metrics =)model.fit(X_train,Y_train,batch_size = 32,历元= 9,validation_data =(X_test,Y_test),详细= 2)详细= 2)详细= 2)
训练模型后,将显示训练效果。对我来说,准确度是96.5%,损失是0.10,这是一个不错的选择。
现在,当咳嗽检测模型准备就绪时,我们将把该模型部署为Arduino库。在将模型下载为库之前,您可以通过转到“ 实时分类 ”页面来测试性能。
转到“ 部署 ”页面,然后选择“ Arduino库” 。现在向下滚动并单击 “ Build” 以开始该过程。这将为您的项目构建一个Arduino库。
现在在您的Arduino IDE中添加该库。为此,请打开Arduino IDE,然后单击 Sketch> Include Library> Add.ZIP库。
然后,通过转到 文件>示例>您的项目名称-Edge Impulse> nano_ble33_sense_microphone来加载示例。
我们将对代码进行一些更改,以便在Arduino检测到咳嗽时发出警报声。为此,蜂鸣器与Arduino相连,每当它检测到咳嗽时,LED就会闪烁三下。
这些更改是在 void loop() 函数中进行的,该函数在其中打印噪音和咳嗽值。在原始代码中,它同时打印标签及其值。
对于(size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){ei_printf(“%s:%.5f \ n”,result.classification.label,result.classification.value); }
我们将噪声和咳嗽值保存在不同的变量中,并比较噪声值。如果噪音值低于0.50,则意味着咳嗽值大于0.50,它将发出声音。用以下代码替换原始的for loop() 代码:
对于(size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++){Serial.print(result.classification.value); float Data = result.classification.value; 如果(数据<0.50){Serial.print(“检测到咳嗽”); 报警(); }}
进行更改后,将代码上传到Arduino。以115200波特打开串行监视器。
因此,这就是构建咳嗽检测机的方式,这不是找到任何COVID19嫌疑人的有效方法,但它在某些拥挤的地方也可以很好地工作。
以下是带有库和代码的完整的工作视频: