写点什么

华为云算法零门槛:零基础教你 AI 试伊妆

作者:程思扬
  • 2022 年 8 月 26 日
    北京
  • 本文字数:5036 字

    阅读完需:约 17 分钟

华为云算法零门槛:零基础教你AI试伊妆

虽然本文没有赶在七夕前让读者见到,但好饭不怕晚,学会这个,可以每天帮你的 TA 修图,当然也可以给自己使用,而且强大易上手,毫无痕迹,即开即用,无需下载 App 无需高级会员,贴合自己的五官,很好的角度贴合,学会后还可以尝试基于此项目,进行二次开发,例如:Web,小程序,App 等


本文亮点:1、论文解读:带你了解妆容迁移论文创新点、模型结构和模型训练方法 2、代码解读:拆解妆容迁移代云上、AI 开发平台 ModelArts 实操演练、带你轻松实现一键 AI 妆容迁移 3、学会了这个技能,可以将任何你心仪的妆容一键复制到你的脸上


本文会分为以下 4 个部分进行介绍 1.架构讲解 2.效果展示 3.数据集·实操 4.华为云 Al Gallery


首先提到妆容迁移,大家想到的是什么呢,美颜的 App 讲妆容复制到脸上,还有就是在网购化妆品的时候,在线试口红色号,粉底,眼影等,都是妆容的应用,还有我们常用的 App 一些妆容,特效滤镜等等

1、 架构讲解

1.1 介绍

妆容迁移是指将目标图上的妆容直接迁移到原图上的技术,也就是将参考图像上的妆容迁移到我们的图片上,我们还要考虑结构,光线,姿态,表情遮挡等情况


• 传统方法:侧重于图像预处理、特征提取和反射操作


• 基于深度学习的方法:GAN 用于图像到图像的迁移任务


BeautyGAN—正面 &简单的妆容迁移效果表现良好


PSGAN—处理多种不同的头部姿态 &表情的面部


CA-GAN—提出颜色判别器,以改善嘴眼区域的细粒度妆容迁移


LADN—将多个重叠区域的局部判别器用于极致化妆风格迁移


LADN 比上面 3 个的能力要强一些,可以将一些较复杂的情况考虑到,但是它的表现力还是不够的,表现效果不太好,所以呢就引出了我们接下来要讲的 CPM

1.2 Color-Pattern Makeup Transfer(CPM)

Paper:https : //arxiv.org/abs/2104.01867


Github:https : //github.com/VinAlResearch/CPM


这是一篇去年,也就是 2021 年的论文 CPM,它有以下四点优势


优势:


  1. 综合的妆容迁移方法,适用于轻盈以及极致的风格

  2. 带有两个分支的框架 Color Transfer &Pattern Transfer,加入 UVspace 中的扭曲面容以消除人脸在形状,头部位置和表情方面的差异

  3. 引入了一个新的 makeuptransfer 的数据集,包含极致风格的妆容效果

  4. State-of-the-art


这篇论文在当时的技术领域也是达到了最高水平,也就是 State-of-the-art



接下来我们看看 Paper 所讲的内容



接下来给大家介绍 UV Map Conversion

2.1 UV Map Conversion

论文提出了一个结合色彩变换和图案添加的妆容迁移方法,设计新的结构: Color Transfer Branch & Pattern Transfer Branch,并在训练两个网络分支时使用 UV 空间中的扭曲脸来消除输入面在形状,头部姿势和表情方面的差异


• UVmap 是计算机图像学中三维物体纹理映射的一种常见技术


• 物体的纹理被压扁成一个二维图像,物体的每个三维顶点都与图像上的一个二维位置相关联


• PRNet 设计了一个 2D UV position map,来编码对齐三维面部形状,它是一个具有三通道的二维图像


我们看一下公式


2.2 Color transfer branch

采用 BeautyGAN 提出的框架和 loss function,其中最关键的 loss 是 Histogram Matching Loss




结论:与 BeautyGAN 相比,ColorTansfer 分支不仅可以捕捉到色彩,还有化妆的结构以及位置信息,表现效果更优

2.3 Pattern transfer branch

• 传统:做分割操作、解除扭曲、重新扭曲


• 使用 uv position map 将其简化为图像分割


• 提出一个新的数据集 CPM-Synt-1


• 采用 dice loss




结论:精准检测和迁移 pattern,保持其形状,纹理和位置信息不变,表现良好

2、 效果展示

我们来看一下使用 UV 在 Color 和 Pattern 上的效果 ,第一行是 color 的效果,第二行是 pattern 分支的效果



接下来是 Color & Pattern& Color-Pattern 呈现效果


3、 数据集·实操

