action|DGNN论文阅读

《Skeleton-based Action Recognition with Directed Graph Neural Networks》
这一篇论文总体上,我觉得写的是很有逻辑调理,创新点也很清晰,基本是对于ST-GCN和2s-AGCN进行的改进了。
首先一上来,作者是先对已有的基于骨骼行为识别的算法进行了一个分类,分为了三种:RNNs、CNNs和GCNs,他们分别是将骨骼数据转化成了 向量序列、伪图像 和 图。作者这篇文章中是使用GCN。
而之前的GCN方法通常是将骨骼表示为无向图,也就是利用其三维坐标,关节是节点坐标,骨骼就是边(两坐标向量之差),再使用两个独立网络对骨骼和关节进行建模,这种处理方式没有办法充分的利用关节和骨骼之间的依赖关系。
所以 作者在此基础上,提出了一个大的创新点,就是 将骨架表示为一个有向无环图(Directed Acyclic Graph),也就是DAG。这时候也许会想问,骨骼哪来的方向,方向又要怎么去确定。作者对其的定义为:首先人体骨架会有一个中心点(比如在ST-GCN中也出现的胸腔部位那的中心点1号),每一条边的方向是由顶点与中心点之间的距离来决定的,具体的表示为 离中心点近的点 指向 离中心点远的点。如下图所示:
action|DGNN论文阅读
文章图片

【action|DGNN论文阅读】 至此,我觉得都是很好理解的,对于整个有向无环图来说,方向已经明白了,无环就更不用说了,人体的骨架本来就没有环。但是,接下来的概念才是真正绕的,需要理清楚。
既然每一条边的方向,我们都知道了,那我们针对于每一个顶点,或者是每一条边来说吧,是不是应该给他们各自命个名呀。
形式上而言,对于每一个顶点action|DGNN论文阅读
文章图片
,我们将指向它的边定义为传入边 action|DGNN论文阅读
文章图片
,从它发出的边定义为
对于有向边action|DGNN论文阅读
文章图片
,定义它是从源顶点action|DGNN论文阅读
文章图片
到目标顶点action|DGNN论文阅读
文章图片
的向量。
action|DGNN论文阅读
文章图片

如上图, 对于顶点v2,它的传入边就是e1,传出边就是e2和e3。那对于边e1来说呢,v1就是它的源顶点,v2就是它的目标顶点。
所以,如果vi 是 ej 的目标(源)顶点,那么ej 就是 vi 的传入(出)边【这个逻辑要理理清】

我们也都知道,每一条边来说,它的源顶点和目标顶点肯定是各自只有一个的,但是对于每一个顶点来说,它的传入和传出边的数量就不是固定的了,比如上图中 v2的传出边就有2条
最后,我们把顶点vi的传入边的集合称为 action|DGNN论文阅读
文章图片
,传出边的集合称为action|DGNN论文阅读
文章图片
。 V就是所以顶点的集合。那这样子的话,一个有向图G就可以表示为 G = (V,action|DGNN论文阅读
文章图片
)。而一个基于骨架的视频是一系列的帧组成,所以就可以表示为 S = (G1,G2,...,Gt),其中t就是视频的长度。
至此,有向图的问题也解决了,那接下来就是怎么去提取图中的特征了。针对于这种有向图,作者就提出了Directed Graph Neural Network(DGNN)网络。该网络包含多个层,每个层都提供一个包含顶点和边的属性的图,并输出带有更新属性的相同图。 (也就是说,每经过一层,顶点和边的特征就会得到一次更新)(并且在这里,顶点和边的属性它是用向量表示的)
在底层,每个顶点或边只能从其相邻的边或顶点接收属性。这些层中的模型旨在更新属性时提取顶点和边的局部信息。
在顶层,来自彼此距离较远的关节和骨骼的信息可以累积在一起。因此,对于识别任务而言,提取的信息更具全局性和语义性
其实,这个有点像CNN的过程,底层的时候,提取关节信息可能只需要一个关节和两个相连的骨骼就行了。而在顶层,它可以累积距离更远的关节,比如手和脚,这样子信息的利用就会更加充分。
那要怎么去进行更新呢?
其实就是要讲它的DGN块了,主要包含两个聚合函数和两个更新函数。更新函数用于根据连接的边和顶点更新顶点和边的属性。聚合函数用于聚合连接到一个顶点的多个传入(传出)边中包含的属性。
整个过程其实也就是四步,分别是聚合入边和出边的信息,再更新顶点和边的属性。公式如下:
action|DGNN论文阅读
文章图片

当然,这个顺序肯定不是随便的,论文中给出如下图
action|DGNN论文阅读
文章图片

