资讯动态

MMAction2 骨架动作识别数据集准备完全指南:骨架标注下载、格式规范与提取/转换脚本实战

发布时间:2026/10/14 17:25:40 来源:尧图企业网站定制
人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载本篇技术指南围绕 MMAction2 仓库中的 骨架数据集准备文档 展开系统讲解 Revisiting Skeleton-based Action Recognition2s-AGCN / PoseConv3D工作所使用的骨架标注体系预标注包的下载方式、pickle 标注的字段级格式规范、用 Faster R-CNN HRNet-w32 从 RGB 视频重新提取 2D 骨架的完整流程、把 NTU RGBD 原始骨架数据转换为 MMAction2 格式的 3D 标注生成方法以及如何把 BABEL 等第三方标注转为本项目格式。读完本文你将能够独立完成骨架动作识别任务的标注准备并理解标注文件在PoseDataset与数据 pipeline 中的消费方式。一、背景骨架标注从何而来MMAction2 发布的是 Revisiting Skeleton-based Action RecognitionarXiv:2104.13586Duan et al., 2021论文中使用的骨架标注。按官方建议引用misc{duan2021revisiting, title{Revisiting Skeleton-based Action Recognition}, author{Haodong Duan and Yue Zhao and Kai Chen and Dian Shao and Dahua Lin and Bo Dai}, year{2021}, eprint{2104.13586}, archivePrefix{arXiv}, primaryClass{cs.CV} }从标注生产链路看默认方案是人体检测Faster R-CNN ResNet50 backboneCOCO-person 训练仓库内置了推理配置 faster-rcnn_r50-caffe_fpn_ms-1x_coco-person.py单人体姿态估计HRNet-w32COCO 256x192 top-down heatmap对应推理配置 td-hm_hrnet-w32_8xb64-210e_coco-256x192_infer.pyFineGYM 特例不使用检测框而是直接使用运动员的 Ground-Truth bounding box 做姿态估计。这条链路的 API 层实现在 inference.pydetection_inference逐帧调用 mmdet 推理只保留det_cat_id默认 0即 person 类且得分超过det_score_thr的框pose_inference则对每个人体框调用 mmpose 的 top-down 推理。交互式的单视频推理 demo 见 demo_skeleton.py其默认检测/姿态配置与标注提取脚本完全一致。二、直接下载预处理的骨架标注官方已提供各数据集的预处理骨架标注包下载后可直接用于训练与测试数据集维度下载地址NTURGBD (NTU60)2Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/ntu60_2d.pklNTURGBD (NTU60)3Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/ntu60_3d.pklNTURGBD 120 (NTU120)2Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/ntu120_2d.pklNTURGBD 120 (NTU120)3Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/ntu120_3d.pklGYM (FineGYM)2Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/gym_2d.pklUCF1012Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/ucf101_2d.pklHMDB512Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/hmdb51_2d.pklDiving482Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/diving48_2d.pklKinetics4002Dhttps://download.openmmlab.com/mmaction/v1.0/skeleton/data/k400_2d.pkl使用注意事项原文档强调务必留意GYM 的 2D 骨架是用 Ground-Truth 人体框提取的对应的 GT 框文件为https://download.openmmlab.com/mmaction/pyskl/data/gym/gym_gt_bboxes.pkl在你的项目中使用该文件时需要引用 PoseConv3D 论文。Kinetics400 的 pkl 只包含目录信息Table of contents不含实际骨架标注。由于 K400 骨架标注体积巨大官方改为提供k400_kpfiles_2d.zip压缩包OpenXLab 数据集OpenMMLab/Kinetics400-skeleton下载后需解压到$MMACTION2/data/skeleton/kpfiles下才能进行 K400 骨架训练与测试。下载后的标注文件按惯例放在data/skeleton/下。这一点可以从骨架模型配置中得到印证例如 2s-agcn_8xb16-joint-u100-80e_ntu60-xsub-keypoint-3d.py 中直接写明了dataset_type PoseDataset与ann_file data/skeleton/ntu60_3d.pkl。三、从 RGB 视频重新提取 2D 骨架标注ntu_pose_extraction.py如果你需要对指定视频生成 2D 骨架标注而不是使用官方预标注包需要先安装 mmdetection 和 mmpose然后在仓库根目录下运行python tools/data/skeleton/ntu_pose_extraction.py S001C001P001R001A001_rgb.avi S001C001P001R001A001.pkl脚本 ntu_pose_extraction.py 的命令行参数由parse_args定义位置参数video源视频路径output输出 pickle 文件名--device推理设备默认cuda:0--skip-postproc跳过 NTU 专属的检测后处理单人/双人框对齐逻辑。脚本内置的检测/姿态模型配置不可通过命令行修改而是写死在模块级变量中args.det_config指向 COCO-person Faster R-CNNargs.det_score_thr 0.5args.pose_config指向 HRNet-w32 推理配置。3.1 端到端处理流程源码级解读主函数ntu_pose_extractionntu_pose_extraction.py#L257-L284的流程是抽帧frame_extract(vid, out_dirtmp_dir.name)把视频解码到临时目录人体检测detection_inference对每帧做 person 检测det_score_thr0.5with_scoreTrue时框尾附置信度NTU 检测后处理ntu_det_postproc未传--skip-postproc时执行为每帧得到固定数量的人体框姿态估计 跨帧对齐pose_inference_with_align调用 HRNet-w32 做 top-down 姿态估计并把各帧 keypoint 对齐到统一形状组装标注并落盘mmengine.dump(anno, args.output)输出 pickle。输出的标注字典与官方 pkl 的annotations单条记录同构keypointfloat32形状[M, T, V, 2]V17 为 COCO 关键点、keypoint_score[M, T, V]、frame_dir视频名去扩展名、img_shape与original_shapeNTU 视频硬编码为(1080, 1920)、total_frames、label从文件名中A后三位解析减 1 变为 0-based 类别号。3.2 检测后处理如何确定“每帧该有几个人”这是脚本中最有工程含量的部分。NTU 视频文件名编码了动作类别如...A055...ntu_det_postprocntu_pose_extraction.py#L198-L229据此先推断期望人数label int(vid.split(/)[-1].split(A)[1][:3]) mpaction list(range(50, 61)) list(range(106, 121)) n_person 2 if label in mpaction else 1即动作类别落在 50–60 或 106–120 区间的视为双人动作期望 2 个人其余为单人。随后按两条路径处理简单样本is_easy_example若所有帧中高置信0.95检测数恰好等于期望人数直接逐帧保留高分框困难样本先removedup去除“被更大框包含且得分更低”的重复框再用bbox2tracklet以 IoU≥0.6、间隔不超过 10 帧为条件把逐帧框连成 trackletdrop_tracklet丢弃长度 ≤5 或平均面积 ≤5000 的短 tracklet最后按场景选择回填策略单人单 tracklettracklet2bbox缺失帧用最近 tracklet 框补齐单人多 tracklettracklets2bbox以“覆盖至少半数的帧中离画面中心480, 270距离最小的 tracklet”为参照取距离阈值至少 50内的 tracklet 合并双人场景tracklet ≤2 时逐 tracklet 回填成[T, 2, 5]多于 2 个时bboxes2bbox按每帧得分 Top-2 取框并用前帧 IoU 匹配做平滑。这些逻辑保证了姿态估计拿到的是时序上稳定、人数固定的人体框从而让后续pose_inference_with_align能够以num_persons max(各帧人数)为第一维把 keypoint/score 对齐到[M, T, V, 2]/[M, T, V]的稠密张量ntu_pose_extraction.py#L232-L254。注意原文档特别提示由于 mmpose 的后续升级重新推理的结果与官方预标注之间可能存在细微差异。若追求论文级一致性建议优先使用第二节的官方 pkl。四、标注文件格式规范重点每个 pickle 文件对应一个动作识别数据集顶层是一个含两个字段的字典split与annotations。4.1 splitsplit的取值是一个字典键为 split 名值为属于该 split 的视频标识列表。4.2 annotationsannotations是一个列表每条骨架标注是一个字典包含以下字段字段类型说明frame_dirstr对应视频的标识total_framesint视频帧数img_shapetuple[int]视频帧形状(height, width)仅 2D 骨架需要original_shapetuple[int]同img_shapelabelint动作类别标签keypointnp.ndarray,[M x T x V x C]关键点标注。M人数T帧数等于total_framesV关键点数NTURGBD 3D 为 25COCO 为 17OpenPose 为 18 等C坐标维度2D 关键点 C23D 关键点 C3keypoint_scorenp.ndarray,[M x T x V]关键点置信度仅 2D 骨架需要4.3 PoseDataset 如何消费这份格式pose_dataset.py 中的PoseDataset是这套格式的官方读取器其实现印证了上述规范load_data_list用mmengine.load读入 pkl若指定了split参数则按data_list[split][self.split]过滤annotations标识符优先取filename否则回退到frame_dirpose_dataset.py#L59-L80类文档明确给出各数据集的合法 split 取值UCF101 / HMDB51 为train1/test1/train2/test2/train3/test3NTURGBD 为xsub_train、xsub_val、xview_train、xview_valNTURGBD 120 为xsub_train、xsub_val、xset_train、xset_valFineGYM 为train、val针对 Kinetics Pose 场景还支持valid_ratio与box_thr取值限 0.5–0.9 且必须落在该网格上filter_data会过滤掉“有效姿态帧占比不足”的视频并用box_score box_thr生成anno_inds对于 K400 这类“pkl 只是目录 每视频一个 pkl”的组织方式get_data_info会在data_prefix中配置了skeleton路径时逐样本从skeleton/frame_dir.pkl加载真实 keypointpose_dataset.py#L103-L118。测试用例 test_pose_dataset.py 验证了 split 过滤与valid_ratio/box_thr组合的行为。4.4 数据 pipeline 中的关键算子标注读入后典型骨架 pipeline见 2s-agcn 配置依次经过PreNormalize3D→GenSkeFeat→UniformSampleFrames→PoseDecode→FormatGCNInput这些算子定义在 pose_transforms.py 与 formatting.pyPoseDecodepose_transforms.py#L1222-L1277按采样索引frame_inds从keypoint形状[M, T, V, C]中切出所需帧keypoint_score同理PreNormalize3D仅用于 NTU 3D 关键点先减去第一个人体首帧 spinejoint #1坐标再做 3D 旋转使 Z 轴对齐 hip→spine 向量、X 轴对齐右肩→左肩向量消除相机位姿差异GenSkeFeat按dataset如nturgbd与featsj关节特征 /b骨骼特征等生成 GCN 输入特征。五、NTU RGBD 原始骨架数据转换仅适用于 GCN backbone除 2D 预标注外仓库还提供把 NTU RGBD原始 3D 骨架官方.skeleton文本文件转换为 MMAction2 格式的脚本 gen_ntu_rgbd_raw.py。该格式面向 GCN 系 backbone2s-AGCN、ST-GCN 等。第一步从 NTU RGBD 官方页面shahroudy/NTURGB-D 仓库下载 NTU-RGBD 60 与 120 的原始骨架数据然后执行NTU-RGBD 60python tools/data/skeleton/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 ntu60NTU-RGBD 120python tools/data/skeleton/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两个 missing-skeletons 清单文件已随仓库提供NTU_RGBD_samples_with_missing_skeletons.txt302 条每条为形如S001C002P005R002A008的无扩展名文件名与 NTU_RGBD120_samples_with_missing_skeletons.txt535 条。5.1 转换脚本的关键实现.skeleton文本解析read_skeleton_filter逐行解析帧数、每帧 body 数、body 元信息bodyID、clipedEdges、左右手置信度/状态、trackingState等与每个关节的 12 项数值x, y, z, depthX, depthY, colorX, colorY, orientationW/X/Y/Z, trackingStategen_ntu_rgbd_raw.py#L28-L63人体筛选read_xyz先按max_body_kinect4个 body 载入[4, T, 25, 3]再按“能量”非零坐标在 x/y/z 三通道上的标准差之和get_nonzero_std排序只保留能量最高的max_body_true2个真实人体最后丢弃全零的 padding body输出float16张量以压缩体积gen_ntu_rgbd_raw.py#L66-L96split 划分get_names_and_labels从文件名解析S/C/P/A四元组。ntu60生成xsub按 20 个训练 subject与xview训练 camera 为 2、3两个基准的 train/valntu120生成xsub50 个训练 subject与xset16 个训练 setup输出gendata最终把{split: ..., annotations: ...}用mmengine.dump写成task_3d.pkl如ntu60_3d.pkl单条 annotation 含frame_dir、label0-based、keypoint[M, T, 25, 3]与total_frames与第四节的格式规范一致3D 骨架无img_shape/keypoint_score符合“仅 2D 需要”的约束。六、第三方标注转换与配套资源6.1 BABEL 标注转换babel2mma2.pybabel2mma2.py 演示了把 BABEL 项目可从其主页下载的train_ntu_sk_120.npytrain_label_120.pkl转成 MMAction2 格式gen_babel把 keypoint 从原始布局转置为[T, V, M, C]后取float16存入sample[keypoint]frame_dir由视频名与元数据拼接而成total_frames固定为 150最终 dump 为babel120_train.pkl。6.2 目录内其他工具与资源tools/data/skeleton/目录还提供若干辅助资源compress_nturgbd.py用 ffmpeg 多进程把data/nturgbd_raw下的_rgb.avi1920x1080压缩为 540p 的data/nturgbd_videosmp4用于骨架可视化等需要 RGB 视频的场景label_map_ntu60.txt60 行与 label_map_gym99.txt99 行0-based 标签到类别名的映射也是 demo_skeleton.py 的默认--label-mapS001C001P001R001A001_rgb.avi官方示例视频即第三节命令中的输入样例。6.3 可视化原文档指出骨架数据可视化关键点热力体、骨骼热力体分别对应 NTU-60 与 FineGYM 的示例动图需要另外准备 RGB 视频。需要说明的是文档所引用的visualize_heatmap_volume脚本并未包含在当前仓库中当前仓库内仅 README 提到该名称如需可视化请自行基于keypoint/keypoint_score字段与 RGB 视频绘制或参考原论文仓库的历史版本。七、与训练配置对接准备完成后如何跑起来以 2s-AGCN 在 NTU60 x-sub 3D 骨架上的完整配置 2s-agcn_8xb16-joint-u100-80e_ntu60-xsub-keypoint-3d.py 为例标注文件就绪后data/skeleton/ntu60_3d.pkl配置的关键要素是dataset_type PoseDataset训练集用splitxsub_train并套RepeatDataset(times5)验证/测试集用splitxsub_valpipelinePreNormalize3D→GenSkeFeat(datasetnturgbd, feats[j])→UniformSampleFrames(clip_len100)测试时num_clips10→PoseDecode→FormatGCNInput(num_person2)→PackActionInputs训练循环为 16 个 epoch配合RepeatDataset等效 80 epochs 的数据重复量SGD 学习率 0.1 加余弦退火。若使用 PoseConv3DRGBPose 融合则参考 configs/skeleton/posec3d/rgbpose_conv3d/ 下的配置该场景下data_prefix需同时给出 RGB 视频与skeleton标注路径。小结优先使用官方预处理 pkl第二节表格Kinetics400 需额外解压k400_kpfiles_2d.zip到data/skeleton/kpfiles自提 2D 标注用ntu_pose_extraction.py核心在于ntu_det_postproc的人体框时序对齐且 mmpose 版本升级会带来与官方标注的轻微差异标注格式的核心是splitannotationskeypoint为[M, T, V, C]由PoseDataset按数据集对应的 split 名消费再经PoseDecode/PreNormalize3D等算子进入模型3D 原始骨架GCN 路线用gen_ntu_rgbd_raw.py转换输出ntu60_3d.pkl/ntu120_3d.pkl人体按能量保留前 2 个、以 float16 存储。赞分享人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载相关推荐PaddleClas 数据准备全指南分类与识别数据集格式、标注规范与配置实战PaddleClas 数据准备全指南分类与识别数据集格式、标注规范与配置实战 PaddleClas 是 PaddlePaddle 生态中面向图像分类与视觉识别人工智能深度学习计算机视觉MMAction2 PoseC3D 自定义数据集训练实战从骨架标注提取到模型训练的完整流程MMAction2 PoseC3D 自定义数据集训练实战从骨架标注提取到模型训练的完整流程 本篇技术指南以 custom_dataset_training.m人工智能计算机视觉深度学习mmaction2 PoseC3D 实战指南基于 3D 伪热图堆叠的骨架动作识别mmaction2 PoseC3D 实战指南基于 3D 伪热图堆叠的骨架动作识别 本文围绕 mmaction2 仓库中 PoseC3D 配置目录文档 http人工智能计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