一、板卡介绍及任务要求
1. 板卡介绍
本次板卡使用的是Syntiant Tinyml Board这个板卡,它的尺寸仅有24毫米×28毫米,它板载了一个2MB串行闪存,一个用户自定义的RGBled,一个sd卡槽。该板卡的主控制器采用的是SAMD21 Cortex-M0+ 32位低功耗48MHz ARM MCU,它内置了256KB的FLASH和32KB的SRAM,拥有5个数字IO口,能与Arduino MKR系列兼容。神经决策器使用的是NDP101,其功耗非常低,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行。NDP101连接了两个传感器,一个是6轴运动传感器BMI160,一个是麦克风SPH0641LM4H。
2. 任务要求
任务一:
用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
任务二:个人进行自由发挥,难度不能低于任务一。
二、环境搭建
1. 安装Arduino CLI
点击链接https://arduino.github.io/arduino-cli/0.24/installation/进入下载网址,根据个人的电脑选择安装的版本,我这里安装的是arduino-cli_0.21.1_Windows_64bit,当然大家也可以安装最新版的,我这里是因为之前安装最新版本无法识别到串口,在安装完低版本后可以正常识别到串口,安装教程具体要看官方给的文档,文档中对如何下载及常遇到的问题都给出了详细的叙述,后面会给出下载链接,这里就不再赘述。
2. 安装Arduino IDE
点击链接https://www.arduino.cc/en/software进入下载网址,选择要下载的版本,我下载的版本是1.8.9,因为我在使用最新版本时总会出现官方给出的历程编译不通过和缺少库的情况,摸索了一天之后仍然没有结果,后来尝试使用低版本,编译就可以通过了。
3. 安装项目中要使用到的库文件
参考https://blog.csdn.net/tinyml/article/details/120747455?spm=1001.2014.3001.5502,博主对库文件安装的过程进行了详细得叙述。
三、模型训练
1. 采集数据
进入edge impulse官方网站,根据个人选择使用哪种设备进行录制音频,我使用的是电脑来录制音频,当然因为板卡上有麦克风,所以也可以使用板卡来录制音频,将板卡连接到电脑上,右键点击电脑任务栏中的喇叭,紧接着点击声音,会出现一个窗口,点击录制,如果电脑识别到TinyML的话就可以使用板卡来录制音频,在录制音频时特别要注意有且只有一个设备在录制音频,其他的设备要禁用,并且在采集数据的过程中不能更换设备,最好从始至终都使用同一个设备来录制音频。录制完音频后,要加入噪声,下载官方的噪声集https://github.com/microsoft/MS-SNSD,并导入到工程中去。
在采集数据时要注意对训练的数据和测试的数据进行分类,保证训练的数据占比为80%左右,测试的数据占比为20%左右。另外要使各类数据占比相同,包括噪声,这样能够保证每一类数据都能够训练得很好。
2. 设计impulse
(1). 创建impulse,点击左侧Create impulse。将第一栏中的Window size改为968ms,将Window increase改为484ms;选择processing block,点击Add a processing block,选择Audio(Syntiant);选择learning block,点击Add a learning block,选择Classification(Keras);最后点击Save Impulse。
(2). 点击左侧的Syntiant,进入Parameters部分,等待光谱图显示完成,在该页面的右上角可以选择查看某个数据的光谱图,点击Save Parameters,进入Generate features界面,点击Generate features,生成一个二维的特征浏览界面,在这里可以观察各个数据集的分布情况。
(3). 点击左侧的NN Classifier,进入训练模型界面,点击Start training,训练完成后会生成模型整体的准确度和失准度以及各个数据集的准确度和失准度,并且还生成一个二维的数据浏览图。从生成的数据可以看出,模型的整体准确度97.9%,失准度为0.06;close_bule、flash_bule、open_bule的准确度都为100%,当识别到噪声时,其被误判成close_bule的概率为3.6%,被误判成open_bule的概率为3.6%。
3. 进行部署
点击左侧的Deployment,首先选择Build firmware,将刷写的脚本下载下来,之后再选择Creat library中的Syntiant NDP101 library,将库文件下载下来。将下载的两个压缩包进行解压,把库文件中的ei_model.bin文件和ei_model.synpkg文件复制到固件库的文件夹中去替换掉原来的文件。之后点击固件库中的flash_windows.bat就可以下载了。
四、代码
1. 从GitHub上下载官方给出的历程https://github.com/edgeimpulse/firmware-syntiant-tinyml,使用Arduino IDE打开工程并编译。编译通过后,打开之前下载的库文件中model-parameters文件夹,复制文件夹中的三个头文件,替换掉官方例程中src文件夹中model-parameters文件夹中的三个文件。
2. 打开model_variables.h文件,将#include "edge-impulse-sdk/classifier/ei_model_types.h"和const ei_model_performance_calibration_t ei_calibration这个常量注释掉。
#ifndef _EI_CLASSIFIER_MODEL_VARIABLES_H_
#define _EI_CLASSIFIER_MODEL_VARIABLES_H_
#include <stdint.h>
#include "model_metadata.h"
//#include "edge-impulse-sdk/classifier/ei_model_types.h"
const char* ei_classifier_inferencing_categories[] = { "close_bule", "flash_bule", "open_bule", "z_openset" };
uint8_t ei_dsp_config_25_axes[] = { 0 };
const uint32_t ei_dsp_config_25_axes_size = 1;
ei_dsp_config_audio_syntiant_t ei_dsp_config_25 = {
1,
1,
0.032f,
0.024f,
40,
512,
0,
0,
0.96875f
};
//const ei_model_performance_calibration_t ei_calibration = {
// 1, /* integer version number */
//(int32_t)(EI_CLASSIFIER_RAW_SAMPLE_COUNT / ((EI_CLASSIFIER_FREQUENCY > 0) ? EI_CLASSIFIER_FREQUENCY : 1)) * 1000, /* Model window */
//0.8f, /* Default threshold */
//(int32_t)(EI_CLASSIFIER_RAW_SAMPLE_COUNT / ((EI_CLASSIFIER_FREQUENCY > 0) ? EI_CLASSIFIER_FREQUENCY : 1)) * 500, /* Half of model window */
//0 /* Don't use flags */
//};
#endif // _EI_CLASSIFIER_MODEL_METADATA_H_
3. 该项目需要编写的代码比较少,当匹配到模型后,就会进入到void on_classification_changed(const char *event, float confidence, float anomaly_score)这个函数中,所以只需要修改这个函数就可以根据中文指令来控制RGB灯。该函数中的event其实就是model_variables.h中所定义的const char* ei_classifier_inferencing_categories[] = { "close_bule", "flash_bule", "open_bule", "z_openset" },所以event这个形参只有三个选择,当event与"close_bule", "flash_bule", "open_bule"这三个中的一个相同时,就执行相应的动作。
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, "open_bule") == 0) {
// Toggle LED
digitalWrite(LED_BLUE, HIGH);//识别到打开灯时,打开蓝灯
}
if (strcmp(event, "close_bule") == 0) {
// Toggle LED
digitalWrite(LED_BLUE, LOW);//识别到关闭灯时,关闭蓝灯并让红灯闪烁两次
digitalWrite(LED_RED, HIGH);
delay(100);
digitalWrite(LED_RED,LOW);
delay(100);
digitalWrite(LED_RED, HIGH);
delay(100);
digitalWrite(LED_RED,LOW);
}
if(strcmp(event,"flash_bule") == 0){
digitalWrite(LED_BLUE,HIGH);//识别到闪烁灯时,蓝灯闪烁四次
delay(500);
digitalWrite(LED_BLUE,LOW);
delay(500);
digitalWrite(LED_BLUE,HIGH);
delay(500);
digitalWrite(LED_BLUE,LOW);
delay(500);
digitalWrite(LED_BLUE,HIGH);
delay(500);
digitalWrite(LED_BLUE,LOW);
delay(500);
digitalWrite(LED_BLUE,HIGH);
delay(500);
digitalWrite(LED_BLUE,LOW);
}
}
五、实物展示
1. 当说出打开灯时,蓝灯亮起。
2. 当说出关闭灯时,蓝灯先熄灭,然后红灯闪烁两次。
3. 当说出闪烁灯时,蓝灯闪烁四次。
六、心得体会
首先很荣幸能够参加此次活动,在这次活动中我学到了很多,这次活动带我走进了机器学习的世界,让我了解了一些机器学习的基本概念,让我亲身得感受到机器学习的奇妙。在这个活动中困难重重,这些困难不仅使我的能力得到了提升,而且让我的耐心也得到了提升,拥有了战胜困难的勇气。
七、一些可能用到的链接
2. edge impulse详细使用指南