SMPL
SMPL
基础知识
-
顶点(vertex):动画模型可以看成多个小三角形组成,每三个顶点组成一个三角形,每个小三角形就可以看成一个顶点。
-
骨骼点:骨架关节,比如膝盖
-
骨骼蒙皮(Rig):建立骨骼点和顶点的关联关系。每个骨骼点会关联许多顶点,并且每一个顶点权重不一样。通过这种关联关系,就可以通过控制骨骼点的旋转向量来控制整个人运动。
-
顶点权重(vertex weights):用于变形网格mesh,通过骨骼计算当前顶点
-
BlendShape:控制动画角色运动有两种,一种是上面说的利用Rig,还有一种是利用BlendShape。比如:生成一种笑脸和正常脸,那么通过BlendShape就可以自动生成二者过渡的动画。这种方式相比于利用Rig,可以不定义骨骼点,比较方便。
-
蒙皮函数(SF,Skinning Function):是计算机图形学中用于将骨骼动画(Skeletal Animation)的变形作用到3D模型表面顶点上的数学方法。它的核心作用是根据骨骼的运动(如旋转、平移)动态调整模型顶点的位置。蒙皮函数包括下面的LBS,BS,DQS。
-
线性混合蒙皮函数(LBS,linear blend skinning algorithm):是一种蒙皮函数skinning methods ,每个模型的顶点可以受多个骨骼影响,每个骨骼对顶点的影响程度通过权重(Weight)表示(权重总和为1)例如,一个顶点可能受“上臂骨”影响60%,受“肩膀骨”影响40%。在骨骼运动时,顶点的新位置是所有关联骨骼变换的加权平均。
- 缺点:
- 糖果纸效应(Candy Wrapping)**:在关节弯曲时可能出现不自然的塌陷或扭曲(如图)。
- 体积损失:剧烈弯曲时模型体积可能收缩。
-
混合蒙皮函数(BS,BlendSkin)是一种改进的蒙皮(Skinning)技术,主传统LBS直接对变换矩阵进行线性加权,而BlendSkin可能采用 非线性混合 或 局部几何感知的插值,使关节弯曲时保持更好的体积和表面连续性。
-
双四元数蒙皮函数(DQS,Dual Quaternion Skinning):使用双四元数代替线性插值,能更好地保持关节处的体积和形状,避免糖果纸效应。
-
SMPL
https://www.zhihu.com/question/292017089
https://zhuanlan.zhihu.com/p/696878001
https://zhuanlan.zhihu.com/p/94218908
https://zhuanlan.zhihu.com/p/94218908
https://zhuanlan.zhihu.com/p/420208990
https://zhuanlan.zhihu.com/p/420090584
https://zhuanlan.zhihu.com/p/420090584
https://zhuanlan.zhihu.com/p/453206221
https://zhuanlan.zhihu.com/p/453206221
https://zhuanlan.zhihu.com/p/453206221
https://zhuanlan.zhihu.com/p/453206221
《SMPL: A Skinned Multi-Person Linear Model》
-
人体可以理解为是一个基础模型和在该模型基础上进行形变的总和,在形变基础上进行PCA,得到刻画形状的低维参数——形状参数(shape);同时,使用运动树表示人体的姿势,即运动树每个关节点和父节点的旋转关系,该关系可以表示为三维向量,最终每个关节点的局部旋转向量构成了smpl模型的姿势参数(pose)。
-
该模型中β和θ是其中的输入参数,其中β是ShapeBlendPose参数代表人体高矮胖瘦、头身比等比例的10个参数,θ是代表人体整体运动位姿和24个关节相对角度的75(24*3+3;每个关节点3个自由度,再加上3个根节点)个参数。然后通过LBS输出是6980个顶点N。
-
参数:
- M, : SMPL function
- T,一个 6890 × 3 6890 的矩阵。这个矩阵是常数值,是TPose
- J,从蒙皮预测骨架的函数,实现从顶点坐标获得关节坐标,24 × 3的矩阵,23个关节点+1个root orientation。这个矩阵是常数值
- W,Skinning function蒙皮函数,一个 6890 × 24 的矩阵。注意,这个矩阵的值需要训练得到,每一个关节点的坐标变化对每一个mesh顶点坐标变化
- B_p: 姿态混合蒙皮函数,Pose blendshapes function,输入姿态参数输出是3*N=3*6980的顶点坐标
- p:所有207个姿势混合形状组成的矩阵
- B_s: 形状混合蒙皮函数,Shape blendshapes function,输入形状参数输出是3*N=3*6980的顶点坐标
- s:形状位移矩阵
- β,影响人体mesh的形状(高矮胖瘦)
- θ,影响人体mesh的姿态(动作姿势)
- SMPL通过训练获得的参数:T,W,S,P,J
-
J_regressor_prior (scipy.sparse.csc.csc_matrix):表示一个稀疏矩阵,用于从形状参数推断关节位置的先验模型。 f (numpy.ndarray):通常表示面的数组,用于描述3D网格模型的拓扑结构。 J_regressor (scipy.sparse.csc.csc_matrix):另一个稀疏矩阵,用于从形状参数计算关节位置的回归器。 kintree_table (numpy.ndarray):表示关节层次结构的数组,用于描述骨骼的树状结构。 J (numpy.ndarray):关节位置的数组,表示模型中各关节在标准姿态下的位置。 weights_prior (numpy.ndarray):一个先验权重数组,用于姿态和形状的权重调整。 weights (numpy.ndarray):每个顶点的骨骼权重数组,表示各顶点受不同骨骼的影响程度。 vert_sym_idxs (numpy.ndarray):顶点对称索引数组,用于保持模型的左右对称性。 posedirs (numpy.ndarray):姿态方向数组,用于描述姿态变化对顶点位置的影响。 pose_training_info (dict):包含姿态训练信息的字典,可能包含训练数据或参数设置。 bs_style (str):绑定皮肤样式的字符串,描述模型的皮肤绑定方式。 v_template (numpy.ndarray):顶点模板数组,表示未变形的基础顶点位置。 shapedirs (chumpy -
形状参数:
- 0 代表整个人体的胖瘦和大小,初始为0的情况下,正数变瘦小,负数变大胖(±5)
1 侧面压缩拉伸,正数压缩
2 正数变胖大
3 负数肚子变大很多,人体缩小
4 代表 chest、hip、abdomen的大小,初始为0的情况下,正数变大,负数变小(±5)
5 负数表示大肚子+整体变瘦
6 正数表示肚子变得特别大的情况下,其他部位非常瘦小
7 正数表示身体被纵向挤压
8 正数表示横向表胖
9 正数表示肩膀变宽
- 0 代表整个人体的胖瘦和大小,初始为0的情况下,正数变瘦小,负数变大胖(±5)
-
形状参数怎么影响顶点的:利用PCA原理控制mesh的胖瘦高矮(
用LBS表示的线性混合蒙皮核用双cerian混合蒙皮dqb 都不如SMPL
SMPL是Tpose并对这个模型施加偏移量实现
创新点:
- 提出了一种学习人体形状和位置依赖的形状变化模型:模型的参数从数据中学习,包括静止姿势模板、混合权重、姿势相关的混合变形、身份相关的混合变形以及从顶点到关节位置的回归。
- 将pose blend shapes建模成rotation matrices(旋转矩阵)的线性函数。因为旋转矩阵的元素是有界的,所产生的变形也是有界的,有助于模型更好地推广。
评估指标指标含义。
- MPJPE。(Mean Per Joint Position Error:首先对齐骨盆(pelvis,关节0)处的预测和GT真实3D关节,然后计算它们的距离,综合评价预测的姿态和形状,包括全局旋转。
- PA-MPJPE。(Procrustes-Aligned Mean Per Joint Position Error, or reconstruction error):在计算 MPJPE 之前执行 Procrustes 对齐,即刚性对齐(rigid alignment),这主要测量关节姿势,消除了尺度和全局旋转的差异。
- MPVE。(Mean Per-vertex Error or Vertex-to-Vertex ,V2V):被定义为预测网格顶点与地面GT网格顶点之间的平均点对点欧几里得距离。
- PA-MPVE。(Procrustes-Aligned Mean Per-vertex Error ):Procrustes对齐后的MPVE。







