神工鬼斧惟肖惟妙,M1 mac系統(tǒng)深度學(xué)習(xí)框架Pytorch的二次元動漫動畫風(fēng)格遷移濾鏡AnimeGANv2+Ffmpeg(圖片+視頻)快速實踐

原文轉(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)”援雇。對于二次元粉絲來說,“打破次元壁椎扬,變身紙片人”這種自娛自樂方式可謂屢試不爽:

image

但是看多了就難免有些審美疲勞惫搏,千人一面的“錐子臉”,一成不變的“卡姿蘭”式大眼睛蚕涤,讓人多少有點味同嚼蠟的感覺筐赔,未免過猶不及,失之現(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/

image

雙擊安裝即可述吸,隨后進入終端鍵入命令安裝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ù):

image

這里圖像尺寸參數(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()
image

可以看到,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")

原視頻的測試用例:

image

轉(zhuǎn)換后效果:

image

在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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末计贰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒂窒,更是在濱河造成了極大的恐慌躁倒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刘绣,死亡現(xiàn)場離奇詭異樱溉,居然都是意外死亡,警方通過查閱死者的電腦和手機纬凤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門福贞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人停士,你說我怎么就攤上這事挖帘⊥昀觯” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵拇舀,是天一觀的道長逻族。 經(jīng)常有香客問我,道長骄崩,這世上最難降的妖魔是什么聘鳞? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮要拂,結(jié)果婚禮上抠璃,老公的妹妹穿的比我還像新娘。我一直安慰自己脱惰,他們只是感情好搏嗡,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拉一,像睡著了一般采盒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔚润,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天磅氨,我揣著相機與錄音,去河邊找鬼抽碌。 笑死悍赢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的货徙。 我是一名探鬼主播左权,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痴颊!你這毒婦竟也來了赏迟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤蠢棱,失蹤者是張志新(化名)和其女友劉穎锌杀,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泻仙,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡糕再,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了玉转。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片突想。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猾担,到底是詐尸還是另有隱情袭灯,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布绑嘹,位于F島的核電站稽荧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏工腋。R本人自食惡果不足惜姨丈,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夷蚊。 院中可真熱鬧构挤,春花似錦髓介、人聲如沸惕鼓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箱歧。三九已至,卻和暖如春一膨,著一層夾襖步出監(jiān)牢的瞬間呀邢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工豹绪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留价淌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓瞒津,卻偏偏與公主長得像蝉衣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巷蚪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    極客學(xué)院Wiki閱讀 7,239評論 0 3
  • 不知不覺易趣客已經(jīng)在路上走了快一年了屁柏,感覺也該讓更多朋友認識知道易趣客啦膜,所以就謝了這篇簡介,已做創(chuàng)業(yè)記事淌喻。 易趣客...
    Physher閱讀 3,409評論 1 2
  • 雙胎妊娠有家族遺傳傾向僧家,隨母系遺傳。有研究表明裸删,如果孕婦本人是雙胎之一八拱,她生雙胎的機率為1/58;若孕婦的父親或母...
    鄴水芙蓉hibiscus閱讀 3,696評論 0 2
  • 今天理好了行李,看到快要九點了乘粒,就很匆忙的洗頭洗澡豌注,(心存一份念想,你總會打給我的??)然后把洗頭液當(dāng)成沐浴液了??灯萍,...
    bevil閱讀 2,768評論 1 1
  • 那年我們15轧铁,像陽光一樣溫暖的年紀。每天我都會騎自行車上學(xué)旦棉,路過田野齿风,工廠,醫(yī)院绑洛,村莊救斑,有微風(fēng),有陽光真屯,有綠...
    木偶說愛你閱讀 2,520評論 0 3