人体动作识别(Human activity recognition)是健康领域一个热点问题,它通过加速度计,陀螺仪等传感器记录人体运动数据,对人体动作进行识别。最近用微信小程序做了一个动作识别的项目,同时尝试部署了单片机。首先奉上b站的视频链接,里面详细介绍了项目的思路和代码:https://b23.tv/4VRvff

下面我将这个过程分成以下几部分给大家进行讲解:

1.数据收集

人体动作的数据是通过手机内部自带的六轴传感器收集的,借助于微信小程序的API可以直接调用。

其中蹲起的数据采集页面如下图所示:

右手持手机,点击“开始读取”后,开始做深蹲,加速度轴和陀螺仪的实时数据会在数据框内显示。做完动作后点击存储,会将采集的数据上传到微信自带的云数据库,并且关闭加速度计和陀螺仪。

我们将每个动作分为不同的document,每个实验者作为一个record,在数据库中进行存储。每条record由六个轴的六个数组、时间戳数组和用户的其他信息组成,数组长度约为采样频率f*采样总时间,大约是700。

将数据导出成JSON或csv文件之后便可以开始信号处理了。

2.信号处理

2.1滤波

本部分中的信号处理是通过python中的signal包来完成。

将csv文件导入到python中,将数组长度统一为700。首先我们可以先直观地感受一下数据:

plt

展示出六个轴的数据,可以看出某些轴的数据是有明显的周期性的,但是噪声较多,需要进行滤波处理。

首先使用中值滤波器,这可以通过signal包中的medfilt函数来完成:

#中值滤波

然后是巴特沃斯滤波器,同样是使用signal包中的函数来完成:

# butterworth滤波器

2.2数据切割

数据经过滤波之后在图像上的体现是变得更加平滑,滤掉了高频的噪音,此时我们将数据进行切割:设定一个时间窗口,以及一个overlap的比例,将数据切分成许多小段。这样就增加了样本的数量,满足机器学习需要的数据量。

2.3特征提取

注意,通过微信小程序提取的数据为时间序列,本身不能作为输入直接喂给机器学习模型,而是需要从中提取一些特征,作为输入向量。此处我们首先将数据进行了快速傅里叶变换,计算功率谱密度、自相关函数,在此基础上得到了时间序列的特征向量。将以上功能封装到一个函数中:

def 

当我们将时域数据转换到频域数据上之后,便可以提取特征,使用分类器进行建模。提取特征的常用方法可以是信号的频率分量以及在此分量上的振幅。

3.模型构建

数据的处理工作完成之后就要开始机器学习的核心部分:模型训练了。此处我们用python强大的机器学习第三方包:sklearn来完成这一部分的工作。

3.1模型选择

机器学习模型众多,如何选择一个适合自己的呢?在此我们选择了一些常用的机器学习模型,查看它们在此数据集上的表现。

首先构建一个装有模型的字典:

dict_classifiers 

然后,我们可以在此字典和每个分类器上迭代:

  • 训练分类器.fit(X_train, Y_train)
  • 评估分类器在训练集中的性能.score(X_train, Y_train)
  • 评估分类器在测试集上的性能.score(X_test, Y_test)
  • 记录训练分类器所需的时间。
  • 将训练模型、训练分数、测试分数和训练时间保存到字典中。如有必要,此字典可以使用 Python 的pickle模块保存。
def 

最终结果如下所示:

可以发现,Gradient Boosting算法效果是最好的,同时训练时间也最长,高达88秒;表现最不好的是SVM;训练时间最短的是Native Bayes。

通过模型的训练与对比,结合我们自身的需求,选择最为合适的模型进行参数调优。考虑到本项目后期需要部署JS,因此需要在算法的复杂程度和准确率之间取舍,此处我选择MLP(多层神经网络)作为最终的模型。

3.2超参数调优

当选择好合适的模型之后,我们就需要调整模型的参数,使其表现的最好,这就是超参数调优。MLP模型的参数主要有:激活函数、学习率

、隐藏层数、隐藏层神经元个数。通过循环遍历的方式进行超参数调优:
MLP_params

可以看出,当激活函数relu,alpha=1,隐藏层神经元个数为100时,MLP模型表现是最好的;同时relu函数运算较快,100个神经元大小适中,用来部署JS较为合适。

模型训练好后,用sklearn自带的函数输出权重矩阵和偏置向量,保存到csv文件中,便于后续模型的部署。

对于大部分的机器学习教程而言,模型训练完之后就算是万事大吉了,但我们的目标是最终做出一个能用于实际生活的小程序,因此还需要进行模型的部署。

4.模型部署

4.1小程序部署

我们将上面保存好的csv文件复制到小程序的js里,对六轴到的数据进行计算。通过几次实验发现,由于安卓系统传感器采集数据的频率较低,因此滤波对本数据集的影响不大。同时因为时间前后的相关性,不对序列进行特征提取,直接将序列喂给模型也能达到同样的准确率。

每隔2秒钟对数据进行一次分类,js代码就是根据MLP的原理进行矩阵的乘法,此处不再赘述。

4.2单片机部署

