SMPL模型进阶

article/2025/9/28 6:07:33

      SMPL模型是一种参数化人体模型,是马普所提出的一种人体建模方法,该方法可以进行任意的人体建模和动画驱动。这种方法与传统的LBS的最大的不同在于其提出的人体姿态影像体表形貌的方法,这种方法可以模拟人的肌肉在肢体运动过程中的凸起和凹陷。因此可以避免人体在运动过程中的表面失真,可以精准的刻画人的肌肉拉伸以及收缩运动的形貌。 

     该方法中β和θ是其中的输入参数,其中β代表是个人体高矮胖瘦、头身比等比例的10个参数,θ是代表人体整体运动位姿和24个关节相对角度的75个参数。

        β参数是ShapeBlendPose参数,可以通过10个增量模板控制人体形状变化: 具体而言:每个参数控制人体形态的变化可以通过动图来刻画:

       PoseBlendShape参数是给出肌肉的凸起与凹下去与人体姿态,但是一般都优化算法都不采用poseBlendShape参数,因为PoseBlendShape项的惩罚能量的Landscape不利于非线性优化算法的迭代优化。

       但是如果要与Kinect给出的25个参数进行匹配直接进行是不够的,因为两者的关节节点是不匹配的。其中原因在于SMPL不但需要考虑基本的人体构型,还需要考虑关节密度能否控制点的运动,因此胸部并无明显关节的情况下,增加了几个关节,而手上的关节数量较少。此外需要注意因为SMPL为了较好的人体模型表达,因此较为精细的部位增加了较多的点数,如手指部分,按照正常人面积应该点数较少,但这对于SMPL模型不利。

        按照doublefusion的思路可以用测地线距离(geodesic distance)为度量进行简化,简化后的模型为了保证关节的正确性,需要额外加入关节附近的顶点索引,此外由于顶点的抽离,在weights、Jregressor、Shape_Tensor、Mean-vertices都应该相应变化,并重新利用Python等语言的脚本进行处理写成新的模型文件(.pkl或Json)。

     在实际的关节运动中,由于是级联的铰链的运动(Articulated),因此在CPU或者GPU中都需要进行顺序运算,类似于Ai=Ai-1*Bi,从根节点出发到肢体关节点遍历类似于比遍历一棵特定深度的树,而树的深度决定顺序运算的最长链,树深度越长并行性越差,按照SMPL原始定义从尾骨位置出发的三叉树深度为9,在此种情况下GPU的单个warp最后的两个if会出问题,树的叶子节点深度分别为6,9,9, 5,5,而修改根节点为原来3号节点后,叶子节点的深度变为4,7,7,7,7,因此树深度下降,树平衡性增加,求解节点旋转平移的并行性提高。有望提高节点RT计算速度以及提高后续雅各比矩阵的稀疏性。

Json的索引需要重新排布,

对照表: 

smpl  [0, 1, 2, 3,  4,   5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,  18,  19,  20, 21, 22, 23]

father = [-100, 0, 0, 0, 1, 2, 3, 5, 6, 7, 8, 9, 9, 9, 12, 13, 14, 16, 17, 18, 19, 20, 21]

正确      [-100, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 12, 13, 14, 16, 17, 18, 19, 20, 21]

smplx的对照表的前24位与smpl是一样的。后面的待补充

[-1000, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 12, 13, 14, 16, 17, 18, 19, 20, 22, 23, 20, 25, 26, 20, 28, 29, 20, 31, 32, 20, 34, 35, 21, 37, 38, 21, 40, 41, 21, 43, 44, 21, 46, 47, 21, 49, 50, 15, 15, 15]
 

new:  [ 3  7  8  1  12 13  0  16 17  2  20   21  4    5     6   9   10   11  14   15  18   19  22  23 ]

之前写错成了:(21号重复了两遍) 

new:  [ 3  7  8  1  12 13  0  16 17  2  20   21  4    5     6   9   10   11  14   21  18   19  22  23 ]

GMM的默认的8个中心姿态:

drawing

                           更改后的关节点编号                                                   原始的关节点编号   

   

                                     Kinect关节点                                                                        SMPL模型关节点

      我整理的kinect与SMPL模型关节点对应关系如上图和下表所示, 但并非严格的对应关系。 

Table = [ 0  16  12 1   17   13  18  14   15  19   20  4   8   9  10   5  6   7  11  ;  %% Kinect
               0   1  2  3   4    5   7    8   11  10   12 17  16  18  20  19  21 23  24  ]; %% SMPL

       此外从Kinect中人体姿态为T-pose时候可以直接推出人体的部分β参数,如关于人体高矮、头身比例、肢体相关的比例等,但是不能得到胖瘦相关的参数,根据实际实验可以得到前五个参数,后面五个参数较难获得,甚至会因为无法获得而取得较大数值,导致人体模型严重失真。 

          为了对人体模型进行约束,作者还给了人体姿态的GMM模型参数,该模型由八个中心构成。 其中最大概率的GMM的并非为人站成T-pose状态下。 在利用GMM作为非线性优化重建人体模型相关研究中,GMM一般以对数的形式出现,但是此时需要注意的是目标惩罚函数并非以原始的概率密度的对数作为优化项,而是有一个constant项,甚至为了符合一般性,会先计算出贡献最大的多分布中在特定姿态下概率密度最大的分布,然后乘以相应的固定常数,然后进行优化。

   然后实际中通过RGB回归的人体二维点多半是coco25,分布如下

     很遗憾,两者很大不同,比如coco25的脸部分布点很多,而smpl在脊柱上面分布点更加密集。另外两者的Pelvis点和左右hip的定义也不同。 所以在做基于coco25的优化smpl姿态方面脊柱是个难点。


