项目来源于我们的“实验设计与统计基础”课程的大作业。
主要实现目的是
用微信小程序实现至少四个HIIT动作的识别和计数。
话不多少,先
奉上视频(视频里已经包括了
如何使用以及整个的实现过程,如果看完之后还想了解详细内容可以继续看下面的文字)
知乎视频www.zhihu.com
----------------------------------------分割线------------------------------------------------
项目是从零开始的,也就是说预先我们没有数据(
数据是自己用微信小程序进行采集的)。
本项目功能:用微信小程序实现HIIT动作(深蹲、开合跳、高抬腿、滑雪跳)的识别与计数,可将数据存储进云数据库。
具体使用方法:- 进入小程序。点击“姿态识别”,进入“个人信息填写”页面,测试者可以填写姓名、年龄、身高、体重、测试环境等信息,以便于更好地在数据库中进行记录。
- 信息填写完毕后,进入“姿态识别”界面。
- 点击“开始识别”按钮后,开始进行姿态识别。说明:点击“开始识别”按钮后,会听到一段提示音——“3,12,1开始”提示音结束后开始做动作,一直做到听到语音播报,之后再进行下一个动作。
- 30s 时间到后,会响起“时间到,识别结束”提示音,此时识别结束。界面显示每个动作的个数。
- 点击“存储数据”,会将个人填写的信息以及识别的动作及个数存入数据库对应的集合——“accelerometer”中。
:使用手机三轴传感器;
模型搭建:以BP神经网络为基础,使用python进行训练,最终训练准确率为97%;
微信小程序实现:JS重写模型结构,实现HIIT动作的离线识别。
一、数据收集
利用微信小程序,使用手机自带的加速度传感器,采集10s 动作数据,每个动作重复采集50次。
小程序的数据采集页面:squat、jumpingJack、highStep、skiJump
1.小程序使用方法
- 点击“开始读取”,程序开始计时,进度条进入10s 进程。使用者开始重复做对应的动作。
- 10s 时间到时,手机会发出“滴滴——”声进行提示。
- 点击“存储数据”,对应动作10s 内采集的数据会被存入对应名称的collection里面。
2.JS页面代码讲解
四个采集页面的代码类似,下面以 squat 页面为例进行介绍。
1)调用手机的加速度传感器
//在 onload 函数里 打开加速度传感器监听
2)存储采集的数据到云数据库
//配置云数据库以及存储到的collection
3)“时间到”声音的配置
//配置音频
二、数据处理与模型训练
将存储进云数据库的四个动作的数据导出为“csv”格式文件。使用python进行数据处理和模型训练。
1.数据处理
1)数据预处理思路
参考文献:
[WISDM:Cell Phone-Based Biometric Identification]www.cis.fordham.edu
基于原始加速度计读数,总共生成了40个维度的feature。下面介绍这40个要素,并在方括号中注明了每种要素类型生成的要素数量:
- 平均值[3] :平均加速度值(每个轴)
- 标准偏差[3] :标准偏差(每个轴)
- 平均绝对差[3] :在200个读数中,每个绝对值之间的平均绝对差 ED和这200个值的平均值(每个轴)
- 平均结果加速度[1] :ED的每个轴上值的平方和的平方根为√(xi2 + yi2 + zi2 )
- Bined Distribution [30] :我们确定每个轴的值范围(最大-最小),除以将该范围分为10个大小相等的容器,然后记录落入每个容器中的200个值的分数。
2)数据预处理部分的python代码讲解
①导入必要的包
#导入必要的包
②加载csv数据,并将每行的数据转化为一个数组
# Load a CSV file
③将数据转化为40个feature
#平均值
③将数据进行处理,转化为40个feature,并存储为一个新的csv文件
output
2.模型训练
使用BP神经网络对模型进行训练,目的是输出训练好的神经网络,
可以直接用在小程序“姿态识别”界面的的JS页面中,当做一个参数来做离线识别。1)数据标准化
①导入必要的包
import
②加载CSV文件,并将数据转化成浮点数,标签值转化为整数
# Load a CSV file
③获取每一维数据的最大最小值,进行数据的标准化处理,将标准化后的数据存储为一个新的CSV文件
注:每一维数据的最大最小值需要存储下来,以便于后期可以直接用在小程序“姿态识别”界面的的JS页面中,当做一个参数来对实时收集的三轴加速度进行标准化处理。
# Find the min and max values for each column
④运行程序
# Test Backprop on Seeds dataset
得到的最大最小值集合(minmax_set)为: minmax_set
2)BP神经网络 模型训练
①导入必要的包
import
②模型训练
# Initialize a network
学习率为0.05,循环500次,选取隐藏层14个进行训练 :
error下降至:0.060
network为:
network
③模型准确率验证
采用十倍交叉验证法对该模型的准确率进行验证,可以看到效果是非常好的。
三、小程序实现动作识别与计数
利用微信小程序,使用手机自带的加速度传感器,在30s 内随机做上述四个动作,小程序会自动进行识别并进行识别动作的语音播报;30s 结束后,小程序页面显示每个动作的个数,并可以将数据存入云数据库。
小程序的姿态识别页面:recog
1.小程序使用方法
- 点击“姿态识别”,进入“个人信息填写”页面,测试者可以填写姓名、年龄、身高、体重、测试环境等信息,以便于更好地在数据库中进行记录。
- 信息填写完毕后,进入“姿态识别”界面。
- 点击“开始识别”按钮后,开始进行姿态识别。
说明:
点击“开始识别”按钮后,会听到一段提示音——“3,12,1开始”
提示音结束后开始做动作,一直做到听到语音播报,之后再进行下一个动作。
- 30s 时间到后,会响起“时间到,识别结束”提示音,此时识别结束。界面显示每个动作的个数。
- 点击“存储数据”,会将个人填写的信息以及识别的动作及个数存入数据库“accelerometer”中。
2.JS页面代码讲解
1)数据准备
放入预先在python中训练得到的 minmax_set 和 network
2)手机三轴加速度计的调用
打开和停止加速度传感器监听代码 同上。
//设置一个定时器,每6s打开一次加速度计的监听
3)提示音配置
同上。
4)动作识别——Judgement、Try、Predict函数
主要思路为将python模型训练中的“数据标准化”部分代码进行JS重写,使其能在小程序中直接运行。
Judgement
5)动作计数——count函数
采用差分法选择峰值,利用峰值进行动作计数。
//传入参数(原始的三轴加速度数据)
整体的介绍就这么多,主要的实现代码也都在上面列出。
附上github链接:https://github.com/Liu-Rundi-SDUWH/HIIT_HAR
请大家不吝赐教。