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

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

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

3345e106ff515490905b78f95cbf2aa6.png

1.数据收集

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

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

88acf7000794d56b9f6aff923d313a50.png

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

我们将每个动作分为不同的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 

最终结果如下所示:

2db35a74171fb79febb939748ddc99d1.png

可以发现,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的内存,是远远不够的,需要进行内存扩展。此处给出我的老师提供的一种方案:

117028da5769c5517f4de469b504f588.png

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

252a5a120c90d1f099a0e540986f1931.png

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

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

写在最后

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python基础查漏补缺1--算数、字符串与变量

1. math相关函数 函 数描 述ceil(x) 大于或等于x的整数cos(x)  x的余弦 degrees(x)将x的弧度转换为度数exp(x)e的x次方factorial(n)计算n的阶乘(n!),n 必须为整数log(x)以e为底的x的对数log(x,b)以b为底的x的对数pow(x,y)x的y次方radians(s)将x转换为弧度数sin(x)x的正弦…

CSS布局说——可能是最全的

前言 现在,我们被称为前端工程师。然而,早年给我们的称呼却是页面仔。或许是职责越来越大,整体的前端井喷式的发展,使我们只关注了js,而疏远了css和html。 其实,我们可能经常在聊组件化,咋地咋地…

php dingo和jwt,dingo配合laravel、JWT使用

介绍:dingo api包是给laravel和lumen提供的Restful的工具包,它可以与jwt组件一起配合快速的完成用户认证,同时对于数据和运行过程中所产生的异常能够捕获到并且可以做出对应的响应。dingo文档地址:https://github.com/dingo/api/w…

重启开源,分享无限--微软面试187题精选

重启开源,分享无限--诚邀你加入微软面试187题的解题中 前期回顾 我想,只要是稍微浏览过我博客的朋友都知道,本博客内总体上大致分为两个部分的内容:1、算法(如十六个经典算法研究系列);2、面试与…

二三星缩水软件手机版_还在抱怨三星手机不好用?用这些软件立马解决

S10系列上市让三星在国内的销量有所回暖,但是很多小伙伴拿到手机后都在吐槽三星的软件工程师不行,比如手势操作太难用了,不如小米人性化。其实这只是你没找到秘诀而已,三星手机原来还可以这样使用?三星有一个官方软件&…

使用Settings Bundle为程序添加设置项

创建一个Demo来学习一个Setting Bundle为程序存储设置项 Settings Bundle是在自己的程序中建立的一组文件,利用它可以告诉设备中的Settings程序我们写的程序有哪些设置项。用户在Settings程序中设置好相关相关选项后回到我们自己的程序,自己的程序中的对…

Netty自娱自乐之协议栈设计

---恢复内容开始--- 俺工作已经一年又6个月了,想想过的真快,每天写业务,写业务,写业务......。然后就是祈祷着,这次上线不要出现线上bug。继续这每天无聊的增删改查,学习学习一下自己感兴趣的事&#xff0c…

Linux 状态命令之磁盘状态 df du

df df(disk free)命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。获取硬盘被占用了多少空间,目前还剩下多少空间等信息,如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。 默认情…

C++包扩展_利用 MATLAB Coder 将M代码生成C/C++代码

利用MATLAB Coder将MATLAB代码生成C/C代码​mp.weixin.qq.comMATLAB Coder 可以将MATLAB代码生成工程中常用的嵌入式或其他硬件平台的C或者C代码。使用者可以在MATLAB中进行验证,然后将生成后的代码集合到工程中。集合的方式可以是源码,静态库和动态库。…

linux 进程通信机制,linux的进程通信机制小结

linux向应用软件提供下列进程间通信手段:####第一类通信方式:只能用于父进程与子进程之间,或者两个兄递进程之间。>管道Pipe>信号Signal>跟踪Trace管道:由父进程来建立。管道两端的进程各自都将该管道视作一个文件。一个…

看穿面试这件事儿……

报 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。本文地址: http://blog.csdn.net/jobchanceleo/archive/2007/04/17/1568254.aspx 有个朋友Min十几年工作经验&…

阿里云胡晓明:数据智能将为城市生活带来真正价值

8月30日,在2017全球(上海)人工智能创新峰会-世界人工智能城市规划大会上,阿里巴巴集团资深副总裁、阿里云总裁胡晓明作《通往智能之路》主题演讲,指出数据智能将从交通、医疗、城市治理等方面影响城市生活,…

MySQL 之 information_schema

一、information_schema简介 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMA…

【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验

实验现象: 核心代码: module single_port_ram(input CLK_12M,input WR,input RD,input CS0,inout [15:0]DB,input [24:16]A,output FPGA_LEDR,output FPGA_LEDG,output FPGA_LEDB); //----------------------------pll-------------------------------//…

curl post https_Linux命令cURL详解,并实现文件定时上传到ftp服务器的程序

前言前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现。我记得之前做过 一个项目:为高通的iot模组编写FOTA功能:实现模组可以远程下载升级镜像包,实现版本升级功能。并当时使用的一个超级强大的工具cURL。心血来潮&a…

linux系统页面缓存,Linux缓存机制之页缓存

内核采用一种通用的地址空间方案,来建立缓存数据与其来源之间的关联。1) 内存中的页分配到每个地址空间。这些页的内容可以由用户进程或内核本身使用各式各样的方法操作。这些数据表示了缓存中的内容;2) 后备存储器struct backing_dev_info指定了填充地…

十月百度,阿里巴巴,迅雷搜狗最新面试七十题(更新至10.17)

十月百度,阿里巴巴,迅雷搜狗最新面试十一题 引言 当即早已进入10月份,十一过后,招聘,笔试,面试,求职渐趋火热。而在这一系列过程背后浮出的各大IT公司的笔试/面试题则蕴含着诸多思想与设计&…

python threading 结束线程

python threading 启动的线程,并没有提供终止线程的方法,现总结一下在网上找到的方法 1、通过threading.Thread._Thread__stop()结束线程 import time import threading def f():while 1:time.sleep(0.1)print(1)t threading.Thread(targetf) t.start…

快读模板

快速读入字符 inline char readc(){ static char buf[1 << 18], *fs, *ft;return (fs ft && (ft (fs buf) fread(buf, 1, 1 << 18, stdin)), fs ft) ? EOF : *fs; } 快速读入数字 inline int readint(){register char creadc();register int res0;re…

fasttext 文本分类_4种常见的NLP实践思路【特征提取+分类模型】

越来越多的人选择参加算法赛事&#xff0c;为了提升项目实践能力&#xff0c;同时也希望能拿到好的成绩增加履历的丰富度。期望如此美好&#xff0c;现实却是&#xff1a;看完赛题&#xff0c;一点思路都木有。那么&#xff0c;当我们拿到一个算法赛题后&#xff0c;如何破题&a…