雖然本文沒有趕在七夕前讓讀者見到哑了,但好飯不怕晚赘方,學(xué)會(huì)這個(gè),可以每天幫你的TA修圖弱左,當(dāng)然也可以給自己使用窄陡,而且強(qiáng)大易上手,毫無痕跡拆火,即開即用跳夭,無需下載App無需高級(jí)會(huì)員,貼合自己的五官们镜,很好的角度貼合币叹,學(xué)會(huì)后還可以嘗試基于此項(xiàng)目,進(jìn)行二次開發(fā)模狭,例如:Web颈抚,小程序,App等
本文亮點(diǎn):
1嚼鹉、論文解讀:帶你了解妝容遷移論文創(chuàng)新點(diǎn)贩汉、模型結(jié)構(gòu)和模型訓(xùn)練方法
2驱富、代碼解讀:拆解妝容遷移代云上、AI開發(fā)平臺(tái)ModelArts實(shí)操演練匹舞、帶你輕松實(shí)現(xiàn)一鍵AI妝容遷移
3褐鸥、學(xué)會(huì)了這個(gè)技能,可以將任何你心儀的妝容一鍵復(fù)制到你的臉上
本文會(huì)分為以下4個(gè)部分進(jìn)行介紹
1.架構(gòu)講解
2.效果展示
3.數(shù)據(jù)集·實(shí)操
4.華為云Al Gallery
首先提到妝容遷移赐稽,大家想到的是什么呢叫榕,美顏的App講妝容復(fù)制到臉上,還有就是在網(wǎng)購(gòu)化妝品的時(shí)候姊舵,在線試口紅色號(hào)晰绎,粉底,眼影等蠢莺,都是妝容的應(yīng)用,還有我們常用的App一些妝容零如,特效濾鏡等等
1躏将、 架構(gòu)講解
1.1 介紹
妝容遷移是指將目標(biāo)圖上的妝容直接遷移到原圖上的技術(shù),也就是將參考圖像上的妝容遷移到我們的圖片上考蕾,我們還要考慮結(jié)構(gòu)祸憋,光線,姿態(tài)肖卧,表情遮擋等情況
? 傳統(tǒng)方法:側(cè)重于圖像預(yù)處理蚯窥、特征提取和反射操作
? 基于深度學(xué)習(xí)的方法:GAN用于圖像到圖像的遷移任務(wù)
BeautyGAN—正面&簡(jiǎn)單的妝容遷移效果表現(xiàn)良好
PSGAN—處理多種不同的頭部姿態(tài)&表情的面部
CA-GAN—提出顏色判別器,以改善嘴眼區(qū)域的細(xì)粒度妝容遷移
LADN—將多個(gè)重疊區(qū)域的局部判別器用于極致化妝風(fēng)格遷移
LADN比上面3個(gè)的能力要強(qiáng)一些塞帐,可以將一些較復(fù)雜的情況考慮到拦赠,但是它的表現(xiàn)力還是不夠的,表現(xiàn)效果不太好葵姥,所以呢就引出了我們接下來要講的CPM
1.2 Color-Pattern Makeup Transfer(CPM)
Paper:https : //arxiv.org/abs/2104.01867
Github:https : //github.com/VinAlResearch/CPM
這是一篇去年荷鼠,也就是2021年的論文CPM,它有以下四點(diǎn)優(yōu)勢(shì)
優(yōu)勢(shì):
綜合的妝容遷移方法榔幸,適用于輕盈以及極致的風(fēng)格
帶有兩個(gè)分支的框架Color Transfer &Pattern Transfer允乐,加入U(xiǎn)Vspace
中的扭曲面容以消除人臉在形狀,頭部位置和表情方面的差異引入了一個(gè)新的makeuptransfer的數(shù)據(jù)集削咆,包含極致風(fēng)格的妝容效果
State-of-the-art
這篇論文在當(dāng)時(shí)的技術(shù)領(lǐng)域也是達(dá)到了最高水平牍疏,也就是State-of-the-art
[圖片上傳失敗...(image-d7ec03-1661493332575)]
接下來我們看看Paper所講的內(nèi)容
[圖片上傳失敗...(image-b08b43-1661493332576)]
接下來給大家介紹UV Map Conversion
2.1 UV Map Conversion
論文提出了一個(gè)結(jié)合色彩變換和圖案添加的妝容遷移方法,設(shè)計(jì)新的結(jié)構(gòu): Color Transfer Branch & Pattern Transfer Branch拨齐,并在訓(xùn)練兩個(gè)網(wǎng)絡(luò)分支時(shí)使用UV 空間中的扭曲臉來消除輸入面在形狀鳞陨,頭部姿勢(shì)和表情方面的差異
? UVmap是計(jì)算機(jī)圖像學(xué)中三維物體紋理映射的一種常見技術(shù)
? 物體的紋理被壓扁成一個(gè)二維圖像,物體的每個(gè)三維頂點(diǎn)都與圖像上的一個(gè)二維位置相關(guān)聯(lián)
? PRNet設(shè)計(jì)了一個(gè)2D UV position map瞻惋,來編碼對(duì)齊三維面部形狀炊邦,它是一個(gè)具有三通道的二維圖像
我們看一下公式
[圖片上傳失敗...(image-689e86-1661493332576)]
2.2 Color transfer branch
采用BeautyGAN提出的框架和loss function编矾,其中最關(guān)鍵的loss是Histogram Matching Loss
[圖片上傳失敗...(image-71d74d-1661493332576)]
[圖片上傳失敗...(image-18f582-1661493332576)]
結(jié)論:與BeautyGAN相比,ColorTansfer分支不僅可以捕捉到色彩馁害,還有化妝的結(jié)構(gòu)以及位置信息窄俏,表現(xiàn)效果更優(yōu)
2.3 Pattern transfer branch
? 傳統(tǒng):做分割操作、解除扭曲碘菜、重新扭曲
? 使用uv position map將其簡(jiǎn)化為圖像分割
? 提出一個(gè)新的數(shù)據(jù)集CPM-Synt-1
? 采用dice loss
[圖片上傳失敗...(image-cdf5db-1661493332576)]
[圖片上傳失敗...(image-17ce53-1661493332576)]
結(jié)論:精準(zhǔn)檢測(cè)和遷移pattern凹蜈,保持其形狀,紋理和位置信息不變忍啸,表現(xiàn)良好
2仰坦、 效果展示
我們來看一下使用UV在Color和Pattern上的效果 ,第一行是color的效果计雌,第二行是pattern分支的效果
[圖片上傳失敗...(image-f71a9a-1661493332576)]
接下來是Color & Pattern& Color-Pattern呈現(xiàn)效果
[圖片上傳失敗...(image-70f6d7-1661493332576)]
3悄晃、 數(shù)據(jù)集·實(shí)操
? MT:包含1115張?jiān)磮D像和2719張參照?qǐng)D像的輕盈化妝容,由BeautyGAN發(fā)布用于訓(xùn)練ColorTransfer
? CPM-Real:3895張多尺寸圖像凿滤,在自然場(chǎng)景下帶有多樣化的極致妝容數(shù)據(jù)
? Sticker:577張高質(zhì)量圖案(花妈橄,水晶,葉子翁脆,字母等等)
[圖片上傳失敗...(image-295521-1661493332576)]
? CPM-Synt-1:555張256*256張紋理圖像眷蚓,用于訓(xùn)練Pattern Transfer
? CPM-Synt-2:包含1625張256*256的三元組圖像,專門為評(píng)估Pattern而設(shè)計(jì)
[圖片上傳失敗...(image-7c4796-1661493332576)]
接下來我們看一下實(shí)操的部分
? Pytorch實(shí)現(xiàn)
? UVconversion和逆向渲染基于PRNet的代碼和模型
? 使用各自的訓(xùn)練模型反番,分別訓(xùn)練PatternTransfer和ColorTransfer這兩個(gè)分支
? Color Transfer :input=256*256 | epochs =300 | batch size=8 | lr= 0.0001 | Adam optimizer
然后是代碼實(shí)際操作的步驟
實(shí)驗(yàn)步驟:
1.將輸入圖像分別轉(zhuǎn)換為UV texture
2.texture被傳遞到兩個(gè)獨(dú)立的分支一color&pattern的妝容遷移
3通過合并這些分支的輸出來形成最后的uv texture沙热,并將該UV texture映射
轉(zhuǎn)換到圖像空間以獲得最終的輸出
4、 華為云Al Gallery
接下來簡(jiǎn)單介紹一下直播講解的案例罢缸,首先我們打開華為云開發(fā)者的Al Gallery AI妝容遷移 下篙贸,可以進(jìn)入如下界面:
[圖片上傳失敗...(image-7d64ec-1661493332576)]
進(jìn)來之后我們等待初始化后會(huì)出現(xiàn)選擇運(yùn)行環(huán)境界面,會(huì)提供限時(shí)免費(fèi)的資源
[圖片上傳失敗...(image-a86b7f-1661493332576)]
我們可以看到整個(gè)的大綱枫疆,瀏覽一下相關(guān)介紹然后下面大概簡(jiǎn)述一下操作步驟歉秫,具體的可以看下官方文檔
[圖片上傳失敗...(image-c394a4-1661493332576)]
4.1.準(zhǔn)備代碼及數(shù)據(jù)
相關(guān)代碼、數(shù)據(jù)和模型都已存放在OBS中养铸,執(zhí)行下面一段代碼即可將其拷貝到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導(dǎo)入依賴包
# 關(guān)閉TensorFlow中的warning
# import tensorflow as tf
# tf.logging.set_verbosity(tf.logging.ERROR)
# 進(jìn)入項(xiàng)目路徑
%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自定義參數(shù)
參數(shù)定義
def get_args():
parser = argparse.ArgumentParser()
parser.add_argument("--checkpoint_pattern", default="./checkpoints/pattern.pth"钞螟, type=str) # pattern預(yù)訓(xùn)練模型
parser.add_argument("--checkpoint_color"兔甘, default="./checkpoints/color.pth", type=str) # color預(yù)訓(xùn)練模型
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基于位置圖回歸網(wǎng)絡(luò)的聯(lián)合三維人臉重建與密集對(duì)齊
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妝容調(diào)整參數(shù)
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
# 修改默認(rèn)參數(shù)
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可視化輸入圖像
圖片轉(zhuǎn)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加載模型
傳入?yún)?shù),下載resnet50編碼器,分別加載color及pattern預(yù)訓(xùn)練模型晾咪,輸出對(duì)應(yīng)UV Texture
PRNet論文所生成的所有人臉的texture都符合uv_face.png所有器官位置收擦,比如鼻子一定會(huì)在texutre的鼻子那里,不管你是側(cè)臉還是正臉谍倦,uv_kpt_ind.txt這里面定義的就是texture的人臉關(guān)鍵點(diǎn)位置塞赂,是固定的
根據(jù)uv_kpt_ind和UV位置映射圖能找到人臉圖(非紋理圖)上的關(guān)鍵點(diǎn)
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 風(fēng)格
Color Only
Color-Transfer Controllabl you can control the obviousness of color-transfer by alpha(0-1)
通過調(diào)整顏色參數(shù)可調(diào)整整體妝容的濃淡程度
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 風(fēng)格
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風(fēng)格
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輸出圖像處理
對(duì)圖像進(jìn)行裁剪
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更換源圖像和參考圖像進(jìn)行實(shí)驗(yàn)
案例圖像存儲(chǔ)路徑為./imgs/
①點(diǎn)擊左側(cè)操作欄上傳按鈕,直接拖拽文件到指定區(qū)域或點(diǎn)擊選擇文件進(jìn)行上傳舒裤,參考下圖
②參考下圖觉吭,拖拽文件至左側(cè)文件目錄下
上傳完圖像之后仆邓,修改輸入?yún)?shù)參數(shù)鲜滩,重新運(yùn)行6-10步
華為云Al Gallery“知識(shí)”+“實(shí)訓(xùn)”的AI開發(fā)社區(qū) 节值,是在ModelArts的基礎(chǔ)上構(gòu)建的一個(gè)開發(fā)者社區(qū)
下圖介紹了一下Al Gallery免費(fèi)資產(chǎn)的使用流程
同時(shí)我們可以通過修改代碼,或者通過相關(guān)案例記錄的筆記分享到Al Gallery Notebook上搞疗,也可以通過優(yōu)化代碼來發(fā)布第二版、第三版等桩皿,讓更多的開發(fā)者學(xué)習(xí)豌汇,以上是我的總結(jié)與分享泄隔,大家有什么問題的話可以在評(píng)論區(qū)進(jìn)行互動(dòng)交流