
人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载ST-GCNSpatial Temporal Graph Convolutional Networks是骨架动作识别领域里程碑式的方法它不再把人体骨架当作一串独立的关节点而是显式建模为一张时空图用图卷积同时捕捉关节间的空间拓扑关系与时间维度的运动规律。本指南以 MMAction2 仓库中 STGCN 模型文档 为骨架结合 STGCN 骨干网络源码、图拓扑构建实现 与全部 16 个 NTU 系列训练配置完整讲解 ST-GCN 的原理、配置逐项拆解、NTU60/NTU120 数据集训练与测试命令以及 joint / bone / joint-motion / bone-motion 四路特征的单流训练与多流融合评估方法读完即可在 MMAction2 中复现官方精度并扩展到自己的人体骨架识别任务。1. ST-GCN 是什么从手工规则到自动学习的时空图建模传统骨架动作识别方法依赖手工设计的部件划分或遍历规则来组织人体关节表达能力受限且难以泛化。ST-GCN 的核心思想是将每一帧中的人体关节看作图的节点关节之间的自然连接如手腕连着手肘看作图的边再把整段视频的帧序列串联起来构成一张时空图。模型不再依赖人工规则而是通过图卷积自动从数据中同时学习空间同一帧内关节间与时间跨帧同一关节两种模式从而获得更强的表达能力与泛化能力。该工作发表于 AAAI 2018论文引用见仓库中的 Citation 小节并在 Kinetics 与 NTU-RGBD 两个大型数据集上取得显著提升。1.1 时空图的三要素节点、边与分区策略在图论视角下一段视频的骨架序列构成一张图其构造过程完全由 graph.py 中的Graph类完成节点V人体关键关节。仓库支持三种常见骨架布局对应不同的关键点数量与连接定义见Graph.set_layoutcoco17 个关节点以鼻尖编号 0为中心常用于 2D 姿态估计结果如 OpenPose/HRNet 输出的 COCO 格式nturgbd25 个关节点以脊柱编号 20代码中 center 21 - 1为中心对应 Kinect 采集的 NTU 数据集 3D 骨架openpose18 个关节点以脖子编号 1为中心。边E分为inward人体骨骼天然连接如手腕→手肘与outward反向连接两者合称邻居集合neighbor同时为每个节点补充自环self_link。分区策略mode决定如何把邻居集合划分成多个子集。仓库实现了两种模式stgcn_spatial按关节到骨架中心的**跳跃距离hop distance**划分。以中心为界把与中心距离相等的节点划分为a_close靠近中心与a_further远离中心两组构成3个邻接矩阵子集自环 近 远这正是原版 ST-GCN 的空间分区策略spatial标准三分区即自环Iden、向心In、离心Out三个子集分别由edge2mat与normalize_digraph构造并做行归一化。无论哪种模式最终都会得到形状为(num_subsets, num_nodes, num_nodes)的邻接矩阵张量 A作为图卷积的先验拓扑。1.2 网络主体STGCNBlock 的空间图卷积 时间卷积ST-GCN 由多个 STGCNBlock 堆叠而成每个 block 完成一次先做空间图卷积、再做时间卷积的两阶段计算前向公式可概括为x ReLU( TCN( GCN(x) ) residual )空间图卷积单元unit_gcn见 gcn_utils.py用 1×1 卷积把输入特征映射到out_channels × num_subsets的维度再通过torch.einsum(nkctv,kvw-nctw, ...)沿邻接矩阵子集做加权聚合最后接 BatchNorm 与 ReLU。adaptive参数控制邻接矩阵是否可学习importance默认A作为 buffer 冻结另学习一个与 A 同形状的可训练参数PA通过逐元素乘法A * PA给每条边的贡献度加权offset学习加性偏移A PAinit直接把 A 变成nn.Parameter端到端学习。时间卷积单元unit_tcn见 gcn_utils.py对特征的时间维做kernel_size × 1的普通卷积默认核大小 9可配置 stride、dilation 与 dropout负责建模帧间运动模式。残差连接当输入输出通道一致且 stride 为 1 时直连否则用核为 1 的unit_tcn做投影。1.3 通道扩展与时间下采样十层结构的搭建逻辑STGCN骨干stgcn.py的默认结构参数如下参数默认值含义in_channels3输入通道数2D 骨架为关节坐标 x,y 置信度3D 骨架为 x,y,zbase_channels64基础通道数ch_ratio2通道膨胀倍率num_stages10总阶段block数inflate_stages[5, 8]在第 5、8 阶段膨胀通道数64 → 128 → 256down_stages[5, 8]在第 5、8 阶段对时间维做 stride2 下采样代码中out_channels int(base_channels * ch_ratio ** inflate_times EPS)因此最终输出通道为 256时间维度逐级减半。若in_channels ! base_channels如输入 3 通道而 base 为 64会在开头额外插入一个不带残差的过渡 block。2. 配置文件逐项拆解NTU60-2D joint 单流训练以官方旗舰配置 stgcn_8xb16-joint-u100-80e_ntu60-xsub-keypoint-2d.py 为例逐段理解每一条配置的作用。文件名自解释8xb16表示 8 卡、每卡 batch 16u100表示每样本均匀采样 100 帧80e表示 80 epochntu60-xsub表示 NTU60 数据集 cross-subject 划分keypoint-2d表示 2D 骨架模态。2.1 模型定义RecognizerGCN STGCN GCNHeadmodel dict( typeRecognizerGCN, backbonedict( typeSTGCN, graph_cfgdict(layoutcoco, modestgcn_spatial)), cls_headdict(typeGCNHead, num_classes60, in_channels256))RecognizerGCN见 recognizer_gcn.py是骨架识别专用的识别器封装它把输入(B, num_clips, num_person, clip_len, num_joints, 3)展平 clip 维度后送入骨干可分别在backbone与head两个阶段取特征。骨干STGCN使用 COCO 17 点布局与原版stgcn_spatial分区。GCNHead见 gcn_head.py先做AdaptiveAvgPool2d(1)把特征压成(N, M, C)再对多个人求均值x.mean(dim1)最后经过一个nn.Linear(256, num_classes)输出分类分数。NTU60 的num_classes60NTU120 则改为 120见 stgcn_8xb16-joint-u100-80e_ntu120-xsub-keypoint-2d.py。2.2 数据管线从原始骨架到 GCN 输入2D 与 3D 配置的管线结构一致区别仅在预归一化算子与骨架布局对比 2D 配置 与 3D 配置train_pipeline [ dict(typePreNormalize2D), dict(typeGenSkeFeat, datasetcoco, feats[j]), dict(typeUniformSampleFrames, clip_len100), dict(typePoseDecode), dict(typeFormatGCNInput, num_person2), dict(typePackActionInputs) ]各算子的底层行为均在 pose_transforms.py 与 formatting.py 中实现PreNormalize2D把 2D 坐标以画面中心为原点、以半宽半高为除数归一化到[-1, 1]区间消除视频分辨率差异。PreNormalize3D3D 配置使用先以第一帧第一个人的脊柱关节为原点做平移再做两次 3D 旋转——使 Z 轴平行于髋→脊柱向量、X 轴指向右肩→左肩方向将不同拍摄视角的骨架对齐到统一坐标系。GenSkeFeat统一的多流特征生成接口。feats[j]表示只生成 joint 流若包含b/bm内部会先调用JointToBone按预定义关节点对pairs计算差分得到骨骼向量若包含jm/bm再调用ToMotionnp.diff计算相邻帧差分得到运动信息最后用MergeSkeFeat沿最后一维拼接。UniformSampleFrames把视频均分为clip_len段每段随机取一帧测试时固定随机种子保证可复现。val 用num_clips1test 用num_clips10即 10-clip 测试协议。PoseDecode按采样得到的frame_inds从全量骨架序列中取出对应帧。FormatGCNInput见 formatting.py将人数对齐到num_person2不足补零、超出截断并把形状重排为(M, num_clips, T//num_clips, V, C)再转置为(num_clips, M, T, V, C)最终交给RecognizerGCN处理。PackActionInputs把处理后的数组打包为模型输入与标签。2.3 数据加载、评测与训练调度train_dataloader dict( batch_size16, num_workers2, persistent_workersTrue, samplerdict(typeDefaultSampler, shuffleTrue), datasetdict( typeRepeatDataset, times5, datasetdict( typePoseDataset, ann_filedata/skeleton/ntu60_2d.pkl, pipelinetrain_pipeline, splitxsub_train)))数据源是 PoseDataset 预提取的骨架 pickle 文件data/skeleton/ntu60_2d.pkl训练用xsub_train划分验证/测试用xsub_val。RepeatDataset把 16-epoch 的训练集重复 5 次等效于80 epoch因此配置文件名写80e而train_cfg.max_epochs16。评测指标为AccMetrictop1 分类精度优化器为 Nesterov SGDlr0.1, momentum0.9, weight_decay5e-4配合CosineAnnealingLR余弦退火val_interval1表示每轮验证。auto_scale_lr声明base_batch_size1288 卡 × 16当改变卡数或 batch 时可用--auto-scale-lr自动按实际 batch 缩放学习率。3. 模型库与已发布结果STGCN 在仓库中共有 16 个已发布配置覆盖 NTU60 / NTU120 × 2D / 3D × 四种模态。2D 与 3D 模型参数量均为 3.1M2D 配置 FLOPs 为 3.8G3D 配置为 5.7G。完整结果见 configs/skeleton/stgcn/README.md 与结构化元数据 metafile.yml。3.1 NTU60-XSubtop1 acc10 clips 测试协议模态2D3Djoint88.9588.11bone91.6988.76joint-motion86.9086.06bone-motion87.8685.49two-stream 融合92.1290.14four-stream 融合92.3490.393.2 NTU120-XSubtop1 acc10 clips 测试协议模态2D3Djoint83.1982.15bone83.3684.28joint-motion78.8778.93bone-motion79.5580.02two-stream 融合84.8485.68four-stream 融合85.2386.19使用注意事项原文档说明表中的gpus是官方产出 checkpoint 所用的卡数。若想改用不同的卡数或每卡视频数最佳做法是在调用tools/train.py时加--auto-scale-lr它会依据实际 batch size 与原始 batch size 自动缩放学习率。两流融合的权重为joint : bone 1 : 1四流融合权重为joint : joint-motion : bone : bone-motion 2 : 1 : 2 : 1。多流融合的完整做法见下文第 5 节。4. 训练与测试命令4.1 单机训练通用命令python tools/train.py ${CONFIG_FILE} [optional arguments]复现 STGCN 在 NTU60-2D 上的确定性训练固定随机种子并开启周期验证python tools/train.py configs/skeleton/stgcn/stgcn_8xb16-joint-u100-80e_ntu60-xsub-keypoint-2d.py \ --seed 0 --deterministictools/train.py的常用可选参数详见 训练与测试教程参数作用--work-dir WORK_DIR指定日志与 checkpoint 输出目录默认在./work_dirs下按配置文件名生成--resume [RESUME]断点续训不跟路径时自动从最新 checkpoint 恢复--amp开启自动混合精度训练--no-validate关闭训练期间的验证不建议--auto-scale-lr按实际 batch 与base_batch_size自动缩放学习率--seed/--deterministic设置随机种子 / CUDNN 确定性选项--cfg-options CFG_OPTIONS以keyvalue覆盖配置项如model.backbone.in_channels24.2 多卡与集群训练# 8 卡分布式训练 bash tools/dist_train.sh ${CONFIG} ${GPUS} [PY_ARGS] # 指定通信端口 PORT29666 bash tools/dist_train.sh ${CONFIG} ${GPUS} [PY_ARGS] # 多机训练各机器设置一致的 PORT 与 MASTER_ADDR NNODES2 NODE_RANK0 PORT$MASTER_PORT MASTER_ADDR$MASTER_ADDR bash tools/dist_train.sh $CONFIG $GPUS # Slurm 集群 [ENV_VARS] bash tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG} [PY_ARGS]4.3 模型测试通用命令python tools/test.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [optional arguments]测试 STGCN 在 NTU60-2D 上的精度并把模型输出 dump 到 pickle 文件python tools/test.py configs/skeleton/stgcn/stgcn_8xb16-joint-u100-80e_ntu60-xsub-keypoint-2d.py \ checkpoints/SOME_CHECKPOINT.pth --dump result.pkl常用参数CHECKPOINT_FILE支持本地路径或 http 链接--dump DUMP保存模型全部输出以便离线评估--cfg-options可覆盖测试配置多卡测试使用bash tools/dist_test.sh ${CONFIG} ${CHECKPOINT} ${GPUS}。测试时配置中的test_pipeline使用num_clips10即每条样本均匀切 10 个 clip 分别推理后再平均分数这正是文档结果表中10 clips测试协议的含义。5. 多流特征与融合逼近最优精度单流模型各有侧重joint 流关注关节位置bone 流关注骨骼朝向与长度关节差分joint-motion 与 bone-motion 流分别刻画关节与骨骼的帧间变化运动信息。官方结果显示把四路互补特征融合后精度显著超过任一单流NTU60-2D 上 four-stream 达 92.34而最强的单流 bone 为 91.69。5.1 修改配置生成多流每种模态对应独立的配置文件改动点仅在于GenSkeFeat的feats参数joint 流feats[j]2D / 3Dbone 流feats[b]2D / 3Djoint-motion 流feats[jm]2D / 3Dbone-motion 流feats[bm]2D / 3D。2D 与 3D 配置的差异集中在两处PreNormalize2DvsPreNormalize3D以及GenSkeFeat的datasetcoco17 点vsnturgbd25 点。5.2 多流晚期融合Late Fusion仓库提供 report_accuracy.py 完成多流分数融合先分别测试各单流模型并--dump预测结果再按权重加权各流分数详细说明见 Multi-Stream Fusion 小节。以 joint-bone 两流融合为例python tools/analysis_tools/report_accuracy.py --preds demo/fuse/joint.pkl demo/fuse/bone.pkl --coefficients 1.0 1.0输出示例Mean Class Accuracy: 0.9180 Top 1 Accuracy: 0.9333 Top 5 Accuracy: 0.9833按文档注释两流权重joint : bone 1 : 1四流权重joint : joint-motion : bone : bone-motion 2 : 1 : 2 : 1。该工具同样支持--apply-softmax在融合前对分数做 softmax 归一化。6. 数据准备与推理扩展数据准备训练前需把 NTU 原始骨架处理为 pickle 格式并放置于data/skeleton/下目录布局与脚本见 skeleton 数据准备工具配置中的ann_file即指向该文件。自定义骨架布局STGCN的graph_cfg支持传入自定义 dict键为num_node、inward、center因此可以方便地把 ST-GCN 迁移到自有骨架定义见 graph.py 中 Graph 类的文档。骨干可配置项STGCN还暴露了data_bn_typeVC对关节-通道联合做 BNMVC额外区分人数维度默认VC、tcn_typeunit_tcn或mstcn多尺度时间卷积用于搭建 STGCN 变体、gcn_adaptive邻接矩阵自适应策略等扩展参数可在不改动模型代码的前提下做变体实验。7. 引用如果本工作对你的研究或项目有帮助请按如下 BibTeX 引用出处见 STGCN 文档 Citation 小节inproceedings{yan2018spatial, title{Spatial temporal graph convolutional networks for skeleton-based action recognition}, author{Yan, Sijie and Xiong, Yuanjun and Lin, Dahua}, booktitle{Thirty-second AAAI conference on artificial intelligence}, year{2018} }赞分享人工智能计算机视觉深度学习【免费下载链接】mmaction2OpenMMLabs Next Generation Video Understanding Toolbox and Benchmark项目地址https://gitcode.com/gh_mirrors/mm/mmaction2点击查看免费下载相关推荐ST-GCN基于骨架数据的动作识别空间时间图卷积网络ST GCN基于骨架数据的动作识别空间时间图卷积网络 项目基础介绍及编程语言 ST GCNSpatial Temporal Graph Convolutio人工智能深度学习计算机视觉MMAction2 中的 STGCN面向骨架动作识别的 ST-GCN 改进基线训练与多流融合实践MMAction2 中的 STGCN面向骨架动作识别的 ST GCN 改进基线训练与多流融合实践 导读 本文围绕 MMAction2 仓库中 confi人工智能计算机视觉深度学习MMAction2中的骨架点检测ST-GCN、AGCN等图卷积网络详解MMAction2中的骨架点检测ST GCN、AGCN等图卷积网络详解 在视频理解领域骨架点检测技术正成为动作识别的重要研究方向。MMAaction2作为O人工智能计算机视觉深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考