MMAction2 学习笔记 (一)——骨骼动作识别模型相关内容

MMAction2 学习笔记 (一)——骨骼动作识别模型相关内容

0- 写在前面

好久不用CSDN发东西了,近期研究可以说有进展却又没什么进展,达到方向切换到了动作识别,目前正在实习,具体的内容方向是基于骨骼关键点的动作识别(skeleton based action recognition)。 在经过了多多的调研之后,觉得目前还是mmaction2平台最香,因此希望后续工作(包括效果的验证、实验、对比等等)包括前期的端到端工作都在mmaction2工具箱上展开。

学习mmaction2的目的是能够借助该平台对数据集、算法、演示、流程、搭建等等环节都能够理解的更加清晰和透彻(毕竟目前是一个小白),为后续自己的真正实际问题解决做准备。

本篇文章主要是基于mmaction2的中文教程(链接见文末),此外还有一些参考的文章以及github库中的注释性教程。

1- MMAction2 简介

MMAction2 学习笔记 (一)——骨骼动作识别模型相关内容_第1张图片

mmaction2是商汤和港中文联合研发的一个基于pytorch框架的人体动作识别的深度学习开源工具库,可以提供包括行为识别(分类)、时序动作检测、时空动作检测、骨骼动作识别(分类)等等多种子类问题的算法框架,包括数据集等等,可以非常方便的使用。
mmaction2 和广为人知的检测工具库mmdetection 一样,都属于open-mmlab 工具箱下属的一个模块,目前仍在不断更新与拓展功能及算法,可以预见的是,其在人体行为识别方面将被更多人使用。

2-骨骼关键点识别部分

目前在骨骼动作识别方面,mmaction2 已集成的算法有两个:
ST-GCN: 2018年发布,是使用图卷积做骨骼关键点识别的开山之作,给出了经典的骨骼关键点拓扑表示方法
Pose-C3D: 2020年发布,简单粗暴,是使用3DCNN做骨骼关键点的一枝独秀(文章进行了大量的实验,会让人觉得是穷近期极的天花板的存在),同时也是近3年为数不多的使用3DCNN解决骨骼关键点且有较好性能表现的文章。

网络模块的基本形式

mmaction2在骨骼点识别算法中内置了上述的ST-GCNPose-C3D 两种网络模型,其具体的介绍以及内容存储在mmaction2/configs/skeleton/ 中。 对于每个模型来说,官方的指南基本上从以下几个方面展开:
Introduction :介绍模型及其所属文章的基本信息
Model Zoo :给出一些已经训练好的模型参数、性能、模型文件以及其他信息
Train : 训练的步骤以及命令行,通常会附一个实例展示具体用法
Test :测试的步骤以及命令行,通常会附一个实例展示具体用法

ST-GCN

》github链接《
ST-GCN介绍的比较草率,唯一的亮点是使用3D-SKELETON数据进行训练时,得到了比原论文还要高的识别准确率(84.61),而使用自生成的2D-SKELETON作为训练与测试样本的时候得到了更高的,这一点在PoseC3D 的文章中有提到,作者认为原因是3D数据集的质量本身不够高,感兴趣的可以去看原文。
具体内容:

  1. 模型库中在NTU RGB+D数据集上进行了训练(X-Sub) 分别为2D版本和3D版本;
  2. 提供了模型训练的脚本
  3. 提供了模型测试的脚本

PoseC3D

相比之下,PoseC3D的介绍要更加详细且全面:

  1. 在 数据集方面,PoseC3D不光做了动作的可视化(因为文章是将关键点变成heatmap而不是拓扑图,感兴趣可以看原文),而且进行了多个数据集的尝试:FineGYM、NTU60_XSub、NTU120_XSub、UCF101、HMDB51,并且提供看了配置文件。
  2. 在训练与测试方面,同样给出了训练、测试的脚本以及数据。
  3. 在model-zoo中,作者给出了两条注释:
  • GPU 数量 指的是得到模型权重文件对应的 GPU 个数。默认地,MMAction2 所提供的配置文件对应使用 8 块 GPU 进行训练的情况。 依据 线性缩放规则,当用户使用不同数量的 GPU 或者每块 GPU 处理不同视频个数时,需要根据批大小等比例地调节学习率。 如,lr=0.2 对应 8 GPUs x 16 video/gpu,以及 lr=0.4 对应 16 GPUs x 16 video/gpu。
  • 用户可以参照 准备骨骼数据集 来获取以上配置文件使用的骨骼标注。

骨架数据集准备

