TinyML-Language Detector-基于 Edge Impulse &Arduino
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 1 |
必要的工具和机器
| ||||
|
应用和在线服务
| ||||
| ||||
|
关于这个项目
概览
该项目背后的想法是使用在微控制器中实现的神经网络/深度学习来创建语言分类。该设备将识别意大利语、英语和法国语言的一个词。要识别的词是“si " 对于意大利语,"oui " 代表法语,而 "是 " 表示英语。设备持续收听,一旦识别出 3 个单词中的一个,就会出现相关语言的标志。
该项目基于两个主要组件:Arduino Nano 33 BLE Sense 微控制器和 Edge Impulse Studio 开发平台。
项目实施遵循以下步骤:
- 采样/创建数据集
- 设计模型
- 训练模型
- 测试模型
- 为硬件定制
- 模型的部署及其定制
- 构建最终设备(模型周围的硬件)。
采样/创建数据集
数据集由3个单词(oui、si、yes)的全局记录组成,持续约30分钟(每个单词10分钟)。
为每个单词创建一个连续的声音文件,其中相同的单词不断重复,然后使用 Audacity 应用程序将文件拆分为多个文件,每个文件持续一秒。每个文件都包含一个单词示例。
然后将这些文件上传到边缘脉冲并根据单词进行标记。
除了这些文件,另一组时长为 1 秒的录音文件也被上传并标记为背景噪音。
全局训练数据由 33 分钟组成(每个单词 10 分钟,背景噪音 3 分钟)
设计模型
该模型是利用边缘脉冲平台实现的,其中大部分需要的算法已经定义了一个凹坑。
创建模型的第一步是将声音转换为时间序列。然后使用预定义的时间窗口大小对时间序列进行分区。
(第一个转换显示在下图的红色一侧)。
第二步是使用信号处理技术,在这种情况下是 MFCC(梅尔频率倒谱系数),从时间序列中提取最能表征 4 个类别(3 个词 + 背景)的特征。
下面是 MFCC 变换及其系数的示例。
时间序列和系数的卷积用于馈送神经网络。最后,神经网络的输出提供了每个类别的归属概率。
下面是神经网络实现及其分类性能的概述。
培训 - 为 Arduino Nano 33 BLE Sense 定制
对于训练和最终模型定制,Edge Impulse Studio 上提供了一个名为“EON Tuner”的新选项 "。它允许为嵌入式机器学习应用程序选择最佳架构。
它并行运行许多可能模型的实例,每个实例具有不同的配置(不同的信号数字技术和不同的神经网络架构)。
此选项只需要一些信息即可运行:
- “目标 " 代表模型类型(在本例中为 "Keyword Spotting ")
- 运行应用程序的硬件(在本例中为“Arduino Nano 33 BLE Sense (Cortex-M4F 64MHz) ".
对于每个实例,它给出了少数分类性能指标、计算所需的时间、内存量以及微控制器文件系统上使用的文件系统空间。
对于这个项目,我们选择了 5 个分类准确度最好的实例,并从中选择了最快的一个。
测试
测试是通过收集一组新的记录器文件并检查分类质量来进行的。
一旦验证分类是准确的。我们进入了实施的下一步,即最终部署。
部署
由于 edge-impulse studio 的部署非常简单。
从部署选项中选择了 Arduino 库选项。这提供了模型的标准 arduino C 文件,可以根据我们的需要对其进行定制。
边缘脉冲构建完成后,在本地机器上创建并下载一个zip文件,只需将其导入Arduino Ide中进行最终定制即可。
代码
该代码可在链接中找到。代码基于edge-impulse下载的代码,做了少量自定义,如下所示。
1. 添加库 Adafruit_PWMServoDriver.h 用于驱动附在旗帜上的舵机。
2. 定义函数servos_selector 根据分类结果协调舵机。
voidservos_selector(int iter){
time_now =millis();
delta=time_now - time_was;
if (delta> 2000){
time_was=time_now;
switch (iter) {
case 0:
pwm.setPWM(0, 0, 350);
delay(500);
pwm.setPWM( 0, 0, 200);
pwm.setPWM(1, 0, 200);
pwm.setPWM(2, 0, 200);
break;
case 1:
pwm.setPWM(1, 0, 350);
Serial.println("2222");
delay(500);
pwm.setPWM(0, 0, 200) );
pwm.setPWM(1, 0, 200);
pwm.setPWM(2, 0, 200);
break;
case 2:
pwm .setPWM(2, 0, 350);
Serial.println("333");
delay(500);
pwm.setPWM(0, 0, 200);
pwm.setPWM(1, 0, 200);
pwm.setPWM(2, 0, 200);
break;
}
}
}代码>
3. 最后,添加了调用servos_select的IF条件 基于“result.classification的函数 " 对象。
for (size_t ix =0; ix ei_printf(" %s:%.5f\n", result.classification[ix].label,
result.classification[ix].value);
}
#if EI_CLASSIFIER_HAS_ANOMALY ==1
ei_printf(" 异常分数:%.3f\n", result.anomaly);
#endif
print_results =0;
}
if (result.classification[1].value> 0.80){
servos_selector(0);
}
else if (result.classification[2].value> 0.80){
servos_selector(1);
}
else if (result.classification[3].value> 0.80){
servos_selector(2);
}
}
电路
电路基于微控制器Arduino Nano 33 BLE Sense微控制器,使用PCA9685驱动3个舵机。
PCA9685 工作负载由外部 9v 电池支持。
仅此而已。
代码
代码
https://github.com/EnzoCalogero/Tensorflow_Lite_embeded/tree/main/nano_sense_EdgeImpulse/language_detection/nano_ble33_sense_microphone_continuous定制零件和外壳
示意图
语言检测_9RxXhRX5sj.fzz制造工艺