[Day 25] Edge Impulse + BLE Sense实现手势动作辨识(下)

=== 书接上回 [Day 24] Edge Impulse + BLE Sense实现手势动作辨识(上) ===

模型设计及训练

接着就可以进到「Impulse Design」页面,开始调整时间序列参数、新增处理和学习区块并存档。在「时间序列」部份,可以调整视窗大小(预设值2000ms)、视窗递增距距离(预设值80ms)和取样频率(预设值16KHz),通常可使用预设值即可。接着新增一个「处理区块(Processing Block)」,选择系统推荐的「频谱分析(Spectral Analysis)」即可,再来新增一个「学习区块(Learning Block)」,选择系统推荐的「分类Classification(Keras)」即可。另一个「异常侦测(Anomaly Detection)」区块并不是用来侦测时序型讯号异常用的,而是用来去除过於离群的资料,所以暂时不要选。最後按下【Save Impulse】,左侧选单Impulse design下方就会新增「频谱特徵(Spectral Features)」和「神经网路分类器(NN Classifier)」新页面。

Edge Impulse 模型设计流程(手势辨识)
Fig. 25-1 Edge Impulse 模型设计流程(手势辨识)。(OmniXRI整理制作, 2021/10/9)

频谱特徵

再来切换到「「频谱特徵(Spectral Features)」」页面,第一子页为「参数(Parameters)」,可以在右上角下拉式选单中切换想观看的资料,页面就会显示对应的原始三轴信号波形,若没有特殊需求可先略过调整频谱相关参数。但从页面右半边显示的「DSP Result」,可看出和声音的处理方式略有不同,它更需要使用滤波功能来使信号更平顺,同时去除更多高频杂讯(手的轻微抖动)。最下方还有模型布署到开发板後的预估记忆体使用量及推论计算时间。

接着要切换到第二子页「产生特徵(Generate Features)」,按下绿色按钮【Generate Features】开始计算所有训练样本的特徵值,并以立体空间可视化结果来呈现资料分布状态。如果各分类自己本身(相同颜色点)越群聚,而不同分类越分开,表示资料很容易分割,可以得到较好的分类效果,反之则要重新处理资料集收集及建置问题。完整操作内容可参考图Fig. 25-2所示。

Edge Impulse 频谱特徵产生(手势辨识)
Fig. 25-2 Edge Impulse 频谱特徵产生(手势辨识)。(OmniXRI, 2021/10/9)

神经网路分类器

再来就是重头戏,切换到「神经网路分类器(NN Classifier)」页面,这里是设计模型结构及进行训练用的。首先可以指定训练次数和学习率,一开始次数可以少设一些,加快训练时间,如果训练後精确度不高,混淆矩阵表现不佳,那就可以增加次数或改变模型结构来改善。再来是模型架构设定,这里已预设两个全连结(Dense Layer)隐藏层,分别有20个和10个神经元,如果神经元数量或隐藏层数不足以产生良好分类结果,那可以适当的调整一下。另外如同前面章节提到,如果你精通Python、TensorFlow和Keras,那右上角的按键可切换至专家模式(Expert),你可以直接修改程序码来改变模型结构。同样地,当按下【Start Training】後就能得到精确度、损失值、特徵分布图及布署到装置後的资源耗损。更完整的内容可参考图Fig. 25-3所示。

另外这个训练的步骤很重要,如果不满意结果就要一直调整,直到可以接受为止。由於目前仅有很少的资料样本,所以训练後得到100%的精准度是很正常的(因为已经过拟合了),但如果你的训练集很大,但却得到很高的精确度和很完美的混淆矩阵,那可能就要注意已产生过拟合现象了。要适当调整网路结构或再增加资料集多样性来改善。

Edge Impulse 神经网路分类(手势辨识)
Fig. 25-3 Edge Impulse 神经网路分类(手势辨识)。(OmniXRI, 2021/10/9)