》参考链接《
接上,以PoseC3D的数据集准备过程为例,简述基于MMAction2的骨骼关键点数据集准备流程。

  1. 简介
    MMAction2 发布 Revisiting Skeleton-based Action Recognition 论文中所使用的骨架标注。 默认使用 Faster-RCNN 作为人体检测器, 使用 HRNet-w32 作为单人姿态估计模型。 对于 FineGYM 数据集,MMAction2 使用的是运动员的真实框标注,而非检测器所出的框。目前,MMAction2 已发布 FineGYM 和 NTURGB-D Xsub 部分的骨架标注

  2. 准备标注文件
    目前,MMAction2 支持 HMDB51, UCF101, FineGYM 和 NTURGB+D 数据集。对于 FineGYM 数据集,用户可以使用以下脚本下载标注文件。

bash download_annotations.sh ${DATASET}

由于 NTURGB+D 数据集的 使用条例,MMAction2 并未直接发布实验中所使用的标注文件。 因此,这里提供生成 NTURGB+D 数据集中视频的姿态标注文件,这将生成一个 dict 数据并将其保存为一个 pickle 文件。 用户可以生成一个 list 用以包含对应视频的 dict 数据,并将其保存为一个 pickle 文件。 之后,用户可以获得 ntu60_xsub_train.pkl, ntu60_xsub_val.pkl, ntu120_xsub_train.pkl, ntu120_xsub_val.pkl 文件用于训练。

对于无法进行姿态提取的用户,这里提供了上述流程的输出结果,分别对应 NTURGB-D 数据集的 4 个部分:
ntu60_xsub_train: https://download.openmmlab.com/mmaction/posec3d/ntu60_xsub_train.pkl
ntu60_xsub_val: https://download.openmmlab.com/mmaction/posec3d/ntu60_xsub_val.pkl
ntu120_xsub_train: https://download.openmmlab.com/mmaction/posec3d/ntu120_xsub_train.pkl
ntu120_xsub_val: https://download.openmmlab.com/mmaction/posec3d/ntu120_xsub_val.pkl
hmdb51: https://download.openmmlab.com/mmaction/posec3d/hmdb51.pkl
ucf101: https://download.openmmlab.com/mmaction/posec3d/ucf101.pkl

若想生成单个视频的 2D 姿态标注文件,首先,用户需要由源码安装 mmdetectionmmpose。之后,用户需要在 ntu_pose_extraction.py 中指定 mmdet_rootmmpose_root 变量。 最后,用户可使用以下脚本进行 NTURGB+D 视频的姿态提取:

python ntu_pose_extraction.py S001C001P001R001A001_rgb.avi S001C001P001R001A001.pkl

