SMPL学习笔记
https://zhuanlan.zhihu.com/p/158700893https://zhuanlan.zhihu.com/p/420090584人体表示的几种方式:只有关节点(12都叫人体姿态估计 pose estimation)关节点和边 (12都叫人体姿态估计 pose estimation)SMPL:包含高矮胖瘦,但不包含手势、脚踝、表情等的mesh表示。SMPL-X: 包含手势、脚
主要参考
https://zhuanlan.zhihu.com/p/158700893
https://zhuanlan.zhihu.com/p/420090584
https://blog.csdn.net/shenlanshenyanai/article/details/122047425
人体表示的几种方式:
- 只有关节点(12都叫人体姿态估计 pose estimation)
- 关节点和边 (12都叫人体姿态估计 pose estimation)
- SMPL:包含高矮胖瘦,但不包含手势、脚踝、表情等的mesh表示。
- 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姿态不对(不是正常人能做出来的动作)。
通常的纠正方法包括:
- 收集大规模正常人体活动数据,学习正常人姿态的范围,然后手动限制关节旋转角度
- 用大规模数据集做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}}
D∈R6890×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}} D∈R6890×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的最大的不同在于其提出的人体姿态影像体表形貌的方法,这种方法可以模拟人的肌肉在肢体运动过程中的凸起和凹陷。因此可以避免人体在运动过程中的表面失真,可以精准的刻画人的肌肉拉伸以及收缩运动的形貌。
缺点:不包含衣物和头发
更多推荐
所有评论(0)