完成训练後,可於左侧选单切换至「模型测试(Model Testing)」来检验测试集的表现,亦可切换至「即时分类(Live Classifictaion)」来输入现录的动作看看是否能顺利分类。这两个步骤和[Day 22] Edge Impulse + BLE Sense实现唤醒词辨识(下)类似,使用系统提供的预设值即可,这里就不再多作说明。

模型布署及推论

最後是要产生可以布署到开发板的程序。同样地不想写程序的人,点击「建置烧录档案(Build Firmware)」项目 下的「Arduino Nano 33 BLE Sense」,按下【Build】後即可得到ZIP档案,解压缩後会得到二进制档(MCU韧体)firmware.ino.bin和烧录程序档flash_windows.bat(windows用),执行後者就能把程序烧进开发板中。执行结果会从USB虚拟序列埠输入,只需使用类似「Windows Terminal」(可於Win10 APP Store下载)或PuTTY中的Serial来监看输出结果,但要注意选对COM埠。

如果自己後续想要加入一些自己的控制程序,需要取得源码,那就得选用「产生函式库(Create Library)」项目下的「Arduino」,再按下【Build】後即可得到ZIP档案。同样地,如同前面章节所示,可於页面下方选择性的指定是否使用EON Compiler优化编译器及是否量化(INT8 / Float32),来缩小模型的复杂度和所需使用的记忆体(SRAM, Flash)储存空间。

接着开启Arduino IDE,点击主选单[草稿码]-[汇入程序库]-[加入.ZIP程序库...],选择刚才产出的ei-cmr_test-arduino-1.0.1.zip(依个人专案名称产生)。再来点击主选单[档案]-[范例]-[CMR_Test_Inferencing(依专案名称不同)]-[nano_ble33_sense_acceleratometer_continuous]就能产生对应的范例程序。在编译及上传前,记得把edge-impulse-daemon的命令列视窗关闭,以免占住虚拟序列埠,导致无法上传。按下左上角箭头符号就可开始编译及上传,这时候可以先去泡杯咖啡,慢慢看着进度条,因为第一次编译要花比较长的时间。上传完成程序就会自动运行起来,此时点击主选单[工具]-[序列埠监控视窗]就可看到开发板一直回送结果,戴上开发板,比出预定手势就能验证是否成功运行。完整的步骤如图Fig. 25-4所示。

Edge Impulse模型经Arduino编译上传结果
Fig. 25-4 Edge Impulse模型经Arduino编译上传结果。(OmniXRI整理绘制, 2021/10/9)

小结

相信大家有了前面声音(唤醒词)辨识操作经验後,这次在操作手势辨识应该非常容易,如果资料集少建一些,那整个专案大概10~15分钟就完成了,实在非常方便,几乎都不用写到程序,对於自定义tinyML专案的开发是很有帮助的。对於想更深入了解的朋友,亦可从Arduino的源码中学到更多的技术原理。

参考连结

Edge Impulse Document - Tutorials - Continuous motion recognition说明文件
[Day 20] Edge Impulse + BLE Sense实现唤醒词辨识(上)
[Day 21] Edge Impulse + BLE Sense实现唤醒词辨识(中)
[Day 22] Edge Impulse + BLE Sense实现唤醒词辨识(下)


<<:  [Day25] 找回密码API – views

>>:  第25天~还是Firebase

[Day 06] tinyML的重要推手Arm Cortex-M MCU

在[Day 01]时就有提及,未来具有边缘智能(Edge AI)的智慧物联网(AIoT)装置一定少不...

DAY 28 Big Data 5Vs – Value(价值) – QuickSight(2)

视觉人类理解世界很重要的感受,沟通也比文字来的有效率,近年来流行的互动式报表与视觉化仪表板以不同於传...

IPv6

IPv6节点使用本地链接地址(前缀为FE80 :: / 10)引导,并使用多播与DHCP服务器联系。...

[Day29] Windows Privilege Escalation

前言 昨天的Linux PrivEsc中已经介绍过提权的基本概念了,所以今天就直接进入正题吧 正文 ...

Day 25 Redux 介绍

第 25 天 ! 我们知道 redux 结构 flux-like , 那麽他的每个阶段是在处理什麽?...