项目说明

目前,基于图神经网络的骨骼点动作识别是主流的方法,但也有一些方法尝试引入注意力机制、传统卷积神经网络到这一任务中。

本项目利用PaddleVideo复现了用于动作识别的DSTANet网络,并利用其参加CCF“基于飞桨实现花样滑冰选手骨骼点动作识别“的比赛,简单设置下在初赛A榜上达到62.78分。

以下命令可以一键执行!

模型

论文题目:Decoupled Spatial-Temporal Attention Network
for Skeleton-Based Action Recognition

论文下载:https://arxiv.org/pdf/2007.03263v1.pdf

动态骨骼数据以人体关节的二维/三维坐标表示,由于其高度的语义信息和环境鲁棒性,已被广泛用于人体动作识别。然而,以前的方法严重依赖于设计手工制作的遍历规则或图形拓扑来绘制关节之间的依赖关系,这在性能和可推广性方面受到限制。在这项工作中,文章提出了一种新的解耦时空注意网络(DSTANet),用于基于骨架的动作识别。它只涉及注意块,允许建模关节之间的时空依赖关系,而无需知道它们的位置或相互连接。具体来说,为了满足骨骼数据的特定要求,提出了三种构建注意块的技术,即时空注意解耦、解耦位置编码和空间全局正则化。此外,从数据方面,文章引入了骨骼数据解耦技术,以强调空间/时间和不同运动尺度的特定特征,从而更全面地理解人类行为。为了测试所提出方法的有效性,文章在基于骨架的手势和动作识别的四个具有挑战性的数据集上进行了广泛的实验,即SHREC、DHG、NTU-60和NTU-120,其中DSTANet在文章发表时在所有这些数据集上都实现了最先进的性能。
目前在paperwithcode上各大数据集上排名也比较靠前。

网络架构图

输入是具有N个关节、T帧和C通道的骨架序列。在每一层中,首先将输入视为矩阵,即N个具有TC通道的元素,并将其输入到空间注意模块(如图2所示)中,以模拟关节之间的空间关系。然后,将输出矩阵转换为T个元素,每个元素有N个C通道,并将其输入到时间注意模块中,以模拟帧之间的时间关系。总共有L层堆叠来更新功能。最终的输出特征是全局平均的,并输入到一个完全连接的层中,以获得分类分数。

时序注意力机制

解耦合策略

时序注意力机制

DSTA-Net

  • 推荐讲解博客

阅读Decoupled Spatial-Temporal Attention Network for Skeleton-Based Action Recognition

PaperWithCode排名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cfzq4rDX-1637020613989)(figure/sort.png)]

数据集

本赛题数据集旨在通过花样滑冰研究人体的运动。在花样滑冰运动中,人体姿态和运动轨迹相较于其他运动呈现复杂性强、类别多的特点,有助于细粒度图深度学习新模型、新任务的研究。

在数据集中,所有的视频素材从2017 到2018 年的花样滑冰锦标赛中采集。源视频素材中视频的帧率被统一标准化至每秒30 帧,并且图像大小是1080 * 720 来保证数据集的相对一致性。之后我们通过2D姿态估计算法Open Pose对视频进行逐帧骨骼点提取,最后以.npy格式保存数据集。

训练数据集与测试数据集的目录结构如下所示:

train_data.npy
train_label.npy
test_A_data.npy
test_B_data.npy  # B榜测试集后续公开

其中train_label.npy通过np.load()读取后会得到一个一维张量,每一个元素为一个值在0-29之间的整形变量代表动作的标签;data.npy文件通过np.load()读取后,会得到一个形状为N×C×T×V×M的五维张量,每个维度的具体含义如下:

维度符号表示维度值大小维度含义补充说明
N样本数代表N个样本
C3分别代表每个关节点的x,y坐标和置信度每个x,y均被放缩至-1到1之间
T2500代表动作的持续时间长度,共有2500帧有的动作的实际长度可能不足2500,例如可能只有500的有效帧数,我们在其后重复补充0直到2500帧,来保证T维度的统一性
V25代表25个关节点具体关节点的含义可看下方的骨架示例图
M1代表1个运动员个数

