项目描述
本项目基于Syntiant tinyML Board,结合Edge Impulse的在线收集数据、训练模型、一键部署功能,实现了三个手势运动的识别,并将识别结果通过串口显示。
硬件介绍
Syntiant TinyML 板的尺寸为 24 毫米 x 28 毫米,是一个小型的独立系统,通过微型 USB 连接通过 Edge Impulse 轻松下载经过训练的模型,而无需任何专用硬件。
本项目所用关键硬件:
-
主机处理器:SAMD21 Cortex-M0+ 32位低功耗48MHz ARM MCU
-
神经决策处理器使用NDP101
-
BMI160 6轴运动传感器
-
uSD卡插槽
从框图可知,SAMD21和NDP101实际上是两个独立的处理器,两者通过SPI进行通信。NDP101专负责机器学习识别的工作,结果丢给DAMD21,而SAMD21则根据结果/请求进行基础的外设控制操作,两者结合实现整个系统。
应用方向:智能手表、智能手环
训练平台介绍
Edge Impluse通过一个开源的设备软件开发套件(SDK)为开发者提供机器学习的支持,包括简单的传感器数据收集、实时信号处理、测试和在任意目标设备上部署的能力,用户还可以扩展和贡献你的算法以及对设备的支持。Edge Impluse使得机器学习的数据采集、信号处理、模型训练、嵌入式设备部署等工作变得非常简单,只需要在网站上进行图形化界面操作即可,并且信号处理及模型训练均在云端完成,无需占用本机的算力。Edge Impluse官方已支持了Syntiant tinyML Board,所以本项目大部分工作均在Edge Impluse网站上进行。
设计思路
-
在Edge Impluse上Clone Syntiant官方提供的Motion工程,以得工程的配置信息,避免自建工程由于参数选项不正常带来的问题。
-
下载官方的Motion工程生产的固件到Syntiant tinyML Board,以得到具有Motion数据采集功能的初始固件。
-
删除Motion工程的数据集,自己设计动作,并采集数据。
-
对采集的数据进行归一化处理,并生成特征。
-
对神经网络进行模型训练
-
生成部署到Syntiant tinyML的固件/库。
设计方案
Data acquisition
本次设计三个手势运动:
-
逆时针画圆(标签:Circle)
-
上下呈波浪状摆动(标签:Wave)
-
翻转板子(标签:Flip)
因此需要对以上三个动作进行数据采集及标签分类,动作完成时间控制在2s以内。按照教程,还需额外采集一个z_openset的数据集。同时,由于Motion采集的数据需要再本地先进行缓存,然后再传输到云端,所以数据采集时,板子需要插入SD卡。
四种数据原始数据示例如下:
Create impulse
impulse设计主要还是沿用原始Clone项目的配置,其中Window increase应该是可以调整以获得不同的识别效果的。
Generate Feature
由于官方Motion样例里面采集的数据集,已经是归一化的,所有它无需再勾选归一化选项了。但是我们自己采集的数据是没有归一化的,所以一定要勾选一下"Scale 16 bits to 8 bits".
Feature 预览图如下
Model Training
神经网络模型训练参数本项目保持原有工程的默认值,训练结果如下:
Deployment
完成模型训练,如果有需要可以进行在线的模型测试。最后工作是将训练好的模型,以嵌入式代码的方式部署到开发板上。由于Edge Impulse已完全支持Syntiant tinyML Board,所以可以有三种部署方式:
-
标准C++库,我理解它不受限于特定硬件,可以在将库嵌入任意满足算力的嵌入式设备上进行工作。
-
Syntiant NDP101库,它实际上是完成生成了可直接执行的NDP101固件,以及几个与模型参数相关的接口文件(.h),在Syntiant tinyML Board上需结合Arduino源码及环境进行集成编译以获得SAMD21上运行的固件
-
Syntiant TinyML,则是完全生产了可直接运行的NDP101固件、DAMD21固件,无需再进行额外的编译工作。
识别结果
手握开发板的USB接口部分,使MCU侧方向向上并保持水平方向,然后分别做出逆时针画圆、翻转、上下波动等手势,识别结果通过串口打印输出,如下图所示:
画圆及翻转的结果
上下波动的结果
不足之处
实际识别的准确率是机器学习不可能避免的一个问题,本项目可以实现三种手势运动的识别,但偶尔存在不识别、误识别的情况。就本项目而言,我认为主要原因是训练数据量不够丰富。其中有两点原因:
-
单个人采集的数据,具有很大的局限性,最好由多人共同构建数据集
-
Edge Impulse使用Syntiant TinyML采集Motion数据,似乎有些bug,经常采集上传不成功,导致很难进行更大数据的采集工作。
对于数据集,未来方向应该是全民参与,共同贡献构建数据集的趋势。本次Funcpack项目培训老师有提议共建数据集的想法,但实际上可能由于时间等多重因素,并没有得到具体的落实,有点遗憾,但是未来我相信会有机会去完成这个构想。
项目小结
心得
通过本项目,我对嵌入式机器学期有了基础的入门和认识,通过实际的动手实践对机器学期的数据采集、数据处理、模型训练、模型部署整个流程有了深刻的理解,为未来进行进一步的机器学习奠定了基础。
建议
后续活动不建议再使用Arduino相关的板子,其编译/开发环境极不友好,问题较多,对于年轻人的基础学习而言也不利。