由于近些年来手环的兴起,因此我也尝试部署了单片机。这里模型比较庞大,即便是功能强大的STC8A8K系列的单片机也只有64KB的内存,是远远不够的,需要进行内存扩展。此处给出我的老师提供的一种方案:

按照上述方案,我使用了洞洞板+单片机的方式进行了连接,洞洞板上是内存扩展芯片,另一块板子是做其他项目时用到的,这里只用到了它的单片机:

十分凌乱,大家实验没问题之后还是用PCB打样吧。。。

最终我通过离线的方式,测试准确率达到了70%,实现了单片机的部署。

写在最后

本文从零开始实现了一个能够落地的人工智能项目,同时部署到小程序端可以实现离线识别,摆脱了对网络的依赖。

非常感谢大家的耐心阅读,我也是一名正在学习中的大二学生,所写内容如有不当之处欢迎大家批评指正。

简单的机器学习程序_人体动作识别小程序【机器学习 人工智能】相关推荐

  1. 简单的机器学习程序_自闭症应用场景下利用机器学习和深度学习方法进行情绪识别,并在小程序中查询识别结果...

    注:实现本文Python代码需要的包:opencv.numpy.matplotlib.sklearn.os,Python版本为Python3.7 为了使每段代码效果更直观,本文将会以类似jupyter ...

  2. java kinect 人体识别_基于kinect的人体动作识别系统

    [实例简介] 基于kinect v2的人体动作识别,配套博客(http://blog.csdn.net/baolinq/article/),基于mfc,可以识别左移右移.上蹦下跳等,也可以自己自定义其 ...

  3. 基于3D关节点的人体动作识别综述(转)

    原文:2016,Pattern Recognition: 3D skeleton-based human action classification: A survey 摘要 近年来,基于深度序列的人 ...

  4. 基于kinect的人体动作识别系统

    基于kinect的人体动作识别系统(算法和代码都放出) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect ...

  5. 基于kinect的人体动作识别系统(算法和代码都放出)

    基于kinect的人体动作识别系统(算法和代码都放出) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect ...

  6. 使用OpenVINO实现人体动作识别

    Paula Ramos著   张晶 译 目录 1.1 人体动作识别背景简介 1.2 OpenVINOTM Notebook简介 1.3 动作识别模型简介 1.4 实现实时动作识别 1.4.1 下载模型 ...

  7. 人体动作识别与评价——区别、联系及研究进展

    摘要 人体动作识别与动作评价是近年来的热点研究问题.两者在数据类型.数据处理.特征描述等方面有许多相通之处.近年来,随着应用需求的显著增长,出现了大量有关动作识别与评价的研究工作,但两者间的区别与联系 ...

  8. 阿旭机器学习实战【2】KNN算法进行人体动作识别

    本系列文章为机器学习实战内容,旨在通过实战的方式学习各种机器学习算法的知识,更易于掌握和学习,更过干货内容持续更新- 目录 人类动作识别问题描述 导入相关数据并查看数据信息 构建KNN算法模型并查看准 ...

  9. 空间注意力机制sam_一种基于注意力机制的神经网络的人体动作识别方法与流程...

    本发明属于计算机视觉领域,具体来说是一种基于注意力机制的神经网络的人体动作识别的方法. 背景技术: 人体动作识别,具有着非常广阔的应用前景,如人机交互,视频监控.视频理解等方面.按目前的主流方法,可主 ...

最新文章

  1. 《互联网人求职图鉴》:这类人才“最吃香”,最高薪编程语言出炉!
  2. cocos2d-x 3.1.1 学习笔记[15] Shader 著色器
  3. 七段液晶数字识别-处理程序
  4. NXP I.MX6ULL 交叉编译工具链下载地址?
  5. JDK自带VM分析工具jps,jstat,jmap,jconsole
  6. android mvp模式
  7. VC6.0常见英文错误对照表
  8. 工具类集和_gblfy版本
  9. linux内核start_kernel分析
  10. [leetcode]84. Largest Rectangle in Histogram c语言
  11. 视频编解码(十四):机顶盒调试编解码器显示总结
  12. 以淘宝网为例,解析大型Java项目架构演进
  13. cdr添加节点快捷键_CorelDRAW常用热键|cdr快捷键大全
  14. box-sizing概述
  15. linux传输系统架构,Linux后端程序成长关键技术——底层体系结构
  16. 【转载】《周一清晨的领导课》读书笔记!!!
  17. 微信视频号下载短视频的步骤
  18. 一级建造师能挂靠到三级资质的企业吗?
  19. 不负春光 清风徐徐入手心 一寸光阴一寸金
  20. robot_marm catkin_make报错

热门文章

  1. c++面向对象高级编程 学习十四 引用
  2. 用面粉和醋洗头 让你的头发黑亮又浓密
  3. Linux 内核调试器 调试指南
  4. 解决:Exception in thread main java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExe
  5. 石牌村中的美好 ...
  6. Java实现Excel导入数据库,数据库中的数据导入到Excel
  7. 模拟真实环境之内网漫游
  8. oracle orion hugepages_settings.sh(支持OEL 7,4.1内核)
  9. 杭电多校 Harvest of Apples 莫队
  10. May 18:PHP 输出语句