在用户获得数据集某部分所有视频的姿态标注文件(如 ntu60_xsub_val)后,可以将其集合成一个 list 数据并保存为 ntu60_xsub_val.pkl。用户可用这些大型 pickle 文件进行训练和测试。

  1. PoseC3D 的标注文件格式
    这里简单介绍 PoseC3D 的标注文件格式。以 gym_train.pkl 为例:gym_train.pkl 存储一个长度为 20484 的 list,list 的每一项为单个视频的骨架标注 dict。每个 dict 的内容如下:

    keypoint:关键点坐标,大小为 N(#人数)x T(时序长度)x K(#关键点, 这里为17)x 2 (x,y 坐标)的 numpy array 数据类型
    keypoint_score:关键点的置信分数,大小为 N(#人数)x T(时序长度)x K(#关键点, 这里为17)的 numpy array 数据类型
    frame_dir: 对应视频名
    label: 动作类别
    img_shape: 每一帧图像的大小
    original_shape: 同上 img_shape
    total_frames: 视频时序长度

如用户想使用自己的数据集训练 PoseC3D,可以参考 Custom Dataset Training,具体可见后面一小节。

  1. 数据可视化
    为了可视化骨架数据,用户需要准备 RGB 的视频。详情可参考 visualize_heatmap_volume。这里提供一些 NTU-60 和 FineGYM 上的例子

  2. 如何将 NTU RGB+D 原始数据转化为 MMAction2 格式
    这里介绍如何将 NTU RGB+D 原始数据转化为 MMAction2 格式。首先,需要从 https://github.com/shahroudy/NTURGB-D 下载原始 NTU-RGBD 60 和 NTU-RGBD 120 数据集的原始骨架数据。

对于 NTU-RGBD 60 数据集,可使用以下脚本:

python gen_ntu_rgbd_raw.py --data-path your_raw_nturgbd60_skeleton_path --ignored-sample-path NTU_RGBD_samples_with_missing_skeletons.txt --out-folder your_nturgbd60_output_path --task ntu60

对于 NTU-RGBD 120 数据集,可使用以下脚本

python gen_ntu_rgbd_raw.py --data-path your_raw_nturgbd120_skeleton_path --ignored-sample-path NTU_RGBD120_samples_with_missing_skeletons.txt --out-folder your_nturgbd120_output_path --task ntu120

骨骼数据集可视化

使用自定义数据集训练 PoseC3D

接上,简述如何使用自己的数据集在PoseC3D 网络上进行训练

》参考链接《 ——Custom Dataset Training with PoseC3D—mmaction2—github
用户:bit-scientist 提供了一种使用自定义(自制)数据集在PoseC3D模型上进行训练的方法。具体可表述如下:

  1. 数据准备工作:

PoseC3D模型是只依赖骨骼数据和标签的,因此在数据准备方面,只需准备好相应的骨骼数据以及标签,并将其按照训练样本和测试样本进行划分即可。

  • 第一步是将 ntu_pose_extraction.py 中的 mmdet_rootmmpose_root 的占位符替换为你的文件安装路径。
  • 第二步,利用 ntu_pose_extraction.py 提供的工具为数据集中的每一个视频提取二维人体关键点,如果你的 文件路径为 some_video_from_my_dataset.mp4,那么执行的命令可以如下所示:
# You can use the above command to generate pickle files for all of your training and validation videos.
python ntu_pose_extraction.py some_video_from_my_dataset.mp4 some_video_from_my_dataset.pkl

由此可将原始的.MP4文件转换为.pkl文件。
这一过程中需要注意的一点是:
由于ntu_pose_extraction.py是专门为ntu视频的姿势提取而开发的,因此在使用此脚本从自定义视频数据集中提取姿势时,可以跳过ntu_det_postproc步骤

  1. 数据集生成:
    在基于上述的流程对所有视频进行骨骼点提取后(如果是其他形式的骨骼点信息,上一步可以变成将其他骨骼点信息转化为.pkl 格式)
    将所有生成的.pkl文件储存为到一个list(列表)中,转化为单个文件,并且将对应的标签也储存在一个对应长度的list中。
    如:custom_dataset_train.pklcustom_dataset_val.pkl
    形成可以直接被模型读取的数据集。

  2. 进行训练/测试:

  • 第一步需要修改边量来对新创建的注释文件进行初始化:
    进入要更改的配置文件,如:configs/skeleton/posec3d/slowonly_r50_u48_240e_ntu120_xsub_keypoint.py
 model = dict(
    ...
    cls_head=dict(
        ...
        num_classes=4,    # Your class number
        ...
    ),
    ...
)

ann_file_train = 'data/posec3d/custom_dataset_train.pkl'  # Your annotation for training
ann_file_val = 'data/posec3d/custom_dataset_val.pkl'      # Your annotation for validation

load_from = 'pretrained_weight.pth'       # Your can use released weights for initialization, set to None if training from scratch
# You can also alter the hyper parameters or training schedule
  • 第二步,使用工具库自带的基于mmaction2的训练脚本执行训练命令: (可参考 PoseC3D/Train)
    如执行:python tools/train.py configs/skeleton/posec3d/slowonly_r50_u48_240e_ntu120_xsub_keypoint.py--work-dir work_dirs/slowonly_r50_u48_240e_ntu120_xsub_keypoint --validate --test-best --gpus 2 --seed 0 --deterministic

基于上述的步骤可以实现训练自身数据集的流程。
关于更多或者其他形式的训练自身数据集的流程,可以参考官方发布的文档: Custom Dataset Training

其他

(一个题外话,非常幸运的是mmaction2于近期正好更新了大量的骨骼关键点相关的模型以及功能【见下图】,刚好能够用上,而且对我有不小帮助)
MMAction2 学习笔记 (一)——骨骼动作识别模型相关内容_第2张图片

参考与相关链接:

mmaction2 github 官网:https://github.com/open-mmlab/mmaction2
官方中文文档教程:https://mmaction2.readthedocs.io/zh_CN/latest/index.html
官方知乎介绍文章 :https://zhuanlan.zhihu.com/p/347705276
mmaction2: 使用自定义数据集训练 PoseC3D 的教程 :https://github.com/open-mmlab/mmaction2/blob/master/configs/skeleton/posec3d/custom_dataset_training.md

你可能感兴趣的:(学习笔记,pytorch,python,cv)