-------------------------------
-------------------------------
1.项目简介
华为手机有个非常方便功能,它便是隔空操作。即手不接触手机,隔空做出手势,然后利用前置摄像头识别手势,可以实现上滑,下滑,截图等功能。
受其启发,我决定做一个手势识别项目,其能够简单识别一些状态,并在电脑上反映出各种操作。其基本流程是:
1、通过板载摄像头拍摄照片;
2、通过神经网络识别手势;
3、将结果解析,并采用模块通过串口向电脑发送USB指令。
2.项目设计过程
2.1基本思路
2.1.1软件部分
在电脑上进行模型训练、量化与嵌入式部署。
2.1.2硬件部分
采用CH9328模块,该模块可与电脑进行通讯,模拟USB键盘输入,而单片机仅需要进行串口通信即可驱动之
2.2模型训练
模型采用官方仓库ai8x-training
项目以及ai8x-syntheses
项目,数据集采用了以下开源项目的数据集:hagrid。
具体部署参考了第一个项目下的官方教程。
按照需要我选择了两个类,分别是fist和stop,即握拳和五指并拢,两个数据集一共约70个G
选择了官方cats_vs_dogs的例程改造,然后开始训练:
2.3模型推理&嵌入式代码转化
训练完成后选用进入ai8x-syntheses文件夹进行推理,具体部署参考官方的ai8x-syntheses项目介绍文档,创建并打开syntheses的虚拟环境,完成后如下:
首先需要将训练好的模型转移到ai8x-syntheses\trained
文件夹下,它在ai8x-training\logs\
文件夹下,选择最好的那个,即best.pth.tar。
然后进行模型的量化:
量化完成后得到best-q.pth.tar文件
接着对这个文件进行嵌入式代码转化:
TARGET:生成文件的目录,如果没有需要创建,这里是我创建的sdk/fist_stop
--prefix:模型的种类,这里因为我是在官方例程上改的,所以选择cats-dogs
--checkpoint-file:被转化文件地址
--config-file:配置文件,hwc表示是height、weight、channel,是图像的输入顺序。
--fifo:first in first out,配置图像缓冲区,更加快速的加载图像。其他都是些关于显示进度的选项,具体可以运行python ai8xize.py --help
来查看。 完成后如下图:
这样在sdk文件夹下就得到了转化好的嵌入式代码了:
2.4导入到MaximSDK 打开MaximSDK,右键选择import:
打开General,选择Existing Projects into Workspace:
点击Browse,选择刚才生成的嵌入式项目然后勾选Copy projects into workspace点击Finish即可
打开此项目的设置,然后打开如下界面,将BOARD改成FTHR_RevA,然后apply,再build即可
踩坑记录
1、在使用摄像头时候,需要按照路径添加库,而不能直接添加,有可能导致某些文件缺失
2、TFT字体库需要自己导入,以官方例程cats_vs_dogs为例,导入,找到TFT字库,然后使用按照官方的示例使用即可。
3、移植官方例程时候一定要把定义符重定义了,否则可能出现某些函数用不了的情况,如某些例程中有这样的写法在移植后,一定要
#defineBOARD_FTHR_REVA
#define TFT_ENABLE
否则可能因为这个函数没有初始化,那么屏幕就显示不了了。
3.项目修改过程
3.1实现(详细的实现流程大部分都在视频里面)
3.1.1前期摸索
本次比赛我认真学习了官方项目的流程,因为是刚入门,而且学校到了考试月,所以只能以有限的精力实现这一个小项目。因为不熟悉流程,所以一开始选择了mnist项目进行复刻,然后准备以此项目为基础,改变数据集进行分类,但是Google发现这个数据集的修改比较困难,只好更换其他项目。
之后便找到了cat vs dog这样一个经典的识别项目,这个项目官方也有例程,便准备这个数据集的更换。
3.1.2修改模型(具体看视频)
我一开始将数据集中的cat替换成stop(停止手势),dog替换成fist(握拳手势),就是直接进行图片替换,训练后发现效果很不错,于是琢磨着想要魔改实现3分类。在看完ai8x-trainning
文件夹后发现,datasets
文件夹下的cats_vs_dogs.py
以及models
文件夹下的ai85net-cd.py
文件是修改的重点,前者是给输入打label的,后者是修改输出的维度数,具体修改请看视频,这样就修改好了模型。
3.1.3修改嵌入式文档(具体看视频)
首先添加路径依赖,见上面踩坑记录。然后这里需要用到串口,我选择的是uart2,根据原理图:
P1_0,P1_1这两个引脚,接上CH9828的tx和rx,然后学着例程进行初始化:
CH9828模式3默认波特率是9600,接收的是16位为一次标准usb键值,具体键值参考数据手册。
然后在识别一次后进行判断,如果结果2的识别率大于89%,那么进行一次截屏操作,
而结果1和结果3只设置了识别到后停顿2s,这里可以采用任何键盘能操作的动作,比如快捷键打开应用,或者关机,或者一键输入,只需要找到相应的键盘操作即可。
3.2不足
本次模型训练尝试过修改optimizer,learning rate以及weight decay,最后发现大约60轮左右即收敛,准确率大约有90%,但是受到光线的影响较大,有时不能正确识别手势,且fist手势的识别率要稍低于ok手势和stop手势,之后有时间将会修改模型层数以及激活函数等方式尝试更佳的鲁棒性。