Funpack第二季第一期:Syntiant TinyML Board项目
本次任务选择任务一:
用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
结合家中实际需求,制定了三个关键词,分别为:开卧室灯,开床头灯,小王同学。
一、开发版介绍
配备超低功耗 Syntiant ® NDP101神经决策处理器™,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍。
Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,是一个小型的独立系统,通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。
Syntiant TinyML板的框图如下图所示。
Syntiant TinyML 板框图 Syntiant TinyML 板卡的主要特点包括:
• 神经决策处理器: NDP101
• 主机处理器: SAMD21 Cortex-M0+ 32位低功耗 ARM MCU, 包含256KB flash 和32KB SRAM
• 板卡电源支持: 5V micro-USB 或 3.7V 锂离子电池
• 数字 I/O 兼容 Arduino MKR 系列板卡
• 1 UART 接口 (包含在 I/O 引脚中)
• 1 I2C 接口 (包含在 I/O 引脚中)
• 2MB 板载串行flash
• 48MHz 系统时钟
• 一个 用户定义的RGB LED
• μSD卡槽 (不包括μSD )
• BMI160 六轴运动传感器
•SPH0641LM4H 麦克风
RGB灯电路连接原理图
从原理图可以看出RGB三个引脚分别接在MCU的PA08、PA06、PA05。
二、开发环境准备
1.EDGE IMPULSE平台,用于训练语音数据
2.Arduino平台,用于编写代码
3.Arduino-cli软件,同于编译上传固件
三、根据教程熟悉Syntiant TinyML板卡
1.TinyML Tutorial for Windows文档,介绍板卡内容和EDGE IMPULSE平台基本操作
2.https://docs.edgeimpulse.com/docs/edge-impulse-cli/cli-installation,介绍板卡
3.https://docs.edgeimpulse.com/docs/tutorials/hardware-specific-tutorials/responding-to-your-voice-syntiant-rc-commands-go-stop,介绍EDGE IMPULSE平台和板卡的联合使用
4.https://docs.edgeimpulse.com/docs/development-platforms/officially-supported-mcu-targets/syntiant-tinyml-board,介绍Edge Impulse CLI的使用(似乎没怎么用到)
四、训练语音模型
在这里我就没有使用新建工程的办法,而是直接克隆了例程的工程,再将它的数据集删除掉,加入我自己的数据集,重新进行模型训练即可,这样也避免一些奇怪的问题发生(别问我怎么知道,因为我试过新建工程。。。)
下面开始说明
克隆完成例程后,点击Data acquisition,选择复选框,将其全部删去即可。
再点击Devices,选择连接设备,当使用USB数据线将开发板与电脑相连时,我们可以直接选择电脑作为设备,此时使用的便是开发板上的麦克风,当然也可以选择使用手机(也试过,但是效果不太好),便可以开始激情的念关键词啦。
采集好声音后,便需要先对声音进行预处理,将每个指令语句分开为单独的一条(我选择使用1秒时间长度作为一条数据)。
之后就可以进行数据的训练,在Impulse design中的Create impulse,按下图所示进行添加组件,并点击Save Impulse。
下一步,点击Impulse design中的Syntiant,稍微等待加载完成,点击Save parameters。
继续,点击Impulse design中的NN Classifier,其中将一些选项改为如下所示,便可点击Start training,开始训练声音模型!
等待训练完成后,选择Deployment,再选择Syntiant NDP101 library,在页面下方的Configure posterior parameters中,选择想要被识别的数据集标签名,便可点击Build来生成所需要的库文件,使用该库文件替换例程中的库文件,再进行Arduino的编程,将程序及模型文件上传到开发板中,开始回应你的声音!
四、编写程序及下载
在上一步中我们可以点击Syntiant TinyML开发板选项来直接生成一个固件,使用这个固件中的脚本可以很方便的将模型文件下载进开发板中,同时也可以更快速的(不用编程)进行板子的识别测试,测试结果将会通过串口发送至电脑上。
进行如上操作,再进行Arduino的编程下载,就可以不用再重新单独下载一遍模型文件。
我所使用的数据集标签及中文语音和对应亮灯情况分别为:
turn_bedroom,开卧室灯,绿灯;
turn_bedside,开床头灯,蓝灯;
wake ,小王同学,蓝灯和绿灯同时亮(青色)。
我所使用的源码是github上的fix-header-references 分支(第一个使用Arduino编译会找不到一个.h文件,但是文件就在工程中。。。)
使用下载好的model-parameters文件替换源工程中的同名文件。
再打开model_variables.h文件,在一个头文件引用中加入“../”,如下图所示,否则还会提示找不到文件。。奇奇怪怪的BUG。。。
使用Arduino IDE打开firmware-syntiant-tinyml.ino文件。
选择开发板为Arduino MKRZERO。
在on_classification_changed函数中,
初级阶段我们只更改该函数中的判断条件即可。
如下图所示
①识别到”开卧室灯“关键字时,将红灯连接的引脚置低,绿灯连接的引脚置高;
②识别到”开床头灯“关键字时,将红灯连接的引脚置低,蓝灯连接的引脚置高;
③识别到”小王同学“关键字时,将红灯连接的引脚置低,绿灯和蓝灯连接的引脚置高;
之所以要将红灯连接的引脚置低,推测是因为板卡识别到关键字后,会自动打开红灯(暂时没找到具体代码),如此一来,就需要先将红灯关闭,才能呈现出正确的颜色。
点击“上传”按钮,将程序下载进开发板中,即可进行测试!
结果如下
当说到,开卧室灯,绿灯便会打开;
当说到,开床头灯,蓝灯便会打开;
当说到,小王同学,绿灯和蓝灯便会打开,呈现出青色;
五、总结及问题汇总
总的来说这次活动还是很不错的,由于这块板卡来自于海外,它的资料很少,需要一步步的去探索,特别是从无到有这个过程,很值得,即使过程很坎坷,也遇到无数的问题,但最终还是如期完成了此次项目。
1.看b站up主的视频,结果Arduino环境问题耽误了许久,最后还是使用SDK另一个分支的Github源码才能正常编译下载(主要问题)
2.选择使用板卡录音的时候,要选择自己的电脑,在电脑设置里,将麦克风设置为开发板即可
3.下载程序至下载了Arduino的几个文件,没有把模型文件下载进去
4.录音使用的手机麦克风,可能与开发板不一致,导致识别错误率/不识别概率很高。
5.发现匹配成功后,某些关键词会将红灯打开
六、参考资料