[ML]Human Activity Recognition人体

2019-07-06  本文已影响0人  pingpong_龘

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:

源自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)的方法,到最近三年来出现的深度学习相关方法。每年在几个主要跟踪数据集上的竞赛非常激烈,方法也越来越多。本期阅面科技资深研究员陈正华将以「目标跟踪方法的发展概述」为主题给大家分享更多的内容。

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个深度学习在人体姿态识别领域的应用模型,包括其论文提出的思路、模型结构、实验数据集和使用的加速硬件(如果有的话),本文不提供相关的实现方法。

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的研究方向(发论文的方向)分为三大类。

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
包含下面四种数据:

CoreMotion框架(一)—— 基础理论
CoreMotion框架, iOS参数介绍
iOS中的一个核心运动框架CoreMotion.framework。这个框架,主要是为了访问加速度计和陀螺仪的相关数据。 它不仅仅提供给你获得实时的加速度值和旋转速度值,更重要的是,苹果在其中集成了很多算法,可以直接给你输出把重力加速度分量剥离的加速度,省去你的高通滤波操作,以及提供给你一个专门的设备的三维位置信息。

cocoachina:详说CMDeviceMotion
基础的接口API介绍,算是比较全面,但是深度一般

3.2 行为序列的特征提取

行为识别(时间序列)特征提取代码
语言: matlab + C语言
多种传感器可以用于行为识别,如最常用的加速度计、陀螺仪、蓝牙与WiFi等。针对蓝牙与WiFi的特征提取,要根据具体的问题情况来进行。通常来说,加速度和陀螺仪的数据是最常用的。因此,我们就以这两种信号为例,提供针对它们的特征提取代码。

加速度和陀螺仪都是典型的时间序列信号,在行为识别中,通常我们都会提取一些统计信息(又称为时域)和频率信息(又称为频域)。两部分合起来,就可以用于行为识别了。从经验出发,能够识别人体常见的大多数运动行为。

也可以用本代码进行一些时间序列的特征提取,用法是一样的

关于时域和频域具体特征的计算方法请见在知乎的这个回答:https://www.zhihu.com/question/41068341/answer/89926233

行为识别常用的特征提取方法
提取加速度:

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滤波应用中的几个问题:

  1. 模型建立的正确性从根本上决定了滤波效果的正确性。
    上面使用物体静止模型进行滤波,结果完全不对,而使用匀速运动模型则能达到较好的效果。从根本上讲,上面的数据也不是匀速运动的,为何结果会基本正确?看看第一个使用静止模型的滤波结果,虽然我们假定了物体是静止的,但由于观测数据的作用,kalman滤波结果也会有相应的运动而不是完全静止,也就是说滤波器在不停地修正这个状态,而在匀速运动模型中,物体的速度我们认为不变,但同样地kalman滤波器也会不停地修正这个速度,滤波器中计算的速度实质的偏离了真实速度的,因此最终也会有相应的偏差,不过这个偏差在我们容许范围内,也就可以大胆使用了。
    如果能确定物体是匀变速直线运动,使用相应带加速度的模型会得到更准确的效果。但是越严格的模型其适用范围也相应越小。
  2. 影响滤波结果平滑性的因素是cR/cQ
    影响滤波结果平滑性的因素是cR/cQ,这个值反映了我们对于预测和观测值的信任程度;其值越大则越相信预测结果,滤波结果平滑性好;反之则越相信观测结果,滤波结果越偏向于观测值。一般我们使用kalman滤波器是为了能平滑数据的波动,因此应尽量保证cR/cQ稍大,上面的测试结果该值在1e4以上数据较为平滑

我所理解的卡尔曼滤波,罗杰,简书

Polen: 非常透彻的讲解, 偏教学引导性的讲解,包括一些数学推到和matlab实现

卡尔曼滤波在我当学生的时候就用过,但是当年我似乎就是套公式,没有理解其精髓,加之时间久了有点模糊,突然需要指导学生使用,有了强烈的陌生感觉,不得不逼自己再一次捡起。自己学会和教会别人是学习的两个层次,为了自我提高,也为了更好得指导学生。于是,我又翻出自己当年写的算法以及在网上找了些大神写的资料,进行融会贯通,总结提炼,希望稍微有点大学概率论的人能够看懂此文并熟练使用。

讲解了随机变量和概率,那么为啥要引入卡尔曼滤波呢。卡尔曼滤波适用于估计一个由随机变量组成的动态系统的最优状态。即便是观测到的系统状态参数含有噪声,观测值不准确,卡尔曼滤波也能够完成对状态真实值的最优估计。

kalman滤波(一)---对各参数的理解

这篇文章从编程的角度,定义了kalman滤波的各项参数,并基于C实现了一个demo版本。

  1. 卡尔曼滤波中的真实值,测量值,预测值,估计值怎么区分?
  2. 卡尔曼滤波递归过程
  3. 卡尔曼滤波器的工作过程
    //标量卡尔曼滤波
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 个手势数据进行识 别对比实验,统计结果表明: 该方法可以对连续手势进行实时有效的识别。

上一篇下一篇

猜你喜欢

热点阅读