也就是先顶点更新,再边更新。通过大量实验,paper选择了平均池作为传入边和传出边的聚合函数,并选择了单个完全连接层作为本工作中的更新函数
接下来就是DAG的具体实现了,对于每一个DAG块,输入的顶点是 C x T x Nv的张量fv,C是通道数,T是帧数,Nv是顶点数。同样,输入边也是C x T x Ne的张量,Ne是边数。根据顶点和边的数量关系,我们应该能知道,Ne是要比Nv少1的。
所以和ST-GCN类似,也需要取一个Nv x Ne的关联矩阵A。不同的是,ST-GCN中取得是NxN的邻接矩阵,因为是无向图。而本论文是有向图,所以用关联矩阵区分一下。并且其元素的意义也是不一样的,这里的A是代表了点和边的组合,ST-GCN中仅单纯是点与点。
那既然是有向图,肯定是需要在A中将这个方向的概念体现出来的。paper中规定了:如果v是e的源顶点,或者e是v的传出边,那么相应的 Aij = -1 ; 如果v是e的目标顶点,或者e是v的传入边,那么相应的 Aij = 1 ;如果没有连接,Aij = 0;并且为了进一步区分源顶点和目标顶点,paper中用action|DGNN论文阅读
文章图片
表示源顶点的关联矩阵,而其本来在A中的值是-1,这里需要取他的绝对值。action|DGNN论文阅读
文章图片
为目标顶点的关联矩阵。可以用之前的一个图(a)来举例说明一下:
action|DGNN论文阅读
文章图片

对于这个图(a)而言,A是其关联矩阵,但是将其进行转置了。如果对于转置的矩阵来看,三行四列,对应的就是三个节点和四条边。
A11 = -1 ,说明v1顶点是e1边的源顶点,所以值是-1,以此类推,可以得到整个A矩阵。
As和At对A中元素进行区分。
接着,看它的聚合函数g。给定一个张量和关联矩阵,他们的聚合函数其实就是矩阵的相乘。比如输入顶点张量fv 和 As,先将fv的shape转换成CT x Nv(本来是C x T x Nv), 因为As的shape是Nv x Nv的,所以乘完以后的shape是 CT x Ne的张量。聚合函数的道理就是把关联矩阵中元素为1的保留,为0的就不保留了。元素为1就是指它的传入边或是目标顶点,为0就不是,所以按照矩阵相乘的原理就可以实现聚合。最后就可以将公式转换成下面的式子,其中H是一个单层的全连接层,action|DGNN论文阅读
文章图片
表示经过标准化处理
action|DGNN论文阅读
文章图片

那对于自适应这一块内容,其实也就是注意力机制。这里就需要提到之前说DGNN是对ST-GCN和2s-AGCN的进一步改进,其中就有一点就是这里。回顾一下ST-GCN注意力机制的缺点和2s-AGCN中的对其的改进,写在这个博客中了2s-AGCN论文理解_Eric加油学!的博客-CSDN博客
简单来说,就是ST-GCN里面初始邻接矩阵为A0,它的更新函数是 A = PA0,其中P是初始化为1的可训练矩阵,但是要注意的是,它们的相乘是哈达玛积,也就是两个矩阵的对应元素相乘,并不是矩阵的乘法,,所以带来的问题就是A0里面如果有一些元素为0,则无论怎么更新,它的值永远都是0,也就是没办法创造出原本没有的连接。【打个比方,两条腿之间不是直接相连的吧,但是你走路肯定两条腿是一前一后的关系,这都是有联系的,但是ST-GCN这样子处理就没办法挖掘到这样的联系】
那2s-AGCN就对它做出了改进,它将这个矩阵A分成了3分,对其做加法。也就是A = P + A0.这里选择用相加来代替相乘。初始化P都为0的。那这样子就可以有效的避免了,无论怎么更新,原本为0的一直为0的弊端。【到此为止,是不是觉得问题已经得到了有效的解决】
但这篇论文的作者认为,依旧不是很好,他认为,A0是不可修改的,并且所有层都要用到,这不应该是一个自适应网络所想要的。如果不去掉,训练到后面,无论训练到哪种程度,P所包含的特征肯定是足够了的,这时候A0就是个累赘了。但是又不能把它直接给去掉,因为刚开始训练的时候除了本身物理结构就没什么好的参考指标了,所以肯定是需要A0的,它代表了人体的先验知识,少了的话肯定效果不是最优。【那这样,矛盾就来了,既不能直接去掉,又不能一直用它,那要怎么搞】
作者的办法就是,我现在前10个批次的训练中加上这个A0,后面的训练就不要了。这样既解决了刚开始训练时,提供了参考指标,又解决了训练后期加上A0后的冗余。完美的解决了ST-GCN和2s-AGCN的问题。
至于双流网络的内容,就没什么特别好讲的了,其实可以参考2s-AGCN,都差不多的样子,就是另一个分支网络输入的是顶点的差和边的差所组成的向量,输入到另一个DGNN网最后融合分类。
至此,DGNN就基本阅读完毕了,总体来说,ST-GCN作为图方法的奠基石,为后续的所有研究奠定了基础,2s-AGCN对其进行完善,DGNN又进一步优化。

    推荐阅读