我是靠谱客的博主 虚拟银耳汤,最近开发中收集的这篇文章主要介绍论文笔记--Skeleton-Based Action Recognition with Multi-Stream Adaptive Graph Convolutional Networks,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Hello,接下来的30天,我会坚持输出30篇论文笔记,有些论文会配上代码的理解。以输出的方式倒逼着自己去输入。

想做实验,但是脑袋空空如也,没有新的想法,这是大脑在提醒你该踏实去科研去看论文做实验;想写论文,逻辑不清此举匮乏,这是大脑在提醒你该多多看论文记录下那些好的词句;想写一些文字表达自己想法时,却不知如何下笔,这是在大脑在提醒自己该看书了。

这样的情形还有很多,但我想表达的并不是“你真懒”,“You are bad”或者其他负面的话语。我想说,我们要看清、认清这些时刻,然后对其作出自己的调整和改变即可。不要责备自己,接受自己,改进完善自己。

好啦好啦,鸡汤就到这里了。下面开始正式学习论文吧!
希望可以坚持做好这件事,因为我的目标是年底的时候总结一份根据自己论文阅读经验整合而成各个方向的大总结。我一定可以的!

一、论文题目关键词提取

  • Multi-Stream:多流 。这里的多流指的是结合了joint 信息和bone信息,将其分别经过模型训练测试后,融合其结果。
  • Adaptive: 自适应。这也是近两年听到的挺多的词,本文是根据网络结构中不同层的语义信息、不同样本的特点生成唯一的图结构,而不是一个固定的图结构。

二、研究背景

近几年随着越来越多生活场景中应用的需要,基于视频流的行为识别的研究不断激增,学者们的研究方法也迭代的十分迅速。从最初传统光流等的方法,再到基于深度学习的方法,方法处理的多样性,准确率提升的迅速性,都是大家有目共睹的。

在基于深度学习的方法中,从网络结构来看,我们又可以将其分为三类:基于RNN的,基于CNN的,以及基于GCN的。具体的大家可以去看一下行为识别的综述,我在日后写到这方面论文的时候也会提及一些。

本文最初的起源是来自于大家都知道的ST-GCN这篇论文,作者的第一版论文2s-AGCN先对其进行改进,增加了自适应的部分,还提出了结合bone信息。第二版论文,也就是本文的这篇,在第一版的基础上再次改进了自适应的部分,增加了门控机制,并且提出了空间、帧、特征的三个注意力机制

三、研究内容 & 目标

(插曲:记得在我研一才进来的时候,我向师兄或者老师提问时,他们总会问我,别人这么做的目的是什么,为什么这么做?我回答最直接的就是提升准确率嘛。然后呢?然后然后。。。嗯。。。

直到最近,我感觉我才迷迷糊糊懵懵懂懂的领悟到那个目标是什么?为什么这么做?以及目标和内容之间的关系。(当然也可能是跟着我导写本子得来的经验总结吧)

目标也是目的,大的来说是准确率,小的来说是为了解决什么问题。比如本文的自适应就是为了解决ST-GCN中固定图的问题,使其更灵活。

内容则是为了解决上述目标,是怎么做的,用简单的话语概括用了什么方法来做的,而不是长篇大论细节描述方法。本文的内容呢,自适应模块就是通过改变邻接矩阵的方式,增加了一个参数化的邻接矩阵B随训练过程进行相应的改变,以及针对不同样本生成的矩阵C。整合全局图和唯一图的时候还增加了门控机制。并且提出了空间、帧、特征的三个注意力机制

四、本文贡献

  • 提出了一种自适应图卷积网络,该网络以端到端的方式自适应学习图的拓扑结构,能够更好地适应动作识别任务、全局控制网络的层次结构和不同的骨架样本。
  • 提出了一个STC-注意力模块,并将其嵌入到每个图卷积层中,该模块可以帮助模型学习有选择地关注有区别的关节、帧和信道。
  • 本工作首次将骨骼数据的二阶信息(骨骼)与一阶信息(关节)进行了公式化和组合,显著提高了识别性能。进一步提取关节和骨骼的运动信息,并将这四种模式集成到一个多流框架中。
  • 在两个大规模的基于骨架的动作识别数据集上验证了该方法的有效性。

五、研究方法

自适应部分:
在这里插入图片描述

if self.adaptive:
A = self.PA
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 = 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:
A = self.A.cuda(x.get_device()) * self.mask
for i in range(self.num_subset):
A1 = 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

注意力机制:
在这里插入图片描述

if attention:
# temporal attention
self.conv_ta = nn.Conv1d(out_channels, 1, 9, padding=4)
nn.init.constant_(self.conv_ta.weight, 0)
nn.init.constant_(self.conv_ta.bias, 0)
# s attention
ker_jpt = num_jpts - 1 if not num_jpts % 2 else num_jpts
pad = (ker_jpt - 1) // 2
self.conv_sa = nn.Conv1d(out_channels, 1, ker_jpt, padding=pad)
nn.init.xavier_normal_(self.conv_sa.weight)
nn.init.constant_(self.conv_sa.bias, 0)
# channel attention
rr = 2
self.fc1c = nn.Linear(out_channels, out_channels // rr)
self.fc2c = nn.Linear(out_channels // rr, out_channels)
nn.init.kaiming_normal_(self.fc1c.weight)
nn.init.constant_(self.fc1c.bias, 0)
nn.init.constant_(self.fc2c.weight, 0)
nn.init.constant_(self.fc2c.bias, 0)

六、评价指标

目前基于NTU数据集的评价指标,都是准确率
最新的论文中,也增加了计算复杂度、参数量等对比。不要着急,之后的论文笔记会有介绍到。

最后

以上就是虚拟银耳汤为你收集整理的论文笔记--Skeleton-Based Action Recognition with Multi-Stream Adaptive Graph Convolutional Networks的全部内容,希望文章能够帮你解决论文笔记--Skeleton-Based Action Recognition with Multi-Stream Adaptive Graph Convolutional Networks所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部