三维人体重建

Dataset

Facebook提出DensePose数据集和网络架构:可实现实时的人体姿态估计
捕捉真值动作的视频数据集HumanEva, Huam3.6M
up-3d dataset
coco-2017 dataset
human 3.6m datas
ai challenger dataset

多张照片三维重建

从照片的三维重建(3D Reconstruction)——MVS系列

单张照片三维重建

人像分割、人体姿势估计(关节点)、肢体分割-肢体运动、蒙皮生成

纹理(皮肤、衣服)贴图、运动控制(骨骼点的旋转向量)、表情变化(BlendShape)

SMPL模型

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

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

β参数是ShapeBlendPose参数,可以通过10个增量模板控制人体形状变化: 具体而言:每个参数控制人体形态的变化可以通过动图来刻画:
在这里插入图片描述
这篇paper里,作者提出了SMPL模型(一种人体三维模型),这种模型特点:

  • 有皮肤(骨骼蒙皮),纹理。
  • 基于顶点的模型,方便调整以适应各种人体形状以及姿态。

SMPL模型是从数据里面学习出来的,这个模型比目前业界效果更好,且和工业界的Unity,Maya是打通的。

动画制作关键词
这里科普几个有关动画制作的关键词(不是专业做动画的,有些关键词含义可能会有一些不恰当的地方,欢迎指正),对于一个动画人物模型,比如Unity模型,有:

顶点(mesh):动画模型可以看成多个小三角形(四边形)组成,每个小三角形就可以看成一个顶点。顶点越多,动画模型越精细。
骨骼点:人体的一些关节点,类似于人体姿态估计的关键点。每个骨骼点都由一个三元组作为参数去控制(可以查看欧拉角,四元数相关概念)
骨骼蒙皮(Rig):建立骨骼点和顶点的关联关系。每个骨骼点会关联许多顶点,并且每一个顶点权重不一样。通过这种关联关系,就可以通过控制骨骼点的旋转向量来控制整个人运动。
纹理贴图:动画人体模型的表面纹理,即衣服裤子这些。
BlendShape:控制动画角色运动有两种,一种是上面说的利用Rig,还有一种是利用BlendShape。比如:生成一种笑脸和正常脸,那么通过BlendShape就可以自动生成二者过渡的动画。这种方式相比于利用Rig,可以不定义骨骼点,比较方便。
蒙皮:将模型从一个姿态转变为另一个姿态,使用的转换矩阵叫做蒙皮矩阵。

现有3D人体模型的缺点

  • 没有骨骼蒙皮:得到人体3D模型之后还需要加rig,太麻烦。而且还需要手工调整表面纹理贴图。
    和现有商业软件不兼容。
  • 不够真实,难以应对各种各样的姿态。

作者方法的优点
与工业界软件兼容,比如Unity,Maya。
将pose blend shapes建模成rotation matrices(旋转矩阵)的线性函数。因为旋转矩阵的元素是有界的,所产生的变形也是有界的,有助于模型更好地推广。
作者使用PCA从CAESAR 数据集学习了一个body shapes的线性模型。方法分为两步:

对于每一个扫描和姿态注册一个模板mesh
使用PCA,得到的主成分就是身体混合形状(body shape blend shapes)
作者将SMPL和BlendSCAPE对比发现,基于顶点的SMPL模型要优于基于形变的BlendSCAPE模型(从上图Figure2可以看出)。为了捕获软组织动力学,作者还提出了DMPL

SMPL/SMPLife website
Account: xufengchen.ai@foxmail.com
Password: 见邮件

后面其他论文使用到SMPL,主要是用

单段式

End to end recovery of human shape and pose: 201712
end to end recovery of human shape and pose源代码的实现加理论解读
End-to-end recovery of human shape and pose阅读笔记
论文
pytorch_HMR
tensorflow_hmr

描述:
直接估计:
可以捕捉真值动作的视频数据集 HumanEva, Huam3.6M,提供训练数据,所以 3D关节估计 就可以变为一个标准的 监督学习 问题。
1)直接从图像估计,通过深度学习框架
2)优势的方法,全卷积网络
特点:拥有 精确的真值3D标记 的图片是在可控的环境下得到的,仅仅这些图片训练出的模型不能再真实世界里生成的很好