http://chatgpt.dhexx.cn/article/DkwNQS4K.shtml

相关文章

SMPL源代码实现和模型解读

对于SLAM的工作已经告一段落了,传统的人体动态三维重建也要告一段落了,由于课题研究的方向是基于图像\视频的人体三维重建,三维shape、pose的恢复:所以今天和大家交流的是SMPL模型,对于SMPL模型的理论部分欢迎大家交流…

SMPL简析

SMPL模型是一种参数化人体模型,是马普所提出的一种人体建模方法。这种方法可以模拟人的肌肉在肢体运动过程中的凸起和凹陷。因此可以避免人体在运动过程中的表面失真,可以精准的刻画人的肌肉拉伸以及收缩运动的形貌。 该模型可以通过身体形状参数和姿势参…

SMPL学习笔记

文章目录 前言一、SMPL概述1.形状参数( β \beta β)2.姿态参数( θ \theta θ) 二、体姿转换过程原理1.基于形状的混合成形(Shape Blend Shapes)2.基于姿态的混合成形 (Pose Blend Shapes)3.蒙皮 (Skinning) 三、具体过程分析1.基于形状的混合成形2.基于姿态的混合成形3.骨骼点…

Java的生产者消费者模型

前言 学完了线程后,我又去找了一些线程相关的练习题来练手,其中印象最深的就是生产者消费者模型这一块,为什么呢,因为它每一篇练习题里都有,开始没看懂,后面就去仔细研究了一下,哦,…

多线程之生产者消费者模型

生产者消费者模型 1.为什么要使用生产者和消费者模式2.案例 1.为什么要使用生产者和消费者模式 在线程开发中,生产者就是生产线程的线程,消费者就是消费线程的线程。在多线程开发中,如果生产者如理数据很快,消费者处理数据很慢&am…

生产者消费者模型(多线程工作)

目录 1.模型前提 2.阻塞队列(消费场所) 3. 实验 4.有关效率 1.模型前提 以单生产者对单消费者为例子: 前提一:有一个缓冲区作为消费场所。 前提二:有两种功能不同的线程分别具有消费与生产的能力。 前提三&…

生产者消费者模型的实现(线程通信)

✅作者简介:我是18shou,一名即将秋招的java实习生 🔥系列专栏:牛客刷题专栏 📃推荐一款模拟面试、刷题神器👉 [在线刷题面经模拟面试](在线面试刷题) 目录 实现一: 实现二: 实现一…

生产者消费者模型【新版】

目录 啥是生产者消费者模型? 生产者消费者模型存在问题??如何进行解决呢?? 生产者消费者模型导致的问题 什么是阻塞队列 生产者消费者模型优点 生产者消费者模型实现 Message MessageQueue 获取消息get方法 生产消息take方法 测试生产者消费者模型 啥是生产者消…

【Linux】生产者消费者模型

文章目录 一. 什么是生产者消费者模型1. 基本概念2. 三种关系3. 再次理解生产者消费者模型 二. 生产者消费者模型的优点三. 基于BlockingQueue的生产者消费者模型1. 准备工作2. 阻塞队列实现3. 测试阻塞队列4. 阻塞队列完整代码5. 关于改进阻塞队列的几点补充5.1 多生产者多消费…

生产者与消费者模型

1、【什么是生产者与消费者模型呢?】 一种重要的模型,基于等待/通知机制。生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点&…

生产者消费者模型——C语言代码详解

概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据…

【Java总结】生产者消费者模型

生产者消费者模型主要结构如下,是一个典型的线程同步的案例。下面就来使用java做几种线程同步的方式来实现以下该模型 确保一个生产者消费者模型的稳定运行的前提有以下几个 生成者应该具备持续生成的能力消费者应该具备持续消费的能力生产者的生成和消费消费有一定…

【设计模式】生产者消费者模型

带你轻松理解生产者消费者模型!生产者消费者模型可以说是同步与互斥最典型的应用场景了!文末附有模型简单实现的代码,若有疑问可私信一起讨论。 文章目录 一:为什么要使用生产者消费者模型?二:生产者消费者…

模拟生产者消费者模型

生产者消费者是多线程很经典的一个模型 牵涉三个对象:仓库、生产者、消费者 仓库代表共享变量 生产者表示在仓库生产货物 消费者表示从仓库拿出货物 实现思路:利用synchronizedwait()notify() 对生产者消费者对应的操作用synchronized关键字保证线程安全…

生产者消费者模型java实现

做题的时候遇到了生产者消费者问题,这个问题可以说是线程学习的经典题目了,就忍不住研究了一波。它描述是有一块缓冲区(队列实现)作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。在Java…

生产者消费者模型详解以及实现

生产者消费者模式 我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦、消息队列等场景。在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者&…

Java生产者消费者模型的五种实现方式

转自:https://juejin.im/entry/596343686fb9a06bbd6f888c 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品&#xff0c…

生产者消费者模型---详解及代码实现

概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据…

生产消费者模型

生产消费者模型中包含三个部分,生产者、消费者和交易场所。其中涉及如下的关系: (1)生产者和生产者之间的关系:由于生产者的生产面向的都是交易场所,所以生产者之间是存在竞争关系的,就像一家超…

生产者-消费者模型

什么是生产者消费者模型 生产者 - 消费者模型( Producer-consumer problem) 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见。 这个模型由两类线程和一个缓冲区组成来组成 生产者线程:生产数据,并把…