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

AI不止能美颜,美妆迁移这样做

美颜和美妆是人脸中很常见的技术,在网络直播以及平常的社交生活中都有很多应用场景。常见的如磨皮,美白,塑形等美颜技术我们已经比较熟悉了,而本文重点介绍的是人脸妆造迁移的核心技术及其相关资源。

作者&编辑 | 言有三

1. 什么是人脸妆造迁移

所谓妆造迁移算法,指的是将一张人像的妆容迁移到任意一张人像照片中,这是美颜算法中比较复杂的技术,示意图如下:

图(a)是原图,图(b)是妆造风格图,图(c)就是将图(b)中的妆造迁移到图(a)中。

下面我们就来剖析传统的妆造迁移算法和基于深度学习的妆造迁移算法。

2. 传统妆造迁移算法

根据对数据集要求的不同可以分为两类,第一类是需要成对的妆造前后的图作为训练集,即有监督的模型;第二类则不需要成对的妆造前后对比图作为训练集,即无监督的模型。

2.1 基于梯度约束和成对数据的算法

基于成对图的算法,它需要同一个人脸图像妆造前后的对比图作为训练集,对数据集的要求很高,以《Example-Based Cosmetic Transfer》算法为例。

假如A和A*是成对的无妆造和有妆造的图,B是需要进行妆造迁移的图,B*是最终的效果,如下图所示:  

该方法通常包括3个步骤:

第一步是面部区域定位和对齐。首先需要完成人脸的检测,眉毛和睫毛,嘴唇等需要妆容迁移的区域的检测,对妆造迁移算法会产生干扰的固有皮肤特征,如雀斑、痣或瑕疵的去除。然后需要对面部几何形状进行变形,获得标准的正脸,从而使得所有的操作可以在该空间中进行。

第二步是妆容映射(cosmetic map)算法。该算法中将人脸图像分解为颜色和光照两部分的乘积,通过计算一个妆造前后的光照密度对比图cp来完成迁移,计算方法如下:

其中ap*就是妆造后图像,ap就是妆造前的图像。得到cp后使用一个加权操作将该对比图应用到图B中,即:

γ是一个加权系数,越大则迁移效果越明显。

第三步是外观修正。上式只有当样例图和目标图有完全相同的几何结构和光照,并且精确对齐时才能成立,而这基本上是不可能的,因此还需要对它进行局部几何变换修正,即将样例图的二阶laplacian信息映射到目标图中,其估计方法如下:

由于右边是确定的值,β是一个权重参数,所以我们只需要对bp进行更新使其满足上式,这通过iterative Gauss-Seidel solver算法来实现。

对于眼睛和睫毛部分,可以使用更加复杂的变换,睫毛和眉毛的浓妆效果需要更精细的处理,包括毛发的长度、颜色和密度。

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

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

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

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

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

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

该方法主要分为四步。

第一步:将I和ε进行人脸对齐。因为我们是在像素点级别进行迁移,所以人脸的对齐是很有必要的。文中人脸对齐采用了薄板样条函数(Thin Plate Spline,简称TPS), 这是一种在图像配准中很常见的插值方法。文中使用了ASM算法来定位关键点,为了提高准确性还进行了人工调整,并增加了十个额头控制点,最终得到了83个关键点。

第二步:对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通道的像素值和空间位置信息。

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

[1] Tong W S, Tang C K, Brown M S, et al. Example-based cosmetic transfer[C]//15th Pacific Conference on Computer Graphics and Applications (PG'07). IEEE, 2007: 211-218.

[2] Guo D, Sim T. Digital face makeup by example[C]//2009 IEEE Conference on Computer Vision and Pattern Recognition. IEEE, 2009: 73-79.

3. 深度学习妆造迁移算法

深度学习算法利用深度学习技术来自动完成妆造迁移,框架流程都更加简单,是当前主流的研究思路,目前主要包括基于数据库匹配的算法和基于GAN等生成式模型的算法。

3.1 基于匹配的妆造算法

论文《Makeup like a superstar: Deep localized makeup transfer network》主要是对人像进行五官分析,获取肤色,眉毛颜色,唇色等信息后,进行不同妆容的最佳匹配推荐,最后上妆,其算法的完整流程如下图:

风格推荐是从已上妆人脸数据库中挑选与当前素颜人脸最相近的图片。具体方法是使用一个人脸识别网络,选取该网络输出的人脸特征的欧氏距离最小者作为推荐结果。

然后是人脸分割,主要是进行五官提取,采用全卷积图像分割网络完成。对于已上妆数据集中的眼影部分妆造,素颜图片没有对应的原则,则根据眉眼特征点定位给出眼影区域。由于妆容分割的前景部分相对于背景更重要,网络对这两部分的损失进行了加权。

最后是妆容迁移,妆容包括粉底(对应面部),唇彩(对应双唇),眼影(对应双眼)。

粉底迁移和唇彩迁移的原理类似,需要考虑颜色和纹理,文中利用了风格化网络来实现,使用参考图和目标图的Gram矩阵作为损失函数,风格化网络直接参考Gaty等人提出的模型。