本文是从图像像素去估计人体的meshes,并没有进行2D的关节检测

HMR is an end-to end framework for reconstructing a full 3D mesh of a human body from a single RGB image. In contrast to most current methods that compute 2D or 3D joint locations, HMR produce a richer and more useful mesh representation that is parameterized by shape and 3D joint angles.
在这里插入图片描述
这是其网络结构图,网络框架的工作流程:

  1. 编码器:获得图片的卷积特征
  2. 迭代的3D回归模型产生3D人体和相机的3D到2D标记的投射
  3. 对抗生成网络:决策,判别3D参数(3D回归模型产生)是否是unpaired数据中真实的meshes,相当于弱监督的过程。
    因为3Dmeshes丰富的representation,数据驱动先验(不清楚是什么)可以获取关节角度限制,拟人的约束(身高,重量,骨骼率),包含了模型的几何先验。
    当真值的3D信息可得,可用中间级损失。目标函数如下
    在这里插入图片描述
    lambda:一个权,控制一下每个目标函数的重要性。
    1l:1表示图片的3D真值可得,0表示不可得。

接着文章开始描述不同的L.

投射损失
在这里插入图片描述
迭代的3D回归:因为3Drepresentation包含了旋转信息,一次性回归很难。

THETA(representation),85维,在这里插入图片描述
在这里插入图片描述
THETA的初始为所有的THETA的平均(来自于数据集)。残差有图像特征和、在这里插入图片描述得到。

投射损失可以让网络产生3D人体可以解释2D的关节位置,但一些其他情况也能最小化投射损失,如像人的3Dbodys和粗略自相交叉的bodys。所以引入判别网络。

Pose、Shape、Camera这五个参数分别用途是什么,还有THETA

为什么用SMPL类型的3Drepresentation?因为可以很精确的知道其潜在空间的意义。

实现功能:人像分割 + 人体姿势估计(关节点) + 蒙皮生成 + 肢体分割-肢体运动

SkeletonNet:完整的人体三维位姿重建方法:2017

Video Based Reconstruction of 3D People Models:201802
https://arxiv.org/pdf/1803.04758.pdf
https://github.com/thmoa/videoavatars

Photo Wake-Up: 3D Character Animation from a Single Photo:201812

两端式

两阶段法:
描述:
1)用2Dpose检测,预测2D关节位置
2)通过 回归分析model fitting 从2D关节去预测3D关节,其公共方法是利用一个学习的3D骨架库。
这些方法为了约束 2D-to-3D 的固有歧义,用了不同的先验
1)假定四肢长度,或比例
2)学习一个姿势先验,获得了与姿势独立的关节角度限制。
特点:对于域的转变更鲁棒,过度依赖2D关节点侦测,丢掉了图片的信息。

三维人脸重建

PRNET

PRNET不需要3DMM系数或者TPS扭曲参数,直接通过神经网络,建立从2D图片到3D模版的映射关系,效率很高。
采用encoder-decoder的网络模式,可以端到端地实现由单张RGB人脸图像进行3D人脸重构密集人脸对齐的联合任务。
数据集:300W-LP

人脸对齐算法PRNet-(Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network)
PRNet:Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network
3D人脸重建:《Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network》

密集人脸对齐是什么?

在这里插入图片描述
把二维图像的rgb配合xyz空间坐标进行重映射(相当于就是图像变形,像素位置重组,不光只是重组因为原图像和目标图像的像素点不是一一对应的,还需要做插值)。一个rgb对应一个xyz,然后我用重映射破坏二维图片原先的像素排列顺序,用以匹配xyz三维人像垂直照射到二维平面的坐标值。

重映射,就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。
为了完成映射过程, 我们需要获得一些插值为非整数像素的坐标, 因为源图像与目标图像的像素坐标不是一一对应的
一般情况下,我们通过重映射来表达每个像素的位置 (x,y),
像这样 : g(x,y) = f( h(x,y) )
在这里,== g()是目标图像, f() 是源图像, 而h(x,y) 是作用于 (x,y) 的映射方法函数==
在OpenCV中,我们用函数remap( )来实现简单重映射。

remap的作用是将原影像映射到目标影像的函数。
当我们想对一张图片进行任意形状变化时,我们可以通过对图像的像素点重新插值来实现,在python中,scipy.interpolate的griddata和OpenCV的remap都可以实现图像插值功能

