Funpack第二季第一期_一起来用Syntiant TinyML学习机器学习
Syntiant TinyML搭建机器学习模型,识别语音指令并做出响应。
标签
Funpack
机器学习
Syntiant TinyML
语音控制
好大一只荣哥哥
更新2022-07-05
461

内容介绍

一、自我介绍及板卡介绍

      大家好,我是“好大一只荣哥哥”,这次参加的是funpack的第二季第一期,本期活动的板卡是深度学习解决方案提供商Syntiant公司的的TinyML开发板,采用的是NDP101超低功耗神经决策处理器,另外,外形方面,尺寸和一枚一元硬币近似,非常迷你,但是板卡配置很齐全,包括了与Arduino MKR系列板子兼容的5个数字I/O口,可自定义的RGB,microSD卡卡槽,5V microUSB和电池接口,这些使得编译下载程序或者是独立供电进行实际应用都变得简单。

二、本期环境搭建

      拿到板子之后就在电脑上测试了一下,发现不知道怎么上手,中途的确让板卡吃灰了有半个月。后面在up主“简简单单的创意”的教程下,学会了基础环境的搭建,过程中也不断的收集交流群中各位朋友踩下的坑,以及解决方法。重复几次操作下来,的确熟悉了这样的一个流程。

      1、首先,我们需要下载Arduino cli,此处根据群里朋友经验,使用的是0.13版本,下载下来之后我们需要在此电脑右键管理环境变量中配置cli的路径。如下图所示:

FqrSP8qQs9Lh-yrrxWTAOLtBar0NFg6FzrmO8gi5nKNCLnYKiGBSxb5T

      保存之后进入cmd输入命令arduino-cli运行,出现以下界面即配置完成。

Fi6RZvfHeLZYtnkSfjEMNyuHc0K-

      2、我们需要下载安装arduinoIDE和官方的Go-stop实例程序。此处IDE使用的是1.8.19,另外,群友反映2.0beta版本其实并不好用。官方实例下载地址:GitHub - edgeimpulse/firmware-syntiant-tinyml: Edge Impulse firmware for Syntiant TinyML board,我们下载zip压缩包即可。

      3、打开IDE,通过USB连接板卡,IDE会提示安装板卡文件,这里我下载安装失败了很多次,一定要安装成功。

      另外,打开压缩包文件,我们运行其中的update_libraries_windows.bat脚本,会自动帮我们下载所需要的库文件。也是建议多更新几次,以免部分库下载失败,编译不过。

      到这里,环境就基本上搭建完成了。

三、官方Go Stop实例上传板卡

      因为基本上是在官方例程上进行修改成为自己的程序,所以先用官方例程学习EDGE impulse平台的使用以及arduino程序的上传。

      我们进入公开的例程https://studio.edgeimpulse.com/public/42868/latest,克隆到自己账户中,直接到Deployment下,选择Syntiant Tiny ML板卡,build构建出固件,完成之后会自动下载压缩包,解压后运行flash_windows.bat脚本刷入固件。

      而后解压github下载的固件,文件夹更名为firmware-syntiant-tinyml,然后使用Arduino IDE打开firmware-syntiant-tinyml.ino文件,编译上传。此处遇到过缺失库文件或提示重复的情况,重新运行上面的更新库文件脚本,或删除重复库,可正常编译上传。

      上传完成后等待板卡重启,后对它说Go和Stop可看到LED灯有绿色和红色响应。

四、任务实现之模型训练

      经过直播课程学习和上面官方例程的实践,基本上已掌握了大体的流程。首先我们到EDGE impulse平台创建我们自定义的训练模型。

      此处根据群里朋友建议,重新克隆官方项目并删除了所有的语音数据。

      进入Data acquisition页面,选择用电脑收集,会打开新标签页,我们在新标签页创建数据标签并收集数据。

FlXAv4hAtJ1rEElwH_Af05yTwRWp

      收集完成的数据在Data acquisition标签页会实时同步显示,我们需要查看对应频谱确认采集的数据是否有效。 

FtdJQecK47hsXSoqc2cX3_XMrj5g

      更换数据标签录入足够数据之后,我们切换到Impulse design标签下Create impulse页,window size不可更改,window increase时长我们可以根据需要设置,完成后保存。

FtQrmB7_V1PHmClqdBpnqc9mvedR

      保存完成进入Syntiant标签,点击Save parameters,然后点击Generate fetures生成数据标签分类。运行完毕后页面右侧会图形展示。

