摘要:3步就能制作漫画头像的机器人,想拥有一个吗?

作者:胡琦

只需要发送关键字,就能出发聊天机器人头像漫画化处理程序,生成动漫图片。怎么实现呢?总的思路就是基于 ModelArts AI Gallery 快速验证 AnimateGanv2 现实照片动漫化能力,基于 Flask 快速部署动漫化服务,基于 Wechaty 快速开发动漫化聊天机器人。

为什么是 AnimeGAN?

动漫(Animation & Comic)作为日常生活中一种常见的艺术表现形式,在儿童教育、影视、广告等领域中应用十分广泛;但动漫创作困难、周期长、开发难度大,对创作者要求也十分苛刻,一般来说好的动漫作品需要创作者掌握线条、纹理、颜色和阴影等绘画技巧;普通人想要快速创造自己的动漫作品不得不借助工具。近年来,随着元宇宙的不断发展,人们对动漫的需求越来越多,比如生成二次元自画像、制作 NFT 艺术品等等,因此动漫风格迁移似乎成为“炼丹师”们喜爱的研究方向之一。

图像风格迁移还得从 pix2pix 和 CycleGAN 说起,这两个基于 GAN 的风格迁移算法为动漫画图片生成奠定了技术基础,后续的 CartoonGAN 通过语义内容损失函数和边缘增强的对抗性损失函数使生成的动漫图片质量更高。而 AnimeGAN基于 CartoonGAN 改进,并提出了一个更加轻量级的生成器架构以及灰度风格损失、灰度对抗损失和颜色重建损失三个新的损失函数,使其风格化的视觉效果能超越 CartoonGAN。

毕竟,AnimeGAN 让新海诚本人都感觉很有趣;而对于我们普通人来说,多了一种创作的可能,只需一张现实照片就能通过 AI 输出大师级的动漫作品!

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(1)

什么是 AnimeGAN ?

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(2)

提到 AnimeGAN ,不得不说说它的发展历程,一作Asher Chan从 2019 年提交第一个 Git Commit 至今,已经迭代了三个版本,AnimeGANv3放出了可执行程序和刚出炉还热乎的肖像素描(点我快速体验:Run in ModelArts - AnimeGANv3 肖像素描生成)。

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(3)

AnimeGAN 实现了将现实世界场景的照片转换为动漫风格图像。 AnimeGANv1 提出了三种损失函数:灰度样式损失、颜色重建损失和灰度对抗损失。

解决了:

1.生成的图像没有明显的动画风格纹理

2.生成的图像丢失了原始图像的内容;

3.网络的参数需要大的存储容量。

AnimeGANv2 修复了上个版本中存在的问题,例如模型生成的图像中存在高频伪影;更容易训练且直接能到达论文效果;进一步减少网络参数使生成器更小;尽可能多地使用更高画质的风格数据。作者觉得创新性不大因此就没重新发表论文。

AnimeGANv3 基于与 Google 的商业许可,作者暂时不提供源码。不过目前提供了图形用户界面程序 (AnimeGANv3.exe) 和预训练模型 (onnx.zip) ,目前我们可以直接在 Windows 上体验图片或视频转动漫风格。截止笔者发文,作者由更新了 AnimeGANv3_PortraitSketch 用于生成肖像画,也就是上图的效果。

笔者有幸体验了 AnimeGAN 带来的乐趣,下图中左边是在华为云 ModelArts 上运行的结果,通过识别人脸关键点之后再进行风格迁移能获得动漫化头像;右边是 AnimeGANv3.exe 在本地运行的结果,我们无需关系环境和代码执行,简单操作就能生成动漫 图片;中间是本次分享的主角–一个能将图片动漫化的聊天机器人。

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(4)

在 AI Gallery 上提前验证

