HandDiff: 3D Hand Pose Estimation with Diffusion on Image-Point Cloud
论文发表于 CVPR 2024,并被选为 Highlight。HandDiff 将三维手部姿态估计重新表述为一个条件扩散问题:给定手部深度图及其对应点云,从三维高斯噪声开始,逐步去噪得到有明确语义顺序的手部关节点。
Introduction
三维手部姿态估计(3D Hand Pose Estimation,3D HPE)的目标是从输入图像中恢复手部关键点的三维位置,例如手腕、指根、指间关节和指尖。
一个包含 个关节的手部姿态可以表示为:
其中每一行分别对应一个关节的 坐标。
该任务广泛应用于:
- 人机交互;
- AR/VR;
- 手势控制;
- 机器人模仿学习;
- 手-物交互理解。
传统方法通常将其处理为确定性的回归或检测问题:输入一张深度图,网络直接输出唯一的三维手部姿态。
这种方法在手部完整可见时能够取得较高精度,但现实场景中经常存在:
- 手指之间相互遮挡;
- 物体遮挡手掌或手指;
- 深度传感器产生空洞和噪声;
- 多个三维姿态在当前观测下都可能成立。
例如,当食指指尖完全被杯子遮挡时,图像中并不存在能够唯一确定其位置的直接观测。此时,模型需要结合手部骨骼结构和其他可见关节,对被遮挡位置的概率分布进行推断。
扩散模型可以从一个随机分布出发,通过多轮去噪逐渐恢复目标数据,因此适合描述遮挡条件下存在的不确定性。HandDiff 将三维手部姿态看作一个由输入深度信息约束的三维点集生成问题:
其中:
- 表示二维深度图;
- 表示由深度图转换得到的三维点云;
- 表示需要估计的三维手部关节。
但直接将普通三维点云扩散模型用于手部姿态估计会遇到两个核心问题。
问题一:关节点具有明确的语义顺序
普通点云中的点通常没有固定顺序。交换点云中任意两个点,描述的几何物体不会发生变化。
手部关节点则不同:
- 第一个点可能表示手腕;
- 第二个点可能表示拇指指根;
- 第三个点可能表示拇指中间关节;
- 其他点分别对应不同手指和关节。
即使模型生成的所有点都位于正确位置,只要关节顺序发生交换,计算出的关节误差仍然会非常大。
普通点云网络通常具有排列等变性(permutation equivariance):输入点顺序改变,输出点顺序也会相应改变,但网络本身不会主动理解“这个点是食指指尖”。
因此,HandDiff 必须显式加入关节身份信息。
问题二:全局条件不足以完成毫米级定位
许多三维扩散模型只使用一个全局特征描述整个输入物体。
全局特征能够告诉模型:
当前输入大致是一只怎样弯曲的手。
但它很难准确回答:
当前噪声点附近是否存在食指表面?
指尖应当向左移动 3 mm,还是向前移动 5 mm?
手部姿态估计要求毫米级精度,因此去噪器还需要反复查询每个噪声关节附近的局部二维和三维特征。
基于这两个问题,HandDiff 引入:
- Joint-wise Condition:为每个关节生成具有独立语义的条件特征;
- Local Detail Condition:在当前噪声关节附近采样局部图像和点云特征;
- Kinematic Correspondence:通过图结构建模不同关节之间的运动学关系;
- Multi-hypothesis Diffusion:从多个随机姿态出发,聚合多条去噪结果。
Related Work
3D Hand Pose Estimation
基于深度信息的三维手部姿态估计主要包含以下几类方法。
1. 基于二维深度图的方法
这类方法直接使用二维 CNN 处理深度图,并回归关节坐标或关节热图。
优点是:
- 深度图结构规则;
- 卷积运算高效;
- 可以保留密集的局部视觉信息。
局限在于二维卷积主要在图像平面上建模,三维几何关系需要通过网络隐式学习,同时容易受到相机视角影响。
代表方法包括 DeepPrior++、CrossInfoNet、JGR-P2O、SSRN 和 PHG。
2. 基于体素的方法
体素方法先将深度图转换为规则的三维网格,再使用 3D CNN 处理。
体素能够直接表达三维空间,但大量网格单元为空,计算和显存开销较大。为了控制成本,体素分辨率通常不能设置得太高,容易损失精细的手指结构。
代表方法包括 3DCNN 和 V2V。
3. 基于点云的方法
点云直接保留深度观测对应的三维坐标,不需要构建稠密体素。
PointNet、PointNet++ 等网络能够处理无序点集,因此被广泛应用于手部姿态估计。HandPointNet、Point-to-Point、SHPR-Net 和 HandFoldingNet 均属于这一方向。
点云方法能够直接建模三维几何,但在局部邻域查询和特征聚合方面成本较高。现有方法通常只采样较稀疏的点云,例如 1024 个点,导致局部细节不足。
HandDiff 同时保留二维深度图和三维点云:
- 二维分支提供密集的局部细节;
- 三维分支提供明确的空间结构。
需要注意,这里的“图像-点云多模态”通常来自同一张深度图:点云通过相机内参将深度像素反投影到三维空间,并非额外采集的一套独立三维标注。
Diffusion Models for Pose Estimation
此前的姿态扩散方法主要面向人体姿态估计,例如 D3DP、DiffPose 和 DiffuPose。
这些方法通常采用两阶段流程:
- 使用一个预训练回归模型从 RGB 图像中提取二维关键点或热图;
- 将二维关键点作为条件,通过扩散模型完成二维到三维的提升。
该流程的最终精度受到第一阶段二维检测器限制。一旦二维关键点在遮挡区域出现错误,扩散模型接收到的条件也会出现偏差。
HandDiff 直接输入原始深度图及其三维点云,在三维坐标空间中进行单阶段条件去噪,无需预先预测二维关节点。同时,模型使用 DDIM 将训练时的 500 个扩散步压缩为推理时的少量去噪步。
Method
Problem Definition
HandDiff 的输入包含:
- 深度图:
- 从深度图中采样得到的三维点云:
模型输出 个三维关节坐标:
推理开始时,模型没有初始姿态预测,而是从标准高斯分布采样:
随后通过多轮条件去噪,将随机分布逐渐恢复为符合输入观测的手部骨架。
整体流程可以概括为:
- 从深度图和点云提取二维、三维局部特征;
- 从全局特征中生成每个关节专属的条件向量;
- 在每个噪声关节附近采样局部特征;
- 建模关节之间的运动学关系;
- 预测当前关节相对于噪声位置的修正量;
- 使用 DDIM 更新下一步的噪声姿态;
- 重复去噪,得到最终三维手部姿态。
Local Condition Encoder
HandDiff 使用两个并行编码器分别处理深度图和点云。
2D Depth Encoder
二维分支使用基于 ConvNeXt 的自编码器,从深度图中提取:
- 二维局部特征图:
- 一个二维全局特征向量。
二维特征图保留密集的像素级信息。例如,一个弯曲指尖在点云采样后可能只剩少量点,但在深度图中仍然对应一片连续区域。
3D Point Encoder
三维分支使用 PointNet++,从点云中提取:
- 三维局部几何特征:
- 一个三维全局特征向量。
三维特征直接包含空间距离和局部表面结构,可以避免网络完全依赖二维投影关系推断深度。
两个分支承担不同作用:
| 分支 | 主要信息 | 优势 |
|---|---|---|
| 深度图分支 | 密集局部外观和轮廓 | 细节丰富、计算规则 |
| 点云分支 | 三维空间结构 | 距离关系明确、视角依赖较弱 |
Joint-wise Condition Extraction
将二维和三维全局特征直接输入普通点云扩散网络,会产生所有输出点共享同一条件的问题。
为了让模型区分不同关节,HandDiff 首先拼接二维和三维全局特征,然后复制 份:
这些特征经过三层 Bias-Induced Layer(BIL),生成关节级条件:
BIL 为每个关节引入独立的可学习偏置。该偏置可以理解为一种关节身份嵌入:
- 对应手腕;
- 对应某个拇指关节;
- 对应第 个固定语义关节。
即使这些关节共享相同的全局手部特征,独立偏置仍能让网络学习不同的映射函数。
这一模块解决的是关节点排列问题:模型生成的不再是一组无语义的三维点,而是一组具有确定身份的关节点。
Joint-wise Local Feature-conditioned Denoiser
在第 个时间步,去噪器的输入为:
- 当前噪声关节 ;
- 关节级条件 ;
- 二维局部特征 ;
- 三维局部特征 ;
- 当前时间步 。
模型输出对干净姿态的估计:
去噪器包含四个关键部分。
1. Local Feature Sampler
对于当前第 个噪声关节 ,模型分别在二维和三维特征中查询附近的 个邻居。
三维分支直接在点云中进行 KNN 查询。
二维分支先将深度像素投影到与关节相同的三维坐标系,再根据三维距离查询邻居。这样可以避免仅根据图像平面距离采样到深度上相距很远的像素。
对于每个邻居,模型使用相对坐标:
其中:
- 是第 个关节附近第 个观测点;
- 是当前噪声关节位置。
将关节作为局部坐标原点,可以消除绝对平移的影响。模型更加关注:
观测表面相对于当前关节位于哪个方向,以及距离多远。
随着去噪过程推进,关节位置逐渐靠近真实位置,局部采样区域也会随之变化。因此,每一步去噪都能够获得更准确的局部观测。
2. Joint Indicator and Timestep Embedding
同一个去噪器需要同时处理不同关节和不同噪声强度,因此模型需要知道:
- 当前处理的是哪个关节;
- 当前处于扩散过程的哪一步。
HandDiff 分别对关节编号 和时间步 使用正弦位置编码:
关节编号编码与 Joint-wise Condition 作用相近,但关注点有所区别:
- Joint-wise Condition 从输入手部的全局特征中产生关节专属先验;
- Joint Indicator 直接向局部去噪网络声明当前关节身份;
- Timestep Embedding 描述当前姿态中包含多少噪声。
局部条件如果缺少关节身份,会继续保持点集网络的排列等变性,无法稳定对应数据集中的固定关节顺序。
3. Kinematic Correspondence-aware Aggregation
手部关节之间存在明确的骨骼联系。例如:
- 指尖位置受到同一手指中间关节约束;
- 相邻指骨长度不会任意变化;
- 手指关节通常沿一条运动链排列。
HandDiff 使用图卷积处理关节级条件:
其中:
- 是原始关节条件;
- 是可学习的关节对应关系矩阵;
- 是特征变换矩阵;
- 是融合其他关节信息后的条件。
这里的 不仅用于表示固定的骨骼邻接关系,还允许不同特征通道学习不同的关节联系。
随后,模型将以下信息拼接:
- 邻居相对坐标;
- 邻居局部特征;
- 图卷积后的关节条件;
- 时间步编码;
- 关节身份编码。
第 个关节附近第 个邻居的更新特征为:
该聚合模块在网络中重复四次,并在每两个模块之间使用 Max Pooling,将局部邻居信息重新汇总为关节级特征:
因此,信息流会在两个层次之间反复传递:
- 关节级条件指导局部特征采样和处理;
- 局部观测更新关节级表示;
- 更新后的关节表示再次参与后续局部推理。
4. Residual Refiner
最后,网络不直接重新生成完整坐标,而是预测当前噪声关节的修正量:
其中 表示预测的三维偏移。
残差结构使每一步去噪可以理解为:
根据当前关节附近的局部观测和整体骨骼结构,判断关节应当向哪个方向移动。
与一次性从全局特征回归全部关节相比,这种局部迭代修正更适合进行精确定位。
Training
Forward Diffusion
训练时,模型从真实关节 出发,逐渐加入高斯噪声:
其中:
随着 增大:
- 逐渐减小;
- 原始姿态信息逐渐消失;
- 高斯噪声占比逐渐增加。
训练时随机采样一个时间步 ,模型根据当前噪声姿态和输入条件,直接预测干净关节:
HandDiff 采用的是 prediction,即直接预测无噪声关节坐标,而非预测加入的噪声 。
Loss Function
模型使用 Smooth L1 Loss 监督关节坐标:
Smooth L1 在误差较小时使用二次函数,在误差较大时近似线性函数,对异常值的敏感度低于普通平方误差。
论文还对 Joint-wise Condition 线性映射得到的初始关节坐标施加监督,使关节级条件在进入完整去噪器前已经包含基本姿态信息。
Inference
推理时,HandDiff 从 个不同的高斯噪声姿态开始:
每个假设分别经过 DDIM 反向过程。
在第 步,网络首先预测干净姿态 ,随后使用 DDIM Noiser 构造下一时间步的输入 。这一过程重复 次,其中推理步数 可以远小于训练扩散步数 。
最后对多个假设进行平均:
多个随机假设使模型能够探索遮挡条件下的不同可能姿态。不过 HandDiff 最终仍输出一个平均后的确定性结果,其目标主要是提高估计精度,而非保留完整的多模态姿态分布。
Experiment
Experiment Settings
论文使用 NVIDIA TITAN RTX 进行训练,主要配置如下:
| 配置 | 数值 |
|---|---|
| 输入深度图尺寸 | |
| 输入点云数量 | 1024 |
| 2D 特征维度 | 128 |
| 3D 特征维度 | 128 |
| 关节条件维度 | 512 |
| Batch Size | 64 |
| 训练扩散步数 | 500 |
| Optimizer | AdamW |
| 初始学习率 | 0.001 |
| 训练轮数 | 30 |
数据增强包括:
- 随机旋转;
- 随机缩放;
- mm 随机平移。
模型每训练 10 个 epoch,将学习率降低为原来的 。
Dataset
ICVL
- 约 22K 个训练深度帧;
- 约 1.6K 个测试深度帧;
- 每帧标注 16 个关节。
MSRA
- 超过 76K 个深度帧;
- 9 名受试者;
- 每名受试者包含 17 种手势;
- 每帧标注 21 个关节。
NYU
- 使用 PrimeSense 深度传感器从三个视角采集;
- 每个视角包含约 72K 个训练帧和 8K 个测试帧;
- 原始数据标注 36 个关节;
- 按照既有工作选取其中 14 个关节评估。
DexYCB
DexYCB 主要用于评估手-物交互场景:
- 582K 个图像帧;
- 10 名受试者;
- 20 个 YCB 物体;
- 8 个相机视角;
- 每帧标注 21 个关节。
官方提供四种划分:
| 协议 | 测试内容 |
|---|---|
| S0 | 已见人物、视角和物体的组合 |
| S1 | 未见人物 |
| S2 | 未见相机视角 |
| S3 | 未见抓握物体 |
Metrics
论文使用两个常见指标。
Mean Joint Error
计算预测关节与真实关节之间欧氏距离的平均值:
单位为毫米,数值越低越好。
Success Rate
给定误差阈值 ,统计平均关节误差低于该阈值的测试帧比例。
该指标可以展示模型在不同精度要求下的稳定性。
Comparison with State-of-the-Art Methods
单手姿态估计
| 方法 | 输入 | ICVL ↓ | MSRA ↓ | NYU ↓ |
|---|---|---|---|---|
| DeepPrior++ | Depth | 8.10 | 9.50 | 12.24 |
| JGR-P2O | Depth | 6.02 | 7.55 | 8.29 |
| SSRN | Depth | 6.01 | 7.05 | 7.37 |
| PHG | Depth | 5.97 | 6.94 | 7.39 |
| HandFolding | Point | 5.95 | 7.34 | 8.58 |
| IPNet | Depth + Point | 5.76 | 6.92 | 7.17 |
| HandDiff | Depth + Point | 5.72 | 6.53 | 7.38 |
单位均为毫米。
HandDiff 在 ICVL 和 MSRA 上取得最低平均关节误差:
- ICVL:由 IPNet 的 5.76 mm 降低到 5.72 mm;
- MSRA:由 IPNet 的 6.92 mm 降低到 6.53 mm。
在 NYU 上,HandDiff 的 7.38 mm 略低于多数方法,但没有超过 IPNet 的 7.17 mm 和 SSRN 的 7.37 mm。因此,论文在不同数据集上的收益并不完全一致。
手-物交互姿态估计
| 方法 | S0 ↓ | S1 ↓ | S2 ↓ | S3 ↓ | AVG ↓ |
|---|---|---|---|---|---|
| A2J | 23.93 | 25.57 | 27.65 | 24.92 | 25.52 |
| Spurr et al. | 17.34 | 22.26 | 25.49 | 18.44 | 18.44 |
| Tse et al. | 16.05 | 21.22 | 27.01 | 17.93 | 20.55 |
| IPNet | 8.03 | 9.01 | 8.60 | 7.80 | 8.36 |
| HandDiff | 7.66 | 8.73 | 8.40 | 7.53 | 8.07 |
HandDiff 在 DexYCB 的四个官方协议上均超过 IPNet:
- 未见人物 S1: mm;
- 未见视角 S2: mm;
- 未见物体 S3: mm;
- 平均误差: mm。
这说明局部条件和关节结构建模对于物体遮挡场景具有一定效果。
Ablation Study
Different Components
论文在 DexYCB 上逐步加入各个模块:
- JC:Joint-wise Condition;
- LC:Local Condition;
- JI:Joint Indicator;
- KC:Kinematic Correspondence;
- MH:Multiple Hypotheses。
| JC | LC | JI | KC | MH | Mean Joint Error ↓ |
|---|---|---|---|---|---|
| ✓ | 9.17 | ||||
| ✓ | 49.58 | ||||
| ✓ | 8.37 | ||||
| ✓ | ✓ | 8.23 | |||
| ✓ | ✓ | 8.28 | |||
| ✓ | ✓ | ✓ | 8.13 | ||
| ✓ | ✓ | ✓ | 7.94 | ||
| ✓ | ✓ | ✓ | ✓ | 7.74 | |
| ✓ | ✓ | ✓ | ✓ | ✓ | 7.66 |
其中最值得关注的是:仅使用 Local Condition 时,误差达到 49.58 mm。
原因在于局部点云特征本身具有排列等变性。网络可以将噪声点移动到手部表面附近,却无法确定每个点应当对应哪一个具体关节。
加入 Joint Indicator 后,误差从 49.58 mm 降至 8.28 mm,说明显式关节身份是将普通点集扩散模型迁移到姿态估计任务的必要条件。
在完整的 JC、LC 和 JI 基础上:
- 加入关节运动学关系后,误差从 8.13 mm 降至 7.74 mm;
- 加入多假设聚合后,进一步降至 7.66 mm。
Different Input Modalities
| 条件输入 | Mean Joint Error ↓ |
|---|---|
| 2D Depth | 8.23 |
| 3D Points | 9.58 |
| 2D Depth + 3D Points | 7.74 |
仅使用二维深度图时,模型缺少显式三维空间信息,误差为 8.23 mm。
仅使用三维点云时,1024 个采样点不足以完整保留手指局部细节,误差上升到 9.58 mm。
融合两种表示后,误差降低到 7.74 mm,验证了二维密集信息和三维几何信息之间的互补关系。
Number of Denoising Timesteps
模型在训练时使用 500 个扩散步,但 DDIM 允许在推理时跳过大量中间步骤。
实验结果显示:
- 仅使用 2 个去噪步已经能够得到可接受结果;
- 使用 10 个去噪步时,NYU 平均关节误差约为 7.44 mm;
- 继续增加到 20、30 或 50 步,提升非常有限。
这是因为手部姿态只包含 14 至 21 个三维点,生成空间远小于图像或稠密点云扩散任务。
在 10 个去噪步、单个假设的设置下:
- 每帧推理时间约为 98 ms;
- 显存占用约为 2.2 GB;
- 对应速度约为 10 FPS。
因此,HandDiff 的推理速度仍低于常见的单次前向回归模型,并不适合直接用于高帧率实时手部追踪。
Number of Hypotheses
随着初始随机假设数量增加,平均关节误差会逐渐下降。
但当假设数量超过 10 后,继续增加假设带来的改善已经很小。
多假设推理还会近似线性增加计算成本。例如,单假设已经需要多次去噪,使用 10 个假设意味着需要同时运行 10 条反向扩散轨迹。
因此,多假设更适合离线高精度估计,而单假设或少量假设更适合对速度有要求的应用。
Discussion
HandDiff 生成的是什么?
HandDiff 输出的是三维关节点坐标:
它不直接输出:
- MANO 姿态参数;
- MANO 形状参数;
- 完整手部网格;
- 世界坐标系中的手部运动轨迹;
- 视频级时序姿态。
因此,HandDiff 更接近一个使用扩散过程实现的单帧三维关键点检测器。
如需获得 MANO 参数,还需要增加 MANO fitting 或参数回归模块,根据预测关节点拟合手部网格。
点云是否需要额外真值?
HandDiff 使用的点云由真实深度图反投影获得:
因此:
- 不需要为每个点额外提供三维语义标签;
- 需要真实深度观测以及相机内参;
- 实验中的点云并非从普通单目 RGB 图像直接获得。
若应用到纯单目视频,需要先使用单目深度估计模型生成伪深度,再转换为点云。此时,深度尺度误差、局部空洞和手部边界误差会继续传递到 HandDiff 中,而论文没有验证这一设置。
扩散模型的主要收益
HandDiff 的扩散过程主要提供三个能力:
- 从随机初始化中逐步修正关节,而非一次完成全部坐标回归;
- 允许通过不同随机初始值产生多个姿态假设;
- 在遮挡条件下建模潜在的姿态不确定性。
但论文的性能提升也依赖于:
- 图像和点云双分支;
- 关节身份编码;
- 局部特征查询;
- GCN 运动学关系;
- 多假设平均。
消融实验主要比较不同 HandDiff 模块,没有提供一个与完整去噪器参数量相近、但采用单步确定性回归的严格对照。因此,当前实验难以完全分离“扩散过程本身”和“关节级局部网络结构”各自带来的收益。
Limitation
HandDiff 仍存在以下限制:
- 依赖深度输入,无法直接处理普通单目 RGB;
- 每帧独立估计,没有显式时序一致性;
- 推理需要多次网络前向,速度低于单步回归模型;
- 只预测关节点,没有输出完整手部网格;
- 多假设最终通过平均合并,可能削弱多峰分布的表达能力;
- 无法处理双手相互作用场景。
论文将交互双手建模列为未来方向,并提出可以探索二部图结构和基于骨架的双手关系建模。
Conclusion
HandDiff 将三维手部姿态估计表述为一个由深度图和点云共同约束的三维扩散问题。
其关键贡献并不只是在关节坐标上加入噪声,而是针对手部姿态设计了三类结构条件:
- Joint-wise Condition 为每个关节提供独立语义,解决点集扩散中的排列歧义;
- Local Condition 根据当前噪声位置动态查询附近的二维和三维观测,支持毫米级定位;
- Kinematic Correspondence 建模关节之间的骨骼关系,避免各个关节独立漂移。
实验中,HandDiff 在 ICVL、MSRA 和 DexYCB 上取得了较低的平均关节误差,并验证了二维深度特征与三维点云特征的互补性。
从更广泛的角度看,HandDiff 展示了一种将扩散模型用于检测任务的方法:将待检测目标表示为一组带有身份的连续坐标,从随机初始化开始,通过局部观测和结构先验进行迭代修正。
这一思路可以继续扩展到:
- 基于点云条件的 MANO 参数生成;
- 遮挡条件下的多假设手部网格恢复;
- 视频级时序手部扩散;
- 双手及手-物联合姿态估计;
- 世界坐标系中的手部轨迹生成。