上周,终于网络答辩结束了,正式的从一名研究生变成一只社畜,开启新的居家隔离生活。。。是的,“炸酱面”村被新冠袭击了,原计划24号返校领证的我们,又只能在家里苟这….
正好这几天可以静下心来,完成我的“羽毛球训练监测器”项目。前期其实已经对FSM和MLC都有了基本的了解和尝试了,我寻思着用一两天先用开发板将主要功能实现一遍,然后结合起来完结项目,撒花~
然而,当我按照之前的认知开始项目的数据采集训练测试时,才发现,我并没有理解MLC如何使用….
以下是本帖正文。
首先,我先放一段今天的一段识别的视频,经过n多次的采集、测试,成功率终于较为稳定了:
从视频中可以看到,本人拿着绑好开发板的羽毛球拍挥拍时,Unico的data界面下的MLC可以正确的识别出我当前的挥拍动作,比如 从上向前挥动会出现12,从下向前挥动会出现4,从左边向前挥动会出现8,说明项目的主要功能已经可以实现了~只是稳定性稍差,但这个稳定性跟MLC的执行原理有关系,我的手已经挥废了。。
接下来,我将从采集数据开始分享下以上功能实现的过程,在此过程中,我也是逐步的重新认识了下MLC这个模块。
我的项目目的是监测挥动羽毛球拍的动作,在帖子中我简单的介绍了下挥动的分类。
在最开始的时候,我用Unico的Polts界面初步分析了挥动羽毛球拍所需要的传感器范围参数。
也就是在挥动过程中,数据不要出现失真,采样频率够用。
然后基于上面的指标,我最后确定了一组参数:
于是基于以上参数,我开始收集动作数据。
-----------------------------这部分存在问题,仅仅为分享记录,请不要参考--------------------------------------------------
最开始根据我之前写的帖子中的采集方法收集了一个小时的数据,后来又多次重复收集数据,挥动我手都快断了:
挥拍动作我保留了三个:从下向前挥动,从上向前扣杀,从左向前回击。每种动作我分别采集了25+个数据集,并且用我之前写的小工具,对数据集进行了区域剪切,去掉了数据中动作前后的空闲段。然后依次导入到Unico的MLC界面中,像这样:
终于,导入完了所有数据之后,开始configuration MLC的参数,一切都是按照之前的方法进行,设置好了前面的参数:(界面中软件版本是9.8.1.0,貌似支持批量导入,但是我没搞能用)
在导出训练文件的时候,出现了问题….软件闪退了!!!前面导入的数据记录全没了,于是我又重新尝试了两三遍,软件退回9.7.1.0也测试了几遍,一天就这么过去了….我曾一度怀疑是我参数设置问题,或者新版软件的bug,或者数据集采集的问题。。。
最后,在我即将饿不下去想吃晚上的午饭时,偷了个懒,发现导入少量的数据后,是可以生成训练文件的,这说明….我那接近八十个数据集太多了…导致软件崩溃了。。。。额,说好的机器学习训练呢,,,数据集不得多来点么。。。
-----------------------------失败测试结果的结束分割线-----------------------------------------------------
在吃过晚饭后,我重新梳理了下思路。在经过对官方教程二度阅读后发现,官方教程中三个动作,一共就仨数据集??
而且在采集数据的界面下可以看到,基本上就是一个动作重复在做很多次:
这时,想到后面要设置的窗口宽度参数,突然明白了。
之前一直受限于研究生课题的深度网络思维,训练集用损失来训练网络权重…那就需要大量的数据集进行演算。而MLC是机器学习啊,它通过数据统计的方法,总结出动作的特征值特点,从而实现分类操作。。。
也就是说,我们采集的数据集中包含大量同一动作的重复数据,并且每个动作的数据量正好在窗口宽度范围左右,那么这样,Unico就可以根据窗口宽度自动分割数据集区间,计算统计特征值了。这也就解释了为啥官方教程中提示的:要注意正确的启动和停止数据日志,必须要start之前动作,动作完成前stop了,这样滑动窗口才不会因此而错位,计算错误的数据。
那这么来看,我前面做的数据集和写的训练方法都是存在问题得了。
于是我重新收集了数据,在一个数据集中多次按照同一动作挥动拍子,这样就收集到了一份新的数据集。(虽然前面写的训练方法是有误的,但是我写的那个小工具还是可以在这个时候,对数据集的前后进行处理的~)
可以看到,采集并且通过处理的数据波形如图所示:
其中包含了25次动作,每个动作占用了70左右的采样次数,那么之后的窗口宽度就可以设置到这个值附近了。
收集好多个动作的数据集后,依次导入到Unico的MLC中
上图中为导入后的样子,其中down是从下向前挥拍,left为从左向前挥拍,up是从上向前挥拍,stand是没动作的时候,那么接下来就可以设置参数了。
在特征参数这里,他的目的是通过所选的特征值来寻找统计出不同动作间的差异,所以特征值参数可以先把能选的都选了,然后用weka统计一遍,最后生成的决策树中会显示只用到了那些特征值,然后再重新设置一遍configuration,这样的目的主要是传感器内存有限,这里特征值选择多了,会占用内存,所以适量就好~
然后点下一步,保存arff文件,并设置下results,官方说明中建议是4的倍数,为了后面的元过滤器,但是我试了1234也是可以的,主要是后面的元过滤器没搞懂他的作用是啥。。
接下来打开刚刚生成arff文件,并按照帖子中的方法来生成决策树即可。
得到决策树的文件:
就可以生成配置文件了
保存了配置文件后,在unico中导入ucf文件,MLC模块就启动成功了。
然后在data界面中就可以看到执行不同动作时的输出效果了~
尽管识别的效率一般,但也是基本实现了MLC识别挥拍动作的功能….
至此,我的项目.....哦 不,左手已经出水泡了。。