计算摄影——妆造迁移

Posted Turned_MZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算摄影——妆造迁移相关的知识,希望对你有一定的参考价值。

        妆造迁移算法是将一张人像中的妆造迁移到任何一张人像中,这是美颜算法中比较新也比较复杂的技术,这里对传统算法和深度学习算法整理一下。

        在妆造迁移中,实例面部皮肤特征,如雀斑、痣和瑕疵等,不应被迁移。同时目标面部固有皮肤特征也应保留。

传统妆造迁移算法

基于实例的妆容迁移(Example-Based Cosmetic Transfer)

        该方法需要成对的数据,比如下图,A和A*为成对的妆造前后实例图像,B为目标图像,B*为根据A的妆造进行迁移后的图像。一般需要四个步骤:

预处理

        在妆容迁移前,首先用贝叶斯扣图(Bayesian matting)将眉毛和睫毛分离,然后对从原始图像中分离眉毛和睫毛后产生的孔洞进行修补,修补方式包括图像修复(image inpainting)和纹理合成(texture synthesis),然后利用独立成分分析(independent component analysis,ICA)将固有皮肤特征(如雀斑、痣或瑕疵)从实例面部图像A和A*中去除。最后将所有图像面部变形为标准面部。

妆容映射

        妆容映射将人脸图像分解为颜色和光照两部分的乘积,通过计算妆造前后的光照密度对比图cp来完成迁移:,在各个像素点p 上,色彩混合表示式为:

外观修正

        上面的方法需要示例图和目标图有完全相同的几何结构和光照,并且精确对齐才可以,但这基本是不可能的,因此还需要对它进行局部几何变换修正,即将示例图的二阶拉普拉斯信息映射到目标图中。

 拉普拉斯算子:是二阶微分线性算子,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使用一阶微分。

假设:由局部几何变化引起的外观变化可通过拉普拉斯算子获取,该算子用于计算某像素与其相邻像素的差异。
 

在该假设下,由妆容引起的几何外观变化可通过混合各个像素点p的a*p和bp近似表示,即局部拉普拉斯二阶导数估计为: ,在给定β后,等式右端为确定值,此时需要修改bp*以满足上式对△bp*的约束,可以使用高斯-赛德尔(Gauss-Seidel)迭代求解。

眼睛迁移

        睫毛和眉毛的浓妆效果需要更精细的处理,包括毛发的长度、颜色和密度。本文利用提取的眉毛和睫毛的蒙板a将图像B的眉毛和睫毛选区叠加到B*上,,实现眉毛和睫毛的转移。

该方法有几个重大的局限性:

(1) 要求肤色相近,背景单一,这限制了应用场景。

(2) 无法适应比较大的几何变换。

(3) 需要成对的妆造对比图进行训练,获取这样的数据需要很高的成本。

基于物理模型和非成对数据的算法

        成对的妆造对比图获取代价高昂,《Digital Face Makeup by Example》方法则提出了人脸分层模型,不需成对的样本图,只需要输入两张图片,一张是目标图片I,一张是参考的样例化妆图片ε,其流程如下图。

该方法主要分为四步:

第一步:将I和ε进行人脸对齐。因为我们是在像素点级别进行迁移,所以人脸的对齐是很有必要的。文中人脸对齐采用了薄板样条函数(Thin Plate Spline,简称TPS), 这是一种在图像配准中很常见的插值方法。

第二步:对I和ε分别进行分解。文中将图片转换到CIELAB颜色空间,然后对图像进行了分层建模。L层被认为是光照层(lightness layer),可以被分解为粗粒度脸部结构层(Face Structure)和细粒度皮肤细节层(Skin Detail),具体的实现其实就是将lightness layer执行一个边缘保持的滤波操作(edge-preserving smoothing)得到large-scale layer,然后将lightness layer减去large-scale layer得到detail layer。剩下的两个通道a*和b*则被认为是颜色层。

第三步:将分解后的图像进行不同的处理,两幅皮肤细节层(Skin Detail)直接相加,颜色层使用一个alpha blending进行融合,对人脸结构中的高光和阴影部分则使用梯度进行迁移。

