3D人体建模技术:从基础到应用
1. 3D人体建模的重要性与挑战
在现实生活中,计算机视觉的许多应用都围绕着自然环境中的人类。比如Snapchat滤镜、FaceRig、虚拟试穿以及好莱坞的动作捕捉技术等,都依赖于精确的3D人体建模。自动收银技术也是一个典型的例子,零售商店配备深度感应摄像头,需要检测顾客拿取商品的动作,并相应地更新购物篮信息,这就要求准确地对人体进行建模。
人体姿态估计是人体建模的基石,它可以预测肩部、臀部和肘部等关节的位置,从而在图像中创建人体的骨骼结构,用于动作识别和人机交互等下游应用。然而,将人体建模为一组关节存在局限性:
- 人体关节不可见,且不与现实世界直接交互,因此不能依靠它们准确建模人机交互。
- 关节无法建模人体的拓扑结构、体积和表面,对于某些应用,如模拟服装的贴合度,仅有关节是不够的。
2. 3D建模问题的构建
在机器学习领域,建模问题通常包括两个主要部分:
- 数学上对问题进行表述。
- 在该表述的约束和边界内构建算法来解决问题。
对于3D人体建模,目标是创建逼真的动画人体,模型应能呈现真实的身体形状,并根据身体姿势的变化自然变形,捕捉软组织的运动。但人体由骨骼、器官、皮肤、肌肉和水等组成,它们之间的相互作用非常复杂,精确建模整个身体十分困难。在实际应用中,我们可以将人体的表面和形状在3D中建模作为替代,只需要模型具有逼真的外观即可,这样能使问题更易于处理。
3. 定义良好的表示
我们的目标是用低维表示准确地表示人体。关节模型是低维表示(通常在3D空间中有17到25个点),但它不能携带很多关于人体形状和纹理的信息。而体素网格表示虽然可以建模3D身体形状和纹理,但它的维度非常高,并且不适合建模因姿势变化引起的身体动态。
因此,我们需要一种能够同时表示身体关节和表面,并包含身体体积信息的表示方法。顶点网格就是这样一种表示,Skinned Multi - Person Linear(SMPL)模型采用了这种表示。SMPL模型利用角色动画行业中艺术家的专业见解,构建了一个良好的初始身体网格模板。这个模板是性别中立的,也可以分别为男性和女性构建变体。具体来说,初始模板网格由3D空间中的6890个点组成,向量化后模板网格的向量长度为6890 x 3 = 20670。任何人体都可以通过扭曲这个模板网格向量来拟合身体表面得到。
4. 线性混合蒙皮技术
有了3D人体的良好表示后,我们希望对不同姿势下的人体外观进行建模,这对于角色动画尤为重要。线性混合蒙皮技术就是用于将静态姿势的皮肤变换为任意姿势的皮肤的一种简单线性模型。该技术效率高,许多游戏引擎都支持它,可实时渲染游戏角色。
线性混合蒙皮技术涉及以下参数:
- 一个具有N个顶点的模板网格T(N = 6890)。
- 由向量J表示的K个关节位置(K = 23,对应人体的关节,如肩部、手腕和脚踝)。
- 混合权重W,通常是一个N x K的矩阵,捕捉N个表面顶点与K个关节之间的关系。
- 姿势参数Ɵ,是每个K个关节的旋转参数,共有3K个参数(这里有72个,其中69个对应23个关节,3个对应整体身体旋转)。
皮肤变形函数以静态姿势网格、关节位置、混合权重和姿势参数为输入,输出变形后的顶点:
$W(T, J, W, \theta) \to vertices$
在线性混合蒙皮中,函数采用变换后的模板顶点的简单线性函数形式:
$\bar{t}
{i}’ = \sum
{k = 1}^{K} w_{k, i} G_{k}’(\theta, J)$
其中:
- $t_i$ 表示原始网格在静态姿势下的顶点。
- $G(\theta, J)$ 是将关节k从静态姿势变换到目标姿势的矩阵。
- $w_{k, i}$ 是混合权重W的元素,表示关节k对顶点i的影响程度。
不过,这种线性模型虽然易于使用,但不明确保留体积,因此变换可能看起来不自然。为了解决这个问题,艺术家会调整模板网格,使蒙皮模型应用后的结果看起来自然逼真。这种应用于模板网格以获得逼真变形网格的线性变形称为混合形状,它们是为动画角色的所有不同姿势设计的,这是一个非常耗时的过程。
5. SMPL模型概述
SMPL(Skinned Multi - Person Linear)是一个基于数千人数据训练的线性模型,它建立在线性混合蒙皮模型的概念之上,是一个无监督的生成模型。该模型使用我们可以控制的输入参数生成20670维的向量,并计算产生正确变形所需的混合形状。输入参数需要具备以下重要属性:
- 对应人体的真实可触知属性。
- 特征本质上是低维的,以便我们能够轻松控制生成过程。
- 特征必须是解耦的,并且可以以可预测的方式控制,即改变一个参数不应改变归因于其他参数的输出特征。
基于这些要求,SMPL模型的创建者提出了两个最重要的输入属性:身体身份和身体姿势。SMPL模型将最终的3D身体网格分解为基于身份的形状和基于姿势的形状,实现了特征解耦。此外,呼吸和软组织动态等因素也是SMPL模型的一部分,但本章未详细解释。
SMPL模型是一个变形的加法模型,即所需的输出身体形状向量是通过在原始模板身体向量上添加变形得到的,这种加法属性使模型易于理解和优化。
6. SMPL模型的定义
SMPL模型在标准蒙皮模型的基础上进行了改进:
- 不使用标准的静态姿势模板,而是使用一个是身体形状和姿势的函数的模板网格。
- 关节位置是身体形状的函数。
SMPL模型指定的函数形式为:
$M(\beta, \theta) = W(T_p(\beta, \theta)J(\beta), \theta, W)$
其中:
- $\beta$ 是表示身体身份(也称为形状)的向量。
- $\theta$ 是对应目标姿势的姿势参数。
- $W$ 是线性混合蒙皮模型中的混合权重。
与线性混合蒙皮模型不同的是,在这个函数中,模板网格是形状和姿势参数的函数,关节位置是形状参数的函数。
7. 形状和姿势相关的模板网格
重新定义的模板网格是标准模板网格的加法线性变形:
$T_p(\beta, \theta) = \bar{T} + BS(\beta) + BP(\theta)$
其中:
- $BS(\beta)$ 是来自身体形状参数 $\beta$ 的加法变形,它是一个学习到的变形,建模为形状位移的前几个主成分,这些主成分从不同人在相同静态姿势下的训练数据中获得。
- $BP(\theta)$ 是一个由 $\theta$ 参数化的加法姿势变形项,也是从多人不同姿势的数据集学习到的线性函数。
8. 形状相关的关节
由于关节位置取决于身体形状,SMPL模型将其重新定义为身体形状的函数:
$j(\beta; J, \bar{T}, S) = J(\bar{T} + BS(\beta; S))$
这里,$BS(\beta)$ 是来自身体形状参数 $\beta$ 的加法变形,$J$ 是将静态模板顶点变换到静态模板姿势的矩阵,其参数也是从数据中学习得到的。
9. 使用SMPL模型
要使用SMPL模型创建3D人体模型,我们可以按照以下步骤进行:
1.
创建Python 2.7环境
:
cd chap8
conda create -n python2 python=2.7 anaconda
source activate python2
pip install –r requirements.txt
- 运行代码生成随机3D人体 :
python render_smpl.py
这将弹出一个窗口,显示3D人体的渲染结果。
下面我们来探究
render_smpl.py
文件中的具体内容:
import cv2
import numpy as np
from opendr.renderer import ColoredRenderer
from opendr.lighting import LambertianPointLight
from opendr.camera import ProjectPoints
from smpl.serialization import load_model
# 加载基本SMPL模型的权重
m = load_model('../smplify/code/models/basicModel_neutral_lbs_10_207_0_v1.0.0.pkl')
# 分配随机姿势和形状参数
m.pose[:] = np.random.rand(m.pose.size) * .2
m.betas[:] = np.random.rand(m.betas.size) * .03
m.pose[0] = np.pi
# 创建渲染器并分配属性,构建光源
rn = ColoredRenderer()
w, h = (640, 480)
rn.camera = ProjectPoints(v=m, rt=np.zeros(3), t=np.array([0, 0, 2.]), f=np.array([w,w])/2., c=np.array([w,h])/2., k=np.zeros(5))
rn.frustum = {'near': 1., 'far': 10., 'width': w, 'height': h}
rn.set(v=m, f=m.f, bgcolor=np.zeros(3))
rn.vc = LambertianPointLight(f=m.f, v=rn.v, num_verts=len(m), light_pos=np.array([-1000,-1000,-2000]), vc=np.ones_like(m)*.9, light_color=np.array([1., 1., 1.]))
# 渲染网格并在OpenCV窗口中显示
cv2.imshow('render_SMPL', rn.r)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过以上步骤,我们可以使用SMPL模型生成随机的3D人体。在实际应用中,我们可能更希望生成可控的3D形状,后续可以进一步探索如何实现这一目标。
下面是一个简单的mermaid流程图,展示使用SMPL模型的基本流程:
graph LR
A[创建Python 2.7环境] --> B[运行render_smpl.py]
B --> C[导入所需模块]
C --> D[加载模型权重]
D --> E[分配随机姿势和形状参数]
E --> F[创建渲染器和光源]
F --> G[渲染并显示网格]
同时,我们可以用表格总结线性混合蒙皮技术和SMPL模型的参数对比:
| 技术/模型 | 模板网格 | 关节位置 | 姿势参数 | 混合权重 |
| — | — | — | — | — |
| 线性混合蒙皮技术 | 静态模板网格T | 固定关节位置J | 旋转参数Ɵ | 矩阵W |
| SMPL模型 | $T_p(\beta, \theta) = \bar{T} + BS(\beta) + BP(\theta)$ | $j(\beta; J, \bar{T}, S) = J(\bar{T} + BS(\beta; S))$ | 旋转参数Ɵ | 矩阵W |
3D人体建模技术:从基础到应用
10. 估计3D人体姿态和形状的SMPLify方法
SMPLify是一种利用SMPL模型来估计3D人体姿态和形状的方法。它的核心思想是通过最小化目标函数,使得SMPL模型生成的3D人体与输入的2D图像或其他观测数据尽可能匹配。
SMPLify的优化过程可以分为以下几个步骤:
1.
初始化参数
:为SMPL模型的形状参数 $\beta$ 和姿势参数 $\theta$ 赋予初始值。这些初始值可以是随机的,也可以根据一些先验知识进行设置。
2.
定义目标函数
:目标函数通常包括多个项,用于衡量SMPL模型生成的3D人体与观测数据之间的差异。常见的项包括:
-
2D关键点损失
:如果有2D人体关键点的标注数据,计算SMPL模型投影到2D图像上的关键点与标注关键点之间的距离。
-
剪影损失
:如果有2D人体剪影数据,计算SMPL模型投影到2D图像上的剪影与实际剪影之间的重叠程度。
-
正则化项
:为了避免参数过度拟合,添加正则化项来约束形状参数和姿势参数的取值范围。
3.
优化目标函数
:使用优化算法(如梯度下降、Levenberg - Marquardt算法等)来最小化目标函数。在优化过程中,不断更新形状参数 $\beta$ 和姿势参数 $\theta$,直到目标函数收敛。
以下是一个简化的SMPLify目标函数的示例:
$L(\beta, \theta) = \lambda_{kp} \sum_{i = 1}^{N_{kp}} ||p_i - \Pi(M(\beta, \theta))
i||^2 + \lambda
{sil} \sum_{j = 1}^{N_{sil}} (1 - I_j \odot \Pi_{sil}(M(\beta, \theta))
j) + \lambda
{reg} (||\beta||^2 + ||\theta||^2)$
其中:
- $\lambda_{kp}$、$\lambda_{sil}$ 和 $\lambda_{reg}$ 是不同项的权重系数。
- $p_i$ 是第 $i$ 个2D关键点的标注位置。
- $\Pi(M(\beta, \theta))
i$ 是SMPL模型投影到2D图像上的第 $i$ 个关键点位置。
- $I_j$ 是第 $j$ 个2D剪影像素的值。
- $\Pi
{sil}(M(\beta, \theta))_j$ 是SMPL模型投影到2D图像上的第 $j$ 个剪影像素的值。
11. 探索SMPLify
在实际应用中,我们可以使用开源的SMPLify代码来进行实验。以下是一个简单的使用示例:
import numpy as np
from smplify.smplify import SMPLify
from smpl.serialization import load_model
# 加载SMPL模型
m = load_model('path/to/basicModel_neutral_lbs_10_207_0_v1.0.0.pkl')
# 假设我们有2D关键点数据
keypoints_2d = np.random.rand(17, 2) # 17个关键点,每个关键点有2D坐标
# 初始化SMPLify
smplify = SMPLify(model=m,
joints_2d=keypoints_2d,
focal_length=5000.,
img_size=(640, 480),
num_iters=100)
# 运行SMPLify进行优化
betas, pose = smplify()
print("Estimated betas:", betas)
print("Estimated pose:", pose)
在这个示例中,我们首先加载了SMPL模型,然后模拟了2D关键点数据。接着,我们初始化了SMPLify对象,并设置了一些参数,如焦距、图像大小和迭代次数。最后,我们运行SMPLify进行优化,得到估计的形状参数 $\beta$ 和姿势参数 $\theta$。
下面是一个mermaid流程图,展示SMPLify的基本流程:
graph LR
A[初始化参数] --> B[定义目标函数]
B --> C[优化目标函数]
C --> D[输出估计的形状和姿势参数]
12. 3D人体建模的应用拓展
除了前面提到的应用,3D人体建模还有许多其他的应用场景:
-
虚拟现实(VR)和增强现实(AR)
:在VR和AR应用中,准确的3D人体建模可以让用户更加身临其境地体验虚拟环境。例如,在VR游戏中,玩家的身体动作可以通过3D人体模型实时映射到虚拟角色上,增强游戏的沉浸感。
-
视频监控和安防
:在视频监控系统中,3D人体建模可以用于行为分析和异常检测。通过对人体的姿态和动作进行建模,可以识别出可疑行为,如奔跑、摔倒等,及时发出警报。
-
医疗康复
:在医疗领域,3D人体建模可以帮助医生更好地理解人体结构和运动。例如,在康复治疗中,通过对患者的身体进行建模,可以制定个性化的康复方案,评估治疗效果。
以下是一个表格,总结3D人体建模在不同应用场景中的作用:
| 应用场景 | 作用 |
| — | — |
| 虚拟现实和增强现实 | 增强沉浸感,实现身体动作实时映射 |
| 视频监控和安防 | 行为分析,异常检测 |
| 医疗康复 | 辅助诊断,制定个性化康复方案 |
13. 总结与展望
3D人体建模是一个具有广泛应用前景的领域,从游戏娱乐到医疗康复,都离不开准确的人体模型。SMPL模型及其衍生方法(如SMPLify)为我们提供了一种有效的解决方案,通过低维表示和可控制的参数,能够生成逼真的3D人体模型。
然而,目前的3D人体建模技术仍然存在一些挑战。例如,在复杂场景下,如多人交互、遮挡等情况下,模型的准确性和鲁棒性还有待提高。未来的研究方向可能包括:
-
融合多模态数据
:结合RGB图像、深度图像、点云等多模态数据,提高模型的准确性和鲁棒性。
-
引入深度学习方法
:利用深度学习的强大特征提取能力,进一步优化3D人体建模的效果。
-
实时性优化
:提高模型的计算效率,实现实时的3D人体建模,满足更多实时应用的需求。
随着技术的不断发展,我们相信3D人体建模技术将在更多领域发挥重要作用,为人们的生活和工作带来更多的便利和创新。
超级会员免费看
1878

被折叠的 条评论
为什么被折叠?



