SMPL学习笔记

主要参考

https://zhuanlan.zhihu.com/p/158700893
https://zhuanlan.zhihu.com/p/420090584
https://blog.csdn.net/shenlanshenyanai/article/details/122047425

人体表示的几种方式:

  1. 只有关节点(12都叫人体姿态估计 pose estimation)
  2. 关节点和边 (12都叫人体姿态估计 pose estimation)
  3. SMPL:包含高矮胖瘦,但不包含手势、脚踝、表情等的mesh表示。
  4. SMPL-X: 包含手势、脚踝、表情等的mesh表示。

在这里插入图片描述

SMPL简介

SMPL(Skinned Multi-Person Linear (SMPL) Model)是一种,用形状参数和姿势参数来对人体进行编码的模型。

  • 形状参数:10个标量构成的向量。每个标量可以简单地理解为人体沿某方向的膨胀或收缩度。更准确的描述是主成分,也就是PCA主成分分析里面的主成分。
  • 姿势参数:24个关节,

姿态参数θ:24*3: 24个关节的旋转角度

  • 姿态参数θ:24个关节。其中23个非根关节相对父节点的旋转角度的轴角式表达(axis-angle representation)。根节点存疑??
  • 这里的轴角式用三元数表示:θ = (x,y,z) = θe。 含义是以其单位向量e为旋转轴, 旋转大小是||θ||。 (似乎是右手定则旋转)

在这里插入图片描述
姿态的纠正:
通过视觉方法等,实现2D的姿态估计,然后转到3D(或者其他原因),可能导致3D姿态不对(不是正常人能做出来的动作)。

通常的纠正方法包括:

  1. 收集大规模正常人体活动数据,学习正常人姿态的范围,然后手动限制关节旋转角度
  2. 用大规模数据集做GAN的训练,训练一个discrininator来判定是不是正常动作

形状参数β:

把人体形状(6890个mesh vertices的位置)提取出10个主成分。每个主成分对应的取值,构成参数β。 β ∈ R 10 \beta \in \mathbb{R}^{10} βR10.

SMPL的第一个主成分大概类似于高矮,或者是整体的size。第二个大概是胖瘦。

人体合成管道(Human synthesis pipeline):SMPL合成人体模型的过程

三个阶段:

Shape Blend Shapes

一句话总结:根据形状参数β,调节人体身材。
输入:基模板,
输出:静默姿态((rest pose,也可以称之为T-pose))下的人体mesh, 称为 V s h a p e V_{shape} Vshape
计算方法: V s h a p e = D β + T ‾ V_{shape} = D\beta + \overline{T} Vshape=Dβ+T

其中,

  • T ‾ \overline{T} T是基模板 ,是根据大量真实人体mesh得到的均值。用N = 6890个端点(vertex)表示整个mesh,每个端点有着x,y,z三个空间坐标
  • β:形状参数,10个标量构成的向量,即 β ∈ R 10 \beta \in \mathbb{R}^{10} βR10
  • D ∈ R 6890 × 3 × 10 D \in \mathbb{R^{6890 \times 3 \times 10}} DR6890×3×10 是10个主成分的偏移方向(常量):主要形状成分(Principal Shape Components)或者称之为端点偏移(Vertex Deviations),代码里叫做shapedirs。(没仔细看,感觉应该是主成分分析PCA计算得到的吧)
    • 可以理解为,一共有10个主成分(对应10个β参数),有的控制高矮,有的控制胖瘦,有的控制小肚子,有的控制腿等。
    • 每个主成分包含6890个顶点的偏移方向,比如往上是长高,往外是变胖。这个偏移方向乘以偏移大小β,得到最终的相对于T的偏移。
    • 比如下图左右分别是第一个和第二个主成分的样子。
    • 可以猜想,第一个主成分的6890个点的坐标位置会变高,即便宜方向D是向上的。第二个主成分的便宜方向是向外的。

在这里插入图片描述

根据形状参数β,调节人体mesh的高矮胖瘦

Pose Blend Shapes

特定动作会影响人体形状,比如坐着比站着更容易有小肚子。因此这一步就是加上姿态参数θ对身材的影响(还是求的静默姿态)。 也即,关节旋转导致其周围的mesh顶点的变形。

v_posed = v_shaped + self.posedirs.dot(lrotmin)
  • v_posed : 6890x3 经过这一步计算以后得到的所有mesh顶点的xyz坐标。
  • v_shaped :上一步计算得到的 V s h a p e V_{shape} Vshape
  • lrotmin( R R R): 23×9的旋转矩阵。将由轴角式的θ(23×3) 转换得到的23×9的旋转矩阵。
  • self.posedirs: 6890×3 ×23×9 常量,类似于上面shape blend里面的 D D D D ∈ R 6890 × 3 × 10 D \in \mathbb{R^{6890 \times 3 \times 10}} DR6890×3×10 是10个β参数对6890×3 的mesh顶点位置的影响。而我们的23×9的关节旋转对顶点位置的影响就用posedirs表示。这个值是通过数据集训练学习得到的。

蒙皮

  • 前两步计算得到的都是Tpose下面的mesh。接下来需要蒙皮,即“让mesh vertices 即skin,跟随关节点进行移动”。
  • 具体来说,需要根据全局关节变换(旋转和平移)的加权组合来变换。
  • 其中关节旋转上面已经有了,就是θ或者是旋转矩阵R。

关节位置估算 Joint Locations Estimation

刚才我们由10个shape参数β和24*3个theta参数,求出了所有mesh vertices的位置。但我们还没给出所有joint关节的位置。

在SMPL模型中,关节位置由周围顶点的坐标加权得到。权重J_regressor是从数据集中学习的:

# v_shape:          6890x3    the mesh in neutral T-pose calculated from a shape parameter of 10 scalar values.
# self.J_regressor: 24x6890   the regression matrix that maps 6890 vertex to 24 joint locations
# self.J:           24x3      24 joint (x,y,z) locations
self.J = self.J_regressor.dot(v_shaped)

这样,我们就求出了Tpose下,每个关节的坐标。接下来在此基础上需要改变pose。

蒙皮变形(skinning deformation)

接下来,我们需要:

  • 将每个joint变换到目标pose。
    • 依此累乘父关节的变换矩阵R即可得到相对于Tpose的全局变换。
  • 将每个mesh vertix变换到目标pose
    • 每个vertix位置是24个关节位置加权的结果。权重weights : (6890, 24)

优缺点

这种方法与传统的LBS的最大的不同在于其提出的人体姿态影像体表形貌的方法,这种方法可以模拟人的肌肉在肢体运动过程中的凸起和凹陷。因此可以避免人体在运动过程中的表面失真,可以精准的刻画人的肌肉拉伸以及收缩运动的形貌。

缺点:不包含衣物和头发

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值