原文轉(zhuǎn)載自「劉悅的技術(shù)博客」https://v3u.cn/a_id_201
前段時間队萤,業(yè)界鼎鼎有名的動漫風(fēng)格轉(zhuǎn)化濾鏡庫AnimeGAN發(fā)布了最新的v2版本术健,一時間街談巷議劣像,風(fēng)頭無兩。提起二次元橄仆,目前國內(nèi)用戶基數(shù)最大的無疑是抖音客戶端剩膘,其內(nèi)置的一款動畫轉(zhuǎn)換濾鏡“變身漫畫”,能夠讓用戶在直播中沿癞,把自己的實際外貌轉(zhuǎn)換為二次元“畫風(fēng)”援雇。對于二次元粉絲來說,“打破次元壁椎扬,變身紙片人”這種自娛自樂方式可謂屢試不爽:
但是看多了就難免有些審美疲勞惫搏,千人一面的“錐子臉”,一成不變的“卡姿蘭”式大眼睛蚕涤,讓人多少有點味同嚼蠟的感覺筐赔,未免過猶不及,失之現(xiàn)實揖铜。
而基于CartoonGan的AnimeGAN動漫風(fēng)格濾鏡則能夠在保留原圖特點的同時茴丰,兼具二次元的炫酷和三次元的寫實,頗有些剛?cè)岵煜拧⑴e重若輕的感覺:
[圖片上傳失敗...(image-f31908-1639576195808)]
并且AnimeGAN項目組業(yè)已在線上發(fā)布demo接口贿肩,可以直接運行模型效果:https://huggingface.co/spaces/akhaliq/AnimeGANv2 但是受限于帶寬以及線上資源瓶頸,線上遷移隊列經(jīng)常會處于排隊的狀態(tài)龄寞,同時一些原圖的上傳也可能造成個人隱私的外泄汰规。
所以本次我們在M1芯片的Mac os Monterey基于Pytorch深度學(xué)習(xí)框架,本地搭建AnimeGANV2版本的靜態(tài)圖片以及動態(tài)視頻的轉(zhuǎn)化服務(wù)物邑。
我們知道溜哮,目前Pytorch的cpu版本在M1芯片mac上的支持版本是Python3.8,在之前的一篇文章中:金玉良緣易配而木石前盟難得|M1 Mac os(Apple Silicon)天生一對Python3開發(fā)環(huán)境搭建(集成深度學(xué)習(xí)框架Tensorflow/Pytorch)色解,曾經(jīng)使用condaforge來構(gòu)建Pytorch的開發(fā)環(huán)境茂嗓,這次我們使用原生的安裝包進行安裝,首先進入Python官網(wǎng)科阎,下載 Python3.8.10 universal2 穩(wěn)定版 :https://www.python.org/downloads/release/python-3810/
雙擊安裝即可述吸,隨后進入終端鍵入命令安裝Pytorch:
pip3.8 install torch torchvision torchaudio
這里我們默認安裝最新的穩(wěn)定版1.10,隨后進入Python3.8命令行锣笨,導(dǎo)入torch庫:
(base) ? video git:(main) ? python3.8
Python 3.8.10 (v3.8.10:3d8993a744, May 3 2021, 09:09:08)
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>>
確定Pytorch可以使用之后刚梭,將官方項目克隆下來:
git clone https://github.com/bryandlee/animegan2-pytorch.git
AnimeGAN也是基于生成對抗網(wǎng)絡(luò)(Generative adversarial network),原理就是我們手上有一定量的原圖票唆,我們可以稱之為三次元圖片朴读,真實的圖片特征會存在一個分布,比如:正態(tài)分布走趋,均勻分布衅金,或者更為復(fù)雜的分布形式,那么GAN的目的是通過生成器來生成一批與真實分布接近的數(shù)據(jù)簿煌。這些數(shù)據(jù)可以理解為二次元的優(yōu)化氮唯,但是會保留三次元的一些特征,比如說眼睛變大姨伟、臉型更接近濾鏡模型的畫風(fēng)等等惩琉,在我們的處理中,這個生成器趨向于使用神經(jīng)網(wǎng)絡(luò)夺荒,因為它能表示更為復(fù)雜的數(shù)據(jù)分布情況瞒渠。
下載成功之后良蒸,可以在weights文件夾下看到四種不同的權(quán)重模型,其中celeba_distill.pt和paprika.pt是用來轉(zhuǎn)化風(fēng)景圖片的伍玖,而face_paint_512_v1.pt和face_paint_512_v2.pt則更注重于肖像的轉(zhuǎn)化嫩痰。
首先安裝圖像處理庫Pillow:
pip3.8 install Pillow
隨后新建test_img.py文件:
`from PIL import Image
import torch
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="celeba_distill")
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v1")
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v2")
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="paprika")
face2paint = torch.hub.load("bryandlee/animegan2-pytorch:main", "face2paint", size=512)
img = Image.open("Arc.jpg").convert("RGB")``out = face2paint(model, img)
out.show()`
這里以凱旋門的照片為例子,分別使用celeba_distill和paprika濾鏡查看效果窍箍,注意本地請求需要關(guān)閉ssl證書檢測串纺,同時首次運行需要下載線上模型參數(shù):
這里圖像尺寸參數(shù)指的是寬高通道的總數(shù),接下來就是人物肖像動漫風(fēng)格轉(zhuǎn)化了椰棘,調(diào)整導(dǎo)入的模型生成器類型纺棺,輸入圖片改成人物肖像:
from PIL import Image
import torch
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import numpy as np
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="celeba_distill")
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v1")
model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v2")
#model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="paprika")
face2paint = torch.hub.load("bryandlee/animegan2-pytorch:main", "face2paint", size=512)
img = Image.open("11.png").convert("RGB")
out = face2paint(model, img)
out.show()
可以看到,v1濾鏡相對風(fēng)格化更強烈一些邪狞,而v2在風(fēng)格化的基礎(chǔ)上相對保留了原圖的特征祷蝌,源于三次元又不拘泥于體驗,架空卻又不流于虛浮外恕,比抖音的漫畫濾鏡不知道高到哪里去了杆逗。
下面我們來看看動態(tài)視頻的動漫濾鏡轉(zhuǎn)換,視頻從廣義上來講鳞疲,就是多張圖片的連拍播放罪郊,只不過取決于視頻幀的速率問題,幀速率也稱為FPS(Frames PerSecond)的縮寫——幀/秒尚洽,是指每秒鐘刷新的圖片的幀數(shù)悔橄,也可以理解為圖形處理器每秒鐘能夠刷新幾次。 越高的幀速率可以得到更流暢腺毫、更逼真的動畫癣疟,每秒鐘幀數(shù)(FPS)越多,所顯示的動作就會越流暢潮酒。
這里可以通過第三方軟件將連貫的視頻轉(zhuǎn)換為以FPS為單位的圖片睛挚,在m1 mac os系統(tǒng)中,推薦使用著名的視頻處理軟件:Ffmpeg
使用arm架構(gòu)的Homebrew進行安裝:
brew install ffmpeg
安裝成功后急黎,在終端鍵入ffmpeg命令查看版本:
(base) ? animegan2-pytorch git:(main) ? ffmpeg
ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
built with Apple clang version 13.0.0 (clang-1300.0.29.3)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/4.4.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
安裝沒有問題扎狱,隨后準(zhǔn)備一個視頻文件,新建 video_img.py:
import os
# 視頻轉(zhuǎn)圖片
os.system("ffmpeg -i ./視頻.mp4 -r 15 -s 1280,720 -ss 00:00:20 -to 00:00:22 ./myvideo/%03d.png")
這里我們使用Python3內(nèi)置的os模塊直接運行ffmpeg命令勃教,針對當(dāng)前目錄的視頻淤击,以每秒15幀的速率進行轉(zhuǎn)化,-s參數(shù)代表視頻解析度故源,-ss參數(shù)可以控制視頻的開始位置和結(jié)束位置污抬,最后是導(dǎo)出圖片的目錄。
運行腳本之后绳军,進入myvideo目錄:
(base) ? animegan2-pytorch git:(main) ? cd myvideo
(base) ? myvideo git:(main) ? ls
001.png 004.png 007.png 010.png 013.png 016.png 019.png 022.png 025.png 028.png
002.png 005.png 008.png 011.png 014.png 017.png 020.png 023.png 026.png 029.png
003.png 006.png 009.png 012.png 015.png 018.png 021.png 024.png 027.png 030.png
(base) ? myvideo git:(main) ?
可以看到印机,圖片按照幀數(shù)作為下標(biāo)文件名已經(jīng)轉(zhuǎn)換完畢矢腻。
接著需要利用AnimeGAN濾鏡對圖片進行批量轉(zhuǎn)換:
from PIL import Image
import torch
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import numpy as np
import os
img_list = os.listdir("./myvideo/")
# model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="celeba_distill")
# model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v1")
model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="face_paint_512_v2")
# #model = torch.hub.load("bryandlee/animegan2-pytorch:main", "generator", pretrained="paprika")
face2paint = torch.hub.load("bryandlee/animegan2-pytorch:main", "face2paint", size=512)
for x in img_list:
if os.path.splitext(x)[-1] == ".png":
print(x)
img = Image.open("./myvideo/"+x).convert("RGB")
out = face2paint(model, img)
out.show()
out.save("./myimg/"+x)
# exit(-1)
每一次轉(zhuǎn)換都將原圖保留并且濾鏡轉(zhuǎn)化后的圖片存放在相對目錄myimg里面,隨后新建img_video.py將其重新轉(zhuǎn)換為視頻:
import os
# 圖片轉(zhuǎn)視頻
os.system("ffmpeg -y -r 15 -i ./myimg/%03d.png -vcodec libx264 ./myvideo/test.mp4")
依然是每秒15幀的速率耳贬,和原視頻相同踏堡。
如果原視頻帶有音軌猎唁,可以先將音軌進行分離操作:
# 抽離音頻
import os
os.system("ffmpeg -y -i ./lisa.mp4 -ss 00:00:20 -to 00:00:22 -vn -y -acodec copy ./myvideo/3.aac")
進行動漫濾鏡轉(zhuǎn)換之后咒劲,將轉(zhuǎn)換后的視頻和原視頻的音軌進行合并操作:
# 合并音視頻
os.system("ffmpeg -y -i ./myvideo/test.mp4 -i ./myvideo/3.aac -vcodec copy -acodec copy ./myvideo/output.mp4")
原視頻的測試用例:
轉(zhuǎn)換后效果:
在m1芯片的加持下,基于cpu版本的Pytorch跑起來效率還是不錯的诫隅,不過令人遺憾的是適配m1芯片的gpu版本的Pytorch我們還需要等待一段時間腐魂,在上個月,Pytorch項目組成員soumith給出過這樣的回應(yīng):
So, here's an update.
We plan to get the M1 GPU supported. @albanD, @ezyang and a few core-devs have been looking into it. I can't confirm/deny the involvement of any other folks right now.
So, what we have so far is that we had a prototype that was just about okay. We took the wrong approach (more graph-matching-ish), and the user-experience wasn't great -- some operations were really fast, some were really slow, there wasn't a smooth experience overall. One had to guess-work which of their workflows would be fast.
So, we're completely re-writing it using a new approach, which I think is a lot closer to your good ole PyTorch, but it is going to take some time. I don't think we're going to hit a public alpha in the next ~4 months.
We will open up development of this backend as soon as we can.
可以看出來逐纬,項目組應(yīng)該是徹底為m1芯片重構(gòu)Pytorch底層蛔屹,公開測試版也不會在近期推出,也許明年的下半年會放出來豁生,還是非常值得期待的兔毒。
結(jié)語:無論是清華大學(xué)的CartoonGAN,還是基于CartoonGAN的AnimeGANv2甸箱,毫無疑問育叁,它們都是業(yè)界的翹楚,是頂峰中的頂峰芍殖,就算是放在世界人工智能的范圍上豪嗽,擺在PyTorch-GAN這樣的項目旁邊,也是毫不遜色的豌骏,在人工智能領(lǐng)域龟梦,AnimeGANv2向世界宣布,中國人只能制造藥丸補劑的歷史已經(jīng)一去不復(fù)返了窃躲。
原文轉(zhuǎn)載自「劉悅的技術(shù)博客」 https://v3u.cn/a_id_201