计算摄影——妆造迁移

news/2024/12/20 9:53:48/

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

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

传统妆造迁移算法

基于实例的妆容迁移(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的妆造迁移算法

Github:https://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 - 知乎

 

 

 

 


http://www.ppmy.cn/news/703895.html

相关文章

芯片制造全工艺流程详情

原文:https://blog.csdn.net/cyrj08/article/details/77990017 芯片制造全工艺流程详情 我们每天运行程序的芯片是这样造出来的,放大后的芯片机构,无与伦比的美,在如此微观世界,人类科技之巅。 芯片一般是指集成电路…

程序员为什么热衷于造轮子,升职加薪吗?

作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言 哪个架构师没造过轮子? 你想过这样一件事吗?是先具备能力在安排职位&…

使用Jmeter制造测试数据

Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。作为一个负责任的后端开发人员,联调前需要充分自测,我使用jmeter主要用来生成测试数据,当然它的主业是进行性能测试。 运行环境是Windows 10操作系统,JDK版本是…

OI造数据以及Lemon评测教程

OI造数据以及Lemon评测教程 前言 所谓数据,就是我们对解决某个问题的程序正确与否进行判断的依据。 不同的题目会考虑到时间和空间复杂度,所以需要对数据有严格要求,甚至部分数据只能人为创造。 本教程是基于C/C和Python的造数据教程&…

造波(推板造波,函数造波)【转载】

转载自:http://www.jishulink.com/content/post/274472 1、推板造波</

利用Mysql存储过程造百万级数据

1.准备工作 &#xff08;1&#xff09;由于是使用存储过程&#xff0c;mysql从5.0版开始支持存储过程&#xff0c;那么需要mysql的版本在5.0或者以上。如何查看mysql的版本&#xff0c;使用下面sql语句查看&#xff1a; &#xff08;2&#xff09;创建两张表&#xff0c;表结构…

性能测试——造数

在性能测试脚本准备阶段&#xff0c;脚本中的参数一般需要造数才能更好的模拟真实的环境。有些参数比如身份证号是固定长度的&#xff0c;如果造1万个身份证号&#xff0c;借助一些工具和技巧能更快的帮助我们&#xff0c;我常用的是Excel和UltraEdit工具。 例子&#xff1a;造…

我们为什么要造轮子

程序员都喜欢造轮子&#xff0c;我身边的程序员&#xff0c;无论他们用什么语言&#xff0c;java、android、ios、python、go, 甚至是js&#xff0c;都热衷于造轮子。其实用go程序员造轮子我倒是能理解&#xff0c;毕竟很多java转go的朋友经常 吐槽&#xff1a;怎么这个没有&am…