任务要求:
任务一:用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。
本次用 syntiant tinyml 的板子 基本实现了第一条的功能。即成果展示中的,可以识别 :“开”,“关”,“停”,三个中文指令,并且根据指令的不同,去点亮不同的RGB灯。
具体的实现流程如下:
首先得 搭建arduino的开发环境,我这个arudino的开发环境,着实是卡了我将近半个月之久,从一遍一遍的从github上下载代码,不行。再到一条条的修改报错的头文件路径,还是不行。在群里进行求助后,问题得到了一些解决思路后,我按照github上的readme手册上给出的步骤,一步一步手动构建和安装相应的库和修补usb的一个文件后,再次编译,终于有了相应的编译成果的结果。当时我特别的高兴。
在用edge impluse 采集训练数据,在部署到自己的板子上。可以根据网页的内容指导进行使用和训练。
再进行编写用户的逻辑函数。下面是我的逻辑函数:
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, "kai") == 0) {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
// Toggle LED
digitalWrite(LED_RED, HIGH);
delay(5000);
digitalWrite(LED_RED, LOW);
}
if (strcmp(event, "guan") == 0) {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
// Toggle LED
digitalWrite(LED_GREEN, HIGH);
delay(5000);
digitalWrite(LED_GREEN, LOW);
}
if (strcmp(event, "ting") == 0) {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
// Toggle LED
digitalWrite(LED_BLUE, HIGH);
delay(5000);
digitalWrite(LED_BLUE, LOW);
}
}
这部分的程序,主要是修改irmware-syntiant-tinyml的例程。
下面的是识别相关的函数:
if (doInt)
{
doInt = 0;
// Poll NDP for cause of interrupt (if running from flash)
if (runningFromFlash)
{
match = NDP.poll();
if (match)
{
// Light Arduino LED
digitalWrite(LED_BUILTIN, HIGH);
ei_classification_output(match -1);
printBattery(); // Print current battery level
}
}
else
{
match = 1;
}
}
digitalWrite(0, HIGH);
暂时是由官方提供的sdk上的。
下面是 edge impluse的训练结果
下面是效果展示部分:
(我训练了一千条数据,可识别效果仍然不算太好,中文指令可以识别到,但是总存在误触发的情况,暂时还没有完美的解决方案。)
心得与体会:
通过本次的的funpack的活动,我体验到了基于ndp101的人工智能的语音识别,学会了用 impluse edge 的网站来为自己的嵌入式系统,来训练相应的模型,并且利用该网站进行采集数据,和训练数据。借此,了解到了如何在该网站上搭建一个合适于自己的神经网络模型。并且对相关的参数进行设置,以及开始训练前的参数设计。并且用该网站提供的工具验证自己的网络模型的准确度,最后构建工程文件,来将模型构建到自己的板子上,实现出专属于自己的神经网络。
训练模型时,采用较高的训练次数,可能导致数据的过拟合,会影响网络对新数据的识别效果,但时如果训练次数不够的话,则会导致整体的识别率不高的现象出现。
对于本次的成果效果,我也不怎么满意,主要的问题出现在,在拥有环境噪声的时候,且没有说出指令词之前,存在概览误识别出发三个中文指令中的一个的现象,也存在在说完一个相应的中文指令后,识别到了该指令,产生对应的现象后,却再次出现误识别的现象,出现其他指令识别到的跟在正确的指令后。 对于这两个问题,我暂时也没有想到很好的解决方案。只能暂时的容忍这。我本来想从数据方面进行改善,在记录数据时,尽量关闭周围的噪声源,尽量放声时,音调尽可能的保持一致,等措施进行弥补,但是随着训练数据的慢慢上涨,最终的训练模型也没有逐渐的改善。遇到了这个arudino的开发环境的问题,着实是卡了我将近半个月之久,从一遍一遍的从github上下载代码,不行。再到一条条的修改报错的头文件路径,还是不行。在群里进行求助后,问题得到了一些解决思路后,我按照github上的readme手册上给出的步骤,一步一步手动构建和安装相应的库和修补usb的一个文件后,再次编译,终于有了相应的编译成果的结果。当时我特别的高兴。还有之后遇到了bat烧录不进去,arduino-cli的安装问题,和arduino-cli 无法进行相应的工具下载的问题,都是这样一点一点,或者群里求助,或者自己百度搜索解决方案,终于编译出了自己的可以进行下载的arduino程序和神经网络模型。
这次活动我学到了很多很多,比如说,做什么事,不要只自己埋头苦干,而是要自己的多尝试,不要胡想乱想,而要踏踏实实的干,只有落实到了实物上,才称得上是自己的作品,而不是停留到构想上。