Syntiant总结报告
1 项目需求
-
任务一: 用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
根据项目要求,本次项目完成了语音识别控制LED,有三个指令,分别为“前进”-绿灯亮;“后退”-红灯亮;“转弯”-蓝灯亮。
2 硬件介绍
深度学习解决方案提供商Syntiant Corp推出的TinyML 开发板,其配备超低功耗 Syntiant ® NDP101神经决策处理器™,可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍。Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,是一个小型的独立系统,通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。
硬件资源包括:
-
神经决策处理器使用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电池供电
硬件资源图如下:
3 实现过程
该项目的主要实现过程包括数据采集、设计网络、参数设置、模型训练、模型部署等。本文将在具体章节简述步骤,并详细说明需要注意的问题。
3.1 数据采集
在edge-impulse
网站,进入Device
界面,选择计算机麦克风进行数据采集,即可采集数据,进入Data acquisition
界面,可查看采集到的数据并进行分割,剪辑等操作。
在采集数据集的过程中,应注意同个标签的数据集尽可能体现多样性,不能使录入的数据过于相似,如果录入数据集的相似度太高,很容易导致过拟合,显著降低识别率。可以在录入过程中使用不同的语速、音调、响度录入声音,并且可以在开窗户或不开窗户,电脑风扇转与不转的时候分别录入声音,可极大增加数据集的多样性,提高识别率。
该过程中有几点需要注意:
-
推荐全部数据均放在训练集中,让系统自动分配训练集与测试集,可以达到最合理的比例。
-
推荐在录制的过程中录制10秒的数据,再进行裁剪分割,将大大提升录入数据的效率
-
在裁切分割数据的时候,可以选择
shift samples
选项,该选项可以使分割后的数据集在时间轴上左右随机移动,以避免所有的分割数据均在时间轴的正中心。 -
添加环境噪音的标签并录入数据集参与训练可大大降低环境噪音呗被误识别成有效指令的概率。
split sample
(分割数据)的界面如下:
3.2 模型训练
在完成数据采集后,分别在Create impulse
、 Syntiant
、 NN Classifier
三个界面依次设置模型参数,其默认参数一般不需要变动,各界面以及相应界面需要注意的参数如下:
Create impulse
该界面需要注意 Time series data
框的Window increase
参数,该参数表示窗口的增加量,当一个样本的时长大于窗口大小时,窗口每次延时间轴平移该数值,故该数值越小,数据量越大,识别准确率越高,有时说话还没有1s,模块便会给出识别结果,此时误识别率较高,可减小Window increase
数值。
推荐Window increase
= 242 ms。
设置好参数后点击 save impulse
即可。
Syntiant
该界面用于设置音频信号的参数并生成特征,按照流程依次进行即可,没有什么需要注意的。
用户可在该界面看到原始音频数据提取出来的频率特征图。
最后会生成一个Feature explorer
,用户可通过这个界面直观地看出各样本之间的特征差别。
NN Classifier
该界面负责设置神经网络分类器的参数,其中大部分参数可保持不变,需要注意的是Data augmentation
(数据扩充),该选项可以在现有数据集的基础上添加噪声、时间蒙版等,以扩大数据集,并防止过拟合的出现,对于数据集较小时提升识别准确率十分有效。
参数设置完成即可开始训练。完成训练后,会生成可视化结果图,可通过该图评估模型的性能。
3.3 模型测试
可在Model testing
界面进行模型测试,模型测试会使用测试集中的数据对模型进行评估。由于测试集的数据没有参与训练,所以这里的评估有很强的说服力。很有可能出现模型训练时准确性很高,但模型测试时准确率很低的情况,若出现此情况,即出现了过拟合,则需增加样本数量与样本的多样性,也可参考上文3.1、3.2章节的一些措施。
3.4 模型部署
当模型测试结束后,即可在Deployment
界面开始模型部署,若只需要烧入arduino
,不需要编程,可选择Syntiant TinyML
;若需要编程,则需要选择Syntiant NDP101 library
并将导出的文件替换arduino
工程中的相应文件即可。
选择完成后,在 Find posterior parameters
按键中设置后验参数,选择除了环境噪音之外的所有有效指令即可。
最后即可点击build 完成导出。
3.5 Arduino编程
arduino编程非常简单,仅需在回调函数里判断接收到的字符串是否为期望的字符串,再亮起期望的灯光即可,代码如下:
#include "src/syntiant.h"
#include <NDP.h>
#include <NDP_utils.h>
#include <Arduino.h>
/**
* @brief Called when a inference matches 1 of the features
*
* @param[in] event The event
* @param[in] confidence The confidence
* @param[in] anomaly_score The anomaly score
*/
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, "stop") == 0) {
// Toggle LED
digitalWrite(LED_RED, HIGH);
}
if (strcmp(event, "go") == 0) {
// Toggle LED
digitalWrite(LED_GREEN, HIGH);
}
if (strcmp(event, "turn") == 0) {
// Toggle LED
digitalWrite(LED_BLUE, HIGH);
}
}
void setup(void)
{
syntiant_setup();
}
void loop(void)
{
syntiant_loop();
}
4 实物演示
当说出“前进”时,绿灯亮,当说出“转弯”时,蓝灯亮;当说出“停止”时,红灯亮。可通过电脑屏幕上的串口打印文本与三色LED的闪烁看到识别结果,识别的成功率较理想。演示效果图片如下,具体演示效果可参考B站的视频讲解。
5 收获与感想
我是第16届智能车竞赛的参赛队员,在参加这次活动前,我就了解过16届的电磁AI组别,当时对单片机上跑神经网络就比较感兴趣,但经过这次活动,感觉实际效果并没有我预计的那么好,即使采取很多措施,其误识别概率仍然非常高,对于一个需要稳定的系统来说是无法忍受的。
另外,调黑箱实在是太难受了,作为一个工程师,如果调的东西只能通过不断尝试输入输出来猜他的内部机制,无疑有十分糟糕的体验,今后虽然不能放弃人工智能的学习,但还是多调些白盒比较好。
当然语音识别还有另一套解决方案,就是科大讯飞等网站的API,今后可能会尝试一下这种解决方案,并与本次活动做个对比,争取将这个系统加入一个究极好活中。