Data-driven 3D human head reconstruction——3D人头重建笔记

时间:2024-04-03 15:42:11

数据驱动的3D人头重建

文中提出的框架可以通过一张图片重建出3D人头模型。图片首先通过卷积神经网络把图片进行分割,使用Gabor滤波器提取头发方向。之后,以标志点为约束求解FLAME面参数化模型。利用人脸图像的高频信息对细节进行增强,并利用反照率参数化模型对纹理进行补充。最后,建立了条状网格毛发数据库,并利用该数据库和图像中提取的信息,对图像中的头发进行了重建

头部重建是人体重建中较为困难的。本文主要有以下几点贡献:

  • 提出一种简单快速的细节增强方法,并将增强后的细节作为法线贴图应用到人头模型,达到实时渲染的目的。
  • 建立了FLAME网格的反照率参数化模型,对人头纹理进行了补充。
  • 建立了一个头发-面部图像分割的数据库,并使用全卷积网络从图像中分割出头发与面部区域。
  • 从发型数据集生成的条状网格数据库是实时渲染的关键。

文中提出方法的处理管线图

Data-driven 3D human head reconstruction——3D人头重建笔记

给定一幅图像首先将其分割成头发、面部以及背景区域,计算毛发方向图并检测面部标志点;接着将FLAME面部参数模型与检测到的特征点进行匹配,得到一个粗糙的人脸网格。为捕捉更多细节使用了Z-buffer技术。文章还通过回归参数反照率模型的PCA系数,来生成完整的纹理贴图。

在头发重建阶段,通过计算多视角方向图,将头发模型数据库离线转换为网格。然后给定图像中的方向图可以从分割出的头发区域计算。通过将图像方向图与3D模型方向图进行匹配,最终可以找到3D头发网格模型。

面部与头发分割

使用全卷积网络进行学习、分类,得到分割后的图像。

面部重建

Data-driven 3D human head reconstruction——3D人头重建笔记

在FLAME网格上手动添加68个特征点(上图b)。把FLAME模型的3D特征点投影到2D,并尽可能接近原始图像中提取的特征点(上图a),以得到初始网格模型(上图c)

FLAME网格模型与原始图像的匹配能量可以写成
Elank=k=168Π(RMk+t)Uk+γ1(wβTβ)2+γ2(wθTθ)2+γ3(wψTψ)2(1) \begin{aligned} E_{l a n k}=& \sum_{k=1}^{68}\left\|\Pi\left(R M_{k}+t\right)-U_{k}\right\|+\gamma_{1}\left(\vec{w}_{\beta}^{T} \vec{\beta}\right)^{2}+\gamma_{2}\left(\vec{w}_{\theta}^{T} \vec{\theta}\right)^{2}+\gamma_{3}\left(\vec{w}_{\psi}^{T} \vec{\psi}\right)^{2} \end{aligned} \tag{1}
假设相机是沿z轴方向的弱透视投影,Π=[α000α0]\Pi=\left[\begin{array}{lll}\alpha & 0 & 0 \\ 0 & \alpha & 0\end{array}\right]

其中β,θ,ψ\vec{\beta},\vec{\theta},\vec{\psi}分别表示300维的形状向量、6维的姿态向量和100维的表达式参数向量,面部模型可以唯一的被这三个变量所确定。Mk=Wvk(β,θ,ψ)R3M_{k}=W_{v_{k}}(\vec{\beta}, \vec{\theta}, \vec{\psi}) \in R^{3}UkR2U_k\in R^{2}分别是3D特征点和对应图像上的2D特征点。wβ,wθ,wψ\vec{w}_{\beta},\vec{w}_{\theta},\vec{w}_{\psi}分别是β,θ,ψ\vec{\beta}, \vec{\theta}, \vec{\psi}的权重。tR3,rR3×3t\in R^3,r\in R^{3\times3}分别是平移向量,旋转矩阵。

使用坐标下降法通过改变β,θ,ψ,Π,R,t\vec{\beta}, \vec{\theta}, \vec{\psi},\Pi,R,t,最小化式(1)直至收敛得到上图c的结果。

由于FLAME分辨率低,表达褶皱和波纹有一定困难。于是文中对FLAME做出了修改。从原始的图片中基于特征裁剪和均匀缩放生成一张512*512的图像,使用z-buff光栅化算法获得高度场曲面。由于面积细节是图像中的高频分量,那么可以在高频分量的指导下移动网格顶点。

为获得高频分量。可用顶点对图像进行采样,得到c(vi)=(r(vi),g(vi),b(vi))c(v_i)=(r(v_i),g(v_i),b(v_i)),并计算强度fI(vi)=0.299r(vi)+0.587g(vi)+0.114b(vi)f_I(v_i)=0.299r(v_i)+0.587g(v_i)+0.114b(v_i),实际上是我们所表示网格上的标量场。而低频分量为fl(M)=(IλL)1fI(M)f_l(M)=(\bold{I}-\lambda\bold{L})^{-1}f_I(M)。可通过去除低频分量获得高频分量fh(M)=fI(M)fl(M)f_h(M)=f_I(M)-f_l(M)

在顶点向高频分向移动的过程中,为保证相邻顶点的一致性,顶点的移动距离取1-ring neighbors的平均值(不太理解是啥,是周边顶点距离的平均值?)
d(v)=1WuN(v)w(uv)(1(vu)n(v)uv)(fh(v)fh(u)) d(v)=\frac{1}{W} \sum_{u \in N(v)} w(\|u-v\|)\left(1-\frac{|(v-u) \cdot \vec{n}(v)|}{\|u-v\|}\right)\left(f_{h}(v)-f_{h}(u)\right)
其中,w(x)=2(xr)33(xr)2+1;0x<rw(x)=2\left(\frac{x}{r}\right)^{3}-3\left(\frac{x}{r}\right)^{2}+1;0 \leq x<r

