Deep 3D Portrait from a Single Image

个人认为文章的创新点:

文章首先主要实现了两个功能第一个是单幅2D人脸图片直接转化为3D人脸模型,第二个是实现了在2D图像上的头部姿势改变,并将头部姿势改变的图片通过功能一完成3D人脸的转化。对于功能一,论文先是分割出头部区域中的脸部区域(不含头发与耳朵)使用3DMM模型生成脸部深度图,然后对头部区域中的其他区域(头发耳朵区域)使用孪生网络方式训练网络生成完整的深度图,在这个步骤也实现了将前面的脸部深度图与其他区域深度图进行合成得到完整的头部深度图。对于功能二首先是对人脸区域和其他区域进行一个刚性变化并重新投影到平面图像中,然后在使用对抗学习来将刚才重新投影得到平面图像进行修复完善生成新的人脸图像。

一.预处理

给定一张人像图像,我们执行粗对齐以集中和重新缩放检测到的面部区域(为了重建步骤后准确地集中 3D 头部中心)。然后,运行Face parsing with roi tanh-warping论文中的最先进的面部分割方法来分割头部区域,表示为SS,这其中包括面部、头发和耳朵区域。

二、3D头部重构

预处理
图1.3D头部重构

首先进行图片预处理,然后通过两个卷积神经网络来预测人头姿态和形状。
然后采用弱透视投影相机模型,并经验性地选择一个焦距得到头部姿态旋转矩阵RSO(3)R \in SO(3)和平移向量tR3t \in \mathbb{R^3},由于旋转矩阵RR由四元数表示,整个头部就被参数化为7维的向量pR7p \in \mathbb{R^7}

这一步就将一张图片的头部(脸、耳朵、头发)分割出来并且采用一个7维度的向量pp来表示。

2.1人脸重建与姿态估计

在分割完头部后接下来就是要进行人脸的重建和姿势估计,在这篇论文中它使用的是3DMM(三维可变形人脸模型)来进行人脸重建,关于3DMM模型点击这里
根据3DMM模型这篇文章中设定人脸形状向量为FF和纹理向量为TT由以下公式计算得到:
F=F(α,β)=F+Bidα+BexpβF=F(\alpha,\beta)=\overline{F}+B_{id}\alpha+B_{exp}\beta

T=T(δ)=T+BtδT=T(\delta)=\overline{T}+B_t\delta
其中F,T\overline{F},\overline{T}分别是人脸形状向量和纹理向量的平均,Bid,Bexp,BtB_{id},B_{exp},B_t分别是身份、表情、纹理的PCA基,α,β,δ\alpha,\beta,\delta分别是对应PAC基的PCA系数。F,T,Bid,Bt\overline{F},\overline{T},B_{id},B_t这几个PCA基与系数来自2009 Basel Face Model(巴塞尔人脸模型),而BexpB_{exp}PCA基与系数来自论文CNN-based Real-time Dense Face Reconstruction with Inverse Rendered Photorealistic Face Images.这样最终的结果为αR80βR64δR80\alpha \in \mathbb{R^{80}}、\beta \in \mathbb{R^{64}、\delta \in \mathbb{R^{80}}}.
作者采用弱监督的方式来训练神经网络预测人脸模型参数(α,β,δ,γ,p)(\alpha,\beta,\delta,\gamma,p),其中 γ\gamma 是球谐函数 (Spherical Harmonics, SH) 的系数(也就是是场景照明的球谐系数向量),其中的pp是上文中的头部向量pR7p \in \mathbb{R^7}
在训练时需要极小化图片的差异损失:
lphoto=fII(α,β,δ,γ,p)2l_{photo}=\int_f \lVert I-I^\prime(\alpha,\beta,\delta,\gamma,p) \rVert_2
II表示训练图片,II^\prime表示通过渲染网络预测的人脸模型得到的对应图片,ff表示渲染的人脸区域,2\lVert * \rVert_2表示RGB通道残差的l2l_2模(l2=((l1l1)2)1/2l_2=(\sum{(l_1-l^\prime_1)^2})^{1/2}),同时作者还考虑到渲染和真实人脸图片之间的感知损失:
lper=1<f(I),f(I)>f(I)f(I)l_{per}=1-\frac{<f(I),f(I^\prime)>}{\lVert f(I) \rVert * \lVert f(I^\prime) \rVert}
这里的f()f(*)表示表示用于提取身份特征的人脸识别网络来自论文Neural aggregation network for video face recognition.

2.2耳朵和头发的深度估计

在2.1中只是预测了人脸部位的深度图,接下来预测头发和耳朵的深度图,首先设定在2.1中分割出的人脸区域为SfS^f其他的区域为H=S(SfF)H=S-(S^f \cap F),由于缺乏真实深度数据,作者使用图像对以立体视觉匹配的方式训练 网络,但在测试阶段只使用单张图片。