第四步:将得到的三部分组合到一起。注意到嘴唇化妆和脸部是很不一样的。在物理化妆中,嘴唇上的化妆品(如口红)通常会保留或突出嘴唇的质感,而不是像在面部皮肤上那样隐藏,处理方法是对原始图I中的每一个像素,从妆造图中搜索匹配的像素进行替换,此时会同时用到L通道的像素值和空间位置信息。

该方法原理清晰,不需要使用成对的数据,且不需要进行训练,但是需要输入图和妆造图进行精确的对齐,这限制了该类方法的实用性。实际上,传统的妆造迁移算法都无法避免这样的问题,它们对输入图的姿态以及光照非常敏感。

深度学习妆造迁移算法

基于GAN的妆造迁移算法

Githubhttps://github.com/Honlan/BeautyGAN 

以商汤提出的BeautyGAN为代表,它输入两张人脸图片,一张无妆图,一张有妆图,模型输出换妆之后的结果,即一张上妆图和一张卸妆图。

BeautyGAN采用了经典的图像翻译结构,生成器G包括两个输入,分别是无妆图Isrc、有妆图Iref,通过编码器(encoder)、若干个残差模块(residual blocks)、解码器(decoder)组成的生成器G 得到两个输出,分别是上妆图IBsrc、卸妆图IAref,结构示意图如下图。

BeautyGAN使用了两个判别器DA和DB,其中DA用于区分真假无妆图,DB用于区分真假有妆图。

BeautyGAN整体loss由4部分loss组成,对抗loss(adversarial loss),循环GAN loss( cycle consistency loss),感知loss( perceptual loss) ,换妆约束loss(makeup constrain loss) 。
其中,α = 1, β = 10,γ = 0.005 。

对抗loss(adversarial loss):

循环GAN loss( cycle consistency loss):

        为了消除迁移细节的瑕疵,将上妆图IBsrc和卸妆图IAref再次输入给G,重新执行一次卸妆和上妆,得到两张重建图Iresrc和卸妆图Ireref,此时通过循环损失(cycle consistency loss)约束一张图经过两次G变换后与对应的原始图相同。因为生成器的输入包含了一对图,所以与CycleGAN的不同之处在于这里使用了同一个生成器G,该损失用于维持图像的背景信息。

感知loss( perceptual loss):

上妆和卸妆不能改变原始的人物身份信息,这可以通过基于VGG模型的Perceptual loss进行约束,定义如下:

其中Cl,Hl,Wl分别是网络第l层的通道数,特征图高度和宽度。

换妆约束loss(makeup constrain loss):

        为了更加精确的控制局部区域的妆造效果,首先使用PSPNet 这样的分割模型,对人脸区域进行分割,即Face parsing 。可以分别提取出嘴巴,眼睛,人脸这3个部位。然后分别对这3个部位进行直方图Histogram loss的计算。

为什么要进行Face parsing操作?

  1. 背景和头发区域的像素和换妆是没有关系的。
  2. 人脸换妆不仅是一个全局的风格变换,更是人脸不同区域的独立风格的变换。

为什么要使用Histogram loss,而不是MSE loss?

If we directly adopt MSE loss on pixel-level histograms of two images, the gradient will be zero, owning to the indicator function, thus makes no contribution to optimization process. Therefore, we adopt histogram matching strategy that generates a ground truth remapping image in advance.
 

下面是一些效果图:

参考文章:

文献阅读 - Example-Based Cosmetic Transfer_K5niper的博客-CSDN博客

【技术综述】人脸妆造迁移核心技术总结 - 知乎

美颜换妆之BeautyGAN_watersink的博客-CSDN博客_beauty gan

妆容迁移专题:BeautyGAN与PSGAN - 知乎

 

 

 

 

以上是关于计算摄影——妆造迁移的主要内容,如果未能解决你的问题,请参考以下文章

计算机视觉中 还有图像处理中 要用到拉普拉斯变换吗

计算摄影资源汇总

C ++中的拉普拉斯矩阵计算[关闭]

数学之路-python计算实战(21)-机器视觉-拉普拉斯线性滤波

请教高手,关于拉普拉斯算子做图像锐化

光,影像与计算摄影