而眼影的迁移略有不同,因为它不是直接改变双眼像素,而是要给眼睛部位添加眼影,必须同时考虑眼睛的形状和颜色。考虑到参考图的眼睛掩膜和内容图的眼睛掩膜,两者具有不同的大小和形状,但是经过变形到目标图中后,两者具有相同的大小和形状。眼影迁移就是要将参考图掩膜处的眼影特征迁移到目标图中,因此实现不在原图中,而是在特征空间中进行约束,这里使用了conv1_1的特征,完整的优化目标如下:

其中A是结果图,R是参考图,sr是参考图的掩膜,sb是经过仿射变换后的待上妆图的掩膜,它们的尺度大小相等。sr'和sb'是sr和sb的卷积结果图,因为卷积降低了维度,所以通常来说就是一个比例缩放。因此上面的代表的是结果图掩膜部分,代表的是参考图掩膜部分,P表示人脸分割网络模型,提取出特征后最小化两者之间的L2损失。

为了让结果更好,还添加了全微分(total variance)损失和全图的结构损失,通过更改其中的权重变量,可以控制妆造的程度,比如让眼影变得更深。

3.2 基于GAN的妆造迁移算法

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

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

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

除了基本的GAN损失之外,BeautyGAN包含了3个重要的损失,分别是循环一致性损失Cycle consistency loss,感知Perceptual loss,妆造损失Makeup loss,前两者是全局损失,最后一个是局部损失。

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

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

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

为了更加精确的控制局部区域的妆造效果,BeautyGAN训练了一个语义分割网络提取人脸不同区域的掩膜(mask),使得无妆图和有妆图在脸部、眼部、嘴部三个区域需满足妆造损失(makeup loss),妆造损失通过直方图匹配实现,其中一个区域的损失定义如下:

item可以分别表示脸部、眼部、嘴部三个区域,HM是一个直方图匹配操作,M就是图对应的掩膜,表示逐个像素相乘。

整个makeup损失定义如下:

完整的BeautyGAN生成器损失为:

下面就是一些效果图:

[3] Liu S, Ou X, Qian R, et al. Makeup like a superstar: Deep localized makeup transfer network[J]. arXiv preprint arXiv:1604.07102, 2016. 

[4] Li T, Qian R, Dong C, et al. Beautygan: Instance-level facial makeup transfer with deep generative adversarial network[C]//Proceedings of the 26th ACM international conference on Multimedia. 2018: 645-653.

4. 展望

由于GAN等技术的成熟,人脸的妆造迁移算法得到了长足的进步,不过在实际落地中仍然会面临着一些难题,如大姿态和大表情的妆造迁移问题,后续的一些研究者们也基于此做出了一些工作,比如Pose-Robust Spatial-Aware GAN[5]。

该方法包括三个模块,即Makeup Distillation Network (MDNet),Attentive Makeup Morphing (AMM) module以及De- makeup Re-makeup Network (DRNet)。

Makeup distillation network是一个编码器模块,它从参考的妆造图y中提取特征Vy,然后使用1×1卷积变换为两个矩阵γ和β, 它们是大小都为1×H×W的特征图,它编码了从内在的面部特征,比如面部形状,眼睛大小到与化妆相关的特征,比如唇彩,眼影之间的关系。

原图像同样会经过Makeup distillation network得到特征Vx,但是因为原图像和妆造图有很大的表情和姿态差异,所以γ和β不能直接应用于Vx得到最终妆造结果,而Attentive makeup morphing module这个模块则在原图和参考图的逐像素差异的约束下计算出变形矩阵A,它的大小是HW×HW,这两个attention矩阵用于将γ和β进行变形得到γ’和β’,使其可以用于原图。

变形矩阵A的计算考虑了两方面的信息,第一个是Makeup distillation network提取的特征V,大小是C×H×W,第二个是几何信息P,这是为了保证x和y的妆造像素位置的对应,它的每一个特征图的元素计算了与68个人脸关键点的位置差,因此大小是136×H×W,P的计算如下,其中分别表示取x和y坐标,即第i个人脸关键点。

A的计算如下:

其中mxi表示原图像x的第i个像素的人脸分割掩膜结果,myj表示妆造图y的第j个像素的人脸分割掩膜结果,当两者同属于某一个语义区域比如嘴唇时,I(mxi=myi)等于1,否则为0。

得到A之后,就可以对γ和β进行变换,计算方法如下:

之后将γ'和β'沿着通道维度扩充后得到,它们的大小都是C×H×W。

De-makeup & Re-makeup network是一个编解码结构,编码器部分与Makeup distillation network是相同的结构,不过不共享参数。提取出来的特征与矩阵进行仿射变换得到,计算方式如下:

Vx'作为De-makeup & Re-makeup network的解码器部分的输入,完成妆造迁移。

下面展示了一些和BeautyGAN的对比结果,证明大姿态下的优势。

[6] Jiang W, Liu S, Gao C, et al. PSGAN: Pose-Robust Spatial-Aware GAN for Customizable Makeup Transfer[J]. arXiv preprint arXiv:1909.06956, 2019.

5. 人脸妆造数据集

