SMPL学习笔记

article/2025/9/28 7:05:37

文章目录

  • 前言
  • 一、SMPL概述
  • 二、体姿转换过程原理
    • 1.基于形状的混合成形(Shape Blend Shapes)
    • 2.基于姿态的混合成形 (Pose Blend Shapes)
    • 3.蒙皮 (Skinning)
  • 三、具体过程分析
    • 1.基于形状的混合成形
    • 2.基于姿态的混合成形
    • 3.骨骼点位置估
    • 4.蒙皮
  • 参考文章


前言

最近在研究神经网络和服装动画结合这一块的文章,发现很多文章的数据集都是和smpl模型相关的,所以记录一下笔记


一、SMPL概述

SMPL模型,其全称是Skinned Multi-Person Linear (SMPL) Model,Skinned表示这个模型不仅仅是骨架点了,其是有蒙皮的,其蒙皮通过3D mesh表示。3D mesh如下图所示,指的是在立体空间里面用三个点表示一个面,可以视为是对真实几何的采样,其中采样的点越多,3D mesh就越密,建模的精确度就越高(这里的由三个点组成的面称之为三角面片)
在这里插入图片描述
在SMPL模型目标是对于人体的形状比如胖瘦高矮,和人体动作的姿态进行定义,为了定义一个人体的动作,我们需要对人体的每个可以活动的关节点进行参数化,当我们改变某个关节点的参数的时候,那么人体的姿态就会跟着改变,类似于布偶娃娃的姿态活动。为了定义人体的形状,SMPL同样定义了参数,这个参数可以指定人体的形状指标。SMPL定义两个参数pose( β \beta β)和shape( θ \theta θ)来控制人体的运动体姿变化。
在这里插入图片描述

1.形状参数( β \beta β)

一组形状参数有着10个维度的数值去描述一个人的形状,每一个维度的值都可以解释为人体形状的某个指标,比如高矮,胖瘦等

2.姿态参数( θ \theta θ)

一组姿态参数有着 24 × 3 24\times3 24×3维度的数字,去描述某个时刻人体的动作姿态,其中的 24 24 24表示的是 24 24 24个定义好的人体关节点,其中的 3 3 3并不是如同识别问题里面定义的 ( x , y , z ) (x,y,z) (x,y,z)空间位置坐标(location),而是指的是该节点针对于其父节点的旋转角度的轴角式表达(axis-angle representation)(对于这 24 24 24个节点,作者定义了一组关节点树)


二、体姿转换过程原理

1.基于形状的混合成形(Shape Blend Shapes)

在这个阶段,一个基模版(或者称之为统计上的均值模版) T − _T^- T 作为整个人体的基本姿态,这个基模版通过统计得到,用 N = 6890 N=6890 N=6890个端点(vertex)表示整个mesh,每个端点有着 ( x , y , z ) (x,y,z) (x,y,z)三个空间坐标,要注意和骨骼点joint区分。
随后通过参数 β \beta β去描述我们需要的人体姿态和这个基本姿态的偏移量,叠加上去就形成了我们最终期望的人体姿态,这个过程是一个线性的过程。其中的 B s ( β → ) B_s(_\beta^\to) Bs(β)就是一个对参数 β \beta β的一个线性矩阵的矩阵乘法过程,我们接下来会继续讨论。此处得到的人体mesh的姿态称之为静默姿态(rest pose,也可以称之为T-pose),因为其并没有考虑姿态参数的影响。

2.基于姿态的混合成形 (Pose Blend Shapes)

当我们根据指定的 β \beta β参数对人体mesh进行形状的指定后,我们得到了一个具有特定胖瘦,高矮的mesh。但是我们知道,特定的动作可能会影响到人体的局部的具体形状变化,举个例子,我们站立的时候可能看不出小肚子,但是坐下时,可能小肚子就会凸出来了,这个就是很典型的 具体动作姿态影响人体局部mesh形状的例子了。 换句话说,就是姿态参数[公式]也会在一定程度影响到静默姿态的mesh形状。结合完形状变形和姿态变形之后,就去估算关节点的位置,用于第三步蒙皮操作。

3.蒙皮 (Skinning)

在之前的阶段中,我们都只是对静默姿态下的mesh进行计算,当人体骨骼点运动时,由端点(vertex)组成的“皮肤”将会随着骨骼点(joint)的运动而变化,这个过程称之为蒙皮。蒙皮过程可以认为是皮肤节点随着骨骼点的变化而产生的加权线性组合。简单来说,就是距离某个具体的骨骼点越近的端点,其跟随着该骨骼点旋转/平移等变化的影响越强。