但是本文不需要3DMM系数或者TPS扭曲参数,直接通过神经网络,建立从2D图片到3D模版的映射关系,效率很高。

3D人脸和2D人脸的位置对应,3D较窄,2D较宽
3D垂直映射下来

rgb 对应UV position的 xyz,
UV position map,记录UV空间中所有点的3D位置。
UV texture map是用来干嘛?
UV position map + UV texture map才是最后的一个生成效果?
在这里插入图片描述
模型的输入输出?
数据集的格式?

总体来讲,可大致分为3个部分:3D人脸模型,3D点云的uv图表示以及网络结构设计

  • 3D人脸模型
    参考3DDFA,3D人脸可看做是形状和表情的和,其中3D形状模型可基于BFM模型,通过3DMM(3D Morphable Model)系数来构建,而3D表情模型可FW 模型构建。二者之和再通过Pose(姿态角,平移,尺度)参数投影到摄像机坐标系下,即得到3D点云的图像坐标。需要注意的是,BFM模型的点云数约为53490, FW表情模型的点云数约为53215,因此二者不能直接相加,需首先对BFM模型的点云进行筛选,仅从中提取53215个点(貌似是去除了嘴巴内部的点),同时修正相应的网格(triangles),这部分工作也是3DDFA团队的贡献。

  • 3D点云的UV图表示
    通过BFM形状模型表情模型,可以得到最终的3D点云的图像坐标(共53215个),每个点有x,y,z 3个坐标,共有53215x3个值,这些点云中的68个点x,y坐标即为常用的68个人脸关键点,约40k个点的x,y坐标即为密集人脸关键点。因此,本文的目标就是从单张2D人脸RGB图像中直接预测这约53k的点的3维坐标值。一个简单且普遍的是用一个1D向量来表示,即将3D点信息用一个向量来表示,然后用网络预测;然而,这种方法丢失了空间信息。
    相关研究中也有预测3DMM等模型的系数,然后同坐模型建模来得到3D点云,但这些方法太过依赖3DMM模型,并且流程复杂;最近的VRN用Volumetric来表示,成功摆脱了上述问题,但是其网络需要输出192x192x200的一个Volume,计算量相当大,重建分辨率将会受到限制。
    针对这些问题,作者非常巧妙地将53215x3个值用一个3通道256x256的图像来表示,即UV position map来表示,如下图
    在这里插入图片描述
    左图是输入图像的3D图和3D点云ground-truth;右边第1行,分别是2D图像,UV纹理映射图,相应的UV位置映射图;右边第2行,分别是UV位置映射图的x,y,z通道。实际上UV 位置图最初来源于3dmmasSTN,与3DDFA中的PNNC有类似的功能,二者详细内容及区别请参见这两篇论文介绍。

  • 网络结构设计
    论文网络基于tensorflow实现,共包含一层卷积层,10层resblock残差块(encoder)和17层转置卷积(decoder),其中中间各层卷积、转置卷积后跟着batchnorm和relu,最后一层转置卷积的激活采用Sigmoid。encoder中各层的kernel均为4, out channel从16到512,输出尺寸从256到8(每两个resblock尺寸减半),decoder则反之,但细节与encoder仍存在些许差别,详见代码。输入和输出均为256x256 RGB图像,其中输入是人脸图像,输出是3D点云坐标(共65536个)。最后分别从中提起相应点的2d、3d坐标来进行3D重建或人脸关键点。详细结构见下图

在这里插入图片描述

PHOTO WAKE UP

在这里插入图片描述

  • 输入图片根据cpm输出的关节信息输入到smpl获得人体3d蒙皮
    通过对smpl源码的阅读,发现该模型男女性是分别训练的,并且对生成模型其关键作用的主要是人体十四个关节点的数据。通过进一步分析知道了节点的顺序( Right ankle,Right knee,Right hip,Left hip, Left knee, Left ankle,Right wrist, Right elbow,Right shoulder, Left shoulder, Left elbow ,Left wrist, Neck ,Head top)以及节点信息存储的位置。节点信息存储在/smplify_public/results/est_joints.npz文件中,读取该文件,发现是一个键为‘est_joints’值为(28, 14, 2000)的列表的字典。

  • 人体分割/抠图
    使用现成Segment或Matting方法分离出输入图片的人和背景

  • 总结:

  1. 通过照片得到关节点位置(cpm)
  2. 通过关节点位置得到三维模型(smpl)
  3. 将得到的三维模型进行投影,得到相应的法线贴图、蒙皮贴图、深度图
  4. 抠图(ps,以及其他的一些算法)

