
大資料文摘出品
來源:github
編譯:李雷、劉俊寰、陳若朦
不知道大家是否都看過動漫YouTuber上的網紅主播。
有個小哥因為對動漫網紅主播太着迷了,于是他用深度神經網絡簡化了動畫生成過程。具體來說,就是将動漫人物的臉部和期望的姿勢等圖像輸入神經網絡,進而生成給定姿勢的輸出圖像。
不僅如此,通過連接配接面部跟蹤器,動漫人物還可以模仿他的臉部動作:
同時,還可以對現有視訊中某人的面部動作進行轉換:
以下是全文,快和文摘菌一起來看看吧!
可以利用深度學習使生成VTuber更容易嗎?
我喜歡動漫YouTube網紅主播(VTubers)已經兩年了。VTubers就是由真人配音的虛拟動漫人物,他們會在YouTube上直播。要弄清楚他們是什麼,最簡單方法就是去看他們的直播。
我最喜歡的一個VTubers是Shirakami Fubuki:
YouTube首頁
VTubers現在已經構成了一個新的娛樂圈,在日本也越來越受歡迎。
根據英國廣播公司(BBC)的一篇報道,由VTubers引發的新興産業正在萌芽之中,一家公司計劃在這個領域投資數百萬美元。
相關報道:
https://www.bbc.com/worklife/article/20181002-the-virtual-vloggers-taking-over-youtube另一方面,深度學習的最新進展也令我着迷,尤其是與動漫相關的研究。2017年,一個研究團隊成功地訓練了生成對抗網絡(GAN),可以生成高品質的動漫人物圖像。
最近,一位碼農Gwern釋出了最大的動漫圖像庫,并成功訓練了另一個GAN,生成的動漫人物之精美令人歎為觀止。由舊金山遊戲開發商Sizigi Studios建立的WaifuLabs網站,允許使用者定制一個由GAN生成的女性動漫人物,并将其印在所購買的商品上。
相關連結:
https://www.gwern.net/Danbooru2018一切似乎都在表明,人工智能将成為動漫創作的重要工具。我也想知道AI要如何才能做到,特别是,如何通過深度學習使動漫生成更為便捷?最容易的似乎是生成VTuber。
自今年初以來,我開始着手探索這個問題:可以利用深度學習使生成VTuber更容易嗎?
無需提前創造2D模型就能生成2D VTuber
那麼,如何成為一個VTuber呢?
你需要一個可以控制其動作的角色模型。 一種方法是建立一個全3D模型,許多著名的VTuber(例如Kizuna Ai,Mirai Akari和Dennou Shoujo Shiro)都采用了這種方法。
但是,制作這類精美的3D模型非常昂貴,因為它需要花費大量人力:首先必須有出色的角色設計師,并且還需要技能娴熟的3D模組化師。 很少有人兼備兩種技能,更不用說像我這樣毫無藝術細胞的人,要建立一個自己的VTuber角色是不可能的。 當然,也可以用錢來解決問題,但是随便Google一下就知道傭金不菲,約為500,000日元(約合5,000美元)。
除了3D模型,建立2D模型也是方法之一。 2D模型是分層設計的動圖集合,大多數VTubers都使用這種類型,它的建立成本要低得多:總體花費30,000日元(約合300美元)即可。
盡管如此,2D模組化也不僅僅是設計和繪制模型,角色身體需要分為多個可活動部分,模組化師必須使用專用軟體(例如Live2D)将它們組裝在一起,要生成身體某一部分的動作也十分費時。
不過,大多數2D VTuber的動作都非常簡單,比如嘴巴開合,睜眼閉眼,挑眉或皺眉,微微側臉,以及左右搖擺身體,很少涉及到旋轉身體或移動手腳。模組化時生成的2D圖像集合也大都是固定的,難以合成大幅度的動作。
由于2D VTuber的動作簡單且幅度小,那麼我們是否可以動态生成他們,并且無需提前建立2D模型?如果能,這使成為VTuber變得更容易,我隻需找人設計人物即可,花費大概不會超過20,000日元。
甚至,我可以免費使用GAN生成角色!這不僅給像我這樣不會繪畫的人帶來好處,也減輕了設計家們的負擔,他們隻需設計出人物即可,而且這項技術還可以用于遊戲制作,輕松實作視覺小說遊戲中角色的說話等動作。
專門生成動漫角色臉部資料的資料集
現在已經确定了目标,接下來需要把問題細化。
我要解決的問題是這樣的:給定一個動漫角色的臉部圖像和一個“姿勢”,生成根據“姿勢”變化的新的臉部圖像。這裡,姿勢是一組數字,用于指定角色的面部表情和頭部朝向。要說明的是,這裡的姿勢是6個數字,對應于6個滑動條。
我将用深度學習來解決這個問題,這需要先解決一下以下兩個問題:
- 用什麼資料訓練網絡?
- 使用哪種網絡體系結構?具體如何訓練網絡?
事實證明,最大的挑戰是第一個問題。我需要一個資料集,其中包含帶有姿勢标注的臉部圖像。EmotioNet是具有姿勢标注的大型人臉資料集。但是,據我所知,目前還沒有類似的動漫角色臉部資料集。
是以,我專門生成了一個新的資料集。我利用了一個名為MikuMikuDance的3D動畫軟體,它包含成千上萬的動漫人物3D模型。我下載下傳了約8,000個模型,用它們來訓練網絡。
我根據3D角色模型的規律設計了網絡,過程分為兩步。首先改變面部表情,即控制眼睛和嘴巴開合度,其次是旋轉面部。
每個步驟使用一個單獨的網絡,第一個網絡的輸出作為第二個網絡的輸入。我将第一個網絡稱為面部變形器(face morpher),第二個網絡稱為面部旋轉器(face rotator)。
對于面部變形器,我使用的是Pumarola等人在其ECCV(歐洲計算機視覺國際會議) 2018論文中提出的生成器體系結構。
神經網絡通過産生代表原始圖像變化的新圖像來改變面部表情,并使用alpha蒙版将更改圖像與原始圖像合并。我發現Pumarola的體系結構在圖像小範圍變化方面表現出色,以本例中,就是閉上眼睛和嘴巴。
面部旋轉器要複雜得多。我使用在單個網絡中實作的兩種算法來旋轉面部,進而産生兩個輸出。這些算法是:
- Pumarola等人的算法:用于修改面部表情,但是現在我讓網絡旋轉面部。
- Zhou等人(ECCV2016論文)的視圖合成算法:他們的目标是旋轉圖像中的3D對象。他們通過讓神經網絡計算外觀流(appearance flow)來做到這一點,外觀流即輸出的每個像素與輸入對應顔色複制的像素的映射圖。
外觀流會産生保持原始紋理的清晰效果,但不利于産生被遮擋部分旋轉後形成的幻象。另一方面,Pumarola等人的體系結構産生結果比較模糊,但由于其無需從現有像素進行複制就可以更改原始圖像的像素,是以可以對未遮擋部分進行幻化。
為了結合兩種算法的優點,我訓練了一個新網絡,以便通過alpha蒙版将兩個輸出合并。網絡還輸出一個“潤色”圖像,并通過另一個alpha蒙版将其與前面的合并圖像進行組合。
上手第一步:定義範圍和意義
系統的輸入由動漫人物的圖像和所需的姿勢矢量組成,圖檔大小通常為256×256,具有RGBA格式,且必須具有透明背景。
更具體地說,不屬于該字元的像素必須具有(0,0,0,0)的RGBA值,不屬于該字元的像素必須具有非零的alpha值。角色的頭部必須在垂直于圖像平面的方向上筆直。頭部必須在中心128×128的框中,眼睛和嘴巴必須張開。
如前所述,角色的臉部配置由“姿勢”控制。本次而言,可以把它是一個6維向量,三個分量控制面部特征,在閉合間隔[0,1]中有意義。
有兩個部分控制着眼睛的張開,一個用于左眼,一個用于右眼。0表示眼睛完全張開,1表示眼睛完全張開。
一個元件控制着嘴巴的張開。但是,這一次0表示嘴是完全閉合的,1表示嘴是完全張開的。眼睛和嘴巴參數的沖突語義源于3D模型的變形權重語義。
其他三個部件控制頭部的旋轉方式。在三維動畫中,頭部由兩個“關節”控制,由一根“骨頭”連接配接。頸根關節位于頸部與身體連接配接的位置,頸尖關節位于頸部與頭部連接配接的位置。在角色的骨架中,尖端是根的子級。是以,應用于根的三維變換也會影響尖端,但不會反過來。
姿勢向量的三個分量的值在區間[-1,1]内。
一個部件控制圍繞頸根關節的$Z軸的旋轉。在這裡,我使用坐标系統,Y軸指向上面,X軸指向字元的左邊,Z軸指向前面。角度範圍控制在正負15度之内。
一個元件控制圍繞頸尖連接配接的X軸的旋轉。從身體上看,它表示頭部向上或向下傾斜的程度。再次,我們将元件值的範圍[-1,1]映射到旋轉角度的範圍[-15°,15°],正值意味着頭向上傾斜,負值意味向下傾斜,0意味着頭面向平行于Z軸的方向。
最後一個元件與上一個元件具有相同的角度範圍,但是它控制着圍繞脖子尖端連接配接的Y軸的旋轉。換句話說,它控制面部的水準方向。
我省略了許多運動,包括眉毛,虹膜和上身的運動。這是為了簡化問題,以便可以盡快完成系統的設計,并證明它是可以工作的。
概括地說,如果輸入的圖像由角色的面部和6維姿勢矢量組成,輸出是相應擺出的另一張臉部圖像。
用3D動畫軟體MikuMikuDance來建立模型
想要動畫繪制的字元,最有效的辦法是進行網絡繪圖訓練。我通過渲染3D人物模型建立了一個訓練資料集。雖然3D效果圖不同于圖紙,但它們更容易操作——因為3D模型是可控的。
現在我們可以想出任何姿勢,應用到一個模型,并渲染一個圖像顯示那個姿勢。此外,一個3D模型可以生成數百個訓練圖像,是以我需要收集數千個模型;如果用圖畫,則不得不收內建千上萬的圖畫,并且用角色的姿勢來注釋每一個——注釋成千上萬的圖像比處理成千上萬的3D模型要困難得多。
我使用3D動畫軟體MikuMikuDance (MMD)建立模型。該軟體上有成千上萬的動漫人物模型可供下載下傳。我也曾用該軟體生成訓練資料,多年來,開發了一個庫來操作和呈現模型,這使得可以進行大部分資料自動化生成過程。為了建立一個訓練資料集,我從Niconi Solid和BowlRoll等網站下載下傳了大約1.3萬個MMD模型,光是下載下傳就花費了兩個月的時間。
然而并不是所有的模型都是可用的——其中存在一些甚至不是角色的模型是不能通過資料庫處理的。為了減少重複的訓練資料,還需要主觀地去掉了與其他模型太接近的模型。淘汰之後,最終隻剩下大約8000個模型。
資料說明
原始模型資料不足以生成訓練資料,其中存在兩大問題:确定模型的頭部和控制模型的眼睛。
為了知道每個模特的頭部到底在哪裡,我建立了一個工具,用符号注釋每個模型中頭部底部和頂部的位置。其中底部與下巴尖相對應,但頭的頂部沒有一個精确的定義。于是我将頭蓋骨的頂部固定起來——這樣整個頭骨 及頭發都包括在這個範圍内。如果角色戴着一頂帽子,也可被猜測位于頭部位置。
第二個問題是如何準确控制每個模特的眼睛。MMD模型的面部表情由“圖像變換(morphs)”(又稱混合形狀)實作。變形通常以特定的方式對應于面部特征。例如,其中一個變形對應于閉上雙眼,另一個會對應于張開嘴巴。為了生成訓練資料,需要知道閉左眼、閉右眼和張開嘴巴這三個變形。
叫做“a”的張嘴變形幾乎存在于所有的模型,是以這并不是一個問題,但是閉眼的變形會使情況變得加困難。由于不同的模組化者以不同的方式對它們命名,是以它們中的一個或兩個可能在某些模型中缺失。MMD模型通常帶有兩種類型的眨眼。正常的眨眼是向下彎曲的眼睑,而微笑的眨眼是向上彎曲的眼睑。而每種眨眼方式都有三種不同的變形:閉右眼、閉左眼和同時閉上雙眼。
——是以我又創造了一個工具,由此可以循環通過眼睛控制變形和标記的正确的語義。注釋模型和建立工具,花費了大約4個月的時間,是項目中最耗時的部分。
姿勢采樣
訓練資料的另一個重要部分是姿勢,我們需要為每個訓練示例指定一個姿勢。我通過獨立采樣姿态向量的每個分量來生成姿态。對于眼控參數和嘴控參數,從[0,1]區間均勻采樣;對于頭關節參數,則從一個機率分布中采樣——該分布的密度從範圍中心開始線性增長,密度如下圖所示。選擇這個分布來增加困難訓練例子的頻率,例如當一些頭關節參數遠不是0時,頭的配置和其餘的姿勢會有很大的不同。
采樣參數機率分布
渲染
為了生成訓練圖像,需要确定一個模型和一個姿勢。我使用了正射投影渲染了這個姿勢模型,而如果使用透視投影的話,則對于繪圖,尤其是塊莖的繪圖,似乎沒有縮短的效果。
渲染3D模型需要指定模型表面的光散射特性。MMD通常使用toon着色,但是我使用的是一個根據模型資料設計的更标準的Phong反射模型,由此生成的訓練圖像的3d更好。
渲染還需要指定場景中的燈光。我采用了兩個光源,分别是定向白光和白色環境光源。其中前者直接指向-z方向,可以減少渲染中的陰影。
資料生成過程的另一個細節是,每個訓練示例由三個圖像組成。首先是人物的休息姿勢,第二個隻包含面部特征的變化,第三個在前一個的基礎上增加了面部旋轉。我通過大量的資料訓練設計了獨立的控制面部特征和旋轉面部的網絡。
資料集
我将他的模型分為三個子集,分别用于生成訓練、驗證和測試資料集。訓練集是由動畫、漫畫和視訊遊戲中的角色建立的;驗證集通過使用來自Nijisanji的VTubers模型來生成。在下載下傳模型時,可以根據原始資料将子集配置設定到各檔案夾中。因為字元的起源不同,是以三個資料集之間沒有重疊。資料生成是完全自動化的。整個過程耗時16個小時。三個資料集的數值分解如下:
神經網絡系統
如概述部分所述,神經網絡系統由許多子網組成,現在較長的描述它們。
面部變形器
擺出角色臉部的第一步是修改其面部特征。更具體地說,就是閉上眼睛和嘴巴。
在論文中,Pumarala等人描述了一個可以根據給定的動作機關(Action Units,AU)修改人臉特征的網絡,該動作機關能代表面部肌肉運動。因為AU是一個非常通用的編碼系統,是以他們能做的遠遠不止閉上眼睛。我嘗試了一下,效果的确很棒!
但是,我沒有使用論文的所有内容,因為我的問題比他們的問題簡單得多。尤其是,他們的訓練資料并非來自具有不同面部表情的同一個人的成對面孔。是以,他們使用的是具有周期一緻性損失的GAN來執行無監督學習。
而我的資料是成對的,是以我可以進行正常監督學習。
網絡通過産生變化圖像來修改面部表情,該變化圖像通過alpha蒙版與原始輸入圖像結合在一起。為此,輸入圖像和姿勢被饋送到編碼-解碼網絡,該網絡将為每個圖像生成一個64維特征向量輸入圖像的像素。然後,使用2個卷積單元的兩個單獨列和适當的非線性處理特征向量的此圖像,以生成alpha蒙版和更改圖像。
Pumarola等人用相當複雜的損失功能訓練他們的網絡,但是在我的問題中,隻需要計算一個簡單的L1像素差異損失。
面部旋轉器
面部旋轉器由兩個子網組成。關于人物臉部,有兩種不同的算法,各有優劣。為了組合它們的強度,組合器會拍攝兩個輸出圖像,将它們與alpha蒙版融合在一起,修飾圖像以提高品質。
二算法旋轉器(Two-Algorithm Rotator)
該網絡可以看作是Pumarola等人發電機模型的擴充:它具有發電機的所有單元,但現在包含新的輸出路徑。Pumarola的網絡隻被要求于旋轉臉部而不包括閉上眼睛和嘴巴。
新途徑使用的是周等人的論文中描述的旋轉對象的方法來産生輸出。
旋轉對象(尤其是旋轉小角度)主要涉及将輸入圖像中的像素移動到不同位置,周等人建議計算外觀流:一張映射圖,該圖告訴輸入圖像中應複制輸出圖像中每個像素的位置。然後再将此地圖和原始圖像傳遞到像素采樣單元。
我使用兩種不同的損失來訓練網絡。第一個隻是L1像素差異損失,第二個損失是L1像素差異損失與Johnson等人的感覺特征重建損失之間的總和。
同樣,我用Adam訓練了網絡,使用了與臉部變形器相同的參數,進行了6個時期(3,000,000個例子)。當使用L1損失時,我将批次大小設定為25,并且訓練又花費了大約2天的時間。但是,由于評估特征重建損失需要更多的記憶體,是以在進行感覺損失訓練時,我不得不将批次大小減小為8,在這種情況下,訓練了6天。
合路器
看到兩個算法旋轉器的輸出是有指導意義的,看看其中一個單獨的輸出是不夠的。
在上圖中可以看到,角色的脖子旋轉使得被身體遮住的部分長發的可見。可以看到Pumarola等人的算法産生了一張模糊的面孔。我推測這是由于要求網絡從壓縮特征編碼中産生所有新像素,進而丢失了原始圖像的高頻細節。另一方面,周等人則從輸入圖像中重用像素,産生了清晰的結果。
然而,很難通過複制現有像素來重建被遮擋的部分,尤其是當複制的正确位置很遠時。上圖中同樣可以看到,周等人的算法使用手臂像素來重建被遮擋的頭發。另一方面,Pumarola等人的頭發具有更自然的顔色。
通過組合兩種算法的輸出,我們可以獲得更好的結果:重新定位的可見像素将保持清晰,而被遮擋部分的像素将具有自然色。
結果評估
網絡配置
網絡和丢失功能的不同組合可以産生執行整個擺姿勢任務的不同配置,具體而言有三種方式旋轉面部:僅使用Pumarola等人的路徑方法,僅使用Zhou等人的路徑,或者同時使用群組合器。
此外,可以使用L1或感覺損失來訓練面部旋轉器的每個子網。下表列出了所有的可能性:
對于上述配置,僅更改了面部旋轉器,面部變色器保持固定。
定量評估
一般用于名額評估性能的有兩個名額。首先是網絡輸出和地面真實圖像之間的平均每像素均方根誤差(RMSE),還有一個是平均結構相似指數(SSIM)。使用測試資料集中的10,000個示例計算分數。
可以看到,單獨使用面部旋轉器的方法比組合方法的效果差。但一個值得注意的例外是,就MRSE而言,PU-P的性能優于FU-PP之外的所有網絡。但是,對于SSIM,組合始終可以帶來更好的性能。
另一個趨勢是,根據兩個名額,使用感覺損失通常會提高性能。但是,相對于SSIM度量标準,性能最好的配置是FU-P-L1,而不是FU-PP。
綜上,似乎最好的配置是FU-P-L1和FU-PP,它們在這兩個名額上均分别獲得了第一和第二的成績。是以,我們需要檢查生成的圖像,以便确定哪個更好。
定性評估
我使用8種網絡配置以及我的MMD模型渲染器,在測試資料集中渲染了8個標明角色的視訊。
我們根據視覺品質來進行對比網絡配置。PU-L1和PU-P産生的結果太模糊且品質較低,這表明盡管Pumarola等人的體系結構可以有效地修飾人臉的一小部分,但當修飾覆寫了輸出圖像的大部分時,它的效果并不理想。
同時,還可以觀察到,由于感覺損失,PU-P産生了更清晰的圖像,這和Park等人所觀察到的結果如出一轍。
另一方面,ZH-L1和ZH-P在直接從輸入圖像複制像素時會産生非常清晰的結果。但是,它們會生成不規則的僞像,進而可能使字元變形。
對于使用所有子網的配置,由于組合器從周等人的途徑中選擇了這些像素,大多數面部和物體都是清晰的。由于Pumarola等人的路徑比周的路徑更不容易從相鄰像素複制像素,是以合成器可以從前者的像素中進行選擇,并在很大程度上(但不是完全)消除後者産生的幹擾僞像。
是以,與僅使用一種途徑的圖像相比,完整的配置産生更好的圖像。但是,被遮擋部分的輸出仍然模糊。下圖顯示,在4種完整配置中,FU-PP産生了最清晰的結果。但是,某些觀看者(包括我自己)可能不喜歡棋盤僞像,而是更喜歡FU-P-L1的平滑輸出。
我還注意到,所有網絡似乎都對角色的解剖結構有一定的了解。
例如,Yamato Iori的右眼被頭發遮住,當她閉上眼睛時,沒有網絡使遮擋的頭發移動。但是,由于圖像解析不正确,我們還可以觀察到許多有趣的失敗案例。
例如,Yozakura Tama的長辮子落在她的身體前部。所有網絡配置都将其切斷成兩部分,并且僅将頂部和頭部一起移動,他們還會誤認為衣服和配件是頭部的一部分。
總而言之,FU-P-L1和FU-PP似乎是最好的網絡配置,因為它們生成的輸出幾乎沒有太多假象且清晰。FU-PP産生具有棋盤圖案的清晰圖像,而FU-P-L1産生模糊但平滑的結果。兩個網絡都可能錯誤地解析輸入圖像,進而導緻它們建立解剖/實體上難以置信的動畫。
動畫圖
該項目的最終目标是能夠對不是3D渲染的圖形進行動畫處理,我通過使用最佳網絡FU-PP評估了與Nijisanji關聯的VTubers圖像和Waifu Labs生成的字元的動畫效果。
由于這些網絡接受了動畫人物渲染方面的訓練,是以可以很好地推廣到具有相同藝術風格的圖紙上。對于大多數角色,即使某些部分被頭發遮擋,它們也可以正确地閉上角色的眼睛。
但是,還是存在幾種故障模式:
- 當角色的外觀與訓練資料集有很大偏差時,網絡可能會錯誤地解析人臉,導緻荒謬的動作。例如,雖然大多數人物的皮膚是黃色或棕色的,但吉爾紮倫三世的皮膚卻是紫色的。在被激活後,他的眼睛和右耳不動,當旋轉時,他的臉看起來完全是平的。
- 臉部變形并沒有完全把一些角色的嘴閉上。當我注意到這些角色的嘴的顔色和周圍的皮膚很接近時,我試着用更深的顔色重新畫嘴,結果發現變形人成功地把嘴全閉上了。這表明資料集偏向于嘴巴和皮膚顔色之間的高對比度。
- 嘴巴在第0幀完全張開,在第30幀完全閉合。在最下面一排,我嘗試重新畫嘴,以增加嘴和周圍皮膚的對比。它的結果是更好的嘴閉合,這意味着臉的形狀已經過度适合高對比度的嘴和皮膚顔色。
- 臉部變形修改圖像的區域不能與周圍的像素平滑地混合。它們可以被看作是閉着的眼睛和嘴巴周圍的圓圈,顔色比周圍的皮膚略深。然而,在從測試資料集進行3D渲染時,這個問題并沒有顯示出來,這表明它是由我的資料集和野外繪圖之間的差異造成的。
然後我觀察到我的效果圖看起來通常比圖紙暗,是以臉形态可能已經學會輸出更暗的膚色。為了測試這個理論,我改變了設定場景燈光和重新生成資料集的方式。這一次,我沒有将環境光強度設定為原本的參數,而是從區間[0.5,1.2]中進行亮度采樣,以便使大多數生成的圖像變得更亮。使用新的訓練資料集訓練的面部形态設法在不引入黑眼圈的情況下閉上眼睛和嘴巴。
(a)面部變形,在恒定的環境光下進行渲染訓練,往往會在閉上的眼睛和嘴巴周圍産生深色的圓圈。(b)使用具有不同環境光的渲染圖進行訓練可以緩解這個問題。
因為這些黑眼圈非常明顯,我使用了經過不同環境光訓練的面部形态來生成下一部分的所有結果。
其他效果
由于神經網絡以數字姿勢參數作為輸入,是以它可以用于任何産生這些數字的過程,例如它也允許通過GUI元素手動指定位姿參數。
位姿參數也可以從面部地标跟蹤器獲得。在下面的視訊中,使用了一個由dlib和OpenCV實作的跟蹤器來處理一個實時的網絡攝像頭的資訊,能夠讓角色模仿真人的面部動作。
這個系統還能應用到公衆人物的視訊中。
https://pkhungurn.github.io/talking-head-anime/原文釋出時間:2019-11-29
本文作者:大資料文摘出品;來源:github;編譯:李雷、劉俊寰、陳若朦
本文來自雲栖社群合作夥伴“
大資料文摘”,了解相關資訊可以關注“
”