二、AAGCN
1、与ST-GCN相比的创新点。
在说本篇论文的创新前,先说明一下ST-GCN的缺点。ST-GCN的注意力机制灵活性不够,掩码 𝑀𝑘 是与邻接矩阵直接相乘,这里说的相乘是按元素相乘,并不是矩阵相乘。这就造成一个现象,就是如果邻接矩阵 𝐴𝑘 里面部分元素为0,那么无论 𝑀𝑘 对应元素为何值,最后结果都是0。换句话说就是不会创造不存在的连接,比如对于“行走”动作,手和腿的联系很大,但是手和腿没有直接相连,所以效果不好。ST-GCN的第二个缺点就是没有利用骨骼数据的第二特征,这里第一特征就是关节坐标,第二特征就是骨骼的长度和方向。直觉上,第二特征也包含了丰富的行为信息。
在AAGCN中,(1)提出了自适应的图卷积网络,也就是引入了两个额外的参数化(可学习)的邻接矩阵,这两个矩阵分别用来:Bk学习所有数据中的共同模式(也就是所有数据中统一的共性关注点);Ck 学习单个数据中独有的模式(也就是每个数据中独有的关注点);(2)注意力机制的改进;(3)二阶信息的提取和多流机制。
2、自适应图卷积神经网络
自适应图神经网络与ST-GCN的区别之一在于引入了参数化,可学习的邻接矩阵𝐵𝑘与𝐶𝑘。这样的邻接矩阵可以解决STGCN中骨架拓扑结构固定的问题。
可见,除了最基本的邻接矩阵𝐴𝑘外,作者还引入了两个可学习的邻接矩阵𝐵𝑘与𝐶𝑘。这里的𝐵𝑘与STGCN中的Learnable edge importance weight相似,是一个参数化的𝑁×𝑁的矩阵(𝑁为关节点个数)。
𝐵𝑘被设计来学习所有数据中的共同模式(也就是所有数据中统一的共性关注点)。但对于每个输入数据而言,其对于骨骼上不同关节的关注点应当或多或少存在一些差异。
因此,作者又引入了一个𝐶𝑘来学习单个数据中独有的模式(也就是每个数据中独有的关注点),这个图𝐶𝑘对于不同输入样本应当是不同的。为了获得从输入数据中获得任意两个节点之间是否有关联,以及关联强度多少,作者应用了normalized embedded Gaussian function。
𝐶𝑘的获取过程类似于视觉注意力中的Non-local,即:
- 输入特征𝑓𝑖𝑛的维度为(𝐶𝑖𝑛,𝑇,𝑁)
- 使用2个不同的1x1卷积对输入特征𝑓𝑖𝑛进行特征提取,获得两个输出𝜃𝑘与𝜙𝑘,维度均为(𝐶𝑒,𝑇,𝑁)
- 将𝜃𝑘与𝜙𝑘分别reshape至𝑁×𝐶𝑒𝑇和𝐶𝑒𝑇×𝑁
- 将reshape后的𝜃𝑘与𝜙𝑘进行矩阵相乘,获得𝑁×𝑁的矩阵
- 将获得𝑁×𝑁的矩阵进行softmax,获得归一化后的结果,即为𝐶𝑘
值得注意的是,𝜃𝑘与𝜙𝑘进行矩阵相乘的本质就是计算每个节点之间的相似度。
获得𝐶𝑘后,将矩阵𝐴𝑘,𝐵𝑘与𝐶𝑘按位相加后获得最终的自适应邻接矩阵。按位相加避免了相乘后非相邻节点间无法建立联系的问题。
def __init__(): self.A = nn.Parameter(A)def forward(self, x): N, C, T, V = x.size() y = None if self.adaptive: for i in range(self.num_subset): A1 = self.conv_a[i](x).permute(0, 3, 1, 2).contiguous().view(N, V, self.inter_c * T) A2 = self.conv_b[i](x).view(N, self.inter_c * T, V) A1 = self.tan(torch.matmul(A1, A2) / A1.size(-1)) # N V V A1 = self.A[i] + A1 * self.alpha A2 = x.view(N, C * T, V) z = self.conv_d[i](torch.matmul(A2, A1).view(N, C, T, V)) y = z + y if y is not None else z else: for i in range(self.num_subset): A1 = self.A[i] A2 = x.view(N, C * T, V) z = self.conv_d[i](torch.matmul(A2, A1).view(N, C, T, V)) y = z + y if y is not None else z y = self.relu(self.bn(y) + self.down(x))
- A是邻接矩阵列表,由三个相同大小的𝐴𝑘组成。这三个矩阵分别反映了关节点本身,向心点集合以及离心点集合的运动关系,与ST-GCN一致;
- self.A就是𝐵𝑘
- A1 就是计算获得的𝐶𝑘
- self.conv_a,self.conv_b,self.conv_d是获取𝜃𝑘,𝜙𝑘以及聚合后进行特征提取的卷积模块
- y = z + y if y is not None else z是对不同卷积核上的输出按位相加
- y+= self.down(x)是残差连接
AAGCN的公式:
AGCN-2S公式:
基本模块:(其中convs是AGCN,convt为TCN,STC为注意力机制)
总的模块:共有 9 个基本模块。每个区块的三个数字分别代表输入通道数、输出通道数和步长。
3、 注意力机制
(1)空间注意力模块(SAM) 1×Cin×N
(2)时间注意力模块(TAM) 1×T×1
(3)通道注意力模块(CAM) C×1×1
if self.attention: # SAM self.conv_ta = nn.Conv1d(out_channels, 1, 9, padding=4) # TAM ker_joint = num_joints if num_joints % 2 else num_joints - 1 pad = (ker_joint - 1) // 2 self.conv_sa = nn.Conv1d(out_channels, 1, ker_joint, padding=pad) # CAM rr = 2 self.fc1c = nn.Linear(out_channels, out_channels // rr) self.fc2c = nn.Linear(out_channels // rr, out_channels)
4、二阶信息
“first-order information”指的是关节点的位置信息,而“second-order information”指的是相邻关节点之间(记做Bone)的方向与长度信息。
具体地,一根bone的两端关节点分别记做源关节点𝑣1(与人体重心较近的那个)与目标关节点𝑣2(与人体重心较远的那个)。那么这根bone的二阶信息可以计算为:
在提取完二阶信息后,作者设计了一个双流网络,以节点特征与骨骼特征分别为输入,共同作用输出识别动作的置信度。