3D 人体姿态估计:从单目图像到三维骨架

FreeGuideOnline 最新 2026-06-19

3D 人体姿态估计:从单目图像到三维骨架

欢迎来到本教程。我们将从零开始,系统地学习如何从一张普通的 RGB 图像中恢复出人体在三维空间中的骨架结构。本教程面向初学者,力求用清晰的逻辑和直观的解释,带你走进 3D 人体姿态估计这个充满魅力的领域。

什么是 3D 人体姿态估计?

3D 人体姿态估计的目标是:给定一张包含人体的单目图像(或视频),预测出人体关键关节(如肩膀、手肘、膝盖等)在三维空间中的精确坐标。这里的“三维空间”通常以摄像机为原点,输出是一组 $(x, y, z)$ 坐标,单位为毫米或米。

这项技术是计算机视觉的核心课题之一,广泛支撑着:

  • 动作捕捉与影视制作:替代昂贵的光学动捕设备,仅用普通摄像头即可完成人物数字化。
  • AR/VR 与虚拟试穿:让虚拟角色实时模仿用户的动作,或实现衣服的虚拟贴合。
  • 人机交互与行为理解:识别手势、体态,帮助机器人理解人类的意图。
  • 运动分析与康复:量化评估运动员的动作质量或患者的康复进展。

必备先修:2D 姿态估计速览

3D 姿态估计通常以 2D 姿态估计作为前端:先找出图像中人体各个关节的二维像素坐标,再将这些 2D 点“反投影”到三维空间。因此,我们先快速回顾一下 2D 姿态估计的核心思想。

2D 关键点检测的主流方式

  • 自顶向下:先用人体检测器框出每个人,再对每个框单独预测关键点。代表方法:HRNet, HigherHRNet。
  • 自底向上:先检测出图像中所有的关键点,再通过算法(如 PAFs, Part Affinity Fields)将关键点组装成不同的人。代表方法:OpenPose, PifPaf。

现在,绝大多数 3D 姿态估计方法都依赖一个性能优异的 2D 姿态检测器,将它的输出作为 3D 模块的输入。因此,可以认为 2D 姿态估计已经是相对成熟的基础工具。

核心策略:从 2D 姿态“提升”到 3D

直接从单张图像恢复绝对深度是病态问题,因为二维图像丢失了深度信息。研究者们发现一个有效的解决方案:先获得准确的 2D 骨架,然后设计一个神经网络专门学习从 2D 关键点到 3D 关键点的映射,这个过程被称为 2D to 3D Lifting

简单而强大的基线:Martinez et al. (ICCV 2017)

Martinez 等人的工作证明了仅仅使用全连接网络,就可以从 GT 2D 姿态恢复出相当准确的 3D 姿态。其网络结构极简:

  1. 输入:$2 \times J$ 维向量(所有关节的二维坐标,归一化后)
  2. 多个带有残差连接的全连接块
  3. 输出:$3 \times J$ 维向量(所有关节的三维坐标)
import torch.nn as nn

class SimpleLiftingNet(nn.Module):
    def __init__(self, num_joints=17):
        super().__init__()
        self.fc1 = nn.Linear(2*num_joints, 1024)
        self.bn1 = nn.BatchNorm1d(1024)
        self.res_blocks = nn.Sequential(
            nn.Linear(1024, 1024), nn.BatchNorm1d(1024), nn.ReLU(),
            nn.Linear(1024, 1024), nn.BatchNorm1d(1024),
        )
        self.fc_out = nn.Linear(1024, 3*num_joints)

    def forward(self, x):
        x = torch.relu(self.bn1(self.fc1(x)))
        x = torch.relu(self.res_blocks(x) + x)  # 残差连接
        x = self.fc_out(x)
        return x

这个简单模型惊人地有效,说明2D 关键点坐标中已经编码了充分的 3D 信息(通过骨骼长度比例、几何约束等),网络主要学习的是如何从这些统计规律中推断深度。

引入时间信息:三维姿态的半监督与序列建模

单张图像具有深度歧义性,但相邻帧可以提供强有力的时序约束。典型方法:

  • VideoPose3D (Dario Pavllo et al., CVPR 2019):使用空洞时间卷积在 2D 关键点序列上操作,利用多帧信息预测中心帧的 3D 姿态。它完全在 2D 关键点空间上做提升,速度快且准确。
  • 用未标注视频进行半监督训练:通过预测同一序列中部分帧的 3D 姿态,再投影回 2D 与原 2D 关键点比较,实现对大量无 3D 真值视频的利用,极大提升泛化性能。

时序方法的核心公式(投影一致性损失):

[\mathcal{L}{\text{proj}} = \frac{1}{T} \sum{t=1}^{T} \left| \mathbf{x}{t}^{\text{2D}} - \Pi \left( \mathbf{X}{t}^{\text{3D}} \right) \right|_2^2]

其中 $\mathbf{X}{t}^{\text{3D}}$ 是预测的三维姿态,$\Pi$ 是投影函数(弱透视或全透视),$\mathbf{x}{t}^{\text{2D}}$ 是原始二维检测。

图卷积网络:基于骨骼结构的先验

人体骨架天然是一张图,关节为节点,骨骼为边。图卷积网络 (GCN) 可以在图结构上传播信息,充分建模关节间的局部与全局关系。

  • SemGCN (Zhao et al., CVPR 2019):提出了语义图卷积,不仅能学习不同关节的连接权重,还能学习到非物理连接(如对称肢体)的语义关系。
  • 直接在图结构上回归三维坐标,输出更为平滑且更符合人体运动学约束。

端到端回归:直接从图像像素到 3D 姿态

