3步就能製作漫畫頭像的機器人,想擁有一個嗎?
摘要:3步就能製作漫畫頭像的機器人,想擁有一個嗎?
作者:胡琦
只需要發送關鍵字,就能出發聊天機器人頭像漫畫化處理程式,生成動漫圖片。怎麼實現呢?總的思路就是基於 ModelArts AI Gallery 快速驗證 AnimateGanv2 現實照片動漫化能力,基於 Flask 快速部署動漫化服務,基於 Wechaty 快速開發動漫化聊天機器人。
為什麼是 AnimeGAN?
動漫(Animation & Comic)作為日常生活中一種常見的藝術表現形式,在兒童教育、影視、廣告等領域中應用十分廣泛;但動漫創作困難、周期長、開發難度大,對創作者要求也十分苛刻,一般來說好的動漫作品需要創作者掌握線條、紋理、顏色和陰影等繪畫技巧;普通人想要快速創造自己的動漫作品不得不藉助工具。近年來,隨著元宇宙的不斷發展,人們對動漫的需求越來越多,比如生成二次元自畫像、製作 NFT 藝術品等等,因此動漫風格遷移似乎成為「煉丹師」們喜愛的研究方向之一。
影像風格遷移還得從 pix2pix 和 CycleGAN 說起,這兩個基於 GAN 的風格遷移演算法為動漫畫圖片生成奠定了技術基礎,後續的 CartoonGAN 通過語義內容損失函數和邊緣增強的對抗性損失函數使生成的動漫圖片品質更高。而 AnimeGAN基於 CartoonGAN 改進,並提出了一個更加輕量級的生成器架構以及灰度風格損失、灰度對抗損失和顏色重建損失三個新的損失函數,使其風格化的視覺效果能超越 CartoonGAN。
畢竟,AnimeGAN 讓新海誠本人都感覺很有趣;而對於我們普通人來說,多了一種創作的可能,只需一張現實照片就能通過 AI 輸出大師級的動漫作品!
什麼是 AnimeGAN ?
提到 AnimeGAN ,不得不說說它的發展歷程,一作Asher Chan從 2019 年提交第一個 Git Commit 至今,已經迭代了三個版本,AnimeGANv3放出了可執行程式和剛出爐還熱乎的肖像素描(點我快速體驗:Run in ModelArts – AnimeGANv3 肖像素描生成)。
AnimeGAN 實現了將現實世界場景的照片轉換為動漫風格影像。 AnimeGANv1 提出了三種損失函數:灰度樣式損失、顏色重建損失和灰度對抗損失。
解決了:
1.生成的影像沒有明顯的動畫風格紋理
2.生成的影像丟失了原始影像的內容;
3.網路的參數需要大的存儲容量。
AnimeGANv2 修復了上個版本中存在的問題,例如模型生成的影像中存在高頻偽影;更容易訓練且直接能到達論文效果;進一步減少網路參數使生成器更小;儘可能多地使用更高畫質的風格數據。作者覺得創新性不大因此就沒重新發表論文。
AnimeGANv3 基於與 Google 的商業許可,作者暫時不提供源碼。不過目前提供了圖形用戶介面程式 (AnimeGANv3.exe) 和預訓練模型 (onnx.zip) ,目前我們可以直接在 Windows 上體驗圖片或影片轉動漫風格。截止筆者發文,作者由更新了 AnimeGANv3_PortraitSketch 用於生成肖像畫,也就是上圖的效果。
筆者有幸體驗了 AnimeGAN 帶來的樂趣,下圖中左邊是在華為雲 ModelArts 上運行的結果,通過識別人臉關鍵點之後再進行風格遷移能獲得動漫化頭像;右邊是 AnimeGANv3.exe 在本地運行的結果,我們無需關係環境和程式碼執行,簡單操作就能生成動漫 圖片;中間是本次分享的主角–一個能將圖片動漫化的聊天機器人。
在 AI Gallery 上提前驗證
我們通常認為「數據、演算法、算力」是人工智慧的三要素,現如今,處在大數據時代,可靠高品質的數據的獲得變得簡潔;優質的演算法隨著開源文化的發展也變得普及;然而算力確成了制約人工智慧普及的「攔路虎」,就連 AnimeGAN 的作者也感嘆「論文的延遲發表只因只借到了一年的 2080ti」。對於筆者而言,幸虧有普惠 AI 的華為雲 ModelArts,AI Gallery 是在 ModelArts 的基礎上構建的開發者生態社區,提供了 Notebook 程式碼樣例、數據集、演算法、模型、Workflow 等 AI 數字資產的共享,姑且理解為 AI 屆的 Github。
- 數據方面,AI Gallery 的數據模組支援數據集的共享和下載;而且數據集是支援 License 聲明的,這一點類似於開源社區;
- 演算法方面,AI Gallery 的演算法模組支援演算法的共享和訂閱;並且演算法支援變現,類似於一個演算法商城;
- 算力方面,用戶在 AI Gallery 中通過點擊「Run in ModelArts」可以將 Notebook 案例在 ModelArts 控制台快速打開、運行以及進行二次開發等操作,目前提供有限的免費算力。
通過學習改造 AI Gallery 已有的 AnimeGAN 案例,我們能夠快速運行 NoteBook 並得到動漫化頭像。
基於 Wechaty 快速構建機器人
提到聊天機器人的開發,作為前端工程師,筆者認為最快捷的方式莫過於import {Wechaty} from “wechaty”;,是的,Wechaty 是一個開源的的對話機器人 SDK,支援 個人號 微信。它是一個使用 Typescript 構建的 Node.js 應用。支援多種微信接入方案,包括網頁,ipad,ios,windows, android 等。同時支援 Linux, Windows, Darwin(OSX/Mac) 和 Docker 多個平台。因此我們要實現聊天機器人就十分簡單了!(PS:除了 token 有點小貴,當然有能力有創意可以加入官方資助計劃)。
聊天機器人有了,接下來怎麼接入 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.com/hu-qi/MDG-AnimeGANv2
大致的效果如下圖:
了解更多內容,歡迎來直播間和作者交流
直播時間:7月27日 20:00-21:00
直播老師:胡琦,華為雲年度十佳部落客
直播主題:三步開發聊天機器人,一秒生成漫畫頭像
直播介紹:
1、基於 ModelArts 快速驗證AnimateGanv2 現實照片動漫化能力
2、基於 Flask 快速部署動漫化服務
3、基於 Wechaty 快速開發漫畫頭像的聊天機器人
直播鏈接://bbs.huaweicloud.com/signup/aaf6f0369810487eb21cb162bc8ac154