[ML]Human Activity Recognition人体
1. 数据集
UCI: Human Activity Recognition Using Smartphones Data Set
手机传感器陀螺仪数据,数据集.
本例的数据来源于UCI(即UC Irvine,加州大学欧文分校)。数据由年龄在19-48岁之间的30位志愿者,智能手机固定于他们的腰部,执行六项动作,即行走、上楼梯、下楼梯、坐、站立、躺下,同时在手机中存储传感器(加速度传感器和陀螺仪)的三维(XYZ轴)数据。传感器的频率被设置为50HZ(即每秒50次记录)。对于所输出传感器的维度数据,进行噪声过滤(Noise Filter),以2.56秒的固定窗口滑动,同时窗口之间包含50%的重叠,即每个窗口的数据维度是128(2.56*50)维,根据不同的运动类别,将数据进行标注。传感器含有三类:身体(Body)的加速度传感器、整体(Total)的加速度传感器、陀螺仪。
公开数据集整理 (Public datasets for activity recognition)
非常详细的一个行为识别相关的数据集集合,包括描述与下载地址,以及引用该数据集的文章等,如果需要数据集先从这里扫一扫看看有没需要的。
2. 人体动作识别 (HAR) - 基于视频
2.1 人体动作识别架构图
Human Activity Recognition:
- Single-layered approaches
- Spatical-temporal approaches
- Spatial-temporal volume
- Trajectories
- Spatial-temporal features
- Sequential approaches
- Exemplar-based
- State-based
- Spatical-temporal approaches
- Hierarchal approaches
- Statistical
- Syntactic
- Description-based
源自2011年 Aggarwal and Ryoo的建议。相对来说,已经很老旧了,仅供了解参考
另,本来有个架构图的,简书的图片上传功能瓦特了, 只能简单手写了。
2.2 目标跟踪
目标跟踪综述
视觉目标(单目标)跟踪任务就是在给定某视频序列初始帧的目标大小与位置的情况下,预测后续帧中该目标的大小与位置。这一基本任务流程可以按如下的框架划分:
输入初始化目标框,在下一帧中产生众多候选框(Motion Model),提取这些候选框的特征(Feature Extractor),然后对这些候选框评分(Observation Model),最后在这些评分中找一个得分最高的候选框作为预测的目标(Prediction A),或者对多个预测值进行融合(Ensemble)得到更优的预测目标...
Polen: 最全面的一篇视觉跟踪的综述,虽然很多是参照其他文章的,但是整个视觉跟踪的前因后果,发展历程都有涉及,很详细,很全面
机器之心:从传统方法到深度学习,目标跟踪方法的发展概述,陈正华,清华
目标跟踪是计算机视觉研究领域的热点之一,过去几十年以来,目标跟踪的研究取得了长足的发展。从 Meanshift、粒子滤波(Particle Filter)和 Kalman Filter 等经典跟踪方法,到基于检测(Track By Detection)或相关滤波(Correlation Filter)的方法,到最近三年来出现的深度学习相关方法。每年在几个主要跟踪数据集上的竞赛非常激烈,方法也越来越多。本期阅面科技资深研究员陈正华将以「目标跟踪方法的发展概述」为主题给大家分享更多的内容。
-
通用目标的跟踪
-
经典目标跟踪方法(产生式模型的方法)
2010 年以前,目标跟踪领域大部分采用一些经典的跟踪方法,比如 Meanshift、Particle Filter 和 Kalman Filter,以及基于特征点的光流算法等。在深度学习和相关滤波的跟踪方法出现后,经典的跟踪方法都被舍弃,这主要是因为这些经典方法无法处理和适应复杂的跟踪变化,它们的鲁棒性和准确度都被前沿的算法所超越。 -
检测与跟踪相结合的方法(基于鉴别式模型的方法)
而基于鉴别式模型的方法是指利用分类来做跟踪的方法,即把跟踪的目标作为前景,利用在线学习或离线训练的检测器来区分前景目标和背景,从而得到前景目标的位置。虽然此时通用物体的检测率还非常低(ImageNet 的检测率不超过 20%),因为物体检测主要基于手工设计的特征,但是,通过在新更新检测器的模型和各种底层特征的提出,鉴别式跟踪方法更能适应跟踪过程中的复杂变化,所以利用检测来做跟踪(Tracking By Detection)逐渐成为主流。- Surrey 大学博士生 Z.Kalal 提出的一种长效跟踪的 TLD(Tracking-Learning-Detection)方法
- 2013年VOT竞赛的冠军 Struck,利用结构化 SVM 方法在线学习的一个分类器
- 2014年VOT竞赛的冠军 DSST,一种改进的基于相关滤波的多尺度跟踪方法
-
基于相关滤波的跟踪算法
- 2012 年 P.Martins 提出的 CSK 方法(一种基于循环矩阵的核跟踪方法,并且从数学上完美解决了密集采样(Dense Sampling)的问题,利用傅立叶变换快速实现了检测的过程)
- 基于 HOG 特征的 KCF 方法
- 考虑多尺度或颜色特征(Color Name 表)的方法
-
基于深度学习的跟踪方法
- GOTURN 方法利用 ALOV300+视频序列集和 ImageNet 检测数据集训练了一个基于图像对输入的卷积网络,输出在搜索区域内相对于上一帧位置的变化,从而得到目标在当前帧上的位置
- 牛津大学的 Luca Bertinetto 提出的端到端的跟踪框架,从 SiameseFC 到今年的 CFNet
-
-
特定目标的跟踪
特定物体的跟踪与前面介绍的方法不同,它更多地依赖对物体训练特定的检测器。人脸跟踪由于它的明显特征,它的跟踪就主要由检测来实现,比如早期的 Viola-Jones 检测框架和当前利用深度学习的人脸检测或人脸特征点检测模型。手势跟踪在应用主要集中在跟踪特定的手型,比如跟踪手掌或者拳头。设定特定的手型可以方便地训练手掌或拳头的检测器。
2.3 HAR + 机器学习
CNN: Deep Learning for Human Activity Recognition,2018
源码: Github
数据集:UCI: Human Activity Recognition Using Smartphones Data Set
简单使用cnn实现了对UCI数据集的分析, 基于Tensorflow and Pytorch.
That dataset contains 9 channels of the inputs: (acc_body, acc_total and acc_gyro) on x-y-z. So the input channel is 9.
Dataset providers have clipped the dataset using sliding window, so every 128 in .txt can be considered as an input. In real life, you need to first clipped the input using sliding window.
So in the end, we reformatted the inputs from 9 inputs files to 1 file, the shape of that file is [n_sample,128,9], that is, every windows has 9 channels with each channel has length 128. When feeding it to Tensorflow, it has to be reshaped to [n_sample,9,1,128] as we expect there is 128 X 1 signals for every channel.
知乎:基于深度学习的人体动作识别算法总结,桑燊
文章主要列出了一些相关的数据集以及深度学习的方法包括基于无监督学习的行为识别、基于卷积神经网络的行为识别、基于循环神经网络以及一些拓展模型的方法。当然,这里面提到的很多模型都不是最新的技术,还有很多最新的模型和技术都没有包含进来。
本文首先提出一共17个人体姿态识别相关的数据集及其链接,然后给出9个深度学习在人体姿态识别领域的应用模型,包括其论文提出的思路、模型结构、实验数据集和使用的加速硬件(如果有的话),本文不提供相关的实现方法。
-
基于无监督学习的行为识别
-
Learning hierarchical invariant spatio-temporal features for action recognition with independent subspace analysis. In: Proceedings of the 2011 IEEE
原来在动作识别领域所使用的方法一般都是人工选取的特征。本篇文章的工作就是使用了一种无监督的学习方法自动地从视频中学习特征。所使用到的方法是Independent Subspace Analysis(ISA)。文章中对该算法进行了一些改进,主要是使用了stacking和卷积两种方法,使模型能够对分层特征进行更好的学习。
-
Learning hierarchical invariant spatio-temporal features for action recognition with independent subspace analysis. In: Proceedings of the 2011 IEEE
-
基于卷积神经网络的行为识别
-
P-CNN: pose-based CNN features for action recognition
将传统的CNN拓展到具有时间信息的3D-CNN,在视频数据的时间维度和空间维度上进行特征计算,在卷积过程中的特征图与多个连续帧中的数据进行连接。简单来说,3D-CNN就是将连续的视频帧看作一个盒子,使用一个三维的卷积核进行卷积,通过这种结构,就能捕获动作信息,使用7帧[公式]大小帧序列作为输入,第一层为硬编码的卷积核,然后进行两次卷积和下采样,最后得到一个128维的特征集合。 -
Two-stream convolutional networks for action recognition in videos
提出一种称为P-CNN的模型,使用单帧数据和光流数据,从而捕获运动信息。
首先,要对视频序列计算光流数据并且存储为图片的形式,对于给定的视频信息和相对应的骨骼位置,将RGB图片和光流图片分割为5类(左手、右手、上部分身体、下部分身体和整张图片),将其大小均初始化为[公式],然后使用两个不同的卷积网络,每个网络都含有5个卷积层和3个全连层,然后通过聚合和归一化,最后整合为一个P-CNN的特征集合,最后使用线性SVM进行训练。 -
Large-scale video classification with convolutional neural networks
提出一种称为Long-term Temporal Convolutions(LTC-CNN)的网络,在定长时间的视频内使用三维的CNN。
相比于其他的将视频切分为短时间的序列,该模型最大限度的保留了视频的时空信息,网络有5个时空卷积层和3个全连层,对于每个时空卷积核尺寸都为[公式],都采用ReLU函数和最大值池化层(max pooling,除了第一层为[公式],其他尺寸均为 [公式]),并且在卷积时采用1像素的边缘填充。
-
P-CNN: pose-based CNN features for action recognition
- 循环神经网络及扩展模型
-
Beyond short snippets: deep networks for video classification, 对应有个PPT
使用在imageNet上预训练过的CNN(AlexNet或者GoogleLeNet)提取帧级特征,再将帧级特征和提取到的光流特征输入到池化框架或者LSTM进行训练,得到分类结果。 就是说使用LSTM对视频进行建模,LSTM将底层CNN的输出连接起来作为下一时刻的输入,在UCF101数据库上获得了82.6% 的识别率。主要贡献:- 提出采用CNN来得到视频级的全局描述,并且证明增大帧数能够显著提高分类性能。
- 通过在时序上共享参数,参数的数量在特征聚合和LSTM架构中都作为视频长度的函数保持不变。
- 证明了光流图像能够提升分类性能并用实验结果说明即使在光流图像本身存在大量噪声的情况下(如在Sports-1M数据集中),与LSTM结合后仍然对分类有很大帮助
-
Long-term recurrent convolutional networks for visual recognition and description
提出了长时递归卷积神经网络(Long-term recurrent convolutional network,LRCN),这个网络将CNN和LSTM结合在一起对视频数据进行特征提取,单帧的图像信息通过CNN获取特征,然后将CNN的输出按时间顺序通过LSTM,这样最终将视频数据在空间和时间维度上进行特征表征,在UCF101数据库上得到了82.92% 的平均识别率。
该模型将卷积神经网络和LSTM相结合,输入可以是一个单独的图片或者是一个视频的一帧,将该输入进行死绝特征提取,可以得到一个用来表示数据特征的定长向量,然后将其输入到LSTM中学习到其中时间相关的信息,最后做出预测。
该模型的特点是可以根据不同的输入实现不同的的任务:- 动作识别:序列输入,固定输出
- 图片描述:固定输入,序列输出
- 视频描述:输入和输入均是序列
-
NTU RGB+D: A Large Scale Dataset for 3D Human Activity Analysis
提出一种称为Part-Aware LSTM的模型,该模型主要是在针对使用Kinect采集的骨骼数据进行人体的姿态识别。
该模型在LSTM的基础上,允许有多个i、g和f门,但是只有一个o门,主要是将下图所示的25个人体骨骼根据动作的相关性分成5个组:躯干、双手和双腿。让这个5个组分别通过自己的i、g和f门,但是却共享一个o门,即每一个时间序列上,豆浆这5个组各自的状态存在细胞状态中,这样不仅可以得到人体关节在时间序列上的关联,也可以通过分组更好获取人体运动的特征。
-
Beyond short snippets: deep networks for video classification, 对应有个PPT
HMM Adaptation for Improving a Human Activity Recognition System
使用HMM,优化HAR问题
IJCAI 2018 | 海康威视Oral论文:分层式共现网络,实现更好的动作识别和检测
官方论文:Co-occurrence Feature Learning from Skeleton Data for Action Recognition and Detection with Hierarchical Aggregation
动作识别和检测正得到计算机视觉领域越来越多的关注。近日,海康威视在 arXiv 发布了在这方面的一项实现了新的最佳表现的研究成果,该论文也是 IJCAI 2018 Oral 论文。
本论文关注的是基于骨架的人体动作识别和检测问题(图 1)。骨架的相互作用和组合在描述动作特征上共同发挥了关键性作用。有很多早期研究都曾试图根据骨架序列来设计和提取共现特征(co-occurrence feature),比如每个关节的配对的相对位置 [Wang et al., 2014]、配对关节的空间方向 [Jin and Choi, 2012]、Cov3DJ [Hussein et al., 2013] 和 HOJ3D [Xia et al., 2012] 等基于统计的特征。另一方面,带有长短期记忆(LSTM)神经元的循环神经网络(RNN)也常被用于建模骨架的时间序列 [Shahroudy et al., 2016; Song et al., 2017; Liu et al., 2016]。尽管 LSTM 网络就是为建模长期的时间依赖关系而设计的,但由于时间建模是在原始输入空间上完成的,所以它们难以直接从骨架上学习到高层面的特征 [Sainath et al., 2015]。而全连接层则有能力聚合所有输入神经元的全局信息,进而可以学习到共现特征。[Zhu et al., 2016] 提出了一种端到端的全连接深度 LSTM 网络来根据骨架数据学习共现特征。
Deep Progressive Reinforcement Learning for Skeleton-based Action Recognition, CVPR2018
来自清华的增强学习
这篇文章开篇就指出,我们的模型是要从人体动作的序列中选取出最informative的那些帧,而丢弃掉用处不大的部分。但是由于对于不同的视频序列,挑出最有代表性的帧的方法是不同的,因此,本文提出用深度增强学习来将帧的选择模拟为一个不断进步的progressive process。
这篇文章处理的问题是skeleton based action recognition
可以看出整个模型大体分为两个部分,FDNet和GCNN。其中FDNet指的是frame distillation network,帧蒸馏网络,形象的将选取最有用的帧的过程用蒸馏来形容。FDNet得到有用的帧之后就要输入到GCNN,也就是graph convolutional neural network里面进行graph convolution,完成动作识别。
强化学习是通过优化选择actions的policy来最大化agent从environment所获得的rewards。文章中说至今为止,在动作识别领域,增强学习的应用还不多。
...
最后作者讲了如何将FDNet和GCNN结合起来,首先,从graph的序列中均匀的选出一些frames,用它们来训练GCNN,之后将GCNN的参数固定,再来训练FDNet,而训练过的FDNet又能够精细调节GCNN, 就这样两者互帮互助。
A New Representation of Skeleton Sequences for 3D Action Recognition CVPR2017
骨架动作识别, 参考博客,本文的主要思想是将3d骨架坐标转换成图片,然后再用卷积网络提取特征,时域上的特征通过特殊的卷积核来提取,以达到时序记忆的目的。
Investigation of Different Skeleton Features for CNN-based 3D Action Recognition 2017
3D骨架识别问题。
将节点之间的距离变成图片,将线和线之间的夹角变成图片,再送入CNN网络提取特征
基于深度学习的Action Recognition(行为识别)文档整理
Action Recognition的研究方向(发论文的方向)分为三大类。
-
Structure
这里的结构主要指网络结构。目前,主流的结构都是基于 Two-Stream Convolutional Networks 和 C3D 发展而来,所以这一块内容也主要讨论这两种结构的各种演化中作为benchmark的一些结构-
Temporal Segment Networks: Towards Good Practices for Deep Action Recognition【ECCV2016】
该论文继承了双流网络的结构,但为了解决long-term的问题,作者提出使用多个双流网络,分别捕捉不同时序位置的short-term信息,然后进行融合,得到最后结果。 -
Deep Local Video Feature for Action Recognition 【CVPR2017】
TSN改进版本之一。改进的地方主要在于fusion部分,不同的片段的应该有不同的权重,而这部分由网络学习而得,最后由SVM分类得到结果。 -
Temporal Relational Reasoning in Videos
TSN改进版本二。
这篇是MIT周博磊大神的论文,作者是也是最近提出的数据集 Moments in time 的作者之一。
该论文关注时序关系推理。对于哪些仅靠关键帧(单帧RGB图像)无法辨别的动作,如摔倒,其实可以通过时序推理进行分类。
除了两帧之间时序推理,还可以拓展到更多帧之间的时序推理。
通过对不同长度视频帧的时序推理,最后进行融合得到结果。 -
I3D-DeepMind
即基于inception-V1模型,将2D卷积扩展到3D卷积。 -
T3D
该论文值得注意的,一方面是采用了3D densenet,区别于之前的inception和Resnet结构;另一方面,TTL层,即使用不同尺度的卷积(inception思想)来捕捉讯息。 -
P3D-MSRA
改进ResNet内部连接中的卷积形式。然后,超深网络,一般人显然只能空有想法,望而却步。 -
Temporal Pyramid Pooling:End-to-end Video-level Representation Learning for Action Recognition
Pooling。时空上都进行这种pooling操作,旨在捕捉不同长度的讯息。 -
TLE: Deep Temporal Linear Encoding Networks
TLE这篇文章认为,在一段视频中,连续帧之间的移动通常很微小,然后参考到IDT算法中对特征点密集采样并且使用光流来跟踪它们能够得到比较好的video representation,因此提出需要有一个对所有的帧进行综合编码而得到的video representation,从而才能够捕捉到长时间的动态过程。
也就是说,TLE首先对一段视频,切割成K段,然后对每一段,让它通过一个CNN提取到CNN features,当然这K个CNN是权值共享的,然后对这K段的CNN features,首先用一个融合操作把它们糅合成一个features,然后对这融合后的features进行编码从而得到最终的video representation。
该模型建立TSN基础上,在输入的特征图上进行时序推理。增加三层全连接层学习不同长度视频帧的权重,及上图中的函数g和h。
-
Temporal Segment Networks: Towards Good Practices for Deep Action Recognition【ECCV2016】
-
Inputs
输入一方面指输入的数据类型和格式,也包括数据增强的相关操作。
双流网络中,空间网络通道的输入格式通常为单RGB图像或者是多帧RGB堆叠。而空间网络一般是直接对ImageNet上经典的网络进行finetune。虽然近年来对motion信息的关注逐渐上升,指责行为识别过度依赖背景和外貌特征,而缺少对运动本身的建模,但是,事实上,运动既不是名词,也不应该是动词,而应该是动词+名词的形式,例如:play+basketball,也可以是play+football。所以,个人认为,虽然应该加大的时间信息的关注,但不可否认空间特征的重要作用。
空间网络主要捕捉视频帧中重要的物体特征。目前大部分公开数据集其实可以仅仅依赖单图像帧就可以完成对视频的分类,而且往往不需要分割,那么,在这种情况下,空间网络的输入就存在着很大的冗余,并且可能引入额外的噪声。-
A Key Volume Mining Deep Framework for Action Recognition 【CVPR2016】
虽然上面的方法可以集成到一个网络中训练,但是思路是按照图像分类算法RCNN中需要分步先提出候选框,挑选出关键帧。既然挑选前需要输入整个视频,可不可以省略挑选这个步骤,直接在卷积/池化操作时,重点关注那些关键帧,而忽视那些冗余帧呢?去年就有人提出这样的解决方法。 -
AdaScan: Adaptive Scan Pooling in Deep Convolutional Neural Networks for Human Action Recognition in Videos 【CVPR2017】
注:AdaScan的效果一般,关键帧的质量比上面的Key Volume Mining效果要差一点。不过模型整体比较简单。
输入方面,空间网络目前主要集中在关键帧的研究上。而对于temporal通道而言,则是更多人的关注焦点。首先,光流的提取需要消耗大量的计算力和时间(有论文中提到几乎占据整个训练时间的90%);其次,光流包含的未必是最优的的运动特征。 -
Hidden Two-Stream Convolutional Networks for Action Recognition
该论文主要参考了flownet,即使用神经网络学习生成光流图,然后作为temporal网络的输入。该方法提升了光流的质量,而且模型大小也比flownet小很多。有论文证明,光流质量的提高,尤其是对于边缘微小运动光流的提升,对分类有关键作用。
另一方面,该论文中也比较了其余的输入格式,如RGB diff。但效果没有光流好。
-
- Connection
这里连接主要是指双流网络中时空信息的交互。一种是单个网络内部各层之间的交互,如ResNet/Inception;一种是双流网络之间的交互,包括不同fusion方式的探索,目前值得考虑的是参照ResNet的结构,连接双流网络。
这里主要讨论双流的交互。-
Spatiotemporal Multiplier Networks for Video Action Recognition【CVPR2017】
网络的结构如上图。空间和时序网络的主体都是ResNet,增加了从Motion Stream到Spatial Stream的交互。论文还探索多种方式。 -
Spatiotemporal Pyramid Network for Video Action Recognition 【CVPR2017】
论文作者认为,行为识别的关键就在于如何很好的融合空间和时序上的特征。作者发现,传统双流网络虽然在最后有fusion的过程,但训练中确实单独训练的,最终结果的失误预测往往仅来源于某一网络,并且空间/时序网络各有所长。论文分析了错误分类的原因:空间网络在视频背景相似度高的时候容易失误,时序网络在long-term行为中因为snippets length的长度限制容易失误。那么能否通过交互,实现两个网络的互补呢?
该论文重点在于STCB模块,详情请参阅论文。交互方面,在保留空间、时序流的同时,对时空信息进行了一次融合,最后三路融合,得出最后结果。 - Attentional pooling for action recognition 【NIPS2017】
-
ActionVLAD for video action classification 【CVPR2017】
这两篇论文从pooling的层面提高了双流的交互能力,这两篇笔者还在看,有兴趣的读者请自行参阅论文。后期会附上论文的解读。 -
Deep Convolutional Neural Networks with Merge-and-Run Mappings
这篇论文也是基于ResNet的结构探索新的双流连接方式。
-
Spatiotemporal Multiplier Networks for Video Action Recognition【CVPR2017】
TURN TAP: Temporal Unit Regression Network for Temporal Action Proposals
有一篇该论文的读书笔记:Model for Video Understanding
模型结果不复杂,最大亮点是:Unit-level Regression。模型结构见下图,虽然我觉得看图并不直观。
前的工作集中在frame-level上,即直接回归得到边界的属性,例如直接得到起/终点的frame index,不过主流的普遍是center frame以及length。本文提供了一种新的思路,relax回归的精度,在unit-level上回归,结果发现,unit-level上不仅更容易训练,效果也更好。Unit-level其实也很简单,就是连续帧,本文里Unit length设置为{16,32}。
Cascaded Boundary Regression for Temporal Action Detection
有一篇该论文的读书笔记:Model for Video Understanding
这篇文章主要是前一篇文章的改进,思路很简单,既然回归网络可以修正边界,那么级联的回归网络应该会有更好的效果,即进行多次回归修正。
模型的主要结构还是两部分,action proposal和action classification。在每一个部分中,增加级联边界回归网络。
3. 人体动作识别 (HAR) - 基于传感器
3.1 移动端传感器信息
CoreMotion (加速仪与陀螺仪)
CoreMotion (加速仪与陀螺仪),加速仪可以检测三维空间中的加速度 ,坐标对应如下
deviceMotion
包含下面四种数据:
- attitude(类型:CMAttitude)
- 返回设备的方位信息,包含roll 、pitch、yaw三个欧拉角的值
- roll: 设备绕 Z 轴转过的角度
- pitch: 设备绕 X 轴转过的角度
- yaw: 设备绕 Y 轴转过的角度
- rotationRate(类型:CMRotationRate)
- 经过滤波操作之后的陀螺仪数据,即 静止时,三个方向的转动速度接近于0;
- gravity(类型:CMAcceleration)
- 返回重力对设备在三个方向上的加速度
- 即重力加速度矢量在当前设备的参考坐标系中的表达,开发中不再需要通过滤波来提取这个信息
- userAcceleration(类型:CMAcceleration)
- 返回用户对设备在三个方向上的加速度
- 不再需要滤波,但根据程序需求而加的滤波算法可以保留
- magneticField:该属性返回校准后的磁场信息
- 该属性值是一个CMCalibr atedMagneticField结构体变量
- CMCalibratedMagneticField类型的变量包括field和accuracy两个字段
- 其中field代表X、Y、Z、轴上的磁场强度,accuracy则代表磁场强度的精度;
CoreMotion框架(一)—— 基础理论
CoreMotion框架, iOS参数介绍
iOS中的一个核心运动框架CoreMotion.framework。这个框架,主要是为了访问加速度计和陀螺仪的相关数据。 它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维位置信息。
cocoachina:详说CMDeviceMotion
基础的接口API介绍,算是比较全面,但是深度一般
3.2 行为序列的特征提取
行为识别(时间序列)特征提取代码
语言: matlab + C语言
多种传感器可以用于行为识别,如最常用的加速度计、陀螺仪、蓝牙与WiFi等。针对蓝牙与WiFi的特征提取,要根据具体的问题情况来进行。通常来说,加速度和陀螺仪的数据是最常用的。因此,我们就以这两种信号为例,提供针对它们的特征提取代码。
加速度和陀螺仪都是典型的时间序列信号,在行为识别中,通常我们都会提取一些统计信息(又称为时域)和频率信息(又称为频域)。两部分合起来,就可以用于行为识别了。从经验出发,能够识别人体常见的大多数运动行为。
也可以用本代码进行一些时间序列的特征提取,用法是一样的
关于时域和频域具体特征的计算方法请见在知乎的这个回答:https://www.zhihu.com/question/41068341/answer/89926233
行为识别常用的特征提取方法
提取加速度:
- 滑动窗口
窗口大小,滑动步长 - 合成加速度
常规采集的都是三个方向的加速度,在处理过程中,会用到三轴加速度合成一个加速度(为了减少计算性) - 时域特征
均值,标准差,众数,MAX/MIN, Range,相关系数,信号幅值面积SMA - 频域特征
直流分量,幅度,功率谱密度PSD
3.3 卡尔曼滤波(Kalman Filter)
官方论文:A New Approach to Linear Filtering and Prediction Problems
卡尔曼全名Rudolf Emil Kalman,匈牙利数学家,1930年出生于匈牙利首都布达佩斯。1953,1954年于麻省理工学院分别获得电机工程学士及硕士学位。1957年于哥伦比亚大学获得博士学位。
我们现在要学习的卡尔曼滤波器,正是源于他的博士论文和1960年发表的论文《A New Approach to Linear Filtering and Prediction Problems》(线性滤波与预测问题的新方法)
理解Kalman滤波的使用
Kalman滤波是一种线性滤波与预测方法,原文为:A New Approach to Linear Filtering and Prediction Problems。文章推导很复杂,看了一半就看不下去了,既然不能透彻理解其原理,但总可以通过实验来理解其具体的使用方法。
Kalman滤波分为2个步骤,预测(predict)和校正(correct)。预测是基于上一时刻状态估计当前时刻状态,而校正则是综合当前时刻的估计状态与观测状态,估计出最优的状态。
function filter = Kalman(filter)
%predict
predict_x = filter.A * filter.x + filter.B * filter.u;
filter.P = filter.A * filter.P * filter.A' + filter.Q;
%correct
filter.K = filter.P * filter.H' / (filter.H * filter.P * filter.H' + filter.R);
filter.x = predict_x + filter.K * (filter.z - filter.H * predict_x);
filter.P = filter.P - filter.K * filter.H * filter.P;
end
在matlab中,kalman滤波实际上就是上面那5个公式,而难点却是在测试代码中针对不同问题各个变量的初始化上。
...
根据上面的实验结果,可以看出Kalman滤波应用中的几个问题:
- 模型建立的正确性从根本上决定了滤波效果的正确性。
上面使用物体静止模型进行滤波,结果完全不对,而使用匀速运动模型则能达到较好的效果。从根本上讲,上面的数据也不是匀速运动的,为何结果会基本正确?看看第一个使用静止模型的滤波结果,虽然我们假定了物体是静止的,但由于观测数据的作用,kalman滤波结果也会有相应的运动而不是完全静止,也就是说滤波器在不停地修正这个状态,而在匀速运动模型中,物体的速度我们认为不变,但同样地kalman滤波器也会不停地修正这个速度,滤波器中计算的速度实质的偏离了真实速度的,因此最终也会有相应的偏差,不过这个偏差在我们容许范围内,也就可以大胆使用了。
如果能确定物体是匀变速直线运动,使用相应带加速度的模型会得到更准确的效果。但是越严格的模型其适用范围也相应越小。 - 影响滤波结果平滑性的因素是cR/cQ
影响滤波结果平滑性的因素是cR/cQ,这个值反映了我们对于预测和观测值的信任程度;其值越大则越相信预测结果,滤波结果平滑性好;反之则越相信观测结果,滤波结果越偏向于观测值。一般我们使用kalman滤波器是为了能平滑数据的波动,因此应尽量保证cR/cQ稍大,上面的测试结果该值在1e4以上数据较为平滑
Polen: 非常透彻的讲解, 偏教学引导性的讲解,包括一些数学推到和matlab实现
卡尔曼滤波在我当学生的时候就用过,但是当年我似乎就是套公式,没有理解其精髓,加之时间久了有点模糊,突然需要指导学生使用,有了强烈的陌生感觉,不得不逼自己再一次捡起。自己学会和教会别人是学习的两个层次,为了自我提高,也为了更好得指导学生。于是,我又翻出自己当年写的算法以及在网上找了些大神写的资料,进行融会贯通,总结提炼,希望稍微有点大学概率论的人能够看懂此文并熟练使用。
讲解了随机变量和概率,那么为啥要引入卡尔曼滤波呢。卡尔曼滤波适用于估计一个由随机变量组成的动态系统的最优状态。即便是观测到的系统状态参数含有噪声,观测值不准确,卡尔曼滤波也能够完成对状态真实值的最优估计。
这篇文章从编程的角度,定义了kalman滤波的各项参数,并基于C实现了一个demo版本。
- 卡尔曼滤波中的真实值,测量值,预测值,估计值怎么区分?
- 卡尔曼滤波递归过程
- 卡尔曼滤波器的工作过程
//标量卡尔曼滤波
typedef struct {
float x; // 系统的状态量
float A; // x(n)=A*x(n-1)+u(n),u(n)~N(0,q)
float H; // z(n)=H*x(n)+w(n),w(n)~N(0,r)
float q; // 预测过程噪声协方差
float r; // 测量过程噪声协方差
float p; // 估计误差协方差
float gain;//卡尔曼增益
}KalmanStructTypedef;
Discrete Kalman Optimal Estimator,2013
对应的github: Kalman.scala
polen: 这是书 <Scala For Mahine Learning> 的上的内容,此章节是基于kalman 实现预测的scala 代码,但是运行有bug,跑不起来
This post is an introduction to the Kalman optimal filter using the Scala programming language as implementation. The Kalman filter is widely used in signal processing and statistical analysis to quantify or estimate noise created by a process and noise generated by measurement devices.
Kalman Filter at the age of big data: programming in Spark/Scala,2017
Scala实现Kalman滤波
在大数据时代如何通过kalman filter进行星际导航. 先介绍了下kalmanfilter是什么,然后将在导航系统中根据观察值和观察状态使用kalmanfilter。偏向于科普文为主,没有太多数学推到,大部分假设以高斯分布为主。
Kalman-and-Bayesian-Filters-in-Python
卡尔曼贝叶斯滤波器的系统介绍,基于python notebook实现
Multidimensional Kalman Filter for a Constant Acceleration Model (CA)
基于卡尔曼滤波,计算乒乓球的运动轨迹,和波尔打乒乓
Effective Adaptive Kalman Filter for MEMS-IMU/Magnetometers Integrated Attitude and Heading Reference Systems
西工大的几个学生写的基于卡尔曼滤波进行姿态识别, 大部分以数学推到为主。
3.4 姿态识别/姿态解算
官方:Open source IMU and AHRS
开源:AHRS的官方源码(c,c#,matlab)
Pixhawk 源码分析系列-姿态解算,创客制造
经过近一段时间的研究,主要是关于多旋翼无人机姿态解算算法的研究,开源PX4源代码里面默认使用的是基于mahony的互补滤波算法(explicit complement filter)进行姿态解算的;还有一套备用姿态解算算法是基于kalman的EKF(extended kalman filter);然后呢,其实还有一套PX4源代码中尚未涉及的基于madgwick的梯度下降算法(gradient descent)。
A Python implementation of Madgwick's IMU and AHRS algorithm
python实现的AHRS算法版本,主要是四元数的计算
Indirect Kalman Filter for 3D Attitude Estimation
纯粹数学推导
Indirect Kalman Filter for 3D Attitude Estimation
Nikolas Trawny and Stergios I. Roumeliotis Department of Computer Science & Engineering University of Minnesota
Multiple Autonomous Robotic Systems Laboratory, TR-2005-002
March 2005
Python Attitude Heading and Reference System,2014-07-23
一个python的ahrs的源代码,没仔细看,感觉啥都有一点
IMU Data Fusing: Complementary, Kalman, and Mahony Filter
姿态识别常用的几种方法对比
在IMU数据融合来得到准确姿态方面的工作已经有很多大牛研究过,主要有:Colton,Bizard,Starlino,Lauszus,Mahony,Madgwick。他们的研究成果已经成为了标准的参考。这么多的算法中有相似也有不同之处,容易给人造成混乱。这里就以6轴传感器的IMU来讨论他们之间的区别和相似。
这里讨论三个最基本的滤波器方法,互补滤波器,卡尔曼滤波器(线性的),Mahony&Madgwick 滤波器。分为五块部分来叙述,第一部分是关于基本的知识,第二部分是关于1维IMU数据融合(1阶,没有估计陀螺仪误差);第三部分是关于1维IMU数据融合(2阶,带有陀螺仪误差估计);第四部分带有Mahony滤波器的3维IMU数据融合;第五部分是关于3维滤波器的展望。最后附带一些算法的实现步骤。
3.5 传感器 + 机器学习
3.5.1 移动端 + 机器学习
用智能手机做行为识别文章总结
列举了13年到15年用手机做行为识别相关的论文
Motion Gesture Detection Using Tensorflow on Android
基于android的传感器+tensorflow神经网络,识别用户是左滑还是右滑动作
这里有中文翻译版本,其对应android的代码, 其中tensorflow训练的jupyter notebook
对于我们的目标,我们可以将其描述为希望手机能够识别左右的快速动作。
我们希望能够在一个单独的Android库中完成这一实现,以便它能够容易地集成到任何其他应用程序中。
这些动作可以通过手机上的几个传感器进行捕获:加速度计、陀螺仪、磁力计等等。随后,这些批量动作可以用于机器学习算法,以便进行训练和后续识别。
为了捕捉数据,我们将开发一个Android应用程序。预处理和训练过程将在Jupyter Notebook环境的PC上使用Python和TensorFlow库执行。手势识别将在一个Android应用程序演示中执行,并生成训练数据。最后,我们将开发一个即时可用的Android库,用于手势识别,而且可以很容易地集成到其他应用程序中
读取的原始数据为:600.000000,2.464342,0.030081,-1.655362
对应: column_names = ['timestamp', 'x-axis', 'y-axis', 'z-axis']
监督学习的标签:green/red (表明左滑或者右滑)
Machine-Learning powered Gesture Recognition on iOS
iOS上集成手势识别的toolkit, 对应源码
作者实现了一个训练ViewController和一个预测ViewController。训练ViewController用于你做指定的动作,来添加训练数据。具体的算法是用C++写的随机森林的一个分类器。相对比较简单,准确性姑且不论,至少这一套完整做下来,后续有其他类似项目,可以作为启动的demo参考。
基于DeepConvLSTM的传感器信号分类,美图,2018
源码: Github
数据集:UCI: Human Activity Recognition Using Smartphones Data Set
本文主要根据手机的传感器数据,训练深度学习模型,用于预测用户的运动模式,如行走、上楼梯、下楼梯、坐、站立、躺下等六种动作.
模型是基于深度学习的DeepConvLSTM算法,算法融合了卷积(Convolution)和LSTM操作,既可以学习样本的空间属性,也可以学习时间属性。在卷积操作中,通过将信号与卷积核相乘,过滤波形信号,保留高层信息。在LSTM操作中,通过记忆或遗忘前序信息,发现信号之间的时序关系。
, 代码基于keras实现
最终效果,在测试集中,准确率约为95%左右:
loss: 0.0131 - acc: 0.9962 - val_loss: 0.1332 - val_acc: 0.9535
val_f1: 0.953794 — val_precision: 0.958533 — val_recall 0.949101
Deep, Convolutional, and Recurrent Models for Human Activity Recognition Using Wearables 好不容易找到一个有github链接的,
分别对DNN,CNN,RNN实现一波人体姿态识别,然后对比实验看结果。从结果来看,CNN和LSTM的效果更好一些。
代码上是基于Lua写的,实现方式是基于CNN/DNN/RNN都有实现,但是可以调试/测试的只有RNN。不过既然代码都不能调试,其论文的可验证性打个问号吧。
3.5.2 传感器 + 机器学习
知乎:近几年国际会议关于传感器行为识别的文章整理
汇总了11年到15年各大平台的行为识别的论文,主要以手机或者传感器为原始数据。列举的很详细,汇总了几十篇论文。
深度学习用于行为识别文章总结 (Deep learning for activity recognition)
深度学习用于行为识别代码 (Deep learning codes)
传感器识别 + 深度学习
迁移学习用于行为识别 (Transfer learning for activity recognition)
传感器识别 + 迁移学习
与位置相关的传感器行为识别文章
传感器在身体的不同位置 + 机器学习
基于加速度传感器的连续动态手势识别,陈鹏展 罗漫 李杰 华东交通大学电气与电子工程学院 南昌
摘要:针对个体手势动作信号的差异性和不稳定性,提出了一种基于加速度传感器的连续动态手势识 别方法。通过 MEMS 加速度传感器采集手势动作信号,并结合手势信号的动作特征,对单个手势的有效 数据进行自动定位截取,经预处理和特征提取后,构建隐马尔可夫模型( HMM) 以实现对特定手势的实时 识别。通过设计实现了一种可穿戴手势信号采集硬件原型系统,对 10 类手势的 1000 个手势数据进行识 别对比实验,统计结果表明: 该方法可以对连续手势进行实时有效的识别。