当前位置: 首页 > news >正文

计算摄影——妆造迁移

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

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

传统妆造迁移算法

基于实例的妆容迁移(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 - 知乎

 

 

 

 

相关文章:

  • 【物理应用】基于Zernike多项式的大气湍流相位屏的数值模拟附matlab代码
  • 【工具网站推荐】文字转语音
  • 自定义类型:结构体详解
  • 两万字:讲述微信小程序之组件
  • 网际协议IP(计算机网络)
  • 树莓派buster安装ROS完整记录
  • Linux进程状态、进程优先级、环境变量、进程地址空间
  • 面试官:ArrayList扩容机制,你了解吗?
  • 应用链的兴起将带来哪些风险和机遇?未来将会如何发展?
  • 2022年接口测试面试题大全
  • 软件流程和管理(十):配置管理
  • 红黑树RBTree的模拟实现
  • 基于JAVA智能选课系统设计与实现计算机毕业设计源码+数据库+lw文档+系统+部署
  • PostgreSQL13主从同步异步流复制
  • HDFS读写流程+NameNode和DataNode工作机制
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • fetch 从初识到应用
  • java正则表式的使用
  • js如何打印object对象
  • Laravel Mix运行时关于es2015报错解决方案
  • Linux快速复制或删除大量小文件
  • Meteor的表单提交:Form
  • React+TypeScript入门
  • Spark学习笔记之相关记录
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 工程优化暨babel升级小记
  • 设计模式 开闭原则
  • 思考 CSS 架构
  • 小试R空间处理新库sf
  • 延迟脚本的方式
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 函数计算新功能-----支持C#函数
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (0)Nginx 功能特性
  • (6)添加vue-cookie
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (五)IO流之ByteArrayInput/OutputStream
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .naturalWidth 和naturalHeight属性,
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET轻量级ORM组件Dapper葵花宝典
  • [ C++ ] STL---stack与queue
  • [20160902]rm -rf的惨案.txt
  • [AIGC] Redis基础命令集详细介绍
  • [Android学习笔记]ScrollView的使用