我们通常认为“数据、算法、算力”是人工智能的三要素,现如今,处在大数据时代,可靠高质量的数据的获得变得简洁;优质的算法随着开源文化的发展也变得普及;然而算力确成了制约人工智能普及的“拦路虎”,就连 AnimeGAN 的作者也感叹“论文的延迟发表只因只借到了一年的 2080ti”。对于笔者而言,幸亏有普惠 AI 的华为云 ModelArts,AI Gallery 是在 ModelArts 的基础上构建的开发者生态社区,提供了 Notebook 代码样例、数据集、算法、模型、Workflow 等 AI 数字资产的共享,姑且理解为 AI 届的 Github。

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(5)

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(6)

通过学习改造 AI Gallery 已有的 AnimeGAN 案例,我们能够快速运行 NoteBook 并得到动漫化头像。

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(7)

基于 Wechaty 快速构建机器人

提到聊天机器人的开发,作为前端工程师,笔者认为最快捷的方式莫过于import {Wechaty} from "wechaty";,是的,Wechaty 是一个开源的的对话机器人 SDK,支持 个人号 微信。它是一个使用 Typescript 构建的 Node.js 应用。支持多种微信接入方案,包括网页,ipad,ios,windows, android 等。同时支持 Linux, Windows, Darwin(OSX/Mac) 和 Docker 多个平台。因此我们要实现聊天机器人就十分简单了!(PS:除了 token 有点小贵,当然有能力有创意可以加入官方资助计划)。

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(8)

聊天机器人有了,接下来怎么接入 AnimeGAN 的能力呢?为了给机器人提供服务,我们需要部署一个应用给前端提供接口,暂且使用 Flask 快速部署头像动漫化服务。

from flask import * # import request import os import uuid import numpy as np from animeGANv2 import * app = Flask(__name__,template_folder='view') app.config['MAX_CONTENT_LENGTH'] = 0.5 * 1024 * 1024 # 3MB # 转换图片文件 @app.route('/postdata', methods=['POST']) def postdata(): print(request) f = request.files['content'] print(f) user_input = request.form.get("name") basepath = os.path.dirname(__file__) # 当前文件所在路径 src_imgname = str(uuid.uuid1()) ".jpg" upload_path = os.path.join(basepath, 'static/srcImg/') if os.path.exists(upload_path)==False: os.makedirs(upload_path) f.save(upload_path src_imgname) # img = cv2.imread(upload_path src_imgname, 1) save_path = os.path.join(basepath, 'static/resImg/') if os.path.exists(save_path) == False: os.makedirs(save_path) fileSize = os.path.getsize(upload_path src_imgname) if(fileSize / 1024 / 1024 > 1): resSets = dict() resSets["value"] = 10 resSets["resurl"] = "127.0.0.1:5000" '/static/resImg/' src_imgname else: inference_from_file(upload_path src_imgname,os.path.join(save_path, src_imgname)) resSets = dict() resSets["value"] = 10 resSets["resurl"] = "127.0.0.1:5000" '/static/resImg/' src_imgname return json.dumps(resSets, ensure_ascii=False) # 转换图片链接 @app.route('/postdataUrl', methods=['POST']) def postdataUrl(): url = request.values['content'] print(url) user_input = request.form.get("name") basepath = os.path.dirname(__file__) # 当前文件所在路径 src_imgname = str(uuid.uuid1()) ".jpg" save_path = os.path.join(basepath, 'static/resImg/') if os.path.exists(save_path) == False: os.makedirs(save_path) inference_from_url(url,os.path.join(save_path, src_imgname)) resSets = dict() resSets["value"] = 10 resSets["resurl"] = "127.0.0.1:5000" '/static/resImg/' src_imgname return json.dumps(resSets, ensure_ascii=False) if __name__ == '__main__': app.run(threaded=True)

完整代码详见:github/hu-qi/MDG-AnimeGANv2

大致的效果如下图:

怎么制作动画漫画头像(3步就能制作漫画头像的机器人)(9)

点击下方,第一时间了解华为云新鲜技术~

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

,