SMPL 人体模型简要

smpl是指2015 马普的一篇文章“SMPL: a skinned multi-person linear model”中构建的人体参数化三维模型,人体可以理解为是一个基础模型和在该模型基础上进行形变的总和,在形变基础上进行PCA,得到刻画形状的低维参数——形状参数(shape);同时,使用运动树表示人体的姿势,即运动树每个关节点和父节点的旋转关系,该关系可以表示为三维向量,最终每个关节点的局部旋转向量构成了smpl模型的姿势参数(pose)。考虑到与目前的市面上的渲染器,SMPL模型使用得较多。总结:三维参数化人体模型被广泛使用,它是估计人体三维姿态和形状的有力先验。其主要思想是通过低维参数对三维人体(包括脸、手和身体)的变形进行建模  。SCAPE-》SMPL-〉SMPL-X等。

 

SMPL  源码

['v_template', 'weights', 'posedirs', 'pose', 'trans', 'shapedirs', 'betas', 'J']:

basicModel_m_lbs_10_207_0_v1.0.0.pkl

下图展示了SMPL模型的标准状态、加上形状参数后的Mesh、加上姿态参数后影响的肌肉的松紧状态、以及由姿态参数驱动关节动作后的Mesh。

(a )中的是由平均顶点集以及权重所描述的人体模型。

(b )中平均顶点集在体态的影响下发生了位移,同时体态对关节也产生了影响。

(c )平均顶点集在体态与动作的两重影响下发生的位移,注意此时的图并未有任何的pose

(d) shapepose双重影响下的SMPL模型;总共四项,分别为经过体型与姿势影响的顶点集、经过体型影响的关节,以及姿势和权重。

具体代码解析:Linear Blend Skinning

full_pose = torch.cat([global_orient, body_pose], dim=1)

vertices, joints = lbs(betas, full_pose, self.v_template,

                               self.shapedirs, self.posedirs,

                               self.J_regressor, self.parents,

                               self.lbs_weights, pose2rot=pose2rot, dtype=self.dtype)

betas:       体型pca对应的参数1 * 10,

global_orient: 1 * 3 根节点旋转向量

body_pose:   23 * 3 关节点旋转向量

shapedirs:    6890 * 3 * 10  形状位移矩阵PCA (由体型引起的位移形状位移的PCA)

posedirs:     6890 * 207 * 3  23 x 9 =207所有207个姿势混合形状组成的矩阵 (由姿势引起位移的pca)

j_regressor:   6890 * 24  , 是从不同的人在不同的姿势的例子中学习回归矩阵,从mesh中回归出关节点

parents:      24 每一个节点的父节点,显然根节点没有父节点

lbs_weights:  6890 * 24 混合权重矩阵,即关节点对顶点的影响权重 (第几个顶点受哪些关节点的影响且权重分别为多少) 6890个顶点,,每一个顶点受到24个关节点的影响

骨骼蒙皮算法

第一步:体型带来的位移偏差  图b

v_shaped = v_template + blend_shapes(betas, shapedirs)

J = vertices2joints(J_regressor, v_shaped)   获得各个关节的位置

第二步:pose带来的位移偏差(影响很轻微,考虑到速度的时候可以舍弃)图c

pose_feature = batch_rodrigues (full_pose)#旋转向量转旋转矩阵

pose_offsets = torch.matmul(pose_feature, posedirs)

v_posed = pose_offsets + v_shaped

第三步:基于运动树进行关节点变换 图d

J_transformed, A = batch_rigid_transform(rot_mats, J, parents, dtype=dtype)

J_transformed: 应用姿势旋转后关节的位置   24 * 3

A: 所有其他节点相对根节点的刚体变换矩阵  24* 3 * 3

第四步:线性蒙皮算法 图d

T=  lbs_weights * A  :6890 * 3 * 3 得到每一个顶点3*3

v_homo =T * v_posed  得到最终的6890 * 3 mesh顶点

J_transformed: 最终的关节点

第五步:有位移考虑位移

if apply_trans:

            joints += transl.unsqueeze(dim=1)

            vertices += transl.unsqueeze(dim=1)

目前SMPL模型也得到了长足的发展,但是因为市面的渲染器对应的接口还是SMPL,所以SMPL的使用还是比较普及。

SMPL SMPLH  SMPLX 

STAR此模型是发布SMPL模型的研究人员2020最新的科研成果,是对SMPL模型的有效改进。

参考SMPL论文解读和相关基础知识介绍 - 知乎

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值