Self-Attention Network for Skeleton-based Human Action Recognition
文章目录
摘要
目前,基于骨架序列的动作识别大多都是用CNN,RNN,Graph-based CNN作为模型的,但是现在的问题是,这些模型都无法捕捉到我们视频的长期联系信息。为了能够让模型有更好的表示,作者提出了3种类型的Self-Attention网络(SAN),分别是SAN-V1,SAN-V2,SAN-V3。SAN 有比较强的提取高阶长期语义信息的能力。基于此,作者还加入了Temporal Segment Network(TSN)来提高模型的能力。
介绍
在提取骨架序列信息时,现有模型一般都是
- 利用RNN来提取时序上的动态信息
- 利用CNN来提取某一帧的骨架序列信息(这里一般是将3D骨架当作一个2D图像,即坐标当作通道)
- 将骨架序列构建为图模型,GCN
但是这3种方法都有一个缺点:
这些操作无论在空间还是在时间上都是基于邻接点的局部操作
文章模型概述:
本文作者提出了一个Self-Attention Network(SAN)来解决以上的问题,并且能够得到更好的特征信息。
-
原始特征信息需要首先经过Encoder层,提取出encoded 特征信息。
-
Encoded signals 再输入到SAN-Variants,计算序列每一个位置的关系密切层度。
-
结构化的SAN结果综合在一起,能够更好的捕捉更高层的语义理解信息。
本篇文章主要贡献:
- 为了从人体骨骼序列中提取到更加有效的深层语义关系,作者提出了SAN-Variants(SAN-V1,SAN-V2 and SAN-V3)
- 将SAN-Varants与Temporal Segment Network(TSN)相结合,提升了模型的表现。
- 可视化自注意力下的各帧联系紧密程度。
- 在当先的两大数据集上取得SOTA
Self-Attention Network
本节简要回顾Self-Attention Network
SAN是用来计算表征输入序列任意位置之间的联系程度。这篇文章的SAN机制参考了之前这篇文章。即该注意力函数也包含了query ,keys ,values ,这里query,keys都有相同的维度,values以及output有相同的维度.
这里的是一个缩放因子,目的在于起调节的作用,使得内积不易过大
Muti-head attention:
多头attention:
- 对query,key,value进行线性变换
- 输入到缩放点积attention机制,重复做h次,每次的输入为线性变换后的原始输入,这里,多头就是指做多次attention之后进行拼接,每一次算一个头,每次Q、K和V的线性变换参数W是不一样的;
- 最后,将拼接后的模型做一次线性变换,得到的值为多头attention的结果。可以看出,多头attention与传统的attention区别在于计算了h次,这样可以从不同的维度和表示子空间里学习到相关的信息,可通过attention可视化机制来验证。
同时本篇文章还做了残差连接、layer normalization。
Approach
该模型是基于SAN的,并且在前面需要有一个Encoder,在这里作者采用了简单的非线性操作或者CNN操作来原始的关节序列进行一个编码,得到encoded 特征。
在这里原始关节序列有两个,即Position Data 、Motion Data.
Raw Position and Motion Data
Position Data:
原始的关节点序列数据。定义为:
其中
F表示帧数
C表示每个节点的坐标数
,S表示在一帧画面中有人数,J表示每个人的节点个数。所以在这里就是在一帧画面中的所有节点个数。以此,我们可以如下定义Position Data:
.代表在画面中的第s个人的骨架序列。
Motion Data
该数据为动作序列:。
该序列是由邻接帧的相同关节点的坐标差所得到的。即:
同样,对于在一帧中的一个人而言,可以表示为
Encoder
作者用了两种方法去encode我们的输入数据和
Non-Linear Encoder
前馈神经网络(FCNN)-包含一个非线性**函数—— 输入向量映射到高纬度(提取更高阶的信息)
简单来讲,就是对于输入的变换为
CNN Based Encoder
在CNN Encoder中,包含4个卷积层。
为了更形象的解释该Encoder的操作过程,我将以SAN-V1为例子作为说明
如图3(b),我们首先将以及进行一个聚合,即有.
1.卷积第一层:
卷积核:,步长为1
假设输入为,则在经过卷积后,output为 ,相当于把坐标扩展为到了64维。
2.卷积第二层:
卷积核:,步长1,padding到原来shape
输出tensor为
需要注意的是,在这里我们的卷积核为$3 \times 1 $,即我们每三帧做一个卷积,可以提取到时序上的局部信息。
3.permute
对shape从变换为,将视作channel,再进行以下的卷积操作。
4.卷积第三层+Max-pooling
卷积核:,步长1,pooling-window:
卷积后shape,然后max-pooling,shape:
5.卷积第四层+max-pooling
卷积核:,步长1,pooling-window
卷积后shape,然后max-pooling,shape:
对于SAN-V2,SAN-V3.具体的卷积方案也是这样,但是在early fusion上会有一定的区别,具体的看上面的图3即可理解
SAN Variant 结构
SAN的基础结构如图3(a)所示。
Self-Attention Network Detail
Position Embeddings
对于channel的一个整合。该层的输出为,例如对于CNN based encoder 后的输出,这里的 .Position embedding的作用就是将张量变换为一个在某一维度有序的特征张量。这样有助于去捕获在一帧中的全局信息。该层的输出y是输入序列x和位置嵌入层p的逐元素相加。
输出y会直接被喂入第二个self-attention层输出。
每一个self-attention 层都会计算到矩阵逐元素的可能性。这里采用了Muti-head Self-attention机制,所以每一层的输出为,其中N为self-attention的层数。
对于所有的输出,进行以下操作:
即有:.代表全局平均层,则是一个全连接层。
SAN-V1
这是一个baseline block
首先将进行聚合,即有
经过Encoder后再输入到Position Embeddings后,输出
然后再输入到如图3(a)中的SAN层中,最后再通过一个全连接层来进行分类。
SAN-V2,SAN-V3如上图的结构所描述一致,就不再赘述,详细描述更可以参考论文对应节的内容。
Temporal Segment Self-Attention Network (TS-SAN)
将一个动作视频分割为K片。对于每一个clip,还是应用SAN-variants来学习时序的特征。
Note:对于每一个clip,他们的所有层的权重都是共享的。具体的公式:
其中F表示SAN-Variant中的任意一种模型,W是该模型的权重(可以由公式看出是共享的)。
对于所有clip的输出,我们采取C函数操作,该操作可以为:逐元素max,平均等。
结论
在本篇论文中,主要就是利用SAN来进行动作的识别,并且介绍了TSN一种分片的方法。 具体的Self-Attention内容可以参考《Attention is all your need》这篇论文。
欢迎大家讨论交流!