研究人脸化妆问题自然需要相应的数据集,而且抗妆造干扰的人脸识别也是一种具有挑战性的问题,具有较大的研究意义,下面我们简单介绍一下已有的妆造数据集。

5.1. 妆造数据集

数据集地址:http://www.antitza.com/makeup-datasets.html。

发布于2012年,这是一个女性面部化妆数据集,可用于研究化妆对面部识别的影响。总共包括4个子数据集:

YMU(YouTube化妆):这是从YouTube视频化妆教程中获取的面部图像,YouTube网址为http://www.antitza.com/URLs_YMU.txt。

VMU(虚拟化妆):这是将从FRGC数据库中采集的高加索女性受试者的面部图像,使用

公开的软件来合成的虚拟化妆样本,软件来自www.taaz.com。

MIW:从互联网获得有化妆和没有化妆的受试者的前后对比面部图像。

MIFS:化妆诱导面部欺骗数据集:这是从YouTube化妆视频教程的107个化妆视频中获取。每一组包含3张图片,其中一张图片是目标的化妆前的主体图像,一个是化妆后的,另一个是其他人化同样的妆试图进行欺骗的图片。

2. 妆造迁移数据集

数据集地址:http://liusi-group.com/projects/BeautyGAN。

发布于2018年,包括3834张女性人脸图,其中1115张无妆造人脸,2719张有妆造人脸。妆造类型包括不同程度的烟熏妆(smoky-eyes makeup style)、华丽妆(flashy makeup style)、复古妆(Retro makeup style)、韩式妆(Korean makeup style)及日式妆(Japanese makeup style)。

总结

本次我们给大家介绍了人脸妆造迁移相关核心技术和数据集,人脸图像属于最早被研究的一类图像,也是计算机视觉领域中应用最广泛的一类图像,其中需要使用到几乎所有计算机视觉领域的算法,可以说掌握好人脸领域的各种算法,基本就玩转了计算机视觉领域。

 

以上内容更详细的介绍请参见《深度学习之人脸图像处理:核心算法与案例实践》,这是一本讲述在人脸各个方向中的深度学习算法的书籍,同时配套有大量实战案例。

 

长按识别二维码了解详情并购买

➤章节目录

 

第1章 人脸图像和特征基础

第2章 深度学习基础 

第3章 人脸数据集

第4章 人脸检测

第5章 人脸关键点检测

第6章 人脸识别

第7章 人脸属性识别

第8章 人脸属性分割

第9章 人脸美颜和美妆

第10章 人脸三维重建

第11章 人脸属性编辑

点击链接了解详情并购买

更多精彩回顾

书讯 |华章计算机拍了拍你,并送来了8月书单(下)

书讯 | 华章计算机拍了拍你,并送来了8月书单(上)

上新 | 三个男人一台戏,为云原生应用和OpenShift写了一本书
书单 | 《天才引导的历程》| 西安交通大学送给准大一新生的礼物

干货 | 机器人干活,我坐一边喝茶——聊聊最近爆火的RPA

收藏 | 揭秘阿里巴巴的客群画像

点击阅读原文查看更多AI好书

相关文章:

  • 【第17期】云原生应用:任何企业都是软件公司
  • 如何从0到1搭建大数据平台
  • 策略产品经理实践:主观评估的方法论
  • 一条SQL引发的“血案”:与SQL优化相关的4个案例
  • AI移动端算法优化之盒子滤波
  • 研究股票?我们偷偷告诉你一个算法
  • 用Spark进行实时流计算的那些技巧
  • 数字人民币要来了!试点全面展开,一文看懂央行数字货币背后逻辑
  • 模型独立学习:多任务学习与迁移学习
  • 看完这篇还不了解 Nginx,那我就哭了!
  • 流量红利已经耗尽?这几本书带你玩转电商各路技巧
  • 乘风破浪的迁移学习!四字成语讲明白这个大热研究方向
  • 详解阿里巴巴1688日常业务中的榜单算法
  • 干货请收好:终于有人把用户画像的流程、方法讲明白了
  • 【第18期】​未来的计算世界里,将会是“万物皆流”?
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Android交互
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • java取消线程实例
  • mysql innodb 索引使用指南
  • MYSQL 的 IF 函数
  • React Transition Group -- Transition 组件
  • Shell编程
  • spring学习第二天
  • 前端路由实现-history
  • 前端设计模式
  • 容器服务kubernetes弹性伸缩高级用法
  • 微信开源mars源码分析1—上层samples分析
  • const的用法,特别是用在函数前面与后面的区别
  • 整理一些计算机基础知识!
  • ​MySQL主从复制一致性检测
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (09)Hive——CTE 公共表达式
  • (1)虚拟机的安装与使用,linux系统安装
  • (二)丶RabbitMQ的六大核心
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (接口自动化)Python3操作MySQL数据库
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十三)Flask之特殊装饰器详解
  • (一)appium-desktop定位元素原理
  • (转)平衡树
  • .gitignore
  • .net core 依赖注入的基本用发
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .php文件都打不开,打不开php文件怎么办
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @EnableConfigurationProperties注解使用
  • @RequestBody与@ResponseBody的使用
  • [ C++ ] STL---string类的使用指南