Fm-wLvXLb_C7BfuYL154PxfK8Nw3

      生成数据标签完毕之后,我们进入NN Classifier页签,进行相应训练设置,然后点击start training 开始训练,训练完毕页面右侧会实时显示准确率和训练结果。

Fg7NmRat_-swMmUfkQbzXS5zErC9

      因为部分数据准确并不足,平台提供 了模型测试功能,我们进入Model testing页签,点击Classify all按钮,验证数据集,验证完成之后红色准确性极差的数据我们可进行删除,然后返回上一步重新训练。

      训练完成之后,我们来到Deployment页签,选择Syntiant TinyML开发板,点击下方Find posterior parameters按钮,选择我们需要的数据标签,然后点击find parameters按钮。更新标签数据。完成之后点击build按钮构建我们的训练模型。同样,构建完成之后会自动下载,我们解压运行flash_windows.bat命令,更新板卡固件。

      最后,还是在Deployment页签,选择Syntiant NDP101 library,然后build构建模型库文件。将压缩包中model-parameters文件夹下三个文件复制到官方firmware-syntiant-tinyml/src/model-parameters文件夹下。这是为了替换掉官方例程中的模型及数据标签相关数据。

      更新下载完成之后,我们打开firmware-syntiant-tinyml.ino进行相关代码更改。

五、任务实现之对应LED显示

      模型训练更新到板卡之后,我们打开firmware-syntiant-tinyml.ino文件。

      打开即可看到主程序中自定义了一个on_classification_changed函数,注释写到我们可以在这里编写自定义指令。这里根据模型训练的数据标签对应添加了4个对应,分别为:

      flash_green_led 绿色LED点亮,500ms后熄灭,语音为“绿灯闪烁”。

      flash_yellow_led 绿色、红色LED同时亮,500ms后同时熄灭,共2次,语音为“黄灯闪烁”。

      turn_off_all_led 红色、绿色、蓝色LED同时亮起,800ms后熄灭,语音为“关灯”。

      turn_on_red_led 红色LED点亮,800ms后熄灭,语音为“打开红灯”。

    if (strcmp(event, "flash_green_led") == 0) {
        //中文指令:绿灯闪烁
        digitalWrite(LED_GREEN, HIGH);
        delay(500);
        digitalWrite(LED_GREEN, LOW);
    }
    if (strcmp(event, "flash_yellow_led") == 0) {
        //中文指令:黄灯闪烁
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_RED,HIGH);
        delay(500);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, LOW);
        delay(500);
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_RED,HIGH);
        delay(500);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, LOW);
    }
    if (strcmp(event, "turn_off_all_led") == 0) {
        //中文指令:关灯
        digitalWrite(LED_GREEN, HIGH);
        digitalWrite(LED_RED, HIGH);
        digitalWrite(LED_BLUE, HIGH);
        delay(800);
        digitalWrite(LED_GREEN, LOW);
        digitalWrite(LED_RED, LOW);
        digitalWrite(LED_BLUE, LOW);
    }
    if (strcmp(event, "turn_on_red_led") == 0) {
        //中文指令:打开红灯
        digitalWrite(LED_RED,HIGH);
        delay(800);
        digitalWrite(LED_RED, LOW);
    }

      演示效果:因为绿色和黄色拍照几乎一样,未拍照。

Fts-JMZ3MAPVwyF8mAJSjfwmjbGPFgFbNZNVlYfLlG9oTJx905K5srwpFhm6VPJQcHGN5a-BMRd-25IAEC2r

六、心得体会与感悟

      从Funpack第一季参与好几期的板卡到现在,还是很开心等到了升级版第二季,这期的板卡很迷你,但是难度还是比较大,主要还是集中在模型构建和训练阶段,因为数据量的缺乏,以及对平台的不熟悉,中间走了好多弯路。但是在重复的观看多个教程之后,逐步摸清了其中的路径,也基本上搭建了自己第一个机器学习模型,大致对机器学习有了粗略的认识。但是模型训练的效果的确不是很满意,误触率比较高。期待下一期,一起学习!

附件下载

firmware-syntiant-tinyml.zip
arduino 源码(已更新替换对应模型库文件)
syntiant-funpack2-1-syntiant-ndp101-lib-v60.zip
edge impulse平台导出的库文件
syntiant-funpack2-1-syntiant-ndp101-v64.zip
edge impulse平台导出的tinyml固件

团队介绍

我是好大一只荣哥哥
团队成员
好大一只荣哥哥

评论

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