基于Syntiant TinyML Board与Edge Impulse的LED语音控制(Arduino/C++)

👉 【Funpack第二季第一期】基于Syntiant TinyML Board与Edge Impulse的LED语音控制
👉 CSDN:工程源代码下载(包括固件)
👉 Syntiant工程
👉 Github-EmbeddedCamerata/Syntiant-tinyml-funpack

项目介绍

本项目基于Syntiant TinyML Board,通过Edge Impulse平台,在web端收集数据、训练、部署神经网络模型固件至NDP101内,实现了三种中文指令控制LED灯,闪烁、开灯、关灯(这个效果不明显)。

硬件介绍

Syntiant的TinyML Board,配备超低功耗Syntiant NDP101神经决策处理器,可以通过Edge Impulse平台,在Web端收集数据、训练、部署神经网络模型,通过USB连接通过Edge Impulse轻松下载经过训练的模型,而无需任何专用硬件。

👉 更多介绍:

  1. Syntiant TinyML
  2. Funpack第二季第一期
    硬件结构图
    Syntiant TinyML Board实物图

主要特点

  • 神经决策处理器使用NDP101,连接了两个传感器:
    • BMI160 6轴运动传感器
    • SPH0641LM4H麦克风
  • 主机处理器:SAMD21 Cortex-M0+ 32位低功耗48MHz ARM MCU
    • 内置256KB FLASH和32KB SRAM
    • 5个数字I/O,与Arduino MKR系列板兼容
    • 其中包含1路UART接口和1路I2C接口(包括在数字I/O引脚中)
    • 2MB板载串行闪存
    • 一个用户定义的RGB LED
    • uSD卡插槽
  • 电路板可使用5V micro-USB或3.7V LiPo电池供电

神经网络模型

👉 Syntiant Tiny ML Board

由于该开发板完全支持Edge Impulse,因此可根据官网引导:

数据采集

该部分完全在Web端通过电脑的麦克风录制中文音频,”闪烁“、“开灯”、“关灯”,三者各120+30段左右(训练集:测试集=4:1),每段1秒钟长度。录制时可先连续录制10s,后手动裁剪。

⚠️ 检查录音是否完整、清晰

前面说可以克隆它提供的Go & Stop示例工程,其中有一类别是“z_openset”,语音大多是一些"Hello world"之类的语句,可以将他们也纳入你的训练集。但实际部署 测试效果很差:这一类别目的是作为“其他”类,即当没有下达指令或受噪声干扰时分为此类,但实际测试中也很难判断到此类别,失去意义。

以下是训练集、测试集样本数量和比例,“z_openset”一类给disable了,后续没有用到。

Training Set
Test Set

网络训练

Impulse Design这一步骤请严格参照上述给出的官方指导即可:Syntiant Tiny ML Board

⚠️ 我感觉网络训练的学习率、cycles、dropout等一些超参数可能需要结合实际训练效果微调,loss小一点更好,不要过分看重验证集正确率。

训练后的模型验证集正确率能90%+,loss<0.2就算凑合。可以发现“开灯”和“关灯”容易误判。

训练后

模型部署

这一步,首先选择"Create libray"下的"Syntiant NDP101 library",然后选择下方“Find posterior parameters”(寻找先验参数)。

⚠️ 注意不要选到“Build firmware”上,它生成的是Go & Stop示例工程的固件,除非你是按照示例工程演示
Deployment
后续勾选你实际要判断的类别与No calibration。测试了有10分钟English radio的校准,感觉也没啥效果。
FInd posterior parameters
找到先验参数后,build完会下载一个压缩包,解压后如图所示:

build package

  • model_parameters内是网络的一些信息,替换其示例工程下./src/model_parameters
  • 后面两个就是网络模型的固件,通过Audio firmware中的flash_linux.sh(Win端类似)可同时下载Arduino程序与NN固件;
  • 因此一个工程需要由两部分组成:NN固件以及业务逻辑程序(Arduino),在其中实现LED的控制。

业务逻辑程序

直接修改示例工程的firmware.ino部分代码,主要是函数on_classification_changed

typedef enum {
    _BLINK,
    _TURN_ON,
    _TURN_OFF,
    //_Z_OPENSET = 0U
} Led_Status;