背面是模拟(估计)出来的,怎么模拟的?可以复制?
直接取正面的镜像反转,反正不看背面,头发也是部位,背面只是修改body的部位,比如头发,衣服,再搞迁移
在这里插入图片描述

SMPL理解

一 . 主要工作

SMPL(Skinned Multi-Person Linear Model)是一种裸体的(skinned),基于顶点(vertex-based)的人体三维模型,能够精确地表示人体的不同形状(shape)和姿态(pose)。

SMPL适用于动画领域,可以随姿态变化自然的变形,并伴随软组织的自然运动。SMPL与现有的许多图形渲染管线都是兼容的。

SMPL是一种可学习的模型,通过训练可以更好地拟合人体的形状和不同姿态下的形变。

二. 相关技术

1. Blend Skinning

混合蒙皮技术(Blend Skinning) :一种模型网格(mesh)随内在的骨骼结构(skeletal structure)变形的方法。网格的每个顶点(vertex)对于不同的关节点有不同的影响权重(weighted influence),顶点在变形时,形变量与这个权重相关

  • LBS(Linear Blend Skinning ):线性混合蒙皮。使用最广泛,但是在关节处会产生不真实的变形

  • DQBS(dual-quaternion blend skinning ):双四元数混合蒙皮。

2. Rigging

骨骼绑定(rigging):建立顶点(vertex)和骨骼点(关节点)的对应关系,是blend skinning的前提

3. Blend shapes

混合形状(Blend shapes):指相对于base shape的变形(deformation),这种deformation是通常被表示为顶点的偏移量(vertex displacements),是由某种参数有关的function确定的

三. SMPL

1. 模型表示参数

  • 顶点数 N = 6839 vertices

  • 关节点数 K = 23 joints

  • 姿态参数(pose parameter) θ \theta θ θ ⃗ = [ w 0 T ⃗ , . . . , w K T ⃗ ] T \vec{\theta} = {[\vec{{w_0^T}},...,\vec{{w_K^T}}]}^T θ =[w0T ,...,wKT ]T 其中, w k w_k wk指关节k相对于运动树(kinematic tree)中的父关节点的旋转轴角度, w k ∈ R 3 w_k \in R^3 wkR3

  • 形状参数(shape parameter) β \beta β

β ⃗ = [ β 1 ⃗ , . . . , β ∣ β ⃗ ∣ ⃗ ] T \vec{\beta} = {[\vec{{\beta_1}},...,\vec{{\beta_{|\vec{\beta}|}}}}]^T β =[β1 ,...,ββ ]T

​ 其中, ∣ β ⃗ ∣ |\vec{\beta}| β 是线性形状系数(linear shape coefficients)的数量

2. Blend skinning

SMPL采用的是LBS方法进行骨骼蒙皮:
t i ˉ ‘ = ∑ k = 1 K w k , i G k ‘ ( θ ⃗ , J ) t i ˉ \bar{t_i}^{`}=\sum_{k=1}^{K}w_{k,i}G^{`}_{k}(\vec{\theta},J)\bar{t_i} tiˉ=k=1Kwk,iGk(θ ,J)tiˉ 其中:

w k , i w_{k,i} wk,i是第k个关节点对第i个vertex的影响,整体来看可用一个混合权重矩阵W( W ∈ R N ∗ K W \in R^{N*K} WRNK)表示所有vertex和所有keypoint之间的weighted influence
t代指 平均模型 T ˉ \bar{T} Tˉ 上的某个顶点
G k G_k Gk是姿态θ下关节点k的变形矩阵
· 可训练的参数:W

3. Shape blend shapes

不同人物的身体形状由一个线性blend shape函数 B S B_S BS表示: B S ( β ⃗ ; S ) = ∑ n = 1 ∣ β ⃗ ∣ β n S n B_S(\vec{\beta};S) =\sum_{n=1}^{|\vec{\beta}|}\beta_nS_n BS(β ;S)=n=1β βnSn 其中: S = [ S 1 , . . . , S ∣ β ⃗ ∣ ] S = [S_1,...,S_{|\vec{\beta}|}] S=[S1,...,Sβ ] S n ∈ R 3 N S_n \in R^{3N} SnR3N是某个shape特征对应的N个vertex的偏移,S是集合了所有shape的形变偏移矩阵

