SMPL 人体模型简要

article/2025/9/28 5:28:06

smpl是指2015 马普的一篇文章“SMPL: a skinned multi-person linear model”中构建的人体参数化三维模型,人体可以理解为是一个基础模型和在该模型基础上进行形变的总和,在形变基础上进行PCA,得到刻画形状的低维参数——形状参数(shape);同时,使用运动树表示人体的姿势,即运动树每个关节点和父节点的旋转关系,该关系可以表示为三维向量,最终每个关节点的局部旋转向量构成了smpl模型的姿势参数(pose)。考虑到与目前的市面上的渲染器,SMPL模型使用得较多。总结:三维参数化人体模型被广泛使用,它是估计人体三维姿态和形状的有力先验。其主要思想是通过低维参数对三维人体(包括脸、手和身体)的变形进行建模  。SCAPE-》SMPL-〉SMPL-X等。

 

SMPL  源码

['v_template', 'weights', 'posedirs', 'pose', 'trans', 'shapedirs', 'betas', 'J']:

basicModel_m_lbs_10_207_0_v1.0.0.pkl

下图展示了SMPL模型的标准状态、加上形状参数后的Mesh、加上姿态参数后影响的肌肉的松紧状态、以及由姿态参数驱动关节动作后的Mesh。

(a )中的是由平均顶点集以及权重所描述的人体模型。

(b )中平均顶点集在体态的影响下发生了位移,同时体态对关节也产生了影响。

(c )平均顶点集在体态与动作的两重影响下发生的位移,注意此时的图并未有任何的pose

(d) shapepose双重影响下的SMPL模型;总共四项,分别为经过体型与姿势影响的顶点集、经过体型影响的关节,以及姿势和权重。

具体代码解析:Linear Blend Skinning

full_pose = torch.cat([global_orient, body_pose], dim=1)

vertices, joints = lbs(betas, full_pose, self.v_template,

                               self.shapedirs, self.posedirs,

                               self.J_regressor, self.parents,

                               self.lbs_weights, pose2rot=pose2rot, dtype=self.dtype)

betas:       体型pca对应的参数1 * 10,

global_orient: 1 * 3 根节点旋转向量

body_pose:   23 * 3 关节点旋转向量

shapedirs:    6890 * 3 * 10  形状位移矩阵PCA (由体型引起的位移形状位移的PCA)

posedirs:     6890 * 207 * 3  23 x 9 =207所有207个姿势混合形状组成的矩阵 (由姿势引起位移的pca)

j_regressor:   6890 * 24  , 是从不同的人在不同的姿势的例子中学习回归矩阵,从mesh中回归出关节点

parents:      24 每一个节点的父节点,显然根节点没有父节点

lbs_weights:  6890 * 24 混合权重矩阵,即关节点对顶点的影响权重 (第几个顶点受哪些关节点的影响且权重分别为多少) 6890个顶点,,每一个顶点受到24个关节点的影响

骨骼蒙皮算法

第一步:体型带来的位移偏差  图b

v_shaped = v_template + blend_shapes(betas, shapedirs)

J = vertices2joints(J_regressor, v_shaped)   获得各个关节的位置

第二步:pose带来的位移偏差(影响很轻微,考虑到速度的时候可以舍弃)图c

pose_feature = batch_rodrigues (full_pose)#旋转向量转旋转矩阵

pose_offsets = torch.matmul(pose_feature, posedirs)

v_posed = pose_offsets + v_shaped

第三步:基于运动树进行关节点变换 图d

J_transformed, A = batch_rigid_transform(rot_mats, J, parents, dtype=dtype)

J_transformed: 应用姿势旋转后关节的位置   24 * 3

A: 所有其他节点相对根节点的刚体变换矩阵  24* 3 * 3

第四步:线性蒙皮算法 图d

T=  lbs_weights * A  :6890 * 3 * 3 得到每一个顶点3*3

v_homo =T * v_posed  得到最终的6890 * 3 mesh顶点

J_transformed: 最终的关节点

第五步:有位移考虑位移

if apply_trans:

            joints += transl.unsqueeze(dim=1)

            vertices += transl.unsqueeze(dim=1)

目前SMPL模型也得到了长足的发展,但是因为市面的渲染器对应的接口还是SMPL,所以SMPL的使用还是比较普及。

SMPL SMPLH  SMPLX 

STAR此模型是发布SMPL模型的研究人员2020最新的科研成果,是对SMPL模型的有效改进。

参考SMPL论文解读和相关基础知识介绍 - 知乎


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

相关文章

SMPL-论文解读

文章目录 创新点算法shape blend shape:pose blend shapeJoint locationSMPL model 训练过程Pose Parameter Trainingjoint regressorShape Parameter TrainingOptimization summary DMPL实验结论 论文: 《SMPL: A skinned multi-person linear model》…

SMPL模型进阶

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

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…

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

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