假设 I1I_1I2I_2 是一个训练图像对 (来自视频中的两帧图像),人脸重建网络估计的头部姿态分别为(R1,t1)(R_1,t_1)(R2,t2)(R_2,t_2),这里的目标是通过孪生网络 (来自论文Learning a similarity metric discriminatively, with application to face verification.) 预测两张图像对应的深度图 d1d_1d2d_2。在训练前,作者首先在H1H_1H2H_2的规则像素格子进行三角化 (triangulation) 来构建两个 2D 网格。给定估计的深度图 d1d_1,通过反投影 (Inverse Projection) 可以得到对应的 3D 网格 H1H_1,通过(R2R11,R2R11t1+t2)(R_2R_1^-1,-R_2R_1^{-1}t_1+t_2)可以将 H2H_2变换到图像I2I_2的坐标系下,再将其投影到图像平面可以得到渲染的图像 I2I_2^\prime。对于 I2I_2d2d_2 同样可以得到渲染图像I1I_1^\prime。整个过程是可微的,因此可以用来训练深度估计网络。

2.2.1立体匹配损失

与立体匹配一样,作者首先通过最小化亮度误差来强制保持颜色的一致性:
lcolor=H2I2(d1)I21+H1I1(d2)I11l_{color}=\int_{H_2^\prime} \lVert I_2^\prime(d_1)-I_2 \rVert_1+\int_{H_1^\prime} \lVert I_1^\prime(d_2)-I_1 \rVert_1
其中H2=H2(H1,d1)H^\prime_2=H^\prime_2(H_1,d_1) 是区域H1H_1变换到图像I2I_2上的对应区域。
同时加上在立体视觉和光流估计中广泛使用的梯度差异损失来使得对于亮度变化更加鲁棒:
lgrad=H2I2(d1)I21+H1I1(d2)I11l_{grad}=\int_{H_2^\prime} \lVert \nabla I_2^\prime(d_1)-\nabla I_2 \rVert_1+\int_{H_1^\prime} \lVert \nabla I_1^\prime(d_2)-\nabla I_1 \rVert_1
这里 \nabla 表示梯度算子。为了增加空间光滑性,作者还添加了一个二阶光滑项:
lsmooth=H1Δd1+H2Δd2l_smooth=\int_{H_1} |\Delta d_1| + \int_{H_2} |\Delta d_2|
这里 Δ\Delta 表示拉普拉斯算子。

2.2.2 将面部升深度图作为条件输出

作者将重建的人脸形状 FF 投影到图像平面得到面部深度图 dfd^f,并将 dfd^f 与图像 II 联接在一起作为额外条件输入。 dfd^f 能够 为头发和耳朵区域的深度预测提供有用的信息,如头部姿态、相机距离等,且 能够使得已知的脸部深度能够沿着人脸轮廓传播到其他深度未知区域。
作者训练网络时同时预测人脸区域的深度,并将 dfd^f 作为目标:
lface=F1S1HF1d1d1f+F2S2HF2d2d2fl_{face}=\int_{F_1-S_1^H\cap F_1}|d_1-d_1^f|+\int_{F_2-S_2^H\cap F_2}|d_2-d_2^f|
这里ShS^h表示头发区域。由于dfd^f也是网络的输入,所有l_{face}不会给网络增加额负担。同时通过增加整个人头区域 S1S_1S2S_2 的光滑损失,能够促使重建的3D人脸和估计的人脸区域以外的几何形状保持一致性:
lsmooth=S1Δd1+S2Δd2l_{smooth}=\int_{S_1}|\Delta d_1|+\int_{S_2}|\Delta d_2|

2.2.3 层序的损失

头发经常会遮挡住部分面部区域,导致两层深度值。为了确保头发和被遮挡面部区域之间正确的相对位置,作者引入了具有层次顺序的损失来惩罚不正确的深度层顺序:
llayer=S1HF1max(0,d1d1f)+S2HF2max(0,d2d2f)l_{layer}=\int_{S_1^H\cap F_1}max(0,d_1-d_1^f)+\int_{S_2^H\cap F_2}max(0,d_2-d_2^f)
图2就展示了层序损失函数对头发遮盖面部效果的作用:


图2.层序损失函数的效果

明显可以看出第三列优于前两列。

三.单图像头部姿势操作

给定从单张图像重建得到的3D人头模型,这里改变其头部姿态,并合成新的肖像图片。算法流程如下图所示:

预处理
图3.头部姿势操控

对于人头姿态编辑,首先调整重建的人头模型的 3D 姿态,再将其重新投影到图像平面,并通过修复网络得到最终的结果.

3.1 3D姿势操作和投影

为了改变人头姿态,只需对 3DMM 人脸 FF 和 头发-耳朵网格 HH进行一个刚性变换。得到新的姿态下的网格后,再将其重新投影到图像平面,可以得到一个初始的粗糙结果。接下来再对该结果进行完善。

3.2 基于对抗性学习的图像优化

