基于骨骼的行为识别笔记
目录
- 1. 人类行为(层次):
- 2. 输入数据
- 3. 基于骨架的行为识别
- 4. 数据集
- 5. 相关论文
- 5.1 Skeleton-based Action Recognition with Convolution Neural Networks(2017.8 海康威视)
- 5.2 Co-ocurrence Feature Learning from Skeleton Data for Action Recognition and Detection with Hierachial Aggregation(2018.8)
- 5.3 Skeleton-based action recognition with synch(2019.6.12)
- 5.4 Actional-Structural Graph Convolutional Networks for Skeleton-based Action Recognition(2019 CVPR)
- 5.5 Skeleton-Based Action Recognition with Directed Graph Neural Networks(2019CVPR)
1. 人类行为(层次):
- 身体的一部分移动(比如手势识别)
- 单个人类活动(比如跑步、拳击)
- 两个或者两个以上的多人交互活动(会议握手)
多人团体活动(篮球比赛、足球比赛)
2. 输入数据
- RGB video
- RGBD video(有深度信息、基于骨架)
3. 基于骨架的行为识别
输入:骨架序列(video)
输出:动作类别标签
来源:Kinect,Human pose estimation algorithms
优点:不受环境的干扰,数据量级小,可以实现端到端的系统
4. 数据集
目前使用的是NTU RGBD中的Action Recognition中的3D skeletons(body joints),大小为5.8GB。
4.1 NTU RGBD
4.1.1 下载方式
下载地址:http://rose1.ntu.edu.sg/datasets/login.asp?DS=3
4.1.2 Benchmark
- Cross-Subject
我们将40个志愿者划分为training和testing团体。每个团体包含20个志愿者,其中1,2,4,5,8,9,13,14,15,16,17,18,19,25,27,28,31,34,35,38为训练集,其余为测试集。 - Cross-View
我们将cameras2和3作为训练集,1为测试集。
4.1.3 Skeleton数据集详解
否NTU RGBD包含60个动作种类以及56880个录像。数据集是由三个kinect V2摄像机实时捕获。NTU RGBD数据集中的RGB录像大小为19201080,深度矩阵和红外录像大小为512424。而在3D skeletal数据集中包含志愿者在每一帧的三维坐标(包含每帧25个主要身体关节的三维位置)。3D骨骼节点信息是通过Kinect相机中的骨骼追踪技术获得的。
每个数据集的格式为SsssCcccPpppRrrrAaaa(eg:S001C001P001R001A001.skeleton)。每个符号代表的意思分别为:
- sss是下载的顺序号(整个数据集特别大,所以要分开放)
- ccc是摄像头ID,分别是degree、front、side
- ppp是志愿者编号
- rrr是同一个动作的表演次数
- aaa动作类别
关于具体如何使用该数据集,简单代码实现为(matlab):https://github.com/shahroudy/NTURGB-D/blob/master/Matlab/read_skeleton_file.m
事实上,在打开skeleton文档后,我们看到的是如下画面:
- 102表示共有102帧3d骨架图;
- 1是指单张骨架图中有多少骨架,
- 72057594037931691是指追踪的骨架编号;
- 接下来是6个整型数,分别是clipedEdges,handLeftConfidence,handLeftState,handRightConfidence,handRightState,isResticted,
- 该行接下来是骨架的x,y偏置(骨架位置?),该行最后一个数字是该骨架的trackingState(?);
- 25表示有25个关键点(关节)信息,接下来有25行;每个关键点信息行上有11个数据,前三个是关键点的3D位置(x,y,z),第四五个是在2D帧中的位置(用于匹配IR帧),第六第七个是在2D帧中的位置(用于匹配RGB帧),第八第九第十第十一是该关键点的方向(WXYZ)
- 第十二个是该关键点的trackingState(?)
是keleton的60个动作类别
5. 相关论文
5.1 Skeleton-based Action Recognition with Convolution Neural Networks(2017.8 海康威视)
5.1.1 论文亮点
- 在该论文发表之前,大部分的基于骨骼的行为识别都使用了LSTM网络,并以LSTM为基础进行改进。该论文提出了双流CNN,取得了比起LSTM(STA-LSTM、VA-LSTM)更快更好的结果(在NTU RGBD数据集上达到了89.3%的准确度)。
事实上,双流CNN(2014)并不是该论文的首创。在传统的数据集(基于视频而非人体骨架的数据集)上,双流CNN一直都是主流算法。在RGB视频数据集上,双流CNN的输入为原始RGB图和光流图。
该论文使用的双流CNN是第一次在基于骨骼的动作识别上使用的RCNN
图1是论文设计的用于裁剪后(代码实现为30帧)的骨骼序列识别高效CNN网络。输入分为两部分,一部分是正常的骨骼序列,一部分是连续序列的移动(motion,从代码上实现其实就是相邻两帧之间做差)。论文同时提出了一种新的结构叫Skeleton Transformer(事实上是一种线性函数),这种网络结构据说可以自动学习一种更好的骨架排序,比人工选取相应的骨架有更好的效果(有点类似于注意力机制,选择更加重要的骨架,选择更重要的帧)。为了处理多骨架任务,使用了maxout来合并不同骨架的特征。每一个骨架最后的输入其实是T(帧数)*N(骨架数)*3的图像。
论文网络中未执行任何的正则化。
5.2 Co-ocurrence Feature Learning from Skeleton Data for Action Recognition and Detection with Hierachial Aggregation(2018.8)
5.2.1 论文亮点
- 论文指出基于骨骼行为识别任务要解决两个方面的问题:首先是,同一帧内骨架同时出现的表示;然后是骨架随时间变化的帧间表示。
论文提出一种端到端的卷积共现(co-occurrence)特征学习框架,这种共现特征是以分层的方式进行学习,这种分层使不同层次的语义信息逐渐聚合。
CNN模型卓越的能力在抽象高层次的信息,它们能够使用来从骨架中学习时空特征[Du et al.,2016;Ke at al.,2017]。
由于在空间维度的权值共享,CNN模型不能够学习到所有骨架的参数,这些是论文提出一个能够从所有骨架得到整体反馈来探索不同骨架之间的相关性。
如上图,在最开始,输入的大小是framesjoints3,在红色(0,2,1)部分,joints变为了channel。这里的依然使用的是双流CNN的想法,一个输入是frames,一个输入是motions,
不同的人在第六层卷积后进行融合。
最后的损失函数使用了交叉熵。
5.3 Skeleton-based action recognition with synch(2019.6.12)
5.3.1 论文亮点
-
提出了一种残差频次注意力机制(rFA,residual frequency attention)来关注一些经常出现的域;同时提出了一种同步局部以及非局部的块(SLnL,synchronous local and non-local)来捕获在时空域的细节和语义。
可以从下图看出,经过transformed的图像进入rFA,之后会进行2D的FFT(快速傅里叶变化,FFT是计算机实现离散傅里叶变化DFT的算法)论文提出了一种软边界聚焦损失(SMFL,soft-margin focal loss),用来优化整个网络,该损失函数可以帮助自动数据选择和强化分类器内部的边界。
文章指出之前的RNN、CNN、GCN有两个严重的问题:首先,之前的操作基本都是在相邻的局部操作,因此局部细节信息和全局语义信息在在低层和高层异步获取,阻碍了动作在细节和语义上的融合;其次,人类动作类似握手、刷牙、鼓掌有频次的特征,但是之前的工作受时空动力学的限制,并且忽略了周期性和经常性的域。这也是rFA和SLnL提出的原因。在时空域同步局部和非局部学习的示意图如下:
软边界聚焦损失:对于分类任务有一项非常重要的困难,那就是如何增强各个类别之间的不同,目前有两种方法:数据挑选或者边界增强。
直观上讲,一个样本的预测的置信度越高,它可能离预测边界越远。因此,论文提出了一种SM(soft-margin)损失,
其中,Pt为置信度,m为边界(margin)参数。
我们将交叉熵和软边界损失进行了结合,得出了软边界交叉熵(SMCE)损失:
Focal loss是用来解决正负样本不平衡,解决易分反例样本导致的整体学习方向跑偏:
其中,y是一个聚焦参数。
类似于SMCE,我们将SM损失与FL损失结合,提出SMFL损失函数:
我们将双流CNN的两个部分分别计算损失,并将两者结合之后也计算了损失,最后的整体损失函数为:
5.4 Actional-Structural Graph Convolutional Networks for Skeleton-based Action Recognition(2019 CVPR)
5.4.1 论文亮点
-
文章提出了A-link Inference Module(AIM)来推断能够捕获特殊动作潜在依赖性的actional links(A-link)
文章提出了动作结构性图卷积网络(AS-GCN)在多图中提取有用的时间空间信息。
文章引入了一种额外的预测姿态的机制,通过捕获细节动作信息来提高分类的准确度。
下图是A-links和S-links的一个解释:下如是一个“走路”的表示,其中a是骨骼图,是人体骨骼的自然连接;b是结构连接允许左手与手臂进行连接;c是动作连接,捕获一个长时间的特定动作关联。
A-links: 许多人类动作需要长距离的关节点配合移动,这是一种关节点间的非物理依赖。为了捕获对不同动作相应的依赖,我们引入了A-links。A-links是由任意两个关节点通过动作生成。为了从动作中自动地推断A-links,我们提出了AIM(A-link inference module)。下图是AIM的数据流图,为了在两个关节点之间推测出A-link,关节点特征被串联起来放入AIM的自编码器结构。编码器生成A-link,解码器根据A-link和之前的动作生成未来的姿态预测。
下图是ASGCN的整体流程图,
5.5 Skeleton-Based Action Recognition with Directed Graph Neural Networks(2019CVPR)
5.5.1 论文亮点
-
DGNN(有向图神经网络)
由于是一个有向图,那么相邻两点之间就包含位置和方向,这里的位置就是关节点,而方向则是骨骼;边缘骨骼信息是由两点坐标之差进行表示。图片1里的根节点被定义为重心(蓝色点),每一个边只有一个源点和目标点。同时使用关节点信息和边缘骨骼信息的好处之一是可以快速推断出关节的角度。
在下图中,a是原始的图;b是顶点更新的过程,其中顶点本身的属性v2和它的传入边(e1)以及传出边(e2和e3)的属性组合在一起来获得更新的顶点v2’;c是边缘骨骼更新的过程,e1本身的属性以及它的源点v1’、目标点v2’的属性组合进行更新,Directed graph network block(DGN block)在有向图神经网络中是一种基本模块,它包含了两个更新函数(更新关节点和边缘骨骼的值)和两个聚合函数(用于聚合连接到一个顶点的多条传入(传出)边中包含的属性)。设计聚合函数的原因是连接到每个顶点的传入(传出)边的数量是变化的,而参数是固定的。又因为这些边没有明显的顺序,所以聚合函数应该对其输入的排列保持不变,并可以接受可变数量的参数,比如平均池化、最大池化和逐元素求和。
关于具体的v和e的更新过程如下:
对于每个顶点v,所有的指向它的边通过传入聚合函数g1(e-)处理,返回聚合后的结果\bar{e}-;
对于所有由v发出的边都由传出聚合函数g2(e+)处理,返回聚合后的结果\bar{e}+;
(v,\ \bar{e}-,\bar{e}+)进行串联后输入顶点更新函数h1,返回更新后的v;
对于每个边e,它的源点、它的目标点以及它自己串联后输入边更新函数h2,返回更新后的e。
总之,整体的过程就是先进行顶点的更新,之后进行边的更新。
通过大量的实验,我们选择了平均池化作为聚合函数来处理输入边和输出边,并选择了全连接层作为更新函数。
输入分为两部分:CTNv和CTNe;其中C是通道数,一般为2或3(关节点的坐标);T是帧数;Nv是关节点数;Ne是骨骼边缘数。论文设计了一种关联矩阵A_{ij},\ i=1,\ldots,\ Nv;j=1,\ldots,\ Ne;这里的A是用来关联vj和ei之间的关系;以下是关联矩阵A的细节部分:
如果vi是ej的源顶点,那么Aij=-1;
如果vi是ej的目标顶点,那么Aij=1;
其余则是Aij=0。
为了将关联矩阵中的源顶点和目标顶点分开,与A矩阵相似,我们设计了As和At来表示源头关联矩阵。
给定一个输入张量和关联矩阵,我们可以过滤得到所需的顶点和边,通过矩阵乘法来聚合函数。比如,当我们得到一个CT*Nv的顶点矩阵时,我们通过该矩阵与As相乘得到CT*Ne张量,这个张量的每个元素对应的是顶点对应边的源顶点的和。我们使用的聚合函数是平均池化操作,关联矩阵需要进行规范化(normalized)。我们将规范化后的矩阵A定义为\widetilde{A}=A\Lambda{-1},其中Λ是一个对角矩阵\Lambda_{ii}=\sum_{j}{A_{ij}+\alpha}其中α是一个很小的数,避免矩阵不可逆。论文设计的更新函数具体公式如下:
其中H是一个单层全连接网络,论文在每个DGN block中添加了BN层和ReLU层。
DGN块的输入是根据人体自然结构来设计的,但论文作者认为,人体的自然结构并不能适合所有种类的行为识别,比如拍手这个动作,左右手之间的关系对于识别非常重要,但左手和右手之间并没有联系。我们可以将邻接矩阵A作为模型的参数,但在前几个epoch中保持参数不变。这样前期保持A参数不变可以简化训练,而后期变更参数则为图提供了更大的灵活性。
伪3D CNN(pseudo-3D CNN)在基于RGB的动作识别领域取得了很大的成果。P3D CNN是利用(1,3,3)的空间卷积(深度可分离卷积)和(3,1,1)的时间卷积(点卷积)来近似代替(3,3,3)的3D卷积思想。论文同时也利用了P3D的思想,在时间维度上也进行了点卷积。和DGN块一样,每个点卷积之后都要添加一个BatchNormal以及ReLU来组成Temporal convolutional block(TCN),最后由softmax来输出。
论文同样使用了双流网络,即骨骼点本身、相邻时间的骨骼点的差作为输入,这一点是延续了之前双流CNN的一个设计思想。在网络的最后使用softmax作为输出,两个网络的softmax相加作为结果。
推荐阅读
-
基于MNIST手写数字数据集的数字识别小程序
-
基于神经网络的人脸识别tensorflow(数据的存储与加载)
-
基于canvas的骨骼动画的示例代码
-
基于OpenCV的PHP图像人脸识别技术
-
笔记本无法识别U盘、读不出U盘的解决方法
-
LotusPhp笔记之:基于ObjectUtil组件的使用分析
-
【笔记】基于Python的数字图像处理
-
golang实现分布式缓存笔记(一)基于http的缓存服务
-
基于jupyter notebook的python编程(Win10通过OpenCv-3.4.1进行人脸口罩数据集的模型训练并进行戴口罩识别检测)
-
NetCore学习笔记:二、基于Dapper的泛型Repository