ViTPose 仓库中的 VoxelPose:基于多相机体素投影的两阶段 3D 人体姿态估计实战指南
人工智能计算机视觉深度学习【免费下载链接】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点击查看免费下载本文以 configs/body/3d_kpt_mview_rgb_img/voxelpose/README.md 为骨架结合本仓库mmpose目录下的检测器、骨干网络、头部与数据集源码系统讲解 VoxelPoseECCV 2020多相机 3D 人体姿态估计算法在本仓库中的完整实现从立方体提议网络 姿态回归网络两阶段设计、体素投影的底层原理到 Panoptic 数据集上的可运行配置、数据管线、训练/测试命令与评估指标。读完本文你将能够看懂并复现该模型在 CMU Panoptic 数据集上的完整流程理解DetectAndRegress、VoxelCenterDetector、VoxelSinglePose、V2VNet等模块的调用关系并掌握如何修改空间尺寸、体素分辨率、相机数量等关键超参。一、算法背景从单目 2D 到多相机 3D 的两阶段框架VoxelPose 论文提出的核心思路是将多相机 3D 人体姿态估计拆解为两个阶段——人体中心检测Cuboid Proposal Network在 3D 空间中检测每个人的中心位置为每个人生成一个人体立方体提议cuboid proposal人体姿态回归Pose Regression Network以每个提议立方体为输入回归出其中人体的 3D 关节点坐标。原文的关键技术特征是两个阶段的网络全部基于 3D 卷积本仓库中均使用V2VNet见 v2v_net.py3D 卷积的输入特征体积feature volume并非直接由图像卷积得到而是通过将每个体素voxel投影到多视角图像上、在对应相机的 2D heatmap 投影位置处采样来生成的。这一设计避开了显式的人体匹配person association问题多视角的 2D 姿态热图经由相机内外参被拧成一个统一的 3D 特征体后续的检测与回归都在该 3D 空间内进行天然对齐了各视角的信息。本仓库将该算法以DetectAndRegress检测器multiview_pose.py的形式集成到 mmpose 框架中对应配置目录为configs/body/3d_kpt_mview_rgb_img/voxelpose/并在 CMU Panoptic 数据集ICCV 2015上提供了完整的训练、验证配置与已发布指标。二、源码级架构体素投影层与两个 3D 网络2.1 ProjectLayer体素 → 多视角 2D 热图的投影采样整个模型的体素化核心在ProjectLayermultiview_pose.py中实现。其工作流程如下构建 3D 网格compute_grid依据box_size空间范围、box_center空间中心与num_bins体素分辨率用torch.linspace在 x/y/z 三个维度生成均匀网格得到所有体素中心的 3D 坐标grid世界坐标 → 像素坐标对每个相机利用相机参数构造SimpleCameraTorchsingle_camera_torch.py通过world_to_pixel(grid)camera_base.py把体素网格投影到该相机的图像平面有效性掩码bounding判断投影点是否落在图像范围内xy坐标非负且小于图像宽高生成一个 0/1 掩码用于屏蔽看不到该体素的相机视角仿射变换与归一化采样将投影坐标经affine_transform_torch对齐到 heatmap 坐标系归一化到[-1, 1]后作为F.grid_sample的采样网格在对应相机的 2D 特征图feature_maps[c]上采样出该体素的特征多视角平均聚合对每个体素把所有可见相机采样到的特征加权求和并归一化除以可见相机数1e-6防除零最终得到形状为(N, C, cubeL, cubeW, cubeH)的 3D 特征体积。从代码可以看到grid_size、grid_center、cube_size三个参数即决定了 3D 空间的物理范围毫米与体素分辨率它们是后文配置文件中space_size/space_center/cube_size等字段的直接映射。2.2 阶段一VoxelCenterDetector 人体中心检测VoxelCenterDetectormultiview_pose.py承担第一阶段用ProjectLayer在全空间space_size上构建cube_size分辨率的初始特征体送入center_net配置为V2VNet(input_channels15, output_channels1)得到单通道 3D 人体中心热图由CuboidCenterHeadvoxelpose_head.py做3D NMS通过max_pool3dmax_pool_kernel3找出热图局部极大值取 Top-Kmax_num个候选点并通过_get_real_locations把体素索引反算回世界坐标毫米输出(N, P, 5)的候选张量——前 3 维为 3D 坐标、第 5 维为响应分数训练时assign2gt依据train_cfg[dist_threshold]配置中为 500.0 毫米把候选中心与 GT 中心做最近邻匹配测试时依据test_cfg[center_threshold]配置中为 0.3过滤低分候选。2.3 阶段二VoxelSinglePose 姿态回归VoxelSinglePosemultiview_pose.py负责第二阶段对每个检测到的人体中心以sub_space_size提议立方体的物理尺寸和sub_cube_size提议立方体的体素分辨率为参数再次调用ProjectLayer从多视角 2D 特征图上采样出局部特征体这正是 README 所述cuboid proposal的实现送入pose_net配置为V2VNet(input_channels15, output_channels15)输出每人 15 个关节的 3D 热图由CuboidPoseHeadvoxelpose_head.py做积分姿态回归Integral Pose Regression将热图经softmax(beta * x)beta100.0控制软最大化锐度后与体素网格坐标加权求和直接回归出(N, K, 3)的关节世界坐标而不是像 2D 方法那样取热图最大值。训练时两个阶段联合DetectAndRegress.forward_trainmultiview_pose.py先让human_detector产出候选中心再把候选传给pose_regressor2D 骨干默认被冻结freeze_2dTrue构造参数默认值见 multiview_pose.py可改为False以联合微调 2D 热图分支。推理阶段forward_test依次得到pose_3d、human_detection_3d与sample_id。2.4 V2VNet全 3D 卷积的编码-解码骨干两个阶段共用的 3D 骨干是V2VNetv2v_net.py其结构为front_layers7×7×7 的Basic3DBlockRes3DBlock把输入通道数映射到mid_channels默认 32EncoderDecorder两次 2×2×2 下采样 残差块的编码器、瓶颈残差块、两次转置卷积上采样 跳跃连接的解码器output_layer1×1×1 卷积把通道数映射到output_channels。该结构保证了特征体在保持空间分辨率的前提下获得足够大的感受野是两阶段 3D 推理的共同基础。三、配置文件深度解析panoptic 5 相机配置本仓库为 CMU Panoptic 数据集提供了完整的可运行配置 voxelpose_prn64x64x64_cpn80x80x20_panoptic_cam5.py文件名中的prn64x64x64表示姿态回归网络输入 64³ 体素cpn80x80x20表示中心检测网络输入 80×80×20 体素cam5表示使用 5 个相机视角。3.1 3D 空间与体素分辨率space_size [8000, 8000, 2000] # 3D 空间物理范围毫米长 8m × 宽 8m × 高 2m space_center [0, -500, 800] # 空间中心坐标毫米 cube_size [80, 80, 20] # 中心检测阶段的体素分辨率 sub_space_size [2000, 2000, 2000] # 姿态回归阶段人体提议立方体的物理尺寸2m³ sub_cube_size [64, 64, 64] # 姿态回归阶段的体素分辨率 image_size [960, 512] # 2D 骨干输入图像尺寸 heatmap_size [240, 128] # 2D 热图尺寸输入的 1/4 num_joints 15 # Panoptic 数据集使用的关节数前 15 个 COCO 关节这些数值直接决定了内存占用与精度体素分辨率越高、空间范围越大3D 卷积的计算量越大sub_space_size若小于人体实际活动范围则中心检测误差可能导致关节截断。修改时需要同时保持space_size与cube_size的比例关系与相机标定覆盖范围一致。3.2 两阶段模型结构model dict( typeDetectAndRegress, backbonebackbone, # 2D 阶段AssociativeEmbedding ResNet-50 DeconvHead pretrainedcheckpoints/resnet_50_deconv.pth.tar, # 2D 骨干预训练权重 human_detectordict( typeVoxelCenterDetector, image_sizeimage_size, heatmap_sizeheatmap_size, space_sizespace_size, cube_sizecube_size, space_centerspace_center, center_netdict(typeV2VNet, input_channels15, output_channels1), center_headdict( typeCuboidCenterHead, space_sizespace_size, space_centerspace_center, cube_sizecube_size, max_num10, max_pool_kernel3), train_cfgdict(dist_threshold500.0), # 候选中心与 GT 的匹配距离阈值毫米 test_cfgdict(center_threshold0.3), # 中心响应置信度阈值 ), pose_regressordict( typeVoxelSinglePose, image_sizeimage_size, heatmap_sizeheatmap_size, sub_space_sizesub_space_size, sub_cube_sizesub_cube_size, num_joints15, pose_netdict(typeV2VNet, input_channels15, output_channels15), pose_headdict(typeCuboidPoseHead, beta100.0))) # softmax 放大系数其中 2D 阶段的backbone使用AssociativeEmbeddingbottom-up 2D 姿态检测器 ResNet-50 DeconvHead输出 15 通道 2D 热图MultiLossFactory配置了heatmaps_loss_factor1.0、with_heatmaps_loss[True]等损失权重。center_head的max_num10限制每帧最多检测 10 人max_pool_kernel3为 3D NMS 池化核大小。3.3 训练超参optimizer dict(typeAdam, lr0.0001) lr_config dict(policystep, warmuplinear, warmup_iters500, warmup_ratio0.001, step[8, 9]) total_epochs 15 evaluation dict(interval1, metricmAP, save_bestmAP)优化器为 Adam学习率 1e-4训练 15 个 epoch在第 8、9 个 epoch 进行阶梯式衰减前 500 次迭代线性 warmup每个 epoch 结束后在验证集上评估 mAP 并保存最优权重。3.4 数据划分序列与相机视角train_data_cfg定义训练集为 9 个 Panoptic 序列如160422_ultimatum1、160906_ian1等选用 5 个相机视角cam_list[(0, 12), (0, 6), (0, 23), (0, 13), (0, 3)]格式为(panel, node)seq_frame_interval3表示每 3 帧取 1 帧验证集换用160906_pizza1、160422_haggling1、160906_ian5、160906_band4四个序列取帧间隔 12。root_id2指定以mid_hip作为人体中心关节max_num10限制每帧人数。四、数据集与数据管线从 Panoptic 原始数据到体素目标4.1 Body3DMviewDirectPanopticDataset数据集实现位于 body3d_mview_direct_panoptic_dataset.py类名为Body3DMviewDirectPanopticDataset继承自Kpt3dMviewRgbImgDirectDataset同时加载 2D/3D 标注与相机参数。其要点包括load_config从data_cfg解析seq_list、cam_list、num_cameras、seq_frame_interval、root_id、max_num等字段_get_cam读取每个序列的calibration_{seq}.json标定文件把相机外参旋转矩阵乘以坐标变换矩阵M并将平移从厘米换算为毫米* 10.0统一到世界坐标系_get_db遍历序列中的hdPose3d_stage1_coco19/*.json3D 标注把joints19截取为前num_joints个关节对每个身体做 3D 坐标变换乘以M与 10 倍缩放并用SimpleCamera.world_to_pixel反投影出 2D 坐标作为 2D 标注预处理结果会缓存为data/panoptic/group_{subset}_cam{num_cameras}.pkl若缓存存在则直接加载db_file的缓存命中校验要求sequence_list、interval、cam_list与当前配置一致。配置中data_root data/panoptic/train/val/test 均使用该数据集类samples_per_gpu1、workers_per_gpu4val/test 的samples_per_gpu2。4.2 关键数据变换MultiItemProcessshared_transform.py对每个相机视角的样本分别执行子管线LoadImageFromFile→BottomUpRandomAffine→ToTensor→NormalizeTensor再按 key 合并成多视角 batchDiscardDuplicatedItemsshared_transform.py对joints_3d、roots_3d、num_persons等跨视角共享的 key 去重只保留一份GenerateVoxel3DHeatmapTargetpose3d_transform.py训练时生成 3D 人体中心热图目标sigma200.0毫米决定高斯核宽度joint_indices[2]指定只对mid_hip根关节生成中心热图代码先用np.linspace建立空间网格再对每个可见人体的根关节写入三维高斯分布并np.clip(target, 0, 1)Collect负责把img、targets_3d与相机、中心、尺度等 meta 信息聚合给模型。五、模型注册与测试验证检测器DetectAndRegress、VoxelCenterDetector、VoxelSinglePose均通过POSENETS.register_module()注册multiview_pose.py骨干V2VNet通过BACKBONES.register_module()注册v2v_net.py头部CuboidCenterHead、CuboidPoseHead通过HEADS.register_module()注册voxelpose_head.py因此可在配置中按字符串直接引用单测 test_multiview_pose.py 中的test_voxelpose_forward构建了DetectAndRegressbackboneNone直接输入 2D 热图input_heatmaps配合VoxelCenterDetector与VoxelSinglePose的最小闭环覆盖forward_train与forward_test两个分支可作为理解模型接口的参考用例。六、训练、测试与评估指标6.1 训练与测试命令依据 getting_started.md 的通用用法在配置与数据就绪后# 单卡训练 python tools/train.py configs/body/3d_kpt_mview_rgb_img/voxelpose/panoptic/voxelpose_prn64x64x64_cpn80x80x20_panoptic_cam5.py # 多卡分布式训练如 8 卡 ./tools/dist_train.sh configs/body/3d_kpt_mview_rgb_img/voxelpose/panoptic/voxelpose_prn64x64x64_cpn80x80x20_panoptic_cam5.py 8 # 测试并评估metric 可选 mAP / mpjpe python tools/test.py configs/body/3d_kpt_mview_rgb_img/voxelpose/panoptic/voxelpose_prn64x64x64_cpn80x80x20_panoptic_cam5.py \ ${CHECKPOINT_FILE} --eval mAP2D 骨干的预训练权重路径checkpoints/resnet_50_deconv.pth.tar需按配置放置。数据集准备方面docs/en/tasks/3d_body_keypoint.md 提示需要参照 voxelpose-pytorch 项目下载 CMU Panoptic 数据只需下载配置中使用的序列与相机视角HD_Video_Number与相机顺序可调整并注意序列160906_band3可能因 CMU 服务器问题不可用。6.2 评估指标与已发布结果配置中evaluation dict(interval1, metricmAP, save_bestmAP)数据集类ALLOWED_METRICS {mpjpe, mAP}body3d_mview_direct_panoptic_dataset.py。其evaluate方法把每个预测姿态与各 GT 计算 MPJPE 后取最近 GT 匹配并以该误差作为 AP/AR 判定依据mAP指标在 25/50/75/100/125/150 mm 六个 MPJPE 阈值下分别计算 AP 与 AR取平均得到 mAP 与 mARmpjpe指标输出RECALL 500mm与MPJPE 500mm500 mm 阈值内的平均关节误差与召回。对应 panoptic 子目录 README 与本仓库 model-index.yml 中登记的 CMU Panoptic 验证集结果如下ArchmAPmARMPJPERecall500mmprn64_cpn80_res505 相机97.3197.9917.5799.85其中mpjpe_threshold np.arange(25, 155, 25)定义了 mAP 的六个判定阈值body3d_mview_direct_panoptic_dataset.py。该结果表明在 5 个同步相机、2m³ 提议立方体64³ 体素的配置下VoxelPose 能够在 CMU Panoptic 的野性多交互场景中取得很高的关节定位精度与召回率。七、实践要点小结内存与分辨率权衡cube_size[80,80,20]与sub_cube_size[64,64,64]决定两个 3D 网络的输入体积减小分辨率可显著降低显存但会损失中心定位与关节回归精度相机同步与标定是前提ProjectLayer依赖每个相机的内参K、畸变系数与外参R/T完成世界坐标到像素的投影标定误差会直接传导到体素采样位置2D 热图质量决定上限体素特征完全来自多视角 2D 热图的网格采样因此backboneResNet-50 DeconvHead的 2D 检测精度至关重要freeze_2dTrue时 2D 分支仅作特征提取器根关节选择root_id2mid_hip作为人体中心用于生成中心热图GenerateVoxel3DHeatmapTarget的joint_indices[2]与其保持一致调参入口中心检测的dist_threshold、center_threshold、max_num以及姿态回归的beta分别控制训练匹配、测试过滤、最大人数与积分回归的锐度是最常需要调节的四个超参。通过以上配置、源码与数据管线的对照阅读你可以把 VoxelPose 的两阶段多相机 3D 姿态估计流程完整复现到自己的多视角数据上并将本文涉及的空间体素化、多视角投影采样与 3D 积分回归思路迁移到其他多相机任务中。赞分享人工智能计算机视觉深度学习【免费下载链接】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 仓库多视角 3D 人体姿态估计指南基于 VoxelPose 的两阶段体素重建方案ViTPose 仓库多视角 3D 人体姿态估计指南基于 VoxelPose 的两阶段体素重建方案 本文聚焦 ViTPose 仓库中多视角 RGB 图像三维人体人工智能计算机视觉深度学习ViTPose 仓库中的 PoseWarper基于 HRNet 的 PoseTrack18 视频人体姿态估计两阶段训练与复现指南ViTPose 仓库中的 PoseWarper基于 HRNet 的 PoseTrack18 视频人体姿态估计两阶段训练与复现指南 导读 本文围绕本仓库 con人工智能计算机视觉深度学习MMPose 中的 VoxelPose多相机 3D 多人姿态估计算法解读与仓库实践MMPose 中的 VoxelPose多相机 3D 多人姿态估计算法解读与仓库实践 VoxelPoseECCV 2020是 MMPose 中极具代表性的多计算机视觉人工智能深度学习上一篇TDengine 容错与灾备实战WAL 数据可靠性机制与双集群异地同步方案下一篇Teleport MWI Terraform Provider 本地构建与联调指南dev_overrides 配置实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考