图卷积相关论文解读 AAGCN

二、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的二阶信息可以计算为:

    在提取完二阶信息后,作者设计了一个双流网络,以节点特征与骨骼特征分别为输入,共同作用输出识别动作的置信度。

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值