• 华为云算法零门槛:零基础教你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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    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.5help="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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    # 修改默认参数
    
    args.input = "./imgs/non-makeup.png"
    
    args.style = "./imgs/style-6.png"
    
    args.alpha = 0.6
    
    args
    
    Namespace(alpha=0.6checkpoint_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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.5可视化输入图像

    图片转numpy格式

    imgA = np.array(Image.open(args.input))
    
    imgB = np.array(Image.open(args.style))
    
    imgB = cv2.resize(imgB, (256256))
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    Image.fromarray(np.concatenate([cv2.resize(imgA, (256256)),imgB],axis=1))
    
    • 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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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 * 255alpha=alpha)
    
    return color
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4.10输出图像处理

    对图像进行裁剪

    x2, y2, x1, y1 = model.location_to_crop()
    
    x2, y2, x1, y1
    
    (02490236)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    保存输出图像

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

    在这里插入图片描述

    ②参考下图,拖拽文件至左侧文件目录下
    在这里插入图片描述

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

    华为云Al Gallery“知识”+“实训”的AI开发社区 ,是在ModelArts的基础上构建的一个开发者社区
    在这里插入图片描述
    下图介绍了一下Al Gallery免费资产的使用流程
    在这里插入图片描述

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

  • 相关阅读:
    新能源中期财报:有人上天入地有人还在苦苦挣扎
    基于STM32的多组外部中断(EXTI)的优化策略与应用
    flex布局原理,常见的父项属性,flex布局子项常见属性,利用flex布局和float制作的有轮播图的携程旅行首页
    POI动态字段导出Excel-导入Excel,解析加密数据再导出
    【最新版】ChatGPT/GPT4科研应用与AI绘图论文写作(最新增加Claude3、Gemini、Sora、GPTs技术及AI领域中的集中大模型的最新技术)
    Spring
    qt指定窗体背景色以及各种颜色(生成调色方案)
    人工智能现在可以从文本中生成具有CD音质的音乐,而且只会越来越好
    ORB-SLAM2 ---- Tracking::TrackReferenceKeyFrame函数
    音视频开发—V4L2介绍,FFmpeg 打开摄像头输出yuv文件
  • 原文地址:https://blog.csdn.net/qq_25749749/article/details/126540920