华为云算法零门槛:零基础教你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
[图片上传失败...(image-d7ec03-1661493332575)]

接下来我们看看Paper所讲的内容
[图片上传失败...(image-b08b43-1661493332576)]

接下来给大家介绍UV Map Conversion

2.1 UV Map Conversion

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

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

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

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

我们看一下公式
[图片上传失败...(image-689e86-1661493332576)]

2.2 Color transfer branch

采用BeautyGAN提出的框架和loss function,其中最关键的loss是Histogram Matching Loss
[图片上传失败...(image-71d74d-1661493332576)]
[图片上传失败...(image-18f582-1661493332576)]

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

2.3 Pattern transfer branch

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

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

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

• 采用dice loss
[图片上传失败...(image-cdf5db-1661493332576)]
[图片上传失败...(image-17ce53-1661493332576)]

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

2、 效果展示

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

[图片上传失败...(image-f71a9a-1661493332576)]

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

[图片上传失败...(image-70f6d7-1661493332576)]

3、 数据集·实操

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

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

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

[图片上传失败...(image-295521-1661493332576)]

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

• CPM-Synt-2:包含1625张256*256的三元组图像,专门为评估Pattern而设计
[图片上传失败...(image-7c4796-1661493332576)]

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

• 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妆容迁移 下,可以进入如下界面:
[图片上传失败...(image-7d64ec-1661493332576)]
进来之后我们等待初始化后会出现选择运行环境界面,会提供限时免费的资源

[图片上传失败...(image-a86b7f-1661493332576)]

我们可以看到整个的大纲,浏览一下相关介绍然后下面大概简述一下操作步骤,具体的可以看下官方文档
[图片上传失败...(image-c394a4-1661493332576)]

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/

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

image.png

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


image.png

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

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


image.png

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


image.png

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容