vv移动后的位置通过v=v+d(v)n(v)v^{\prime}=v+d(v) \vec{n}(v)计算得到。完成移动后进行拉普拉斯平滑得到一个具有几何细节的网格

Data-driven 3D human head reconstruction——3D人头重建笔记

(a)输入图像;(b)初始FLAME网格;©细化FLAME网格;(d)提取出的高度网格;(e)细节增强结果;(f)计算的法线贴图;(g)通过法线贴图和纹理的渲染结果

整个过程如上图所示。根据含有与原图相一致的几何细节的模型(上图e),计算原始FLAME网格的法线贴图,结果如上图f。最终使用FLAME网格实时渲染细节,如上图g。

FLAME网格的完整纹理贴图

首先将FLAME参数化到平面区域(如下图a),然后将FLAME网格与BFM(巴塞尔人脸模型)网格对齐,得到无组织的纹理如下图b,通过光栅化算法渲染成纹理贴图(如下图c)。对于渲染纹理出现的瑕疵使用PULL-FILL算法修复(如下图d),最终给FLAME网格贴上纹理如下图e

Data-driven 3D human head reconstruction——3D人头重建笔记

在给FLAME贴反照率纹理时,首先使用FLAME反照率参数化模型计算反照率系数
minβ~ρ(i,j)AvAvIijIijρ(β~ρ)+wrk=1β~ρβ~ρkσpck(2) \min _{\tilde{\beta}_{\rho}} \sum_{(i, j) \in A_{v}}^{\left|A_{v}\right|}\left\|I_{i j}-I_{i j}^{\rho}\left(\widetilde{\beta}_{\rho}\right)\right\|+w_{r} \sum_{k=1}^{\left|\tilde{\beta}_{\rho}\right|} \frac{\tilde{\beta}_{\rho}^{k}}{\sigma_{p c}^{k}} \tag{2}
AvA_v是带颜色的像素区域,Iρ(β~ρ)I^{\rho}\left(\widetilde{\beta}_{\rho}\right)是对应像素的反照率;第二项是正则项,wrw_r是权重。解出式(2)中的β~ρ\widetilde{\beta}_{\rho},则输入缺失的图像的完整区域反照率可以通过混合系数Iρ(β~ρ)I^{\rho}\left(\widetilde{\beta}_{\rho}\right)得到,简记为I~ρ\widetilde{I}_{\rho}

假设面层材料为朗伯材料,并从照明方程中剔除镜面反射,得到了红色通道漫反射率的球谐展开式。
rij=R~ijρn=0NM=nnlnmαnYnm(ij)(3) r_{i j}=\widetilde{R}_{i j}^{\rho} \sum_{n=0}^{N} \sum_{M=-n}^{n} l_{n m} \alpha_{n} Y_{n m}(i j) \tag{3}
R~ijρ\widetilde{R}_{i j}^{\rho}是像素点(i,j)的红色反照值,lnml_{nm}是球谐展开系数,是只与发现方向有关的常系数。由于文中只取第一三阶球谐函数就可以表示98%的能量,所以式(3)又可化简为
rij=R~ijρLY(nij) r_{i j}=\widetilde{R}_{i j}^{\rho} \mathbf{L} \mathbf{Y}\left(n_{i j}\right)
其中L=[1,lx,ly,lz,lxy,lxz,lyz,lxy2,lz2]\mathbf{L}=\left[1, l_{x}, l_{y}, l_{z}, l_{x y}, l_{x z}, l_{y z}, l_{x y 2}, l_{z 2}\right]是照明系数向量,Y(nij)=[nx,ny,nz,nx,ny,nx,nz,ny,nz,nx2nv2,3nz21]Y(n_{ij})=\left[n_{x}, n_{y}, n_z, n_{x}, n_{y}, n_{x}, n_{z}, n_{y}, n_{z}, n_{x}^{2}-n_{v}^{2}, 3 n_{z}^{2}-1\right]是仅与法向方向有关的函数。

为了求出光照与反照率可以解下面的最小化方程

minl~,ρ~R(i,j)Av(ρ~RL~Y(nij)IijR2+wσRρ~RR~ijρ2) \min _{\tilde{l}, \tilde{\rho}_{R}} \sum_{(i, j) \in A_{v}}\left(\left\|\tilde{\rho}_{R} \tilde{\mathbf{L}} Y\left(n_{i j}\right)-I_{i j}^{R}\right\|^{2}+w_{\sigma R}\left\|\tilde{\rho}_{R}-\tilde{R}_{i j}^{\rho}\right\|^{2}\right)

解此方程先不考虑第二项,使用初始反照率R~ijρ\widetilde{R}_{i j}^{\rho}作为光照系数的初始值。然后固定光照系数去解ρ~R\tilde{\rho}_{R},由于这是个病态问题,所以把第二项当做常项,wσRw_{\sigma R}设置为1。其他的通道可以用相同的方法去解。把求解出的反照率作为最终补充完整的表面纹理。

Data-driven 3D human head reconstruction——3D人头重建笔记

上图展示的是该过程的求解过程:(a)输入图像;(b)提取出的有空洞的纹理;(c)经过补全的纹理;(d)在光照条件下的渲染结果

这篇论文中还是有很多地方不是很理解,在纹理上许多基础的概念以及原理都不是了解,接下来打算在这方面做一些工作。