初始粗糙图像存在部分空洞,完善过程类似图像修复 (Image Inpainting),需要填补缺失的图像部分。作者使用神经网络GG来处理初始图像,并使用配对的(带有真实值的图像)和未配对的(初始粗糙图像) 数据(R,R^)(R,\hat{R})JJ来训练网络:
lcolor(G)=EJ[BG(J)J1]+ER[G(R)R^1]l_{color}(G)=\mathbb{E}_J\left[ \int_B \left \| G(J)-J \right \|_1 \right]+\mathbb{E}_R\left[ \int \left \| G(R)-\hat{R} \right \|_1 \right]
作者使用对抗学习来增加生成图像的真实性,使用判别器DD来鉴别GG生成的图像是否足够真实,并训练GG来生成足够真实的图像来骗过DD。作者使用 LS-GAN 框架,GGDD的对抗损失分别如下:
ladv(G)=12EJ[(D(G(J))1)2]+12ER[(D(G(R))1)2]l_{adv}(G)=\frac{1}{2}\mathbb{E}_J\left[ (D(G(J))-1)^2 \right]+\frac{1}{2}\mathbb{E}_R\left[ (D(G(R))-1)^2 \right]
ladv(D)=12EJ[(D(G(J))0)2]+12ER[(D(G(R))0)2]+ER[(D(R^)1)2]l_{adv}(D)=\frac{1}{2}\mathbb{E}_J\left[ (D(G(J))-0)^2 \right]+\frac{1}{2}\mathbb{E}_R\left[ (D(G(R))-0)^2 \right]+ \mathbb{E}_R\left[ (D(\hat{R})-1)^2 \right]
从图4中可以看出,借助对抗损失,网络可以生成更加清晰的结果。但由于 GAN 网络训练的不稳定性,会带来一些不需要的缺陷。为了移除这些缺陷,作者针对配对的数据,引入了感知损失:
lfeat(G)=i1Niϕi(G(R))ϕi(R^)1l_{feat}(G)=\sum_i \frac{1}{N_i}\left \| \phi_i(G(R)) - \phi_i(\hat{R}) \right \|_1
这里ϕi\phi_i是在ImageNet上预训练的VGG-19网络的第ii个激活层。图4展示了最终的修复结果,图像看起来非常真实、清晰。


图4.通过对抗网络修复空洞的结果

四.实验

人脸重建网络的训练集包含18万张自然人脸图片,图片来源包括 CelebA, 300W-LP 和 LFW 数据集。人头深度估计网络的训练集包含1.1万个图片对,来自316段不同人的包含头部运动的视频,运动幅度大致介于5到15度。在一块 NVIDIA M40 GPU 上训练网络需要大约15小时。

图像修复网络的训练集包含3.7万个配对的数据和3万张未配对的数据,在4块 M40 GPU 上训练需要40小时。

测试阶段,人脸重建、深度估计和图像修复分别需要13ms、9.5ms和11ms。预处理阶段的分割大约需要15ms。

注释

注释一.3DMM模型

3DMM,即三维可变形人脸模型,是一个通用的三维人脸模型,用固定的点数来表示人脸。它的核心思想就是人脸可以在三维空间中进行一一匹配,并且可以由其他许多幅人脸正交基加权线性相加而来。我们所处的三维空间,每一点(x,y,z)(x,y,z),实际上都是由三维空间三个方向的基量,(1,0,0)(0,1,0)(0,0,1)(1,0,0),(0,1,0),(0,0,1)加权相加所得,只是权重分别为x,y,zx,y,z
转换到三维空间,道理也一样。每一个三维的人脸,可以由一个数据库中的所有人脸组成的基向量空间中进行表示,而求解任意三维人脸的模型,实际上等价于求解各个基向量的系数的问题。
人脸的基本属性包括形状和纹理,每一张人脸可以表示为形状向量和纹理向量的线性叠加。
设定形状向量为shapevector:Sshape vector:S,纹理向量为texturevector:Ttexture vector:T
任意的人脸可以由数据集中的mm个人脸模型进行加权组合组成如下:
Smod=i=1maiSi............(1)S_{mod}=\sum_{i=1}^ma_iS_i............(1)
Tmod=i=1mbiTi............(2)T_{mod}=\sum_{i=1}^mb_iT_i............(2)
i=1mai=i=1mbi=1\sum_{i=1}^ma_i=\sum_{i=1}^mb_i=1
其中SiS_i,TiT_i分别为数据库中第ii张人脸的形状向量与纹理向量,aia_i,bib_i是权重。由于SiS_i,TiT_i并不是正交的,所以需要使用PCA进行降维分解,操作如下:

其中第一项是形状和纹理的平均值,而si,tis_i,t_i则都是Si,TiS_i,T_i减去各自平均值后的协方差矩阵的特征向量,它们对应的特征值按照大小进行降序排列。

等式右边仍然是mm项,但是累加项降了一维,减少了一项。sitis_i,t_i都是线性无关的,取其前几个分量可以对原始样本做很好的近似,因此可以大大减少需要估计的参数数目,并不失精度。

基于3DMM的方法,都是在求解这几个系数,随后的很多模型会在这个基础上添加表情,光照等系数,但是原理与之类似。
返回人脸重建部分继续阅读