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

    每天进步一点点
  • 相关阅读:
    如何在SpringMVC中使用REST风格的url
    c#实现的udt
    数据库查询服务化-缓存和分页
    c#常用数据库封装再次升级
    c#数据库连接池Hikari重构升级
    c# 常用数据库封装
    聊聊数据存储查询
    c#分析SQL语句
    c# 分析SQL语句中的表操作
    c#最近博文结尾
  • 原文地址:https://www.cnblogs.com/sariel-sakura/p/14321818.html
Copyright © 2011-2022 走看看