好久不用CSDN发东西了,近期研究可以说有进展却又没什么进展,达到方向切换到了动作识别,目前正在实习,具体的内容方向是基于骨骼关键点的动作识别(skeleton based action recognition)。 在经过了多多的调研之后,觉得目前还是mmaction2平台最香,因此希望后续工作(包括效果的验证、实验、对比等等)包括前期的端到端工作都在mmaction2工具箱上展开。
学习mmaction2的目的是能够借助该平台对数据集、算法、演示、流程、搭建等等环节都能够理解的更加清晰和透彻(毕竟目前是一个小白),为后续自己的真正实际问题解决做准备。
本篇文章主要是基于mmaction2的中文教程(链接见文末),此外还有一些参考的文章以及github库中的注释性教程。
mmaction2是商汤和港中文联合研发的一个基于pytorch框架的人体动作识别的深度学习开源工具库,可以提供包括行为识别(分类)、时序动作检测、时空动作检测、骨骼动作识别(分类)等等多种子类问题的算法框架,包括数据集等等,可以非常方便的使用。
mmaction2 和广为人知的检测工具库mmdetection 一样,都属于open-mmlab 工具箱下属的一个模块,目前仍在不断更新与拓展功能及算法,可以预见的是,其在人体行为识别方面将被更多人使用。
目前在骨骼动作识别方面,mmaction2 已集成的算法有两个:
ST-GCN: 2018年发布,是使用图卷积做骨骼关键点识别的开山之作,给出了经典的骨骼关键点拓扑表示方法
Pose-C3D: 2020年发布,简单粗暴,是使用3DCNN做骨骼关键点的一枝独秀(文章进行了大量的实验,会让人觉得是穷近期极的天花板的存在),同时也是近3年为数不多的使用3DCNN解决骨骼关键点且有较好性能表现的文章。
mmaction2在骨骼点识别算法中内置了上述的ST-GCN与 Pose-C3D 两种网络模型,其具体的介绍以及内容存储在mmaction2/configs/skeleton/
中。 对于每个模型来说,官方的指南基本上从以下几个方面展开:
Introduction :介绍模型及其所属文章的基本信息
Model Zoo :给出一些已经训练好的模型参数、性能、模型文件以及其他信息
Train : 训练的步骤以及命令行,通常会附一个实例展示具体用法
Test :测试的步骤以及命令行,通常会附一个实例展示具体用法
》github链接《
ST-GCN介绍的比较草率,唯一的亮点是使用3D-SKELETON数据进行训练时,得到了比原论文还要高的识别准确率(84.61),而使用自生成的2D-SKELETON作为训练与测试样本的时候得到了更高的,这一点在PoseC3D 的文章中有提到,作者认为原因是3D数据集的质量本身不够高,感兴趣的可以去看原文。
具体内容:
相比之下,PoseC3D的介绍要更加详细且全面:
》参考链接《
接上,以PoseC3D的数据集准备过程为例,简述基于MMAction2的骨骼关键点数据集准备流程。
简介
MMAction2 发布 Revisiting Skeleton-based Action Recognition 论文中所使用的骨架标注。 默认使用 Faster-RCNN 作为人体检测器, 使用 HRNet-w32 作为单人姿态估计模型。 对于 FineGYM 数据集,MMAction2 使用的是运动员的真实框标注,而非检测器所出的框。目前,MMAction2 已发布 FineGYM 和 NTURGB-D Xsub 部分的骨架标注
准备标注文件
目前,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 姿态标注文件,首先,用户需要由源码安装 mmdetection 和 mmpose。之后,用户需要在 ntu_pose_extraction.py
中指定 mmdet_root
和 mmpose_root
变量。 最后,用户可使用以下脚本进行 NTURGB+D 视频的姿态提取:
python ntu_pose_extraction.py S001C001P001R001A001_rgb.avi S001C001P001R001A001.pkl
在用户获得数据集某部分所有视频的姿态标注文件(如 ntu60_xsub_val
)后,可以将其集合成一个 list 数据并保存为 ntu60_xsub_val.pkl
。用户可用这些大型 pickle 文件进行训练和测试。
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,具体可见后面一小节。
数据可视化
为了可视化骨架数据,用户需要准备 RGB 的视频。详情可参考 visualize_heatmap_volume。这里提供一些 NTU-60 和 FineGYM 上的例子
如何将 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 网络上进行训练
》参考链接《 ——Custom Dataset Training with PoseC3D—mmaction2—github
用户:bit-scientist 提供了一种使用自定义(自制)数据集在PoseC3D模型上进行训练的方法。具体可表述如下:
PoseC3D模型是只依赖骨骼数据和标签的,因此在数据准备方面,只需准备好相应的骨骼数据以及标签,并将其按照训练样本和测试样本进行划分即可。
ntu_pose_extraction.py
中的 mmdet_root
与 mmpose_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
步骤
数据集生成:
在基于上述的流程对所有视频进行骨骼点提取后(如果是其他形式的骨骼点信息,上一步可以变成将其他骨骼点信息转化为.pkl 格式)
将所有生成的.pkl文件储存为到一个list(列表)中,转化为单个文件,并且将对应的标签也储存在一个对应长度的list中。
如:custom_dataset_train.pkl
或 custom_dataset_val.pkl
形成可以直接被模型读取的数据集。
进行训练/测试:
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
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 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