Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition(动作识别)

Introduction

动作识别的常用方法:appearance,depth,光流,骨架序列

本文主要研究骨骼序列,利用图卷积的方法构建一个有效的模型。

骨架序列模型

所谓骨骼序列就是指一个在时间轴上的骨骼坐标的序列集合。

早期骨架模型的缺点:

1.早期的方法是对一个时间帧上的所有骨架节点的坐标flatten平铺作为一个向量,仅仅以时序的方法去分析。忽略了骨架在一个时间帧上的空间信息,这个信息对于人体的动作是非常关键的。

2.早期对于骨架模型的设计都是hand-crafted,模型的泛化能力非常弱。

目前骨架序列 via deeplearning

为了能获得空间和时间上的所有信息,我们可以利用深度学习去自动提取一些高阶的信息。即本文提出了利用graph CNN来识别空间上的关节点的信息,利用TCN来提取时间帧上的信息。

文章亮点:

首次将图卷积应用在了骨架序列动作识别上,0-1的一步,构建了一个时空图卷积网络来进行动作识别。具有图卷积的很多优点:局部感受野、Muti-presentation等。

Spatial Temporal Graph Convnet

前言:

在我们做一个动作时,我们的关节一般都是成一个组进行运动的。因此在模型中我们可以很好的解释利用局部感受野去只关注Local regions的有效性。一个关节组的运动轨迹可以很好的表征一类运动,这可以让模型在训练的过程中有非常好层次表达能力

Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition(动作识别)

时序骨架图的构造

对于每一帧图像,我们提取人的骨架节点作为图的结点,并且骨架的自然连接作为结点与结点之间的边,这就构建出了一帧的图。同时,我们将每个节点的在时间帧上的对应节点也用边连接起来,这就构成了一个包含时间和空间信息的图。每一个节点的坐标(2D或者3D)作为图结点的特征输入。

1.Construct an undirected spatial temporal graph G=(V,E)G=(V,E) ,其中VV代表了所有帧中的所有节点的集合,有V={vtit=1,,T,i=1,,N}V=\{v_{ti}|t=1,…,T,i=1,…,N \},这里的NN代表对于每一个帧中的骨架节点有N个。对于每一个节点vtiv_{ti}我们定义气特征向量为F(vti)F(v_{ti}),该向量包括了节点的坐标信息、置信度等。

对于图中的边,我们首先定义节点之间的边(即一帧中的边),有Es={vtivtj(i,j)H}E_s=\{ v_{ti}v_{tj}|(i,j) \in H \},这里有H代表在单帧下的图的节点的集合。接下来我们进一步定义时序边(inter-frame edges),有EF={Vtiv(t+1)i}E_F=\{ V_{ti}v_{(t+1)i} \}

Spatial Graph Convolutional Neural Net

我们首先来分析在某一帧下的空间图卷积网络,此时有N个节点,并且有骨架边Es(τ)={vtivtjt=τ,(i,j)H}E_s(\tau)=\{ v_{ti}v_{tj} |t=\tau,(i,j) \in H \}.

Recall:

我们先分析CNN中的卷积定义,在欧几里德空间中,我们可以将一个输入看做一个2D网格,而CNN的输出同样也是2D网格,而kernel 的作用就是对于图像网格中依据kernel的大小定义窗口,中心节点x将其邻居网格做一个权重加权,重新赋值于x.所以对于一个CNN的单一channel,卷积核的spatial location为 x,我们有以下输出:
fout(x)=h=1Kw=1Kfin(p(x,h,w))w(h,w) f_{out}(x)=\sum_{h=1}^K{\sum_{w=1}^K}{f_{in}(p(x,h,w))·\mathbf{w}(h,w)}
其中的sampling function p计算了在中心结点x下,他的其他邻居节点,h,wh,w分别表示卷积核中目标节点相对于中心结点的相对坐标.其实p函数的实质就是定位在图像窗口上的邻居位置。

同理,weight function是一个权重向量,全局共享参数,对每一个窗口进行权重加权并加到中心结点x中。

NOTE: 这就是标准的2D网格上的卷积,我们需要注意2个细节:

  1. p()p(*)函数是定位邻居节点位置的。
  2. w函数依据节点的相对位置来给出权重参数。

Sampling function.

我们需要将标准CNN中的扩展延伸到图网络中,在CNN中,样本函数是去定位相对于中心结点的邻居节点的位置。首先我们在图中定义一个对于节点vtiv_{ti}邻居集合B(vti)={vtjd(vtj,vti)D}B(v_{ti})=\{v_{tj}|d(v_{tj},v_{ti}) \leq D \},这里的$(v_{tj},v_{ti}) \leq D D表示两个节点直接的最小距离最多为D。进一步,我们若以v_{ti}samplefunction作为中心结点,那么可以定义sample function 为p(v_{ti},v_{tj})=v_{tj}$.

