一、介绍
模型描述
街拍,人像,团建照片…随意上传您心仪的照片,选择对应风格(日漫风,3D风,手绘风等等),一键即可转换为不同风格的卡通化图片!多风格的人像模型已经内置好,点点鼠标就可以抢占朋友圈的C位。
期望模型使用方式以及适用范围
该任务采用一种全新的域校准图像翻译模型DCT-Net(Domain-Calibrated Translation),利用小样本的风格数据,即可得到高保真、强鲁棒、易拓展的人像风格转换模型,并通过端到端推理快速得到风格转换结果。
使用方式和范围
使用方式:
- 支持GPU/CPU推理,在任意真实人物图像上进行直接推理;
使用范围:
- 包含人脸的人像照片(3通道RGB图像,支持PNG、JPG、JPEG格式),人脸分辨率大于100×100,总体图像分辨率小于3000×3000,低质人脸图像建议预先人脸增强处理。
目标场景:
- 艺术创作、社交娱乐、隐私保护场景,自动化生成卡通肖像。
模型局限性以及可能的偏差
- 低质/低分辨率人脸图像由于本身内容信息丢失严重,无法得到理想转换效果,可预先采用人脸增强模型预处理图像解决;
- 小样本数据涵盖场景有限,人脸暗光、阴影干扰可能会影响生成效果。
模型推理流程
预处理
- 人脸关键点检测
- 人脸提取&对齐,得到256×256大小的对齐人脸
推理
- 为控制推理效率,人脸及背景resize到指定大小分别推理,再背景融合得到最终效果;
- 亦可将整图依据人脸尺度整体缩放到合适尺寸,直接单次推理
数据评估
使用CelebA公开人脸数据集进行评测,在FID/ID/用户偏好等指标上均达SOTA结果:
Method | FID | ID | Pref.A | Pref.B |
---|---|---|---|---|
CycleGAN | 57.08 | 0.55 | 7.1 | 1.4 |
U-GAT-IT | 68.40 | 0.58 | 5.0 | 1.5 |
Toonify | 55.27 | 0.62 | 3.7 | 4.2 |
pSp | 69.38 | 0.60 | 1.6 | 2.5 |
Ours | 35.92 | 0.71 | 82.6 | 90.5 |
二、部署教程
如果您是初学者,对于命令行不太理解,那么请按下键盘上的Win键+R键
后,在弹出的新窗口内输入CMD并按下回车,打开CMD窗口,按顺序执行如下的每一条命令。
首先我们需要确认一个工作目录,用来存放multi-style_portrait_stylization的相关环境依赖文件。本站所选择的目录为D盘的根目录下dataddd文件夹,完整路径为:D:\dataddd\multi-style_portrait_stylization
。
检测D盘是否在dataddd目录下有没有multi-style_portrait_stylization
文件夹,没有则创建该文件夹。
if not exist D:\dataddd\multi-style_portrait_stylization mkdir D:\dataddd\multi-style_portrait_stylization
强制切换工作路径为D盘的dataddd\multi-style_portrait_stylization
文件夹。
cd /d D:\dataddd\multi-style_portrait_stylization
为不影响电脑中的现有环境,请一定要安装Conda,如果您不知道什么是Conda,或者未安装过Conda,请参考如下文章,安装部署Conda之后再继续以下步骤。
在CMD中执行下面的命令行,创建Conda虚拟环境至该项目的目录中,方便日后重装系统也能够正常使用,无需重新部署环境。
conda create -p D:\dataddd\multi-style_portrait_stylization\ENV python=3.7
执行完成上面的命令之后,将会在CMD窗口中看到Proceed ([y]/n)?
提示,我们直接按下回车即可。
初始化Conda环境,避免后续可能报错。
conda init cmd.exe
激活已创建的Conda环境,这样我们可以将我们后续所需要的所有环境依赖都安装至此环境下。
conda activate D:\dataddd\multi-style_portrait_stylization\ENV
执行如下命令,安装阿里达摩院相关依赖。
pip install modelscope
执行如下命令,安装torch
依赖。
pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple
执行如下命令,安装CV2依赖库。
pip install opencv-python
关于tensorflow的安装,支持CPU和GPU双版本,以下两行代码选择其中一个执行安装即可。
- 如果你想用CPU来计算,请复制第一行内容执行。
- 如果你想用GPU来计算,请复制第二行内容执行。
pip install --upgrade tensorflow==1.15
pip install --upgrade tensorflow-gpu==1.15
执行如下命令,卸载较新的protobuf版本依赖库。
pip uninstall protobuf
执行如下命令,安装3.20.0版本的protobuf依赖库。
pip install --force-reinstall protobuf==3.20.0
执行如下命令,安装easydict依赖库。
pip install easydict
三、使用教程
⚠️注意:您所使用的图片必须为PNG格式,如果使用其它格式基本必会报错!
推荐下载VS Code代码编辑器,然后在代码编辑器器内新建一个Python文件,粘贴如下代码,在代码编辑器的右下角选择Python环境为D:\dataddd\multi-style_portrait_stylization\ENV
。
素描
本次本站先以素描模型为例,让您先将代码能够正常运行,以下是运行时所需要的代码和输出示例。
该模型官方并未给了示例,本站已经帮您写好了相关的代码,复制粘贴即可使用。
注意:请自行修改相应名称和路径为自己项目结构,然后再执行,否则会报错。
import cv2
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
img_cartoon = pipeline(Tasks.image_portrait_stylization,
model='damo/cv_unet_person-image-cartoon-sketch_compound-models')
# 图片路径
resultIMGName = 'Beauty_Girl'
# 原图格式 | 尽量不要改
resultIMGFormat = '.png'
# 原图路径
resultIMGPath = 'D:\dataddd\multi-style_portrait_stylization'
# 输出图像名称
outputIMGName = 'Beauty_Girl_FX'
# 输出格式 | 尽量不要改
outputFormat = '.png'
# 输出路径
outputIMGPath = 'D:\dataddd\multi-style_portrait_stylization'
result = img_cartoon(('%s/%s%s'%(resultIMGPath,resultIMGName,resultIMGFormat)).replace('\\', '/'))
cv2.imwrite((('%s/%s%s'%(outputIMGPath,outputIMGName,outputFormat)).replace('\\', '/')), result[OutputKeys.OUTPUT_IMG])
print ('输出完成')
四、效果展示
可以看到效果还可以,中规中矩吧。
其它效果
代码示例
为方便大家使用,本站已经将所有效果的代码整到了一起,大家只使用这一段代码,就可以生成各种效果啦。只需要修改Fun
的参数即可。
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
import cv2
# 文本识别
class DCT_Net():
def __init__(self, Fun):
if Fun == 'SuMiao':
# 素描模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-sketch_compound-models')
elif Fun == 'YiShu':
# 艺术模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-artstyle_compound-models')
elif Fun == '3D':
# 3D模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-3d_compound-models')
elif Fun == 'ShouHui':
# 手绘模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-handdrawn_compound-models')
elif Fun == 'KaTong':
# 卡通模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon_compound-models')
# 读取本地文件
def file_models(self):
result = self.img_cartoon(IMG_File)
cv2.imwrite(OUT_File, result[OutputKeys.OUTPUT_IMG])
# 自定义配置
Fun = '3D' # 素描=SuMiao;艺术=YiShu;3D;手绘=ShouHui;卡通=KaTong。
IMG_File = 'D:/dataddd/multi-style_portrait_stylization/Beauty_Girl.png' # 本地文件路径
OUT_File = 'D:/dataddd/multi-style_portrait_stylization/Beauty_Girl_%s.png'%Fun # 文件输出路径
# 以下内容无需修改
DCTNet = DCT_Net(Fun)
DCTNet.file_models()
效果展示
All in one
如果您希望直接一次性通过一张图输出所有效果,可以使用如下代码,将会自动处理输入的图片,将其循环输出所有特效,非常方便。
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
import cv2
# 文本识别
class DCT_Net():
def __init__(self, Fun):
if Fun == 'SuMiao':
# 素描模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-sketch_compound-models')
elif Fun == 'YiShu':
# 艺术模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-artstyle_compound-models')
elif Fun == '3D':
# 3D模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-3d_compound-models')
elif Fun == 'ShouHui':
# 手绘模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon-handdrawn_compound-models')
elif Fun == 'KaTong':
# 卡通模型
self.img_cartoon = pipeline(Tasks.image_portrait_stylization, model='damo/cv_unet_person-image-cartoon_compound-models')
# 读取本地文件
def file_models(self):
result = self.img_cartoon(IMG_File)
cv2.imwrite(OUT_File, result[OutputKeys.OUTPUT_IMG])
# 自定义配置
resultIMGName = 'Beauty_Girl' # 图片名称
resultIMGFormat = '.png' # 原图格式 | 尽量不要改
resultIMGPath = 'D:\dataddd\multi-style_portrait_stylization' # 原图路径
# 以下内容无需修改
IMG_File = ('%s/%s%s'%(resultIMGPath,resultIMGName,resultIMGFormat)).replace('\\', '/')
FX = ['SuMiao','YiShu','3D','ShouHui','KaTong']
for i in range(len(FX)):
OUT_File = ('%s/%s_%s%s'%(resultIMGPath,resultIMGName,FX[i],resultIMGFormat)).replace('\\', '/') # 文件输出路径
DCTNet = DCT_Net(FX[i])
DCTNet.file_models()