• MT:包含 1115 张源图像和 2719 张参照图像的轻盈化妆容,由 BeautyGAN 发布用于训练 ColorTransfer


• CPM-Real:3895 张多尺寸图像,在自然场景下带有多样化的极致妆容数据


• Sticker:577 张高质量图案(花,水晶,叶子,字母等等)



• CPM-Synt-1:555 张 256*256 张纹理图像,用于训练 Pattern Transfer


• CPM-Synt-2:包含 1625 张 256*256 的三元组图像,专门为评估 Pattern 而设计



接下来我们看一下实操的部分


• Pytorch 实现


• UVconversion 和逆向渲染基于 PRNet 的代码和模型


• 使用各自的训练模型,分别训练 PatternTransfer 和 ColorTransfer 这两个分支


• Color Transfer :input=256*256 | epochs =300 | batch size=8 | lr= 0.0001 | Adam optimizer


然后是代码实际操作的步骤


实验步骤:


1.将输入图像分别转换为 UV texture


2.texture 被传递到两个独立的分支一 color&pattern 的妆容迁移


3 通过合并这些分支的输出来形成最后的 uv texture,并将该 UV texture 映射


转换到图像空间以获得最终的输出

4、 华为云 Al Gallery

接下来简单介绍一下直播讲解的案例,首先我们打开华为云开发者的 Al Gallery AI 妆容迁移 下,可以进入如下界面:



进来之后我们等待初始化后会出现选择运行环境界面,会提供限时免费的资源



我们可以看到整个的大纲,浏览一下相关介绍然后下面大概简述一下操作步骤,具体的可以看下官方文档


4.1.准备代码及数据

相关代码、数据和模型都已存放在 OBS 中,执行下面一段代码即可将其拷贝到 Notebook 中


import os
import moxing as mox
if not os.path.exists("/home/ma-user/work/CPM"):
mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/makeup_transfer/CPM.zip',"/home/ma-user/work/CPM.zip")
os.system("cd /home/ma-user/work;unzip CPM.zip;rm CPM.zip")
if os.path.exists("/home/ma-user/work/CPM"):
print('Download success')
else:
raise Exception('Download Failed')
else:
print("Project already exists")
复制代码

4.2.安装所需要的 python 模块

!pip install torch==1.6.0 torchvision==0.7.0
!pip install tensorflow==1.14.0
!pip install blend_modes==2.1.0
!pip install segmentation_models_pytorch==0.2.1
!pip install scikit-image==0.19.3
!pip install albumentations==1.2.1
!pip install dlib==19.21.1
复制代码

4.3 导入依赖包

# 关闭TensorFlow中的warning
# import tensorflow as tf
# tf.logging.set_verbosity(tf.logging.ERROR)
# 进入项目路径
%cd /home/ma-user/work/CPM
/home/ma-user/work/CPM

import argparse
import os
import cv2
import numpy as np
from makeup import Makeup
from PIL import Image
复制代码

4.4 自定义参数

参数定义


def get_args():
parser = argparse.ArgumentParser()
parser.add_argument("--checkpoint_pattern", default="./checkpoints/pattern.pth", type=str) # pattern预训练模型
parser.add_argument("--checkpoint_color", default="./checkpoints/color.pth", type=str) # color预训练模型
parser.add_argument("--device", default="cuda", type=str) # cuda
# parser.add_argument('--batch_size', default = '1', type = int)
parser.add_argument("--prn", default=True, type=bool) # PRNet基于位置图回归网络的联合三维人脸重建与密集对齐
parser.add_argument("--color_only", default=False, action="store_true")
parser.add_argument("--pattern_only", default=False, action="store_true")

parser.add_argument(
"--input",
type=str,
default="./imgs/non-makeup.png",
help="Path to input image (non-makeup)", # 输入图像
)
parser.add_argument(
"--style",
type=str,
default="./imgs/style-2.png",
help="Path to style image (makeup style | reference image)", #妆容参考图像
)
parser.add_argument("--alpha", type=float, default=0.5, help="opacity of color makeup") # Color妆容调整参数
parser.add_argument("--savedir", type=str, default=".") # 输出保存路径
args = parser.parse_args(args=[])

print(" ⊱ ──────ஓ๑♡๑ஓ ────── ⊰")
print("🎵 hey, arguments are here if you need to check 🎵")
for arg in vars(args):
print("{:>15}: {:>30}".format(str(arg), str(getattr(args, arg))))
print()
return args
复制代码


# 修改默认参数
args.input = "./imgs/non-makeup.png"
args.style = "./imgs/style-6.png"
args.alpha = 0.6
args
Namespace(alpha=0.6, checkpoint_color='./checkpoints/color.pth', checkpoint_pattern='./checkpoints/pattern.pth', color_only=False, device='cuda', input='./imgs/non-makeup.png', pattern_only=False, prn=True, savedir='.', style='./imgs/style-6.png')
复制代码

