数字信号 fft c源码_如何制作一个简单的人体动态识别微信小程序(附源码)
知乎小白第一次写专栏,还请多指教。
先放成果。
GitHub源码:
lrioxh/HAR-applet-of-Wechatgithub.com
b站演示视频:
居然不需要服务器?!如何制作一个简单的人体动态识别微信小程序www.bilibili.com
再放一个重要参考博客(关于滤波与特征提取):
Machine Learning with Signal Processing Techniquesataspinar.com
前言
人体动态识别(Human Activity Recognition)简称HAR,在人机交互等诸多领域有着不错的应用前景。本文简要阐述了从零开始搭建一个HAR小程序的过程,采用小程序的加速度和陀螺仪API采集数据,用python进行数据处理和有监督学习分类器训练,再将训练好的模型部署到小程序,实现动作识别及播报,并用波峰检测进行动作计数。
过程可大致分4步:
1.数据采集
要进行有监督学习,首先就要有数据集。在这里用小程序进行数据采集。笔者选择了静止、臂绕环、踏步、扩胸、开合跳五种动作。(但静止并没有进入后期的训练过程。)被采集者需右手正持手机,单次采集开始后,在倒计时一定时间内持续做选定的某一动作。小程序采集完六轴(加速度和陀螺仪)数据后与动作标签一并上传至云开发数据库。不同动作重复采集若干次。完成后再将数据集下载为csv。
需要注意的是,尽管小程序提供了50Hz的六轴采样率,但实际效果通常在20Hz左右或更低,故这里直接选择20Hz采样率。ps据说iOS设备可达到50Hz,奈何家中并不存在iOS。
另外,还可考虑添加身高、性别等特征,可自行尝试。
2.信号处理与可视化
这部分主要用python进行。用到了numpy,pandas,scipy,detecta,matplotlib.pyplot模块。
- 数据预处理
预处理包括滤波和加窗两步。
滤波首先对六轴六维原信号分别中值滤波,然后再对加速度三轴进行巴特沃斯低通滤波。其中低通滤波用于滤出重力信号,因为加速度三轴中的低频部分可以认为是重力的分量。值得注意的是,对于普遍用到的50Hz数据集,还需要再加一个低通滤波器用于滤出20Hz以下的信号,因为研究表明[1]99%的人体动作能量都在15Hz以下。但由于前文所述,采样率已经为20Hz,故不需要20Hz的低通滤波。
滤波后得到了九维(三轴加速度,三轴重力,三轴陀螺仪)的时间序列。
加窗就是为了将时间序列转化为用于有监督学习训练的数据集,与时间序列不同,其每行之间是无序的。笔者采用了2s的固定窗口和50%的overlap,因为考虑到人的步频通常不小于1.5步/s[2]即1.33秒一周期(两步)而一个窗口至少要捕捉一个动作周期。
加窗后数据为
- 特征提取
特征提取有很多选择,如在开篇贴的博客中使用的:将信号分别 fft,psd,auto-correlation 变换后,取每种变换的前5个峰值的x(频率)和y(对应幅值),最终提取为9*3*5*2=270维。(实际上20Hz情况下其中很多项为0。)或者可以用加窗后的数据结合mean、max(振幅)、平方和(能量)、自/互相关、波峰数等特征(参考链接)。甚至不进行特征提取,直接用加窗后的数据进行训练也是一种选择。可以根据测试集或实际实验效果进行取舍。
- 可视化
可视化主要是为了找合适的维度进行动作的波峰计数,如图中Gyro的z-component,波峰较显著且周期明显,则考虑将其作为计数的信号源。
同时通过对比不同动作的波形也能看出,频率、能量、振幅等特征可以较好地分辨不同动作。
3.分类器训练与对比
机器学习有很多经典的分类器,如随机森林,SVM,贝叶斯等等,利用sklearn模块即可轻松地训练并对比这些模型。而且很多模型的分类逻辑十分简单(不是训练逻辑),如随机森林即条件判断和投票,贝叶斯就是计算概率。因而得到训练后的模型可以转写为js代码,直接在小程序中使用。
下表为笔者对三种分类器的对比结果,不过由于数据集较小,可能不具有代表性。
SVM: precision recall f1-score support0 1.00 0.90 0.95 201 0.76 1.00 0.86 192 1.00 0.94 0.97 183 1.00 0.82 0.90 17
weighted avg 0.94 0.92 0.92 74RF:precision recall f1-score support0 1.00 1.00 1.00 191 0.90 1.00 0.95 182 1.00 0.88 0.94 173 1.00 1.00 1.00 16
weighted avg 0.97 0.97 0.97 70Bayes:precision recall f1-score support0 1.00 1.00 1.00 201 0.86 1.00 0.93 192 1.00 0.89 0.94 183 0.94 0.88 0.91 17
weighted avg 0.95 0.95 0.95 74
4.完成识别小程序
核心逻辑是从开始识别的第二秒起,每隔1s取出小程序当前缓存中向前2s的六轴数据,进行滤波和特征提取,再输入分类器分类,并在识别到动作改变时播报当前动作。识别完成后再根据动作分类的标签,对每2s的陀螺仪z轴进行波峰计数,累加后除以二作为该动作的计数。最后再将识别及计数结果上传至云开发数据库。
其中关于滤波器有一个很好用的工具:
数字录波器在线设计www-users.cs.york.ac.uk
将设计好的c语言滤波器转写为js即可在小程序中使用,当然万能的matlab也可以实现类似的功能。
至此,用于人体动态识别的微信小程序便做好了。笔者制作项目全部代码已上传GitHub,成品并不完美,存在如训练集较小,ui不美观,iOS未适配等问题有待改进。
最后,知乎求赞同,GitHub求star,b站求赞 (*^_^*)TZ
参考
- ^Davide Anguita, Alessandro Ghio, Luca Oneto, Xavier Parra and Jorge L. Reyes-Ortiz. A Public Domain Dataset for Human Activity Recognition Using Smartphones, ESANN 2013
- ^C. BenAbdelkader, R. Cutler, and L. Davis. Stride and cadence as a biometric in automatic person identification and verification. In Proceedings of the Fifth IEEE International Conference on Automatic Face and Gesture Recognition, pages 372–377, 2002.
数字信号 fft c源码_如何制作一个简单的人体动态识别微信小程序(附源码)相关推荐
- 600多个微信小程序源码_点餐系统的开发,java后台+微信小程序 实现完整的餐厅点餐系统。微信扫码点餐小程序源码讲解...
今天来给大家讲解一个完整的微信扫码点餐项目.java后台+微信小程序实现点餐系统. 后台技术选型: JDK8 MySQL(需要5.6以上) Spring-boot Spring-data-jpa Lo ...
- App识别微信小程序二维码、太阳码调研
需求:App跳转到微信小程序 在App内部,除了直接链接外,通过长按识别小程序码跳转到小程序指定页面 问题: 1,小程序二维码,链接数据经过特殊加密,无法直接通过链接打开小程序指定页面. 2,小程序太 ...
- 检讨书生成微信小程序工具源码-拥有流量主安装搭建简单
对于经常写检讨的小伙伴来说,福音来了 因为这是一款检讨书生成小程序 所以再也不用为了写检讨而烦恼了哦 支持自定义字数下线,主题自定义 支持多种类型检讨比如:学生党的,男朋友,领导演讲稿,共青团申请书等 ...
- 小程序如何关联微信小程序二维码,实现二码聚合
相信大家在停车场遇到过这样的场景,在停车场入场和出场时,不管我们是用微信还是支付宝,只需台扫同一个二维码,自动识别打开各端小程序,并带入参数停车场id和通道id. 这种方式一般统称为二维码聚合或者说是 ...
- thinkphp三级分销小程序源码_山东谷道微信小程序商城源码带后台 公众号平台三级分销系统...
山东谷道微信小程序商城源码带后台 公众号平台三级分销系统 那么微信二级分销系统与微信三级分销系统到底有什么区别和联系呢?为什么改了个数字地位就天差地别? 1.微信分销模式等级的区别 用简洁的话来说,微 ...
- 小程序源码 租房管理系统_微信小程序-租房源码
[实例简介] 微信小程序实例-微信小程序源码,无论学习还是二次开发必备,微信小程序(wei xin xiao cheng xu),简称小程序,英文名Mini Program,是一种不需要下载安装即可使 ...
- 关于美团:零基础搭建获利的美团饿了么优惠券CPS小程序附源码
关于美团:零基础搭建获利的美团饿了么优惠券CPS小程序附源码 下面是无裂变版本的搭建教程. 源码地址:http://y.mybei.cn 部署步骤 部署后台,填资料 登录后台 http://q.myb ...
- 云开发校园微社区微信小程序源码/二手交易/兼职交友微信小程序开源源码
介绍: 云开发校园微社区微信小程序开源源码,这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码,可以给你提供快捷方便的校园生活,有很多有趣实用的板块和功能,如:闲置交易.表白交友. ...
- 微信小程序实例源码大全demo下载
怎么本地测试微信小程序实例源码 1.下载源码 2.打开微信开发者工具 3.添加项目->选择本项目目录->编译执行 微信小程序实例源码大全 微信小程序游戏类demo:识色:从相似颜色中挑选不 ...
最新文章
- pandas使用read_csv函数读取文件最后N行数据并保留表头、pandas使用read_csv函数读取网络url链接数据
- 通过javascript把图片转化为字符画
- 错误:android.util.SuperNotCalledException
- 4.帧循环(游戏主循环),schedule
- Go学习笔记—Go并发基础
- [IT业界] 网盘纷纷停止服务,下一个是谁?
- 今天高考,讲几句大实话
- 优先队列实现原理分析
- python词频统计并按词频排序
- 鼠标使用板载内存和使用计算机上,【罗技G5鼠标评测】板载内存 没有驱动也能自定义-中关村在线...
- 服务器2019添加虚拟机,Hyper-V安装Server 2019虚拟机图文教程
- 你缺的不是一个“大牛” 而是一个透视宝
- javaweb招聘管理系统的设计与实现
- 数据链路层---差错检测和纠正
- 智能聊天机器人之图灵机器人
- asp.net分页查询
- 1、标杆对照 《数据收集工具与技术》
- 敬业福朋友有你也可以有 区块链做到有福同享
- python基础语法复习[二] 函数、类
- JAVA-LocalDateTime时间格式化,转换时间戳和源码分析
热门文章
- MQTT基本应用(Mosquitto+Eclipse Paho)
- jquery和javascript屏蔽右键菜单及阻止事件冒泡
- 实践 + 理论 | API 接口安全性设计
- es6 为什么修饰器不能用于函数
- java 怎么链接ndk的库_使用ndk-build链接现有的静态库
- sqlite3存储与读写
- adfs服务器获取信息失败,在ADFS服务器上SAML LogOutRequest处理失败
- 台式计算机M丅BF是什么,中南民族大学计算机系统结构试卷
- 计算机网络第4版潘爱民_王道考研 计算机网络(2)学习笔记
- php 微信实时更新,微信小程序修改data使页面数据实时更新的代码示例