· 可训练的参数:S

4. Pose blend shapes

不同姿态(pose)引起的形变由一个线性blend shape函数 B P B_P BP表示: B P ( θ ⃗ ; P ) = ∑ n = 1 9 K ( R n ( θ ⃗ ) − R n ( θ ⃗ ∗ ) ) P n B_P(\vec{\theta};P) = \sum_{n=1}^{9K}(R_n(\vec{\theta})-R_n(\vec{\theta}^*))P_n BP(θ ;P)=n=19K(Rn(θ )Rn(θ ))Pn 其中: R : R ∣ θ ⃗ ∣ → R 9 K R:R^{|\vec{\theta}|}→R^{9K} RRθ R9K R是把pose向量 θ ⃗ \vec{\theta} θ 映射到exp( w ⃗ \vec{w} w )(concatenated part relative rotation matrices)的函数** θ ∗ θ^* θ**指rest pose(A-pose)下的pose向量 P = [ P 1 , . . . , P 9 K ] P = [P_1,...,P_{9K}] P=[P1,...,P9K] $P_n \in R^{3N} $是某个pose对应的N个vertex的形变偏移,P是集合了所有这种形变偏移的矩阵,可以表示9K=207种pose blend shape

· 可训练的参数:P

5. Joint locations

不同体型的人体的关节点位置是不同的(高矮胖瘦会影响keypoint的坐标位置),所以rest pose下的关节点位置L可以被表示为一个与人体形状 θ \theta θ的函数: L ( β ⃗ ; J , T ˉ , S ) = J ( T ˉ + B S ( β ⃗ ; S ) ) L(\vec{\beta};J,\bar{T},S) = J(\bar{T}+B_S(\vec{\beta};S)) L(β ;J,Tˉ,S)=J(Tˉ+BS(β ;S)) 其中,J是一个把rest pose下的vertex位置转化为joint位置的回归矩阵

· 可训练的参数:J

6. SMPL model

SMPL的关键优化之处就在于,在基本的LBS模型之上,通过blend shape来解决LBS的关节处变形问题

假设用L来表示LBS方法,最基本的LBS模型可以表示为: L ( T , J , θ ⃗ , W ) → t i ˉ ‘ = ∑ k = 1 K w k , i G k ‘ ( θ ⃗ , J ) t i ˉ L(T,J,\vec{\theta},W)→ \bar{t_i}^{`}=\sum_{k=1}^{K}w_{k,i}G^{`}_k(\vec{\theta},J)\bar{t_i} LT,J,θ ,Wtiˉ=k=1Kwk,iGk(θ ,J)tiˉ 其中T是指rest pose下的模型template,J是关节点位置,W是混合权重矩阵

首先,SMPL中J受shape的影响,所以有: J → J ( β ⃗ ) J → J(\vec{\beta}) JJ(β ) 其次,shape blend shape和pose blend shape对于模板模型的顶点位置产生影响,所以有: T → T P ( β ⃗ , θ ⃗ ) = T ˉ + B S ( β ⃗ ) + B P ( θ ⃗ ) T→T_P(\vec{\beta},\vec{\theta})=\bar{T}+B_S(\vec{\beta})+B_P(\vec{\theta}) TTP(β ,θ )=Tˉ+BS(β )+BP(θ ) 因此,SMPL模型可以被表示为: M ( β ⃗ , θ ⃗ ; Φ ) = L ( T p ( β ⃗ , θ ⃗ ) , J ( β ⃗ ) , θ ⃗ , W ) M(\vec{\beta},\vec{\theta};\Phi)=L(T_p(\vec{\beta},\vec{\theta}),J(\vec{\beta}),\vec{\theta},W) M(β ,θ ;Φ)=L(Tp(β ,θ ),J(β ),θ ,W) 其中** Φ \Phi Φ** 表示 可被训练的所有参数 的集合: Φ = W , S , J , P \Phi={ W,S,J,P} Φ=W,S,J,P

  • 19
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值