骨架示例图:

数据集下载

数据集可以从比赛链接处下载,报名成功后,即可获取数据集下载链接。数据集下载完成后,可以将数据集上传到aistudio项目中,上传后的数据集路径在/home/aistudio/data目录下。

如果是直接fork的本项目,在/home/aistudio/data 目录下已经包含了下载好的训练数据和测试数据。

数据集重新划分

由于原数据集没有验证集,所以采用了随机划分的形式,生成了newdata。在项目内newdata目录下。训练使用可选这个数据。训练集和验证比例0.85比0.15;

注意:当然可以不划分,直接用原来的数据集,只需要改一下配置文件的数据集路径。

import numpy as np
file_path = '/home/aistudio/data/data104925/train_data.npy'
label_path = '/home/aistudio/data/data104925/train_label.npy'
train_data = np.load(file_path) #train_data.npy
label = np.load(label_path)
print(train_data.shape) #(2922, 3, 2500, 25, 1) 训练集样本2922
# file_path = '/home/aistudio/data/data104924/test_A_data.npy'
# test_data = np.load(file_path) #train_data.npy
# print(data.shape) #(628, 3, 2500, 25, 1) 测试集样本628

# 随机划分训练集为训练和验证两部分
shuffle_indexes=np.random.permutation(len(train_data))
val_ratio=0.15 # 验证比例
val_size=int(len(train_data)*val_ratio)     #规定测试集个数

val_indexes=shuffle_indexes[:val_size]  #测试集索引
train_indexes=shuffle_indexes[val_size:] #训练集索引
new_train_data = train_data[train_indexes,...]
new_train_label = label[train_indexes]
new_val_data = train_data[val_indexes,...]
new_val_label = label[val_indexes]
print(new_train_data.shape)
print(new_val_data.shape)
print(new_val_label.shape)
%mkdir newdata/
np.save("/home/aistudio/newdata/train_data.npy",new_train_data)
np.save("/home/aistudio/newdata/val_data.npy",new_val_data)
np.save("/home/aistudio/newdata/train_label.npy",new_train_label)
np.save("/home/aistudio/newdata/val_label.npy",new_val_label)
!tree -L 3 /home/aistudio/data 
!tree -L 3 /home/aistudio/newdata 

基于PaddleVideo的DSTANet识别模型

本项目基于PaddleVideo项目完成识别网络训练:

  • PaddleVideo github
  • PaddlePaddle-gpu==2.1.2

DSTANet模型代码

位于DSTANet/paddlevideo/modeling/backbones/dstanet.py

配置代码环境,安装相应的依赖包

%cd DSTANet/
!python3.7 -m pip install --upgrade pip
!python3.7 -m pip install --upgrade -r requirements.txt

训练

训练方式采用PaddleVideo的训练方式,在yaml文件中配置模型、优化器和数据集等信息。

!python3.7 main.py -c configs/recognition/dstanet/dstanetv1.yaml --validate
# !python3.7 main.py -c configs/recognition/dstanet/dstanetv2.yaml #无验证集的原训练集划分

测试脚本

模型训练完成后,可使用测试脚本进行评估,

测试脚本启动命令

python3.7 main.py --test -c configs/recognition/dstanet/dstanetv1.yaml -w output/DSTANETv1/DSTANETv1_best.pdparams
  • 通过-c参数指定配置文件,通过-w指定权重存放路径进行模型测试。

  • 评估结果保存在submission.csv文件中,可在评测官网提交查看得分。

!python3.7 main.py --test -c configs/recognition/dstanet/dstanetv1.yaml -w output/DSTANETv1/DSTANETv1_best.pdparams

提交分数

评估结果保存在submission.csv文件中,可在评测官网提交查看得分。

项目内DSTANet下有可直接提交的文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d4LJsg0o-1637020613991)(figure/score.png)]

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