zoukankan      html  css  js  c++  java
  • SMPL模型学习

    动画制作相关术语

    1. Vertex(顶点):动画模型可以看成多个小三角形(四边形)组成,每个小三角形就可以看成一个顶点。顶点越多,动画模型越精细。
    2. 骨骼点:人体的一些关节点,类似于人体姿态估计的关键点。每个骨骼点都由一个三元组作为参数去控制(可以查看欧拉角,四元数相关概念)
    3. 蒙皮:将模型从一个姿态转变为另一个姿态,使用的转换矩阵叫做蒙皮矩阵。
    4. 骨骼蒙皮(Rig):建立骨骼点和顶点的关联关系。每个骨骼点会关联许多顶点,并且每一个顶点权重不一样。通过这种关联关系,就可以通过控制骨骼点的旋转向量来控制整个人运动。
    5. 纹理贴图:动画人体模型的表面纹理,即衣服裤子这些。
    6. texture map:将3D多边形网格表面的纹理展开到2D平面,得到纹理图像
    7. 混合形状(BlendShape):控制动画角色运动有两种,一种是上面说的利用Rig,还有一种是利用BlendShape。比如:生成一种笑脸和正常脸,那么通过BlendShape就可以自动生成二者过渡的动画。这种方式相比于利用Rig,可以不定义骨骼点,比较方便。它指相对于base shape的变形(deformation),这种deformation是通常被表示为顶点的偏移量(vertex displacements),是由某种参数有关的function确定的
    8. 混合蒙皮技术(Blend Skinning) :一种模型网格(mesh)随内在的骨骼结构(skeletal structure)变形的方法。网格的每个顶点(vertex)对于不同的关节点有不同的影响权重(weighted influence),顶点在变形时,形变量与这个权重相关
    9. LBS(Linear Blend Skinning ):线性混合蒙皮。使用最广泛,但是在关节处会产生不真实的变形
    10. DQBS(dual-quaternion blend skinning ):双四元数混合蒙皮。
    11. 顶点权重(vertex weights):用于变形网格mesh
    12. uv map:将3D多边形网格展开到2D平面得到 UV图像
    13. 拓扑(topology):重新拓扑是将高分辨率模型转换为可用于动画的较小模型的过程。两个mesh拓扑结构相同是指两个mesh上面任一个三角面片的三个顶点的ID是一样的(如某一个三角面片三个顶点是2,5,8;另一个mesh上也必有一个2,5,8组成的三角面片)
    14. pose-dependent blend shape:姿势相关的混合变形
    15. regressor from shape to joint locations: 形状到关节位置的回归函数

    相关算法详解

    SMPL

    1.介绍

    SMPL(Skinned Multi-Person Linear Model)是一种裸体的(skinned),基于顶点(vertex-based)的人体三维模型,能够精确地表示人体的不同形状(shape)和姿态(pose)。

    SMPL适用于动画领域,可以随姿态变化自然的变形,并伴随软组织的自然运动。SMPL与现有的许多图形渲染管线都是兼容的。

    SMPL是一种可学习的模型,通过训练可以更好地拟合人体的形状和不同姿态下的形变。

    它将身体形状分为identity-dependent shape和non-rigid pose-dependent shape。人体可以理解为是一个基础模型和在该模型基础上进行形变的总和,在形变基础上进行PCA,得到刻画形状的低维参数——形状参数(shape);同时,使用运动树表示人体的姿势,即运动树每个关节点和父节点的旋转关系,该关系可以表示为三维向量,最终每个关节点的局部旋转向量构成了SPML模型的姿势参数(pose)。

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

    在SMPL文章中介绍了SMPL的总体模型,这个模型是通过训练得到,就是一些参数, 该模型中β和θ是其中的输入参数,其中β代表人体高矮胖瘦、头身比等比例的10个参数,是一个10-D的vector。θ是代表人体整体运动位姿和24个关节相对角度的75(24*3+3;每个关节点3个自由度,再加上3个根节点)个参数,是一个3K-D的vector(代表pose,其中K为骨架节点数,3是每个关节具有的3个自由度)。 β参数是Shape Blend Pose参数,可以通过10个增量模板控制人体形状变化: 具体而言:每个参数控制人体形态的变化可以通过动图来刻画。

    SMPL骨架的节点个数为24,标注了人体影响姿态的几个主要关节,即:

    smpl_names = [
                    'Left_Hip', 'Right_Hip', 'Waist', 'Left_Knee', 'Right_Knee',
                    'Upper_Waist', 'Left_Ankle', 'Right_Ankle', 'Chest',
                    'Left_Toe', 'Right_Toe', 'Base_Neck', 'Left_Shoulder',
                    'Right_Shoulder', 'Upper_Neck', 'Left_Arm', 'Right_Arm',
                    'Left_Elbow', 'Right_Elbow', 'Left_Wrist', 'Right_Wrist',
                    'Left_Finger', 'Right_Finger'
                ]
    

    img

    加上position的三个维度,则该模型最终总的输入就是10+3+3x24=85-D的数据。
    根据输入的数据,对标准模型进行一步步的变化,大概流程就是:

    1. Add shape blend shapes(缩放)
    2. Infer shape-dependent joint locations.(根据shape调整joint)
    3. Add pose blend shapes(胖瘦变形)
    4. Get the global joint location(摆pose)
    5. Do skinning(给骨架包裹外皮)
       
    

    最终生成的模型是具有6980个顶点的mesh。

    smpl 10个shape参数分别对应的物理意义:(实际有50个参数,开源的只有10个)smpl官网的unity模型可以用slider 控制参数变化

    0 代表整个人体的胖瘦和大小,初始为0的情况下,正数变瘦小,负数变大胖(±5)
    1 侧面压缩拉伸,正数压缩
    2 正数变胖大
    3 负数肚子变大很多,人体缩小
    4 代表 chest、hip、abdomen的大小,初始为0的情况下,正数变大,负数变小(±5)
    5 负数表示大肚子+整体变瘦
    6 正数表示肚子变得特别大的情况下,其他部位非常瘦小
    7 正数表示身体被纵向挤压
    8 正数表示横向表胖
    9 正数表示肩膀变宽

    2.相关参数:

    顶点 vertical: N=6890

    关节 joint: K=23

    网格对男女具有相同的拓扑结构,空间分辨率可变,干净的四元数结构,分割成多部分,有初始混合权重和骨骼蒙皮。

    模型生成的函数:

    1. (M(vec eta ,vec heta ;Phi ) = Wleft( {{T_P}(vec eta ,vec heta ),J(vec eta ),vec heta ,{cal W}} ight)mathbb{R}{^{left| {mathop heta limits^ o } ight| imes left| {mathop eta limits^ o } ight|}} mapsto {mathbb{R}^{3N}}), SPML function: 将形状和位姿参数映射成顶点。$Phi $表示学习到的参数。

    2. (W(overline{mathrm{T}}, mathbf{J}, vec{ heta}, mathcal{W}): mathbb{R}^{3 N imes 3 K imes|vec{ heta}| imes|mathcal{W}|} mapsto mathbb{R}^{3 N}): the standard linear blend skinning function. 标准线性混合蒙皮.从模板smpl模型中取vertics in the rest pose (overline{mathrm{T}}),joint locations J,a pose (vec{ heta}) and the blend weights $ mathcal{W}$ , 输出posed vertices.

    3. (B_{P}(vec{ heta}): mathbb{R}^{| heta|} mapsto mathbb{R}^{3 N}):a pose-dependent blend shape function. 一个取决于位姿的混合模型函数。输入是$mathop heta limits^ o $:一系列位姿参数向量,代表位姿的相关形变。它会和blend shapes加在一起,施加到rest pose上。

    4. (B_{S}(vec{eta}): mathbb{R}^{mid eta mid} mapsto mathbb{R}^{3N}):a blend shape funchtion. 混合变形函数。输入是形状参数向量(shape parameters)(vec{eta}),输出是塑造了目标身份的混合形状(a blend shape sculpting the subject identity),也就是人体模型。

    5. (B_D): Dynamic blendshapes function

    6. (J(vec{eta}): mathbb{R}^{mid eta mid} mapsto mathbb{R}^{3K}): a function to predict K joint locations. 一个预测K个关节位置的函数.

    模型输入的参数:

    (eta):(vec{eta}=left[vec{eta}_{1}, ldots, overrightarrow{eta_{mid eta mid} } ight]^{T}),形状参数(shape parameter) 其中,(mid eta mid)是线性形状系数(linear shape coefficients)的数量

    ( heta):,(vec{ heta}=left[vec{omega}_{0}^{T}, ldots, vec{omega}_{K}^{T} ight]^{T})姿态参数(pose parameter).其中,(w_k)指关节k相对于运动树(kinematic tree)中的父关节点的旋转轴角度,({omega _{ m{k}}} in {R^3})

    $mathop omega limits^ o $: Scaled axis of rotation; the 3 pose parameters corresponding to a particular joint

    (vec{ heta}^{*}):原始姿态(zero pose)

    $overrightarrow phi $: Dynamic control vector

    $overrightarrow delta $: Dynamic shape coefficients

    要通过训练集训练获取的参数:

    (overline{mathrm{T}} in mathbb{R}^{3 N}):Mean shape of the template.平均模型,由N个串联的顶点表示(a mean template shape represented by a vector of N concatenated vertices)

    (mathcal{S}=left[mathbf{S}_{1}, ldots, mathbf{S}_{|vec{eta}|} ight] in mathbb{R}^{3 N imes|vec{eta}|}): shape blend shapes. 所有207个姿势混合形状组成的矩阵 (由姿势引起位移的正交主成分)

    (mathcal{P}): Pose blend shapes

    (mathcal{W} in mathbb{R}^{N imes K}): blend weights. 一组混合权重,BS/QBS混合权重矩阵,即关节点对顶点的影响权重 (第几个顶点受哪些关节点的影响且权重分别为多少) (a set of blend weights)

    (mathcal{J}:) Joint regressor matrix. 将rest vertices转换成rest joints的矩阵(获取T pose的关节点坐标的矩阵)[完成顶点到关节的转化]

    训练数据:

    (V): A registration

    (V^P): Pose dataset registration

    (V^S): Shape dataset registration

    (hat{mathbf{T}}^{P}):Pose dataset subject shape; body vertices in the template pose

    (hat{mathbf{J}}^{P}):Pose dataset subject joint locations in the template pose

    (hat{mathbf{T}}_{mu}^{P}):Mean shape of a pose subject; body vertices in the template pose

    (hat{mathbf{T}}_{mu}^{S}):Shape dataset subject shape; body vertices in the template pose

    (hat{mathbf{T}}_{mu}^{S}):Mean shape of a subject in the shape dataset; body vertices in the template pose

    3.Blend skinning

    每个关节j绕轴的旋转角用罗德里格斯公式转换成旋转矩阵:

    [exp left(vec{omega}_{j} ight)=mathcal{I}+widehat{ar{omega}}_{j} sin left(left|vec{omega}_{j} ight| ight)+widehat{omega}_{j}^{2} cos left(left|vec{omega}_{j} ight| ight) ]

    其中,(vec{ heta}=left[vec{omega}_{0}^{T}, ldots, vec{omega}_{K}^{T} ight]^{T}),参数通过(|vec{ heta}|=3 imes 23+3=72)定义

    (ar{omega}=frac{vec{omega}}{|mid{omega}| mid}):为旋转的单位范数轴(the unit norm axis of rotation)

    (hat{omega}):斜对称矩阵,通过三维向量(ar{omega})组成

    (mathcal{I}):3x3单位矩阵

    4.顶点坐标计算方法

    每个(overline{mathrm{T}})中的顶点({overline t _i})被转换成(overline{t}_i^{'})(都是齐次坐标系下的列向量):

    [egin{aligned} overline{mathbf{t}}_{i}^{prime} &=sum_{k=1}^{K} w_{k, i} G_{k}^{prime}(vec{ heta}, mathbf{J}) overline{mathbf{t}}_{i} \ G_{k}^{prime}(vec{ heta}, mathbf{J}) &=G_{k}(vec{ heta}, mathbf{J}) G_{k}left(vec{ heta}^{*}, mathbf{J} ight)^{-1} \ G_{k}(vec{ heta}, mathbf{J}) &=prod_{j in A(k)}left[egin{array}{c|c}exp left(vec{omega}_{j} ight) & mathbf{j}_{j} \ hline overrightarrow{0} & 1end{array} ight] end{aligned} ]

    其中,({omega _{k,i}})是混合权重矩阵(mathcal{W})的元素,代表第(k)部分的旋转角度有多少程度影响了第(i)个顶点。

    (exp left(vec{ heta}_{j} ight))为局部(3 imes 3)旋转矩阵,对应结点(j)

    (G_{k}(vec{ heta}, mathbf{J})) 是关节(k)的世界变换

    (G_{k}^{'}(vec{ heta}, mathbf{J}))是移除了变换后的相同变换(the same transformation after removing the transformation due to the rest pose.)

    (mathbf{J}):关节回归函数。Predict points from surface. Each 3-element vector in (J) corresponding to a single joint center (j), is denoted (mathbf{j}_j).

    (A(k))定义了关节k的有序集合。

    注意,为了与现有的渲染引擎兼容,我们假设(mathcal{W})是稀疏的,最多允许四个部分影响一个vertex。

    为了保持兼容性,我们保留了基本的皮肤函数,而是以一种附加的方式修改模板,并学习一个预测关节位置的函数。

    [egin{array}{c} M(vec{eta}, vec{ heta})=Wleft(T_{P}(vec{eta}, vec{ heta}), J(vec{eta}), vec{ heta}, mathcal{W} ight) \ T_{P}(vec{eta}, vec{ heta})=overline{mathbf{T}}+B_{S}(vec{eta})+B_{P}(vec{ heta}) end{array} ]

    (B_{S}(vec{eta}),B_{P}(vec{ heta}))表示由shape和pose引起的相对于SMPL标准模板的顶点向量({overline t _i})的偏移量:

    [overline{mathbf{t}}_{i}^{prime}=sum_{k=1}^{K} w_{k, i} G_{k}^{prime}(vec{ heta}, J(vec{eta}))left(overline{mathbf{t}}_{i}+mathbf{b}_{S, i}(vec{eta})+mathbf{b}_{P, i}(vec{ heta}) ight) ]

    进行进一步的细化,初始顶点不能直接用平均形状下的顶点,还要考虑到体型与姿势的影响,同样关节也会因为体型而发生改变。于是得到以下扩展:

    [overline{mathbf{t}}_{i}^{prime}=sum_{k=1}^{K} w_{k, i} G_{k}^{prime}(vec{ heta}, J(vec{eta}))left(overline{mathbf{t}}_{i}+mathbf{b}_{S, i}(vec{eta})+mathbf{b}_{P, i}(vec{ heta}) ight) ]

    其中,(mathbf{b}_{S, i}(vec{eta}), mathbf{b}_{P, i}(vec{ heta})) 分别(B_{S}(vec{eta}),B_{P}(vec{ heta}))的顶点,表示相对于顶点({overline t _i})的偏移量。关节中心是身体形状的函数,通过混合蒙皮变形的模板网络是姿态和形状的函数。

    5.Shape blend shapes

    不同人的身体形状可以被以下的线性函数表示:

    [B_{S}(vec{eta} ; mathcal{S})=sum_{n=1}^{|vec{eta}|} eta_{n} mathbf{S}_{n} ]

    (vec{eta}=left[eta_{1}, ldots, eta_{|vec{eta}|} ight]^{T})(|vec{eta}|)是线性形状系数的数量。

    (mathbf{S}_{n} in mathbb{R}^{3 N}): 形状位移的标准正交主分量(orthonormal principal components of shape displacements )

    (mathcal{S}=left[mathbf{S}_{1}, ldots, mathbf{S}_{|vec{eta}|} ight] in mathbb{R}^{3 N imes|vec{eta}|})为形状位移矩阵。线性函数(B_{S}(vec{eta} ; mathcal{S}))能够完全被矩阵(mathcal{S})定义,通过注册训练网络学习。

    右边的值表示学习过的参数,而左边的值是动画器设置的参数;为了便于标记,当学习的参数在训练中没有得到明确的优化时,通常忽略这些参数。

    6.Pose blend shapes

    定义(R:mathbb{R}^{|vec{ heta}|} mapsto mathbb{R}^{9 K})为把一个位姿向量映射到连接部分相对旋转矩阵的向量上(vec{ heta}),由于我们的骨骼(rig)有23个关节,则(R(vec{ heta}))是一个23x9=207维的向量。它的元素是关节旋转角的sin和cos函数,因此它是一个对于(vec{ heta})的非线性函数。

    但是作者又定义了一个可以让pose blend shape线性的函数:(R^{*}(vec{ heta})=(R(vec{ heta})-R(vec{ heta}^{*}))),其中,(vec{ heta}^{*})定义了rest pose. 定义(R_n(vec{ heta}))(R(vec{ heta}))的第n个向量,则与静止模板的偏差为:

    [B_{P}(vec{ heta} ; mathcal{P})=sum_{n=1}^{9 K}left(R_{n}(vec{ heta})-R_{n}left(vec{ heta}^{*} ight) ight) mathbf{P}_{n} ]

    上式代表将姿势带来的形状位移正交分解,进行计算,不过要减去休息状态的姿势的影响,这样可以保障pose blend shapes在静止状态时贡献为0。

    其中,(mathbf{P}_{n} in mathbb{R}^{3 N})表示顶点偏移的向量。

    (mathcal{P}=left[mathbf{P}_{1}, ldots, mathbf{P}_{9 K} ight] in mathbb{R}^{3 N imes 9 K})是所有207个pose blend shape组成的矩阵。(B_{P}(vec{ heta}))完全被矩阵(mathcal{P})定义。

    1. Joint locations

    不同的体型有不同的关节位置,每个关节由其在静止位姿(rest pose)中的3D位置表示。至关重要的是,这些数据必须是准确的,否则在使用皮肤化方程建立模型时将会出现伪影关节。关节3D位置相对于身体形状的函数如下:

    [J(vec{eta} ; mathcal{J}, overline{mathbf{T}}, mathcal{S})=mathcal{J}left(overline{mathbf{T}}+B_{S}(vec{eta} ; mathcal{S}) ight) ]

    其中,(mathcal{J})是将rest vertices转换成rest joints 的矩阵,我们从不同的人在不同的姿势的例子中学习回归矩阵(mathcal{J})。这个矩阵models哪些网格顶点是重要的,以及如何结合它们来估计关节位置。

    8.SPML模型

    SMPL模型的模型参数定义为:(Phi = { overline T , mathcal{W}, mathcal{S}, mathcal{J}, mathcal{P}}),通过变换(vec{eta}, vec{ heta})可以得到不同的人体形状和姿态。SMPL最后被定义为:

    [M(vec eta ,vec heta ;Phi ) =Wleft(T_{P}(vec{eta}, vec{ heta} ; overline{mathbf{T}}, mathcal{S}, mathcal{P}), J(vec{eta} ; mathcal{J}, overline{mathbf{T}}, mathcal{S}), vec{ heta}, mathcal{W} ight) ]

    每个顶点被转换成:

    [mathbf{t}_{i}^{prime}=sum_{k=1}^{K} w_{k, i} G_{k}^{prime}(vec{ heta}, J(vec{eta} ; mathcal{J}, overline{mathbf{T}}, mathcal{S})) mathbf{t}_{P, i}(vec{eta}, vec{ heta} ; overline{mathbf{T}}, mathcal{S}, mathcal{P}) ]

    其中,

    [mathbf{t}_{P, i}(vec{eta}, vec{ heta} ; overline{mathbf{T}}, mathcal{S}, mathcal{P})=overline{mathbf{t}}_{i}+sum_{m=1}^{|vec{eta}|} eta_{m} mathbf{s}_{m, i}+sum_{n=1}^{9 K}left(R_{n}(vec{ heta})-R_{n}left(vec{ heta}^{*} ight) ight) mathbf{p}_{n, i} ]

    代表施加blend shapes后的顶点i,(mathbf{s}_{m, i}, mathbf{p}_{n, i} in mathbb{R}^{3})是shape and pose blend shapes对应模板顶点(ar{mathbf{t}}_{i})的元素.

    最后,文章用LBS,DQBS去训练参数,分别为SMPL-LBS,SMPL-DQBS,然后默认SMPL-DQBS为它们研发的好模型,因此后边都叫SMPL

    9.训练

    训练目标是训练(Phi = { overline T , mathcal{W}, mathcal{S}, mathcal{J}, mathcal{P}}) 的参数来最小化数据集上最小顶点的重建误差。因为这个模型分解了shape和pose,因此可以分开训练。先用多姿态数据集训练 ({mathcal{W}, mathcal{J}, mathcal{P}}),再用多形状数据集训练 ({ overline T , mathcal{S}})

    参考:

    https://blog.csdn.net/weixin_45915902/article/details/108654466

    https://blog.csdn.net/qq_34296627/article/details/103158923

    https://blog.csdn.net/qq_34296627/article/details/103158923?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-7.control

    每天进步一点点
  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/sariel-sakura/p/14321818.html
Copyright © 2011-2022 走看看