妆容迁移【Lipstick ain’t enough: Beyond Color Matching for In-the-Wild Makeup Transfer】--cvpr2021

Lipstick ain’t enough: Beyond Color Matching for In-the-Wild Makeup Transfer

原文链接:https://arxiv.org/pdf/2104.01867

Abstract

  1. 化妆转移是将参考图像中的化妆风格应用到源脸上的任务。
  2. 现有的作品只关注淡妆风格,忽视了图案等化妆组件。
  3. 本文提出了一个整体化妆传输框架,可以处理颜色、形状、纹理和位置等所有化妆属性。
  4. 本文还引入了一个新的化妆数据集,包含真实和合成的极端化妆样本。
  5. 本文的框架在淡妆风格和极端妆容风格上都达到了最先进的性能。
  6. 本文的代码可在[https://github.com/VinAIResearch/CPM]获取。

1.Introduction

  1. 人类,尤其是女性,一直追求面部之美,因为它是吸引力的关键部分。化妆是一种常用的面部美容技术,它可以改变和增强面部外观,有很多种类的化妆品和配件。化妆是一个庞大的行业,每年产生巨额的营业额。
  2. 化妆转移是一种试妆技术,可以让用户看到自己换上不同的化妆风格的效果。化妆转移是通过将参考图像中的化妆成分转移到源脸上来实现的,这需要考虑面部的结构和特征。化妆转移是一个复杂的任务,因为它涉及到多种因素,如头部姿势、照明、面部表情和遮挡。
  3. 化妆转移是一种利用深度学习的生成模型来实现的技术,它可以将参考图像中的化妆风格转移到源脸上。 现有的方法只能处理基于色彩分布的简单化妆风格,不能处理复杂的图案和配件,如腮红、面部彩绘和化妆首饰。本文提出了一个新的框架,它由颜色传输分支和图案传输分支组成,它们可以同时处理颜色、形状、纹理和位置等化妆属性。 本文使用 UV空间中的扭曲面部来训练两个分支,以消除面部在形状、姿势和表情方面的差异。 本文将两个分支的结果融合起来,生成逼真的化妆后图像。
  4. 本文引入了一个新的化妆数据集,它包含了真实和合成的各种化妆风格,特别是极端的化妆风格。
    本文使用新的数据集和新的网络框架来训练化妆转移方法,它可以处理颜色和图案两个方面的化妆属性。
    本文的方法在淡妆和极端妆容上都表现出了优异的效果,超过了以前的方法,并提出了化妆转移的评估标准。

2.Related Work

  1. 化妆转移是一种利用深度学习的生成模型来实现的技术,它可以将参考图像中的化妆风格转移到源脸上。
    现有的方法(例如:CycleGAN、,BeautyGAN、BeautyGLOW、 BeautyGLOW、LADN、PSGAN、CA-GAN )只能处理基于色彩分布的简单化妆风格,不能处理复杂的图案和配件,如腮红、面部彩绘和化妆首饰。
    本文提出了一个新的框架,它由颜色传输分支和图案传输分支组成,它们可以同时处理颜色、形状、纹理和位置等化妆属性。
    本文引入了一个新的化妆数据集,它包含了真实和合成的各种化妆风格,特别是极端的化妆风格。
    本文在淡妆和极端妆容上都表现出了优异的效果,超过了以前的方法,并提出了化妆转移的评估标准。
  2. 从单个图像进行 3D 面部建模是一种重建输入图像中的 3D 面部结构的技术,它对于化妆转移等任务很重要。 3D 变形模型 (3DMM) 是一种常用的 3D 面部建模方法,它使用参数化的统计模型来表示 3D 面部流形。 巴塞尔面部模型 (BFM) 是最流行的3DMM,它将任何 3D 面部近似为平均面部和主要形状分量的加权和。 3D 建模任务的目标是优化权重,使得合成的 3D 面部与输入图像尽可能匹配。
  3. 深度学习是一种利用神经网络来学习数据特征和模式的技术,它在计算机视觉中有很多应用。 3D 面部建模是一种重建输入图像中的 3D 面部结构的技术,它对于化妆转移等任务很重要。 深度学习在 3D 面部建模中的第一次尝试是使用监督训练来回归 3DMM参数,这是一种参数化的统计模型来表示 3D 面部流形。 后来的方法使用自动编码器来进行无监督训练或学习非线性 3DMM 模型,以提高 3D 建模的准确性和真实性。 PRNet 是一种最新的方法,它使用 UV 位置图来编码对齐的 3D 面部形状,将 3D 面部建模转换为图像到图像的转换问题。 UV 表示具有易于使用和操作的优点,同时消除了头部姿势和表情的影响。 本文使用 PRNet 来进行3D 面部建模,并利用其 UV 表示来实现跨面部的有效化妆交换。

3.Color-&-Pattern Makeup Transfer Method(彩妆转印法)

令 I n s 表示未化妆 (n) 的源图像 (s),I m r表示具有所需化妆 (m) 的参考图像 ®。我们的目标是获得 I m s ,即从参考图像转移化妆后的源面部图像。它需要学习一个函数 F,使得:在这里插入图片描述
我们的方法由以下三个步骤组成。首先,输入图像Ins 、Imr 被转换为UV纹理图Tns、Tmr 。其次,纹理贴图被传递到两个并行分支,以进行基于颜色和基于图案的化妆传输。第三,通过组合这些分支的输出形成化妆转移纹理Tms ,并将该UV纹理图转换到图像空间以获得最终输出Ims 。我们的方法的流程如图 2a 所示。在本节的其余部分中,我们将描述主要组件的详细信息。

在这里插入图片描述

3.1. UV map conversion(UV贴图转换)

  1. UV 贴图表示是计算机图形学中 3D 对象纹理映射的常用技术。对象的纹理被关注到 2D 图像中,并且对象的每个 3D顶点都与图像上的一个 2D 位置(称为UV 坐标)相关联,用于颜色采样。
  2. PRNet 扩展了这个想法,并引入了 UV 位置图表示来编码任何 3D面部形状。它是具有三个通道的 2D 图像,对 3D脸部相对于相机坐标的 XYZ 坐标进行编码。该 UV 贴图注册良好;无论输入的头部姿势如何,地图中的每个像素都对应于脸上的固定语义点。
  3. 除了 UV 位置图之外,我们还进行纹理映射以获得配对的纹理图。 UV位置图包含有关面部形状、头部姿势和面部表情的所有信息,而映射的纹理对于这些方面是不变的。
  4. 给定输入面部图像 I,我们可以使用 PRNet 的预训练模型(记为 UV)来提取相应的 UV 位置图 S 和UV 纹理 T。输入图像可以通过渲染函数 UV^-1 从这些 UV 表示中恢复。在这里插入图片描述
  5. 在源图像和参考图像之间传输化妆 对于不同的头部姿势,我们使用这些 UV 贴图演示。首先,我们对每个输入图像 In s 和 I m r应用转换函数UV 以获得相应的 UV 图 (S s , T n s ) 和 (S r , T mr )。请注意,UV 位置图 S s 和S r 仅取决于 3D 脸部形状,因此与化妆风格无关。然后,我们将纹理贴图 Tn s 和 T m r 传递到颜色和图案传输分支,以在 UV 空间中交换妆容。两个分支的输出被混合成最终的纹理图像T m s 。最后,我们应用渲染函数将其转换回标准图像表示:I m s =UV ^- 1 (S s , T m s )。

3.2Color transfer branch(颜色转移分支)

  1. 该分支采用 BeautyGAN中提出的架构和训练损失。
  2. 在 BeautyGAN 中,关联区域没有对齐;它们在大小、位置和透视变形方面差异很大。它严重影响直方图匹配结果,降低了直方图损失的有效性。
  3. 虽然与 BeautyGAN 类似,但我们的颜色传输分支使用 UV 纹理贴图代替原始图像进行化妆交换。这些看似所有的创新实际上带来了很大的改进。纹理图是逐像素注册的,使直方图匹配功能能够准确工作。区域掩模是图像不变的并且等于通用掩模:在这里插入图片描述

3.3Pattern transfer branch(模式转移分支)

  1. 除了颜色转移分支之外,我们还提出了一种新颖的图案转移分支,旨在检测和转移基于图案的化妆组件,例如贴纸、面部图画和装饰配件。在转移这些图案时,我们需要保持它们的形状、纹理和位置不变,但扭曲到目标 3D 表面。在自然图像形式中,这个过程很复杂,包括分割图案、反扭曲以及重新扭曲到目标上。由于 UV位置图表示,我们不需要反扭曲和重新扭曲步骤。问题简化为简单的图像分割。
  2. 给定输入纹理图 T m r ,我们的目标是为其化妆模式提取二进制分割掩模。我们可以通过使用任何分割网络来做到这一点。在我们的实现中,使用了带有预先训练的 Resnet-50 编码器的典型 UNet 结构。我们使用骰子损失进行训练:
    在这里插入图片描述
    其中 Î gt 和 Î pr是模式的基本事实和预测分割掩模。为了训练这个网络,我们需要一个带有带注释的化妆图案蒙版的化妆数据集。然而,这样的数据集并不存在,因此我们自己开发了一个名为 CPM-Synt-1 的合成数据集,用于图像-掩模对训练数据。

3.4Combination(Combination)

  1. 图案传输分支的输出是图案掩模 Î m ,而颜色传输分支的输出是整个 UV 纹理图 T msC。这两种输出的形式不同,反映了两种化妆品类别之间的根本差异。这就是为什么我们提出两个单独的分支进行专用处理。为了获得具有所需转移妆容的源图像的UV 纹理图,我们可以通过将由预测蒙版 Î m 定义的参考妆容图案与颜色混合来组合两个分支的输出。
  2. 转移纹理图 T msC 来自颜色传输分支:

在这里插入图片描述
3. 最后,我们使用渲染函数将此纹理贴图转换为输出图像 I m s 。
在这里插入图片描述

4.Color-&-Pattern Makeup (CPM)

鉴于缺乏极端化妆风格的注释数据来开发野外化妆转移方法,我们自己收集了此类数据。在本节中,我们描述了数据收集和生成过程,该过程产生了三个颜色和图案化妆(CPM)数据集,称为CPM-Real、CPM-Synt-1和CPM-Synt-2。

4.1. CPM-Real – In-the-Wild Makeup Dataset

  1. 这个真实野外化妆数据集是一个包含 3895 张真实面部图像的数据集,它们具有多样和极端的化妆风格,如色彩妆、图案妆、面部宝石、面部彩等。
  2. 这个真实野外化妆数据集是通过使用关键词搜索、人脸检测、裁剪和手动筛选来编译的,它比之前最大的化妆数据集 MT 多了 43%的化妆图像。
  3. 这个真实野外化妆数据集是为了测试化妆转移技术而设计的。

4.2. CPM-Synt-1 – Added Pattern Dataset

  1. 这个合成添加的化妆模式数据集是一个包含 5555 张真实面部图像的数据集,它们具有不同的图案化妆组件,如贴纸、面部图画和装饰配件。
  2. 这个合成添加的化妆模式数据集是通过从互联网上收集 577 张高质量的图案图像,然后将它们与 MT 数据集 的图像进行混合来编译的。
  3. 这个合成添加的化妆模式数据集使用 UV 贴图表示来进行图像混合和渲染,以保持图案的形状、纹理和位置不变,并适应目标面部的 3D 表面。
  4. 这个合成添加的化妆模式数据集还提供了每个图像的图案分割掩模和 UV 贴图,它们可以用于训练和测试化妆转移技术。

4.3. CPM-Synt-2 – Transferred Pattern Dataset

尽管有真实标签,CPM-Synt-1 并不遵循传输设置,因此它不能用于评估基于模式的化妆传输算法。因此,我们构建了另一个名为 CPM-Synt-2 的综合数据集。该数据集包含图像三元组:(源图像、参考图像、地面实况),专为模式转移评估任务而设计。此测试的一项要求是具有相同色妆风格的源图和参考图。否则,我们需要在真实图像中施加色彩化妆转移。创建这样的事实并非易事,而且还没有提出实际的解决方案。我们可以从非化妆图像开始,但即使这些图像也有明显的色彩差异,需要交换。为了克服上述问题,我们依赖化妆转移稳定性的假设:当使用相同的参考图像时,好的化妆转移方法将输出相同化妆风格的图像。基于这个假设,我们提出了一种构建CPM-Synt-2 数据集的方法,如图 4 所示。首先,从MT 数据集中随机挑选两个非化妆图像。然后,我们使用 BeautyGAN 将它们转移到由颜色样式图像定义的相同化妆风格 n。此过程会产生具有相同颜色样式的两个图像,分别称为 Color-makeup Source I n s 和Color-makeup Reference I n r 。接下来,我们将贴纸混合到两个图像中,形成真实图像 I gt s 和参考图像 I m r 。最后,形成三元组(In s 、I m r 、Igt s )。 CPM-Synt-2 由 1625 个三元组组成,用于评估目的。

5. Conclusion(结论)

在本文中,我们扩展了化妆迁移任务的定义,并提出了一个新颖的整体框架来处理野外化妆风格。化妆风格现在被解释为颜色匹配和图案添加的组合,分别由我们的颜色转移分支和图案转移分支解决。结合 UV表示来改善两个分支的结果。实验表明我们的框架可以实现最先进的定性和定量结果。此外,我们提出了新颖的数据集来利用化妆转移研究并鼓励未来的发展

效果展示在这里插入图片描述

6. 代码

可以通过华为云服务器进行操作。
网址:项目入口
结果

网上找的戏妆,效果还不错,与beautyGan相比效果有大幅度的提升。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一个简单的化妆Python小游戏。这个游戏可以让玩家选择不同的化妆品,来为一个虚拟的模特化妆。 首先,需要安装Pygame模块。可以使用以下命令在终端中安装: ``` pip install pygame ``` 接下来,创建一个名为“makeup_game.py”的Python文件,并导入Pygame模块: ```python import pygame ``` 然后,定义一些常量,如屏幕大小和颜色: ```python SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 WHITE = (255, 255, 255) ``` 接下来,创建一个名为“Game”的类,并定义初始化函数: ```python class Game: def __init__(self): pygame.init() self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("Makeup Game") self.clock = pygame.time.Clock() self.running = True def run(self): while self.running: self.clock.tick(60) self.handle_events() self.update() self.draw() pygame.quit() def handle_events(self): for event in pygame.event.get(): if event.type == pygame.QUIT: self.running = False def update(self): pass def draw(self): self.screen.fill(WHITE) pygame.display.flip() ``` 现在,我们可以运行游戏并看到一个白色的窗口。接下来,我们需要添加一些化妆品。 首先,创建一个名为“Item”的类,并定义初始化函数和绘制函数: ```python class Item: def __init__(self, image_path, x, y): self.image = pygame.image.load(image_path) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y def draw(self, screen): screen.blit(self.image, self.rect) ``` 然后,创建一些化妆品对象: ```python lipstick = Item("lipstick.png", 100, 100) eyeshadow = Item("eyeshadow.png", 200, 100) mascara = Item("mascara.png", 300, 100) ``` 接下来,在“update”函数中检查鼠标是否点击了某个化妆品,并存储当前选择的化妆品: ```python def update(self): mouse_pos = pygame.mouse.get_pos() if pygame.mouse.get_pressed()[0]: if lipstick.rect.collidepoint(mouse_pos): self.current_item = lipstick elif eyeshadow.rect.collidepoint(mouse_pos): self.current_item = eyeshadow elif mascara.rect.collidepoint(mouse_pos): self.current_item = mascara ``` 最后,在“draw”函数中绘制当前选择的化妆品: ```python def draw(self): self.screen.fill(WHITE) lipstick.draw(self.screen) eyeshadow.draw(self.screen) mascara.draw(self.screen) if self.current_item: self.current_item.draw(self.screen) pygame.display.flip() ``` 这样,我们就完成了一个简单的化妆Python小游戏。玩家可以通过点击不同的化妆品来选择不同的化妆品,然后将其应用于虚拟模特身上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值