Funpack第二季第一期-用Syntiant TinyML根据中文指令使LED呈现出不同效果
Funpack第二季第一期-用Syntiant TinyML根据中文语音指令使LED呈现出不同效果
标签
嵌入式系统
MPU
测试
liurongbao
更新2022-07-06
368

内容介绍

任务要求:

      任务一:用自带的麦克风,搭建机器学习模型,使板卡上的LED灯根据中文语音指令(不少于三个指令)呈现出不同效果,如开灯、关灯、闪烁、SOS、呼吸等。

      本次用 syntiant tinyml 的板子 基本实现了第一条的功能。即成果展示中的,可以识别 :“开”,“关”,“停”,三个中文指令,并且根据指令的不同,去点亮不同的RGB灯。

   具体的实现流程如下:FsMAaqRBzRfrrzoZqqbGTOx8ETH6

   首先得 搭建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的训练结果FijtRTC27OS2W_muWX4IgehCqNUF

下面是效果展示部分:

   FrRi69WwXR_MSbZU9JGW0oF5pUktFjgFCQv-jVHZxN6x0Q0nsfNrebdMFiBrHaHvu7CikEHb3XxVnGQsjov-(我训练了一千条数据,可识别效果仍然不算太好,中文指令可以识别到,但是总存在误触发的情况,暂时还没有完美的解决方案。)

 

心得与体会:

   

通过本次的的funpack的活动,我体验到了基于ndp101的人工智能的语音识别,学会了用 impluse edge 的网站来为自己的嵌入式系统,来训练相应的模型,并且利用该网站进行采集数据,和训练数据。借此,了解到了如何在该网站上搭建一个合适于自己的神经网络模型。并且对相关的参数进行设置,以及开始训练前的参数设计。并且用该网站提供的工具验证自己的网络模型的准确度,最后构建工程文件,来将模型构建到自己的板子上,实现出专属于自己的神经网络。

   训练模型时,采用较高的训练次数,可能导致数据的过拟合,会影响网络对新数据的识别效果,但时如果训练次数不够的话,则会导致整体的识别率不高的现象出现。

   对于本次的成果效果,我也不怎么满意,主要的问题出现在,在拥有环境噪声的时候,且没有说出指令词之前,存在概览误识别出发三个中文指令中的一个的现象,也存在在说完一个相应的中文指令后,识别到了该指令,产生对应的现象后,却再次出现误识别的现象,出现其他指令识别到的跟在正确的指令后。  对于这两个问题,我暂时也没有想到很好的解决方案。只能暂时的容忍这。我本来想从数据方面进行改善,在记录数据时,尽量关闭周围的噪声源,尽量放声时,音调尽可能的保持一致,等措施进行弥补,但是随着训练数据的慢慢上涨,最终的训练模型也没有逐渐的改善。遇到了这个arudino的开发环境的问题,着实是卡了我将近半个月之久,从一遍一遍的从github上下载代码,不行。再到一条条的修改报错的头文件路径,还是不行。在群里进行求助后,问题得到了一些解决思路后,我按照github上的readme手册上给出的步骤,一步一步手动构建和安装相应的库和修补usb的一个文件后,再次编译,终于有了相应的编译成果的结果。当时我特别的高兴。还有之后遇到了bat烧录不进去,arduino-cli的安装问题,和arduino-cli 无法进行相应的工具下载的问题,都是这样一点一点,或者群里求助,或者自己百度搜索解决方案,终于编译出了自己的可以进行下载的arduino程序和神经网络模型。

   这次活动我学到了很多很多,比如说,做什么事,不要只自己埋头苦干,而是要自己的多尝试,不要胡想乱想,而要踏踏实实的干,只有落实到了实物上,才称得上是自己的作品,而不是停留到构想上。

附件下载

firmware-syntiant-tinyml.zip

团队介绍

暂无

评论

0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号