用于控制 RGB 灯的 TinyML 关键字检测
组件和用品
| Arduino Nano 33 BLE Sense | | × | 1 | |
关于这个项目
前提
边缘机器学习对于创建可以完成“智能”任务的设备非常有用,与传统代码相比,编程和逻辑流程图要少得多。这就是为什么我想结合边缘关键字检测,它可以识别某些单词,然后根据所说的内容执行任务。
硬件
该项目只有一个组件:Arduino Nano 33 BLE Sense。真正的魔法发生在机器学习模型中。 Arduino Nano 33 BLE Sense 充满传感器,包括麦克风、9 轴 IMU、环境传感器和手势/接近/颜色/环境光传感器 (APDS-9960)。其上的微控制器是 nRF52840,运行频率为 64MHz,包含 1MB 闪存和 256KB RAM。该项目还使用其板载 RGB LED 来显示当前颜色。
图>
设置边缘脉冲
我首先在 Edge Impulse 上创建了一个新项目,然后安装了 Edge Impulse CLI 工具。有关如何执行此操作的更多说明,请访问安装说明页面。这让 Arduino Nano 与云服务通信以接收命令并自动发送传感器数据。我下载了最新的 Edge Impulse 固件,并通过双击重置按钮使其进入引导加载程序模式将其闪存到板上。然后我运行 flash_windows.bat
转移它。
在命令提示符下,我运行了 edge-impulse-daemon
并按照向导进行设置。现在,Nano 出现在项目的设备列表中,它允许将样本作为训练/测试数据集的一部分进行采集和上传。
收集样本
训练机器学习模型需要数据,而且需要相当多的数据。我想为 RGB LED 灯条设置以下模式:
对于每种模式,我都会听到大约 1 分钟的声音,其中我以 1-2 秒的间隔反复说这个词并将它们分开。
图>
但是仅仅拥有这些样本是不够的,因为背景噪音和其他文字会给出错误的读数。幸运的是,Edge Impulse 已经为噪声和“未知”词提供了一个预先构建的数据集,所以我使用他们的“上传现有数据”工具将这些音频文件上传到训练数据中。
最后,我重新平衡了数据集,分别将推荐的 80-20 拆分用于训练和测试数据。
训练模型
现在有了一个小时的训练数据和大量标签,是时候训练模型了。我设计的impulse将音频作为时间序列数据,窗口大小为1秒,窗口增加500ms。然后它通过 MFCC 块进入 Keras 神经网络块。
MFCC 块允许您配置音频的处理方式,以及以视觉方式显示频率的频谱图。
我将神经网络设置保留为大部分默认设置,但也做了一些修改。首先,我将最小置信阈值从 0.80 更改为 0.70,并以附加噪声和屏蔽时间带的形式添加了一些数据增强。这有助于神经网络避免过度拟合模型,因为它有更多不同的数据可供使用。
在 Arduino Nano 33 BLE Sense 上部署
Arduino Nano 33 BLE Sense 充当始终开启的麦克风,持续对音频进行采样并检测是否有人说出了其中一个关键字。一旦找到,关键字就会转换为索引,用于解码所需的颜色。对于 on 或 off 关键字,LED 设置为黑色或浅灰色。
我将模型下载为库并将其添加到 Arduino IDE,然后编译并将代码写入 Nano。
代码
RGBLEDKeywordDetectionC/C++
/* Edge Impulse Arduino 示例 * 版权所有 (c) 2020 EdgeImpulse Inc. * * 特此免费授予获得此软件和相关文档文件(“软件”)副本 * 的任何人的许可, * 不受限制地处理 * 软件,包括但不限于 * 使用、复制、修改、合并、发布、分发、再许可和/或出售 * 软件副本的权利,并允许使用软件的人*提供这样做,受以下条件的约束: * * 上述版权声明和本许可声明应包含在 * 本软件的所有副本或重要部分中。 * * 本软件“按原样”提供,不提供任何形式的明示或 * 暗示保证,包括但不限于适销性保证, * 适用于特定用途和不侵权。在任何情况下,*作者或版权持有人均不对任何索赔、损害或其他*责任承担责任,无论是在合同诉讼、侵权行为或其他方面,*因软件或其他软件的使用而引起的或与之相关的* 软件中的交易。 */// 如果您的目标内存有限,请删除此宏以节省 10K RAM#define EIDSP_QUANTIZE_FILTERBANK 0/** * 定义每个模型窗口的切片数。例如。 1000 ms * 的模型窗口,每个模型窗口的切片设置为 4。切片大小为 250 ms。 * 更多信息:https://docs.edgeimpulse.com/docs/continuous-audio-sampling */#define EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW 3/* 包括-------------------- --------------------------------------------- */#include #include #include