三、具体过程分析

1.基于形状的混合成形

整个形状的混合成形可以用以下公式表示: V s h a p e = D β + T ‾ V_{shape}=D\beta+\overline{T} Vshape=Dβ+T
其中:
D ∈ R 6890 × 3 × 10 D\in R^{6890\times3\times10} DR6890×3×10是10个主成份的偏移

β ∈ R 10 \beta\in R^{10} βR10表示的是10个主成份偏移的大小

T ‾ ∈ R 6890 × 3 \overline T\in R^{6890\times3} TR6890×3表示的是基模版的mesh

V s h a p e ∈ R 6890 × 3 V_{shape}\in R^{6890\times3} VshapeR6890×3表示的是混合成形后的mesh

这个公式是线性的,可以直接套参数运算

2.基于姿态的混合成形

模型以0号节点为根节点,通过其他23个节点相对于其父节点(根据其运动学树结构可以定义出节点的父子关系)的旋转角度,我们可以定义出整个人体姿态的姿势。这里的旋转是用的轴角式表达。那么表示这些非根节点的相对于父节点的相对旋转需要用 23 × 3 23\times3 23×3个参数,为了表示整个人体运动的全局旋转(也称之为朝向,Orientation)和空间位移,比如为了表示人体的行走,奔跑等,我们还需要对根节点定义出旋转和位移,那么同样的,需要用3个参数以轴角式的方式表达旋转,再用3个参数表达空间位移。需要特别注意的是,轴角式并不方便计算,因此通常会把它转化成旋转矩阵进行计算,其参数量从3变成了 3 × 3 = 9 3\times3=9 3×3=9个。因此在控制mesh成形方面,基于姿态的混合成形需要 R ( θ → ) = 23 × 9 = 207 R(\overrightarrow{\theta})=23\times9=207 R(θ )=23×9=207个基本的pose模版。由于姿态的混合变形是非线性的,所以需要利用神经网络来训练得到一个 P ∈ R 3 N × 9 K P\in R^{3N\times9K} PR3N×9K的一个矩阵来结合形变参数 θ \theta θ来说使用。要知道这个过程是非线性的,需要训练的

3.骨骼点位置估

因为不同人体形状具有较大差异性,因此在经过了之前谈到的两种混合成形之后,我们仍然需要根据成形后的mesh估计出符合该mesh的骨骼点,以便于我们后续对这些骨骼点进行旋转,形成我们最终期望的姿态。因此,骨骼点位置估计(Joint Locations Estimation)在这里指的是根据混合成形后静默姿态下的mesh端点的位置,估算出静默姿态的作为控制点的骨骼点的理想位置。这个过程也是非线性的,需要训练的

4.蒙皮

在经过骨骼点位置估计之后,我们便有了对整个人体数字模型进行操作的控制点了,其实就是骨骼点。当我们对骨骼点进行旋转时,我们可以像摆动球形关节娃娃一样将静默姿态下的人体摆成我们需要的姿态。人体mesh端点也会随着其周围的关节点一起变化,形成我们最后看到的人体数字模型。因此蒙皮其实是让静默姿态下的人体骨架“动起来”,并且对其蒙上“皮肤”的过程。

参考文章

人体动作捕捉与SMPL模型 (mocap and SMPL model)


http://chatgpt.dhexx.cn/article/8aw2W0KL.shtml

相关文章

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) 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见。 这个模型由两类线程和一个缓冲区组成来组成 生产者线程:生产数据,并把…

最长上升子序列和最长公共子序列

文章目录 文章目录 文章目录一、基本知识二、最长上升子序列1.朴素版2.二分版 三、最长公共子序列 一、基本知识 1.子串和子序列的区别: 子串必须连续,子序列可以不连续。 2.最长上升子序列(LIS): 是指一个序列中最长的单调递增的子序列。 3.最长公共…

求最长子序列及回溯

D - 最长公共子序列问题 Description 给定两个序列 X{x1,x2,…,xm} 和 Y{y1,y2,…,yn},找出X和Y的最长公共子序列。 Input 输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z…

算法14-求最长子序列

题目: 给定数组arr。求最长的有序子序列的长度,返回长度int 分析: 1 要求的子串是有序的,就要比大小 2 用最暴力大方法,看成窗口问题,每一个元素求出它左边的最长序列子串,写入一个数组dp&…