Led_Status last_state = _TURN_OFF;	// 这个变量最后没用上

void on_classification_changed(const char *event, float confidence, float anomaly_score) {
    // here you can write application code, e.g. to toggle LEDs based on keywords
    if (strcmp(event, "blink") == 0) {
        blink_cb();
    }

    else if (strcmp(event, "turn_off") == 0) {
        turn_off_cb();
    }

    else if (strcmp(event, "turn_on") == 0) {
        turn_on_cb();
    }
}

// 这个函数没有用到,期望是在判断到非三种模式时保持之前的业务逻辑操作
void on_classification_unmatched() {
    if (last_state == _BLINK)
        blink_cb();
    else if (last_state == _TURN_ON)
        turn_on_cb();
    else if (last_state == _TURN_OFF)
        turn_off_cb();
}

void turn_on_cb() {
    last_state = _TURN_ON;
    digitalWrite(LED_GREEN, HIGH);
}

void turn_off_cb() {
    last_state = _TURN_OFF;
    digitalWrite(LED_GREEN, LOW);
}

void blink_cb() {
    last_state = _BLINK;
    digitalWrite(LED_BLUE, HIGH);
    delay(200);
    digitalWrite(LED_BLUE, LOW);
    delay(200);
    digitalWrite(LED_BLUE, HIGH);
    delay(200);
    digitalWrite(LED_BLUE, LOW);
}

比较简单,但效果也不太明显:此次判断为“开灯”,接着绿灯亮起,但过一会绿灯也会灭,恢复初始态。因此“关灯”的展示效果不行(需要开灯完迅速关灯)。

由于我的PC是linux,因此直接使用arduino_build.sh -- build编译Arduino工程,并将firmware.ino.bin(如果改了工程名称最后改回这个即可)与上述网络模型的固件一起,通过flash_linux.sh下载至开发板。

⚠️ 若下载出错,请查阅官网示例教程,内有提示

Arduino工程build
Flash
上述通过flash_linux.sh同时将两部分的固件下载至开发板。

功能展示

简单拍了一些效果图,还是看视频效果更直观,正确率有些感人,预测的结果从串口打印。每次说话时得凑近开发板麦克风说话。

👉 项目演示视频参见B站:基于Syntiant TinyML Board与Edge Impulse的LED语音控制

  1. 开灯:绿灯亮

Turn on
2. 关灯:绿灯灭,要在开灯后迅速关灯

Turn off
3. 闪烁:蓝灯闪烁一会最后灭,图片看不出动效,但看串口为blink没问题

Blink

总结

此次项目使用Syntiant TinyML Board,在Edge Impulse平台上实现了三种中文词汇的检测,“开灯”、“关灯”以及“闪烁”,效果较好,正确率实际能有个八成吧,前提是你离麦克风够近。

Syntiant TinyML Board确实小巧精悍,有麦克风与IMU,背后还有SD卡槽,虽然预留的IO口不多,但是主打功耗的NN推理的不要奢求太多,能做到这么小也是本事。它的判断速度很快,但是说话时最好凑近开发板,录制训练集时用它的麦克风很难顶,会出现录制不全、声音小等各种现象。

Edge Impulse这种在网页端完成整个NN流程的模式,对于这种嵌入式轻度应用的开发很友善、方便,但我感觉能训练的模型只有简单几层FC这是否……但是能克隆别人的项目顺带把数据集也克隆了,后续能搞个数据集共享就更好。

👉 【Funpack第二季第一期】基于Syntiant TinyML Board与Edge Impulse的LED语音控制
👉 CSDN:工程源代码下载(包括固件)
👉 Syntiant工程
👉 Github-KafCoppelia/Syntiant-tinyml-funpack

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Arduino Nano 33 BLE Sense训练TensorFlow模型以识别某些关键字并控制RGB灯带。 与传统代码相比,边缘机器学习对于创建可通过更少的编程和逻辑流程图完成“智能”任务的设备非常有用。这就是为什么我想要结合边缘关键字检测功能,该功能可以识别某些单词,然后根据所说的内容执行任务。 该项目只有一个组件: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已经为噪声和“未知”单词提供了一个预先构建的数据集,因此我使用了它们的“上传现有数据”工具将这些音频文件上传到训练数据中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值