项目介绍
这里是我参加Funpack第二季第一期活动的任务总结报告,我所完成的是任务二,手势识别。
在edge impulse网站上训练好不同手势运动的模型文件,下载到开发板上后,利用板子上的6轴运动传感器感应到手势的移动,并将数据传给SAMD21主处理器,主处理器再将数据通过SPI的方式传给NDP101神经决策处理器,NDP101通过下载进去的模型去判断传来的数据属于哪种手势变化,当然,手势识别有一定的概率性,若是训练的模型不够完善,可能会发生误识别
主要硬件介绍
SAMD21:Cortex-M0+内核 32位低功耗48MHz ARM MCU,内置256KB FLASH和32KB SRAM,5个数字I/O,与Arduino MKR系列板兼容,其中包含1路UART接口和1路I2C接口(包括在数字I/O引脚中)
NDP101神经决策处理器:可以使语音和传感器应用程序分别在 140 和 100 微瓦以下运行,与基于 MCU 的传统 MCU 相比,吞吐量提高 20 倍,系统效率提高 200 倍
三色 RGB LED:本次任务通过这个led灯显示不同的颜色来表示识别的不同手势
BMI160 6轴运动传感器:获取位置及速度变化数据
SPH0641LM4H麦克风:获取语音数据
SD卡插槽:不同于语音识别的项目,手势识别项目需要插SD卡进行操作
板子上的IO:
主要软件介绍
1、手势模型文件的训练:
建议使用谷歌浏览器,网址:https://studio.edgeimpulse.com
上图可以看出,在项目中我一共设计了5个动作,且训练与测试的数据大约为8:2
五个手势分别为:旋转,闲置,左右移动,上下移动,摆动
选择合适的处理块,学习块,就可以开始训练模型
我这里运气不错,测试效果不错,不同的手势数据都分的很开,说明我的几个手势都有很大的不同点
最后尽可以生成模型下载进板子中了
2、代码实现
可以从官方的github上下载到tinyml的固件库,windos电脑点击最下面那个bat文件就可以安装程序编译所需要的库了。为了适配我们下载进去的手势识别的模型文件,我们还需进行一些修改
这个文件里的这个宏定义,模型标签的数量为5,因为我们有5种手势
该文件的这个变量,可以将我们各个手势的标签名填入
该文件的这里,因为我们使用的是6轴运动传感器,且先前下载进去的是由运动传感器检测到的不同位置速度变化数据所产生的的模型文件,这里应该使用ei_model_sensor.bin,下面那个文件名是语音模型文件名
最后,就是.ino文件里面。板子会一定间隔检测所传来的位置速度变化数据,随后在中断中触发该函数,而在该函数中,我们可以根据传来的参数进行匹配,从而判断出当前是什么手势,并且开启不同颜色的LED灯
功能展示
闲置时显示白灯
旋转时显示绿灯
左右移动显示蓝灯
心得体会
从这次的活动中,我学习到了如何用edge impulse生成深度学习的模型数据,并将其部署在嵌入式开发板上,使板子具有判断一些复杂,人类无法正确处理的模拟数据。
其实在上面的5个手势识别中,上下移动开启红灯这项并没有很好的实现,即使是上下移动,也是显示了闲置时的白灯,我想是因为我的训练数据还太少的原因,使模型并不能很好的分辨出闲置与上下移动的数据差别。
当然也有可能,我选的手势本身就不太合适,即上下移动跟闲置这两个手势本身就存在着一定的数据相似。
总的来说,还是学到了不少新知识的,十分感谢硬禾学堂平台。