资讯详情 ViTPose 中 ShuffleNetV1 人体姿态估计基线:MPII 数据集上的轻量级 Top-Down 模型详解
📅 2026/10/14 3:12:42
人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载本文以 ViTPose 仓库中configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/mpii/目录下的pose_shufflenetv1基线为核心完整梳理该模型在 MPII 数据集上的训练配置、网络结构与评测指标PCKh背后的实现逻辑。读完本文你将能够理解如何在 ViTPose 框架中用 ShuffleNetV1 骨干训练一个 256×256 输入的热力图回归姿态模型并掌握从数据管线、骨干网络、热力图头到 PCKh 评估的完整调用链。一、基线定位与官方评测结果ShuffleNetV1 出自 CVPR 2018 论文《Shufflenet: An extremely efficient convolutional neural network for mobile devices》inproceedings{zhang2018shufflenet, title{Shufflenet: An extremely efficient convolutional neural network for mobile devices}, author{Zhang, Xiangyu and Zhou, Xinyu and Lin, Mengxiao and Sun, Jian}, booktitle{Proceedings of the IEEE conference on computer vision and pattern recognition}, pages{6848--6856}, year{2018} }MPII 数据集则源自 CVPR 2014 论文《2D Human Pose Estimation: New Benchmark and State of the Art Analysis》inproceedings{andriluka14cvpr, author {Mykhaylo Andriluka and Leonid Pishchulin and Peter Gehler and Schiele, Bernt}, title {2D Human Pose Estimation: New Benchmark and State of the Art Analysis}, booktitle {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, year {2014}, month {June} }官方基准结果页shufflenetv1_mpii.md报告了该基线在 MPII val 集合上的成绩ArchInput SizeMean (PCKh)Mean0.1权重日志pose_shufflenetv1256×2560.8230.195ckptopenmmlab 下载站logopenmmlab 下载站其中Mean指 16 个关键点在阈值 0.5 下的 PCKh 均值pelvis、thorax 两个关节不计入Mean0.1指阈值 0.1 下的 PCKh 均值用于衡量更严格定位下的精度。权重与训练日志均由 OpenMMLab 托管可按仓库文档中的链接下载。二、训练配置全解析shufflenetv1_mpii_256x256.py基线配置 shufflenetv1_mpii_256x256.py 继承两个基础配置_base_ [ ../../../../_base_/default_runtime.py, ../../../../_base_/datasets/mpii.py ]default_runtime.py 提供检查点保存间隔10 epoch、日志配置每 50 次迭代记录、nccl分布式后端、fork多进程启动方式等通用运行时设置mpii.py 定义了 MPII 的 16 个关键点元信息keypoint_info、15 条骨架连接skeleton_info、逐关节权重joint_weights脚踝/手腕为 1.5膝/肘为 1.2其余为 1.0以及借鉴自 COCO 的sigmas。2.1 训练超参数evaluation dict(interval10, metricPCKh, save_bestPCKh) optimizer dict( typeAdam, lr5e-4, ) optimizer_config dict(grad_clipNone) lr_config dict( policystep, warmuplinear, warmup_iters500, warmup_ratio0.001, step[170, 200]) total_epochs 210要点说明优化器为 Adam初始学习率5e-4不做梯度裁剪学习率策略为 step在 170 与 200 epoch 处衰减训练前 500 次迭代做线性 warmupwarmup 起点比例为 0.001共训练 210 epoch每 10 epoch 在 val 集上以PCKh为指标评估并保存最优权重。评估由 EvalHook 驱动PCKh位于MMPOSE_GREATER_KEYS越大越好列表中。2.2 模型结构model dict( typeTopDown, pretrainedmmcls://shufflenet_v1, backbonedict(typeShuffleNetV1, groups3), keypoint_headdict( typeTopdownHeatmapSimpleHead, in_channels960, out_channelschannel_cfg[num_output_channels], loss_keypointdict(typeJointsMSELoss, use_target_weightTrue)), train_cfgdict(), test_cfgdict( flip_testTrue, post_processdefault, shift_heatmapTrue, modulate_kernel11))typeTopDown使用 GT 或检测框裁剪出人体区域后做姿态估计Simple Baseline 2D 路线骨干为ShuffleNetV1groups3是默认分组数此时最终阶段输出通道数恰好为 960与keypoint_head的in_channels960对应pretrainedmmcls://shufflenet_v1表示从 MMClassification 模型库加载 ImageNet 分类预训练权重损失为逐关节加权 MSE 热力图损失JointsMSELossuse_target_weightTrue使用joint_weights加权测试配置中flip_testTrue开启左右翻转 TTAshift_heatmapTrue对翻转回的热力图做 1 像素补偿modulate_kernel11指定热力图解码时高斯模糊核大小。2.3 数据配置与数据管线data_cfg dict( image_size[256, 256], heatmap_size[64, 64], num_output_channels16, num_joints16, use_gt_bboxTrue, bbox_fileNone, )use_gt_bboxTrue表明训练/验证均直接使用 GT 包围框bbox 归一化因子为 200×scale这是纯姿态模型的评测方式image_size[256, 256]与heatmap_size[64, 64]决定了 4 倍下采样关系。训练管线train_pipeline [ dict(typeLoadImageFromFile), dict(typeTopDownRandomFlip, flip_prob0.5), dict( typeTopDownGetRandomScaleRotation, rot_factor40, scale_factor0.5), dict(typeTopDownAffine), dict(typeToTensor), dict(typeNormalizeTensor, mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), dict(typeTopDownGenerateTarget, sigma2), dict(typeCollect, keys[img, target, target_weight], meta_keys[image_file, joints_3d, joints_3d_visible, center, scale, rotation, flip_pairs]), ]其中TopDownGetRandomScaleRotation做 ±40° 随机旋转与 0.5 缩放范围的数据增强TopDownGenerateTargetsigma2按关键点位置生成高斯热力图标签。验证管线去掉翻转与随机增强仅保留仿射裁剪、归一化与收集val_pipeline [ dict(typeLoadImageFromFile), dict(typeTopDownAffine), dict(typeToTensor), dict(typeNormalizeTensor, mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), dict(typeCollect, keys[img], meta_keys[image_file, center, scale, rotation, flip_pairs]), ] test_pipeline val_pipeline数据集使用TopDownMpiiDataset实现于 topdown_mpii_dataset.py标注文件为mpii_train.json/mpii_val.jsonbatch size 每 GPU 64验证 32每 GPU 2 个 workerdata dict( samples_per_gpu64, workers_per_gpu2, val_dataloaderdict(samples_per_gpu32), test_dataloaderdict(samples_per_gpu32), traindict(typeTopDownMpiiDataset, ann_filef{data_root}/annotations/mpii_train.json, img_prefixf{data_root}/images/, ...), valdict(typeTopDownMpiiDataset, ann_filef{data_root}/annotations/mpii_val.json, ...), testdict(...))三、ShuffleNetV1 骨干的源码实现骨干实现位于 shufflenet_v1.py由ShuffleUnit基本块与ShuffleNetV1主干两部分组成。3.1 ShuffleUnit分组卷积 channel shuffleShuffleUnit的核心前向逻辑见 shufflenet_v1.py为out self.g_conv_1x1_compress(x) # 1x1 分组卷积压缩到 out_channels // 4 out self.depthwise_conv3x3_bn(out) # 3x3 深度卷积concat 分支 stride2 if self.groups 1: out channel_shuffle(out, self.groups) out self.g_conv_1x1_expand(out) # 1x1 分组卷积恢复通道 # 之后按 combineadd残差相加或 concat通道拼接合并关键的channel_shuffle实现于 utils 目录它将通道维按groups分组后重排reshape → transpose → contiguous → view使分组卷积各组的输出通道彼此交错实现跨组信息流动。这是 ShuffleNet 相比普通分组卷积保持精度的核心机制。两个值得注意的细节first_block时第一个 1x1 分组卷积的分组数为 1self.first_1x1_groups 1 if first_block else self.groups因为首块输入来自普通卷积尚不具备分组结构combineadd要求输入输出通道相等且深度卷积 stride 为 1combineconcat则用3×3/stride2平均池化残差分支后拼接实现通道数翻倍与分辨率减半。3.2 主干结构与 groups 通道表ShuffleNetV1主干依次为conv13→24 通道3×3/stride2MaxPool2d(3, stride2, padding1)再连接三段 ShuffleUnit 堆叠块数stage_blocks [4, 8, 4]。不同groups取值对应的各阶段通道数见 shufflenet_v1.pygroups第 1 段第 2 段第 3 段默认输出1144288576220040080032404809604272544108883847681536配置中groups3且默认out_indices(2,)因此骨干只输出第三段960 通道7×7 特征图单个 Tensor直接送入头部。其余可选参数包括widen_factor通道宽度乘数经make_divisible对齐到 8 的倍数、frozen_stages冻结前若干阶段、norm_eval训练时冻结 BN 统计量、with_cp梯度检查点省显存。单元测试 test_shufflenet_v1.py 对上述设计做了完整验证非法groups10抛ValueError、ShuffleUnit(64, 24, combineadd)因通道不等触发断言、224×224 输入下groups3各阶段输出形状(1, 240, 28, 28)/(1, 480, 14, 14)/(1, 960, 7, 7)均与源码一致并覆盖了frozen_stages、with_cp、norm_eval等行为。四、TopdownHeatmapSimpleHead从 960 通道到 16 通道热力图头部实现于 topdown_heatmap_simple_head.py。本配置未设置num_deconv_layers与extra即num_deconv_layers3默认值下的结构为 3 层反卷积256 滤波器、4×4 核、stride2后接 1×1 卷积输出 16 通道热力图。以 256×256 输入为例特征图经历7×7 × 960ch → 14×14 × 256ch → 28×28 × 256ch → 56×56 × 256ch → 56×56 × 16ch训练时get_loss直接计算加权 MSE 损失get_accuracy则在热力图上做 PCK 精度统计调用 top_down_eval.py 中的pose_pck_accuracy以 heatmap 尺寸归一化坐标距离、默认阈值 0.05写入日志中的acc_pose。推理时由父类 TopdownHeatmapBaseHead 的decode完成解码调用keypoints_from_heatmaps读取test_cfg中的unbiased_decoding、post_process、modulate_kernel、valid_radius_factor等参数得到 64×64 热力图峰值位置再经 post_transforms.py 中的transform_preds用center/scalescale 乘回 200 因子把 64×64 坐标映射回原图坐标。当flip_testTrue时inference_model会对左右翻转的输出调用flip_back交换左右成对关键点并水平翻转热力图若shift_heatmapTrue再将翻转结果整体左移 1 像素output_heatmap[:, :, :, 1:] output_heatmap[:, :, :, :-1]以补偿特征非对齐带来的偏移。五、PCKh 指标的实现细节evaluation dict(metricPCKh)触发 TopDownMpiiDataset.evaluate其实现改编自 HRNet 官方代码将预测关键点从 0-based 转回 1-basedpreds preds[..., :2] 1.0并按bbox_id排序去重读取与标注同目录的mpii_gt_val.mat取出 GT 坐标pos_gt_src、头部框headboxes_src与缺失掩码jnt_missing以头部框边长乘以SC_BIAS 0.6作为每样本归一化尺度计算各关键点的归一化误差scaled_uv_err在阈值 0.5 处统计各关节 PCKh并扫描 00.5 共 50 档阈值生成 AUC 曲线数据报告前对索引 6、7pelvis、thorax做掩码处理PCKh.mask[6:8] True即不计入这两个无标准 GT 的关节最终输出的Mean即为其余 14 个关节的均值。这解释了基准表中Mean0.823的含义在误差 ≤ 0.5 × 头部尺寸这一宽松阈值下模型平均约有 82.3% 的关键点定位合格而Mean0.10.195则说明当阈值收紧到 0.1 时精度显著下降这是热力图峰值量化与 4 倍下采样的固有约束。六、训练与评测的复现方式在准备好 MPII 数据目录结构为data/mpii/annotations/{mpii_train.json,mpii_val.json,mpii_gt_val.mat}与data/mpii/images/后可按仓库标准流程操作# 单卡训练 python tools/train.py \ configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/mpii/shufflenetv1_mpii_256x256.py # 分布式训练 ./tools/dist_train.sh \ configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/mpii/shufflenetv1_mpii_256x256.py 8 # 评测权重 python tools/test.py \ configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/mpii/shufflenetv1_mpii_256x256.py \ ckpt_path训练过程中每 10 epoch 自动执行一次 val 集 PCKh 评估并保留最优权重save_bestPCKh日志每 50 次迭代记录一次含损失、acc_pose。若要复现基准数字需使用官方托管的权重文件或在相同配置与数据条件下自行训练。七、小结pose_shufflenetv1基线展示了 ViTPose 中一套完整的轻量级 Top-Down 姿态估计方案模型侧ShuffleNetV1(groups3)用分组 1×1 卷积 3×3 深度卷积 channel shuffle 以极低算力输出 960 通道特征由 3 层反卷积 1×1 卷积的TopdownHeatmapSimpleHead解码为 16 通道 64×64 热力图训练侧Adamlr5e-4、210 epoch、step 衰减 500 次迭代线性 warmup、随机旋转/缩放增强、σ2 高斯标签与加权 MSE 损失评测侧PCKh 以头部尺寸×0.6 归一化误差阈值 0.5 下的均值为 0.823阈值 0.1 下为 0.195pelvis 与 thorax 两个关节不参与统计。该基线适合作为移动端/低算力场景的人体姿态估计起点若需要更强的定位精度可参考仓库 mpii 目录下基于 HRNet 等更重骨干的配置若需要更小的模型则可比较同目录其他轻量骨干的配置差异。所有结论均可在对应源码与测试文件中查证便于继续深入。赞分享人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载相关推荐MMPose 中 ShuffleNetV1 人体姿态估计MPII 数据集 Top-down 热图基线的完整解析MMPose 中 ShuffleNetV1 人体姿态估计MPII 数据集 Top down 热图基线的完整解析 本篇基于 MMPose 模型库文档 shuff计算机视觉人工智能深度学习ViTPose 中的 SEResNet MPII 人体姿态估计Top-Down 热图基线配置与实现详解ViTPose 中的 SEResNet MPII 人体姿态估计Top Down 热图基线配置与实现详解 本文基于仓库文档 seresnet_mpii.md人工智能计算机视觉深度学习ViTPose 仓库实战ShuffleNetV1 轻量骨干下的 COCO 人体姿态估计Top-Down HeatmapViTPose 仓库实战ShuffleNetV1 轻量骨干下的 COCO 人体姿态估计Top Down Heatmap 导读 本文围绕 ViTPose 仓人工智能计算机视觉深度学习上一篇TiXL 图编辑器变量追踪GetTypeVar 悬停显示 Set/Get-Var 引用连线的实现解析下一篇StarRocks ds_theta_intersect 标量函数详解基于 Apache DataSketches Theta 的集合交集基数估计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考