3D Human Reconstruction Notes
重建个自己的avatar放metaverse里面跑
Human Face Reconstruction Reference
PIFu
PIFu分为single-view surface reconstruction及multi-view surface reconstruction,但是实际上multi-view surface reconstruction就是对多个single-view的一个整合(比如简单粗暴的取平均值之类的),故不多赘述。
PIFu,全称Pixel-Aligned Implicit Function,顾名思义,它与之前的做human digitalization的算法的不同之处在于两点,一个是Pixel-Aligned,一个是implicit function。关于pixel-aligned,之前的算法大多都是voxel-aligned,也就是将一个三维的数据,即voxel,放到model中训练,显然,这费时又费空间,而PIFu只先关注二维数据,再利用implicit function的优势,将深度参数$z(X)$放进隐式函数中求解。
首先声明一下implicit function $f$的定义,
$$
f(F(x), z(X)) = s : s \in R
$$
其中,$x$表示一个二维点,$X$表示一个三维点,并且$x = \pi (X)$,表示$x$是$X$的一个二维projection,$z(X)$上面有说过,存储是$X$的深度参数,$F(x) = g(I(x))$是一个函数,其中$g(\cdot)$是一个encoder,之后由神经网络训练得到。而$f(\cdot)$得到的值$s$是个binary,即只有$0$和$1$,分别表示该点在mesh surface的外面和里面。
fig. 1是PIFu的流程图,如图所示,对于surface reconstruction,在计算机得到图像之后,将其放入image encoder,得到其特征向量$F_V(x)$,注意这里的下标$V$仅是用于将surface和texture reconstruction得到的特征向量区分开,即这依旧表示的是上文公式的$F(\cdot)$。得到必要的$F_V(x)$、$z(X)$作为参数后,便可以训练隐式函数$f_V(\cdot)$了, *loss function为
$$
\mathcal L_V = \frac1n\sum\limits_{i = 1}^n |f_v(F_V(x_i), z(X_i)) - f^_v(X_i)^2|
$$
其中,$f^*_v(X_i)$指的是由给定训练集中的训练数据可以得到的$f(\cdot)$函数。
知道了训练方法,那么现在问题就是如何获取训练样本,毕竟对于一个模型,我们可以从它身上取的点是无数个。一个最简单的想法就是,在模型的bounding box里随机取样,然而PIFu研究者经过实验,证明这种方式并不是很理想,他们决定再加上另一种采样方式: 随机在模型表面采样,并且给予其扰动,该扰动距离符合Gauss Function $\mathcal N(0, \sigma)(\sigma = 0.5cm)$。最终研究者确定在这两种取样方法比例为$1: 16$时为最佳。
解决了Surface Reconstruction,Texture Reconstruction同理,在其基础上,修改其$f(\cdot)$函数的表示方法,即$f_c(\cdot) = RGB$,并且更改损失函数为
$$
\mathcal L_C = \frac1n\sum\limits_{i = 1}^n |f_c(F_C(x’i, F_V), X’{i, z}) - C(X_i)|
$$
其中,$X’_i = X_i + \epsilon, \epsilon \sim \mathcal N(0, d), d = 1.0cm$,$x_i’ = \pi (X_i’)$
之所以loss function需要改成这样,是因为若保持原样,相当于在surface特征上又加上一个color的特征,而这样一般来讲,并且研究者经过实验,发现容易overfitting,那么不如在原有已得特征$F_V$的基础上加以改进,这样就可以省掉一个特征了,即$F_C (x_i’, F_V)$。而添加offset是为了让得到颜色的范围更广一些,毕竟我们无法对那无数个点都做训练,所以只能够让一个颜色存在于一定范围内来实现texture inference。
之后使用Marching Cube方法实现模型重建。
更细节一些,求解$F(\cdot)$的encoder使用的是Stacked Hourglass Network,而训练$f(\cdot)$使用的是多重$MLP$。
U-Net
U-Net 一般是用来处理semantic segmentation类问题用的,而此类问题即是指将存在于一张图像的不同物体标注出来,其最终呈现效果实际上有点类似于thermal image,但是又不尽相同。传统处理semantic segmentation的方法一般都是通过CV实现,比如基于threshold或者edge detection的实现,之后Jonathan Long等人提出了基于FCN(Fully Convolutional Network)的实现,2015年,在U-Net这篇论文中,它基于FCN,提出一种能够适应小训练集的网络方案。
首先说说FCN,其实FCN和CNN的网络结构基本一致,泛泛而谈,只是将最后的Fully Connected Layer改成了一个全卷积网络,实际上顾名思义,FCN本身即全部是由卷积组成的。那么为什么要做这样的处理?因为在CNN中,要通过FCL,我们必须将之前的tensor全部化为一个$1 \times n$的vector,也就是说,最终我们得到的只有对图像全局的一个分类参数,而若我们要做semantic segmentation,显然这样是行不通的,那么此时将FCL改为全卷积,我们就可以获得每个pixel的分类信息,从而获取全局的分割信息。
Subsampling的过程实际上是提取特征,level较低的layer用于提取小特征,level较高的layer用于抽象全局特征,即类似于classification的特征就是由这一块得到的,因为其receptive field较大,但是这也造成了其resolution较低。那么经过subsampling后,可以提高resolution并还原特征。其中,FCN在与前文的联系上采用skip-layer中逐pixel做加法的方法,即类似于fig. 2中的灰色箭头。
了解了FCN,U-Net理解起来就比较容易了,generally speaking,不去细究其内部网络详情,一如每个kernel的大小之类的,它实际上就是在与context连接的部分将逐pixel相加改为直接重叠,即将两个tensor重叠在一起,形成一个新的tensor,再进行下一步处理。
至于U-Net为何能在只有小训练集的时候也能很好的训练出一个不错的model,这归功于Overlap-tile strategy,实际上就是将一个大的图片分为很多较小的训练样本,那么对于关键词overlap-tile,这实际上就是扩大padding,来让我们选定的小范围区域的边缘部分也能被计入训练集进行训练。
I M Avatar
Definition
PCA: 一种将多维变量在尽可能保留featrue的情况下降维的方法。
ARCH
Animatable Reconstruction of Clothed Humans
Def
rigging:指的应当是建骨架的过程
![image-20221230103831196](/Users/colythme/Library/Application Support/typora-user-images/image-20221230103831196.png)
cv提到语义,一般指的是图像中像素点或目标本身的含义、性质等。
比如cv的语义分割,指的是按照目标的种类性质进行图像分割,同一种物体分为一类。实际就是对每个像素点做分类任务。
SemDF is a vector field represented by a vector-valued function V that accomplishes the transformation.v
SemS S = {(p, sp) : p ∈ R3} is a space consist- ing of 3D points where each point p ∈ S is associated to semantic information sp enabling the transformation opera- tion. SemDF is a vector field represented by a vector-valued function V that accomplishes the transformation,
pose-normalization我觉得指的应当是将project后得到的3D model normalize为基础动作或表情
In computer vision and graphics, 3D human models have been widely represented by a kinematic structure mimick- ing the anatomy that serves to control the pose, and a surface mesh that represents the human shape and geometry. Skin- ning is the transformation that deforms the surface given the pose. It is parameterized by skinning weights that individ- ually influence body part transformations.
其中,kinematic structure指的是运动学结构,即通过关节等的运动来表达。
skinning是根据skinning wieghts来构建的,即比如一个手的weight是多少,我就让他倾斜多少度等(当然这个例子只是方便理解,实际并不一定是这样)。Skinning is the process of binding the actual 3D mesh to the joint setup you created.
weight: 一个joint可以管到一片区域,但是很明显,对于某个特定位置,可能会影响到该点的joint对他的影响程度是不同的,这也就有了weight的概念,即一个weight $w_{i, p}$表示某个joint $i$对某个点$p$的影响程度。而若对于某个点$p$,他所拥有的weight和为1的话,则称这个weight是被normalized的。
那么LBS实际上就是对于一个点$p$,先算出每个joint对其进行linear transformation之后这个点应该在哪里,之后再将求出的每个点按照各自joint对$p$的权重乘起来并累加,类似于加权平均,得到最终$p$在经过某个变换应该所在的位置。
-
可以发现对于点$v_i$,求$v_i’$实际上就是对于每个joint,累加其对于$v_i$的影响权重$w_{k, i}$乘上(经过canonical rest pose纠正过的vector仿射变换乘以$v_i$),实际上和LBS的步骤差不多。
Occupacy map中的某个点$p$的occupacy $o_p$是个0到1之间的数,表示该点被占据的概率是多少。
Dataset: Our training dataset is composed of 375 3D scans from the RenderPeople dataset, and 207 3D scans from the AXYZ dataset. Our test dataset contains 64 scans from the RenderPeople dataset, 207 scans from the AXYZ dataset, 26 scans from the BUFF dataset, and 2D images from the DeepFashion dataset, representing clothed people with a large variety of complex clothing.
For each 3D scan, we pro- duce 360 images by rotating a camera around the vertical axis with intervals of 1 degree.
3D scan -> fit a rigged 3D body template to the scan mesh (detect regions of self-contact and topology changes and cut the mesh before pose-normalization) -> do pose-normalization
Comparison: We reconstruct the results on the same test set and repose them back to the original poses of the input images and compare the reconstructions with the ground truth surfaces in the original poses.
We report the average point-to-surface Euclidean distance (P2S) in centimeters, the Chamfer distance in centimeters, and the L2 normal reprojection error in Tab. 1.
Canonical Space:
Contribution
we introduce the Semantic Space (SemS) and Semantic Deformation Field (SemDF) to handle implicit function representation of clothed humans in arbitrary poses.
那么他使用的方法就是先给定一个template model,假定他的semantic space是$S = \{(p, \{w_{i, p}\}^{N_K}{i = 1}) : p \in \mathbb{R}^3\}$。那么根据skinning的方法比如LBS,对于一个任意pose的model,其上一点$p’$都肯定可以被template model上某个点$p$转化到,换言之,$p’$ is a linear combination of $\{w{i, p}\}$。
那么问题就到了如何求$\mathcal{V}$。
we propose opacity-aware differentiable rendering to refine our human representation via Granular Render-and-Compare
we demonstrate how reconstructed avatars can directly be rigged and skinned for animation. In addition, we learn per-pixel normals to obtain high-quality surface details, and surface albedo for relighting applications.
![image-20230102173751432](/Users/colythme/Library/Application Support/typora-user-images/image-20230102173751432.png)
Process
ARCH contains three components, after 3D body es- timation by [51] (see Fig. 2): pose-normalization using Semantic Space (SemS) and Semantic Deformation Field (SemDF), implicit surface reconstruction, and refinement using a differentiable renderer by Granular Render-and- Compare (see Sec. 3.4).
ARCH++
Contribution
First, we introduce an end-to-end point based geometry en- coder to better describe the semantics of the underlying 3D human body, in replacement of previous hand-crafted features.
Second, in order to address the occupancy ambiguity caused by topological changes of clothed humans in the canonical pose, we propose a co-supervising framework with cross-space consistency to jointly estimate the occupancy in both the posed and canonical spaces.
这里的joint实际上就是将posed space和canonical space的点$p_a, p_b$合起来看,同时假设他们的occupacy为$o_a, o_b$,那么组成一个四维pair $(p_a, p_b, o_a, o_b)$,然后在marching cubes找isosurface的时候找$o_a = o_b = \tau$。实际上这样就某种程度避免了手在袋子里导致的reconstruction失误,因为$o_a, o_b$分别是小于0和大于0的。
Last, we use image-to-image translation networks to further refine detailed geometry and texture on the reconstructed surface, which improves the fidelity and consistency across arbitrary viewpoints.
Definition
end-to-end: 深度学习提供了一种端到端的学习范式,整个学习的流程并不进行人为的子问题划分,而是完全交给深度学习模型直接学习从原始数据到期望输出的映射。对深度模型而言,其输入数据是未经任何人为加工的原始样本形式,后续则是堆叠在输入层上的众多操作层,这些操作层整体可以看作一个复杂的函数FCNN, 最终的损失函数由数据损失data loss和模型参数的正则化损失(regularization loss)共同组成, 模型深度的训练则是在最终损失驱动下对模型进行参数更新并将误差反向传播至网络各层。
PointNet++: 做Point Set Segmentation and Classification
SMPLicit
Definition
SDF: 首先,我们可以用SDF(Signed Distance Function)这样一个函数来隐式地表示一个三维物体,输入是空间中点的三维坐标,输出是这个点离我们想表示的物体表面的最近距离,如果在外部就是正,内部就是负。显然只要SDF找的好,从理论上来说,我们就能够简单粗暴地表示任意复杂且连续的物体,这也是物体的隐式表示方式与用点云、体素、网格等表示方式相比最大的好处。
这样就万事大吉了吗?并没有,因为如果用这种方法,并不是数据驱动的,而更像是一种数学的方法,我们每次进行重建的时候都得重新训练一个神经网络得到表示这个物体的专属SDF,比如给我一个轿车的若干采样点,我给训练出来了,你要是再给我一个卡车的采样点,我还得重新训练,虽说这样我们根本不需要数据集,但是缺点显而易见:我是希望在神经网络中引入对三维数据集的一些先验来辅助拟合,以便于更好地进行三维重建的,比如你就给我8个采样点,分别代表正方体的8个顶点,如果不引入数据集(如汽车数据集)的先验的话,最终拟合出来的东西肯定就是一个正方体(或者是个球体)之类的东西,而不是像个汽车的样子。
假定数据集中的某个数据被编码成latent code进行表示,这样我将这个latent code和三维坐标同时丢入神经网络查询得到sdf值,其实就能够得到某个具体的三维物体的SDF函数表示了
而有了SDF表示,我们就可以通过ray marching来render。
Process
SMPLicit本质上是要独立生成SMPL模型表面的衣服,而不用生成human body本身。
Clothing Cut: 这个clothing cut指的不是衣服裁剪问题,而是defined as the body area occluded by clothing。 for each garment-body pair in the training set, we compute a UV body occlusion image denoted as $U$. That is, we set every pixel in the SMPL body UV map to 1 if the corresponding body vertex is occluded by the garment, and 0 otherwise。然后再用一个image encoder从$U$ map到latent vector $z_{cut}$。注意,$U$是根据ground truth算出来的。
Clothing Styles: 我认为他使用DeepSDF去做$z_{style}$的拟合,本质上是因为每个衣服的特征是不同的,而DeepSDF的功能就是可以找不不同物体的SDF,那么这个$z_{style}$实际上是用来表示衣服的SDF的?
Body Shape: 由于在不同shape下衣服的表现是不同的,比如胖的人衣服就会膨胀起来,那么还要针对shape来进行编码训练。所以$P_{\beta}$本质上是表达衣服表面和body中vertex cluster的关系的参数,然后他记录的是衣服和body的距离(广义理解的话)。而$P_{\beta}$是$\mathbb{R}^3$中的一个3D点$p$ map的结果。
Output Representation: 实际上就是一个decoder network $C$,把$(P_{\beta}, z)$解码成为predicted unsigned distance $D (p)$。
Training
Loss: 可以理解为$D (p)$的prediction和ground truth的作差。
但是实际上上述操作都是在T-pose的前提下进行的,所以不能直接应用于3D reconstruction。
在3D human reconstruction的应用:
We first detect people and obtain an estimate of each person’s pose and shape [52], as well as a 2D cloth semantic segmentation [67]. We then fit SMPLicit to every detection to obtain layered 3D clothing.
接着在T-pose的SMPL模型上均匀采样,并且将这些sample point deform到当前pose下他们应当在的位置,再删除那些occluded的点。假定这些点为$p$,再将它们投影到2D平面,和原照片比对,如果点在clothes的semantic segmentation出来的块内则$s_p = 1$,反之为0。之后由损失函数处理。
ARAH
Definition
Differentiable Rendering: 三维的物体渲染成二维图像的时候,其实本质上是进行了一系列矩阵变换,插值等操作,这和神经网络有一定的相似之处,渲染相当于前向传播,得到渲染图,而渲染图和输入图像相比较可以定义loss,从而进行反向传播,去优化三维物体的形状与纹理,从而实现基于单张图像的三维重建,并且不再受3D数据集依赖。
Process
他的关键在于root-finding algorithm的改进。
整个流程