HandDiff: 3D Hand Pose Estimation with Diffusion on Image-Point Cloud
HandDiff: 3D Hand Pose Estimation with Diffusion on Image-Point Cloud
时间:CVPR2024
机构:ETH & CMU & Sungkyunkwan University
TL;DR
将手部分3D点预测任务建模为点云生成任务,提出Handiff算法,以手部图像点云为条件输入,通过迭代降噪的方式预测精确的手部姿态,效果在四个benchmark上都达到SOTA。
Method
输入:手部深度图\(D_{in} ∈ R^{H×W}\), sampled 3D点云\(P_{in} ∈ R^{N ×3}\)
输出: \(J^0 ∈ R^{J×3}\)
特征提取
depth image -> CNN -> Local 2D特征
sampled 3D points -> PointNet++ -> Local 3D特征
Joint-wise Condition Extraction
提取Joint-wise的embedding特征
做法: cat[local 2d feature, 3d feature] 外接J个head,每个Head独立预测自己的joint embedding特征,该joint wise feature将作为condition信息,在diffusion每个迭代轮次均被使用。
算法pipeline看图即可,与diffusion model几乎一致了。
Code
分析一下xx.py,Q1:模型Backbone是什么?Q2:模型预测noise还是预测去噪之后的结果?Q3:模型Loss是什么设计的?Q4:模型输出的shape是什么?Q5: 实验代码中diffusion迭代多少次?
让我们根据提供的 `handdiff.py` 文件内容来回答你的问题。Q1: 模型的Backbone是什么?
在 handdiff.py
中,模型使用了 ConvNeXt
作为其backbone。ConvNeXt
是一个基于卷积神经网络的架构,它在模型中用于提取特征。在代码中,ConvNeXt
被实例化为 self.backbone
,并且根据模型配置的不同(例如 'tiny', 'small', 'base', 'large'),其深度和维度会有所不同。
Q2: 模型预测noise还是预测去噪之后的结果?
模型是一个去噪模型,它预测的是去噪之后的结果。这可以从模型使用 DiffusionPoint
类这一事实中推断出来,该类在代码中用于定义扩散过程中的点。扩散模型通常用于生成或恢复数据,通过逐步去除噪声来恢复出干净的数据。
Q3: 模型Loss是什么设计的?
模型的损失函数是一个平滑的L1损失(smooth L1 loss),定义在 smooth_l1_loss
函数中。这个损失函数通常用于回归问题,它结合了L1损失和L2损失的特点,对于异常值不敏感,并且在优化过程中更加平滑。
Q4: 模型输出的shape是什么?
模型的输出是一个关节点的预测,具体来说,是一个 BxJx3
的张量,其中 B
是批次大小,J
是关节点的数量,3
代表每个关节点的 X
, Y
, Z
坐标。这可以从模型的 forward
方法和 get_loss
方法中的处理逻辑中看出。
Q5: 实验代码中diffusion迭代多少次?
在实验代码的配置中,迭代次数由 iters
参数控制。在 HandModel
类的初始化中,iters
被用作 VarianceSchedule
类的参数,这表明扩散过程的迭代次数。根据代码中的注释和上下文,迭代次数被设置为 opt.iters
,其具体值在实验代码中被设置为500。
Q6: 文章中表格6的hypotheses指得是什么?
在文章 "HandDiff: 3D Hand Pose Estimation with Diffusion on Image-Point Cloud" 中,表格 6 显示了在去噪过程中不同假设数量(hypotheses)下的平均关节误差(mean joint error)。这里的 "hypotheses" 指的是在推断过程中,模型生成的多种可能的3D手部姿势假设。
具体来说,在扩散模型(diffusion model)中,为了提高估计的准确性,可以采用多假设策略,即生成多个不同的姿态预测。这些预测可以看作是关于真实手部姿势的不同假设。通过迭代地去噪,每个假设都会逐步改进,最终通过某种形式的集成或平均,以获得更准确的结果。
在文中的实验设置中,作者探讨了使用不同数量的假设对最终手部姿势估计性能的影响。结果表明,随着假设数量的增加,误差通常会减小,但当假设数量达到一定程度后,进一步增加带来的性能提升会变得边际化。
以上就是对 handdiff.py
文件内容的分析。如果你需要更详细的代码解释或有其他问题,请随时提问。
Experiment
Ablation
- using local conditions (LC); 2) using joint indicator (JI); 3) using joint-wise con- dition (JC) and LC; 4) using LC with JI; 5) using JC and LC with JI; 6) using JC and LC with JI and kinematic correspondence (KC); 7) using JC, LC with JI and KC, and multiple hypotheses (MH), which is our full configuration. Note that the use of local conditions without KC is imple- mented by applying a PointNet layer [33] on noisy joints.
总结与发散
结合diffusion的算法原理扩充了文章篇幅
将手部特征作为先验condition信息,diffusion过程更像是一个cascade的过程
相关链接
人体上Diffusion工作参考CVPR2023这篇 DiffPose: Multi-hypothesis Human Pose Estimation using Diffusion Models