4.5 可视化输入图像

图片转 numpy 格式


imgA = np.array(Image.open(args.input))
imgB = np.array(Image.open(args.style))
imgB = cv2.resize(imgB, (256, 256))
复制代码


查看待处理图像及模板图像


Image.fromarray(np.concatenate([cv2.resize(imgA, (256, 256)),imgB],axis=1))
复制代码

4.6 加载模型

传入参数,下载 resnet50 编码器,分别加载 color 及 pattern 预训练模型,输出对应 UV Texture


PRNet 论文所生成的所有人脸的 texture 都符合 uv_face.png 所有器官位置,比如鼻子一定会在 texutre 的鼻子那里,不管你是侧脸还是正脸,uv_kpt_ind.txt 这里面定义的就是 texture 的人脸关键点位置,是固定的


#根据 uv_kpt_ind 和 UV 位置映射图能找到人脸图(非纹理图)上的关键点


import matplotlib.pyplot as plt
def draw_kps(img,kps,point_size=2):
img = np.array(img*255,np.uint8)
for i in range(kps.shape[0]):
cv2.circle(img,(int(kps[i,0]),int(kps[i,1])),point_size,(0,255,0),-1)
return img
uv_kpt_ind = np.loadtxt('./PRNet/uv-data/uv_kpt_ind.txt').astype(np.int32)
uv_face = plt.imread('./PRNet/uv-data/uv_face.png')
plt.imshow(draw_kps(uv_face,uv_kpt_ind.T))
plt.axis('off')
复制代码

4.7 迁移 Color 风格

Color Only
Color-Transfer Controllabl you can control the obviousness of color-transfer by alpha(0-1)
通过调整颜色参数可调整整体妆容的浓淡程度
def color_makeup(A_txt, B_txt, alpha):
color_txt = model.makeup(A_txt, B_txt)
color = model.render_texture(color_txt)
color = model.blend_imgs(model.face, color * 255, alpha=alpha)
return color
复制代码

4.8 迁移 Pattern 风格

def pattern_makeup(A_txt, B_txt, render_texture=False):
mask = model.get_mask(B_txt)
mask = (mask > 0.0001).astype("uint8")
pattern_txt = A_txt * (1 - mask)[:, :, np.newaxis] + B_txt * mask[:, :, np.newaxis]
pattern = model.render_texture(pattern_txt)
pattern = model.blend_imgs(model.face, pattern, alpha=1)
return pattern
output_pattern = pattern_makeup(A_txt, B_txt)
Image.fromarray(output_pattern)
复制代码

4.9 融合迁移 Color + Pattern 风格

def color_pattern_makeup(A_txt, B_txt, render_texture=False):
color_txt = model.makeup(A_txt, B_txt) * 255
mask = model.get_mask(B_txt)
mask = (mask > 0.001).astype("uint8")
new_txt = color_txt * (1 - mask)[:, :, np.newaxis] + B_txt * mask[:, :, np.newaxis]
color_pattern = model.render_texture(new_txt)
color_pattern = model.blend_imgs(model.face, color_pattern, alpha=1)
return color_pattern
复制代码

4.10 输出图像处理

对图像进行裁剪


x2, y2, x1, y1 = model.location_to_crop()
x2, y2, x1, y1
(0, 249, 0, 236)
复制代码


保存输出图像


save_path = os.path.join(args.savedir, "result.png")
Image.fromarray((output).astype("uint8")).save(save_path)
print("Completed Please check result in: {}".format(save_path))
复制代码

4.11 更换源图像和参考图像进行实验

案例图像存储路径为./imgs/


①点击左侧操作栏上传按钮,直接拖拽文件到指定区域或点击选择文件进行上传,参考下图



②参考下图,拖拽文件至左侧文件目录下



上传完图像之后,修改输入参数参数,重新运行 6-10 步


华为云 Al Gallery“知识”+“实训”的 AI 开发社区 ,是在 ModelArts 的基础上构建的一个开发者社区



下图介绍了一下 Al Gallery 免费资产的使用流程



同时我们可以通过修改代码,或者通过相关案例记录的笔记分享到 Al Gallery Notebook 上,也可以通过优化代码来发布第二版、第三版等,让更多的开发者学习,以上是我的总结与分享,大家有什么问题的话可以在评论区进行互动交流

发布于: 刚刚阅读数: 4
用户头像

程思扬

关注

会的越多,不会的越多 2022.01.03 加入

还未添加个人简介

评论

发布
暂无评论
华为云算法零门槛:零基础教你AI试伊妆_华为_程思扬_InfoQ写作社区