在本文中,以下所有的样本函数都默认D=1作为讨论。

Weight function

在2D网格中,当我们已经确定一个中心结点后,他的邻居节点的相对位置是确定的,但是在网络结构中就不是这样了。由此我们的想法就是将邻居节点编号。这里我们定义这个编号的mapping函数为lti:B(vti){0,,K1}l_{ti}:B(v_{ti}) \longrightarrow \{ 0,…,K-1\},即将每一个邻居节点分到K个子集中并且依序编号。则有:
w(vti,vtj)=w^(lti(vtj)) \mathbf{w}(v_{ti},v_{tj})=\mathbf{\hat{w}}(l_{ti}(v_{tj}))

Spatial Gragh Convlution

Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition(动作识别)

其中Z是对应的子集的元素的数量。

Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition(动作识别)

Spatial Temporal Modeling

论文中为了严谨性公式讲的非常复杂,实际上没什么卵用。实际过程就是在我们对每一帧做了图卷积后,在将所有帧输入到TCN中,对于同一节点在时间维度上去做时间卷积。

Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition(动作识别)

Partition Strategies

本节内容会介绍3个label map 的策略。

1.Uni-labeling

这是最简单的方法,就是仅仅指划分一个子集,该自己包括中心结点以及其所有的邻居(暴力而简单),但是这种划分方法最后得到的结果不好。

2.Distance partitioning.

这种策略是依据相距中心结点的距离来做的分类,在本文中,D=1,则我们会分为两类,第一类是中心结点自己本身,第二类是距离中心结点为1的结点,即有K=2。

3.Spatial configuration partitioning.

这是一种基于对关节点分组分类的策略。我们可以人为的定义3个子集,分别表示3种情况;第一种:中心结点本身。第二种:邻居节点到重心的距离小于中心结点到重心的距离。第三种:其他情况。

这样分类的目的:人的关节组的运动我们可以分为:平动;离心;向心。则我们可以启发式的构建上面的三个子集,分别代表着三类关节运动。

Learnable edge importance weighting

这就是给关节点间加了一个注意力机制,本文没有详细介绍。

Implementing ST-GCN

综合上面的第一个方法策略,我们将对于单一帧的网络卷积写作矩阵函数:
fout=Λ12(A+I)Λ12finW f_{out}={\Lambda}^{-\frac{1}{2}}(A+I){\Lambda}^{-\frac{1}{2}}f_{in}W
这里A+I代表的一个带有自环的图。Λ\Lambda代表的是图的出度组成的一个对角矩阵,其中出度全部在对角线上,即Λii=j(Aij+Iij){\Lambda}^{ii}=\sum_j(A^{ij}+I^{ij}).需要注意的是,这里的W其实并不是卷积核,而仅仅是对于我们图中的输入矩阵finf_{in}在channel数做一个变换,在代码实现中可以认为是1*1*c的卷积,即指变换通道数。而真正的卷积核是前面的Λ12(A+I)Λ12{\Lambda}^{-\frac{1}{2}}(A+I){\Lambda}^{-\frac{1}{2}},这是经过变化的邻接矩阵,利用该矩阵将所有节点的邻边信息进行聚合来更新节点信息。

同理,我们可以写出利用第二,三个label策略的矩阵函数:
fout=jΛj12AjΛj12finWj f_{out}=\sum_{j}{\Lambda}_j^{\frac{-1}{2}}A_j{\Lambda}_j^{\frac{-1}{2}}f_{in}W_j
也就是我们对于每个Label求出fout,jf_{out,j}后,我们再将这些信息加起来。

如果我们再加上注意力矩阵的话,就是:
fout=jMΛj12AjΛj12finWj f_{out}=\sum_{j}M \otimes {\Lambda}_j^{\frac{-1}{2}}A_j{\Lambda}_j^{\frac{-1}{2}}f_{in}W_j
Note:注意力矩阵开始要初始化为全1.

Conclusion

本篇文章是第一篇将图网络应用于动作识别上的,而作者也仅仅是给出了最为简单的网络,后续也有很多人follow这篇文章,做出了很多有意义的改进。

例如:

Two-Stream Adaptive Graph Convolutional Networks for Skeleton-Based Action Recognition

Actional-Structural Graph Convolutional Networks for Skeleton-based Action Recognition