虽然提升法占主导,但也不乏直接学习图像到 3D 姿态映射的方法。它们省去了显式 2D 中间步骤,理论上可以避免 2D 检测错误对后续的累积影响。

体积热图回归

将 2D 热图拓展到 3D 空间:对于每个关节,在离散化的三维体素网格上预测可能性。代表方法:

  • V2V-PoseNet (Moon et al., CVPR 2019):在 $64 \times 64 \times 64$ 的体积中心附近回归各关键点的 3D 热图,通过软 argmax 得到亚体素精度的坐标。
  • 这类方法需要大量显存,但精度高,尤其擅长处理遮挡和密集关节。

人体模型驱动的回归

为了获得更具物理真实性的结果,许多研究将姿态估计与参数化人体模型 (SMPL) 结合。SMPL 模型用低维参数 $( \theta, \beta )$ 控制人体姿势和体型,可输出 6890 个顶点的三维网格。

  • HMR (Kanazawa et al., CVPR 2018):直接从图像回归 SMPL 参数,对抗训练确保生成的人体姿态符合自然分布。
  • SPIN (Kolotouros et al., ICCV 2019):结合了回归与优化,利用回归网络提供初始值,再用基于循环的优化进一步提升拟合精度。

通过 SMPL,我们不仅能得到关节位置,还能得到人体形状、表面网格,非常适合做虚拟试穿、渲染等下游任务。

主流数据集一览

要想训练和评估模型,必须了解常用数据集及其特点。

  • Human3.6M:最大最常用的室内单人 3D 姿态数据集。包含 11 名受试者(7 男 4 女),360 万帧,4 个同步摄像机。提供 2D/3D 关节真值、24 个身体部位。评估标准中使用 S1, S5, S6, S7, S8 为训练,S9, S11 为测试。
  • MPI-INF-3DHP:室外和室内混合场景,包含一些复杂动作和多人交互。评估指标有 MPJPE、AUC 等,常用于测试泛化能力。
  • 3DPW:户外自然视频数据集,使用 IMU 传感器和移动摄像机采集。标注真实且动作自由,是测试 in-the-wild 性能的关键基准。
  • AMASS:一个巨大的合成人体运动数据集,汇总了多个光学动捕库,提供 SMPL 参数,常用于预训练或数据增强。

评估指标

不同论文常使用的指标,理解它们才能看懂结果好坏。

  • MPJPE (Mean Per Joint Position Error)
    平均关节位置误差:计算每个关节预测位置与真值位置的欧氏距离,再对所有关节和所有帧取平均。单位毫米。在根关节对齐后(减去根节点坐标)计算。
  • P-MPJPE (Procrustes Aligned MPJPE)
    先对预测的 3D 姿态进行刚性变换(旋转、平移、缩放)与真值对齐,再计算 MPJPE。消除了绝对坐标尺度、朝向影响,衡量姿态形状的误差。
  • MPJVE (Mean Per Joint Velocity Error)
    适用于视频序列:计算预测的关节速度(帧间位移)与真值关节速度的差异,反映动作动态的准确性。
  • AUC / 3DPCK
    在某些数据集(如 MPI-INF-3DHP)中,会使用曲线下面积(AUC)或 3D 正确关键点百分比(3DPCK),即误差小于阈值的比例。

主要挑战与前沿方向

即使方法众多,3D 姿态估计仍面临诸多难题:

  1. 深度模糊与遮挡
    单目图像天生的尺度-深度歧义,以及肢体自遮挡或人与人互遮挡。解法:多视角融合、时序一致性、图模型中的物理约束。
  2. 从实验室到开放世界的泛化
    训练数据多在受限室内环境下采集,在户外光照、服饰、姿态多变时性能下降。对策:域适应、合成数据增强、弱监督/自监督利用大量无标注数据。
  3. 实时性与轻量化
    提升法本身很快,但前置 2D 检测器可能成为瓶颈。轻量化 2D 检测器(如 MobilePose)加简易提升网络,可在移动端实现实时 3D 人体跟踪。
  4. 多人交互姿态估计
    此时不仅要预测每个人的 3D 姿态,还要处理人与人之间的空间关系。近期工作(如 ROMP, BEV)尝试在鸟瞰视角下进行多人定位与重建。

动手实践:快速搭建一个 3D 姿态估计器

假设你已经有一个现成的 2D 检测器(例如用 OpenPose 或 MediaPipe 输出),只需要实现最简单的提升网络,就能体验从 2D 到 3D 的奇妙转换。

步骤 1:准备 2D 关键点输入
将每帧检测到的关键点坐标相对于人体中心(通常用骨盆或髋部中点)归一化,并缩放到零均值单位方差。

步骤 2:搭建网络
使用前面 SimpleLiftingNet 的代码,或者使用 VideoPose3D 提供的预训练模型。

步骤 3:后处理
网络输出的是归一化坐标,需要反归一化回真实尺度。通过逆变换恢复绝对坐标,同时可以利用已知的骨骼平均长度进行尺度校准。

步骤 4:可视化
使用 matplotlib 的 3D 绘图,或者用 pyrenderopen3d 渲染出三维骨架,直观验证效果。

总结

本教程覆盖了 3D 人体姿态估计的核心技术路径:从 2D 姿态检测出发,以 Lifting Network 为纽带,连接上时序建模、图卷积、端到端体积回归以及人体模型等多种先进方法。你学习了主要数据集和评估指标,也看到了这个方向仍然存在的挑战。希望这些内容能帮你建立起清晰的知识框架,并点燃进一步探索的热情。

如果你对某个方法想深入了解,推荐阅读相关原始论文,并利用开源的 PyTorch 实现进行实验。动手是一切理解的开始。