



只要輸入一張靜態的老婆,就能讓她動起來,會張嘴會眨眼,還能東張西望,擡眼看天。彷彿成了3D老婆。
並且,你想讓妹子怎樣動,姿勢都可以定製。比如,渴望她一直對你wink,就調眼睛的參數:

這裏有一隻造福人類的AI,作者是名叫Pramook Khungurn的死宅少年。
此宅因長期沉迷虛擬偶像小姐姐,想到用深度學習自己做一隻,結果成功了。
他把喜訊發上Reddit,7小時熱度便突破200點。樓下有小夥伴發來賀電:
爲了科學!

完全無法反駁。
既然如此,背後的科學究竟是怎樣的?
靜態老婆動起來
我們先粗略瞭解一下,打造一隻虛擬老婆,原本是個怎樣的技術任務。

Pramook說,至少得有一個人物模型,ta的動作要能控制:
一種方法是做3D模型,有些虛擬偶像 (VTuber) 的確是這樣誕生的。只是比較貴,需要人物設計師和3D建模師,一人很難完成。如果是沒有藝術技能的普通人類,就更做不到了。
另一種是做2D模型,成本比較低,這種方法制造的VTuber更常見。2D人物的動作也會簡單一些。
於是Pramook明白了,2D老婆更容易獲得。但即便這樣,2D模型還是分成幾個可動的部分,建模師要把這些部分的動作整合到一起,依然非常耗時。
既然如此,作爲一隻合格的技術宅,當然要用深度學習,把手動2D建模的繁瑣步驟跳過去,直接用一張靜態圖,生成會動的老婆了。(至於靜態圖從哪來,有GAN可以直接生成啊↓↓↓)

少年打定主意之後,第一步就是要搞個數據集,纔好訓練算法:
自制數據集
這裏需要的是,標註好姿勢的臉部數據集。
如果是真實人臉,就有EmotioNet這樣的數據集可以用。但二次元應該還沒有這樣直接可用的數據集。
少年機智地想到,雖然自己要的是2D老婆,但訓練數據可以用3D模型來提取。熟悉初音的他,知道MikuMikuDance裏面有大量的3D模型,於是下載了8000多個虛擬人物。
這些人物的動作都可以控制,只要想到一個姿勢,就能渲染出一張這種姿勢的圖片來。

每個3D模型都可以得出成百上千張圖,8000多個模型合在一起,就是很大的數據集了。
一個訓練實例分三張圖,第一張是原圖 (直視前方) ,第二張是表情修改後的圖 (如閉眼/閉嘴) ,第三張是在第二張基礎上轉動了臉的朝向。

表情的變化,是由6個參數決定的:兩個負責眼睛開閉,一個負責嘴巴開閉,還有三個負責臉部轉向 (x、y、z軸) 。



數據集有了,算法又是怎樣的呢?
兩步走
一是表情變化器 (Face Morpher) ,二是臉部旋轉器 (Face Rotator) 。
表情變化器比較簡單,少年借用了中選ECCV 2018的GANimation算法:

原理是,把從原圖到第二張圖之間要發生的變化,用另一張圖表示出來。
然後用一個Alpha Mask,把這張圖片和原圖結合起來,就有了第二張圖 (Mask也是網絡自己生成的) 。
這個算法很適合用來修改圖像的一小部分,比如閉眼。

臉部旋轉器就複雜一些,用到了兩個互補算法。
其中一個依然是GANimation (下圖紅框) ,原本它只用來改變表情,但少年又讓它去做臉部旋轉了。
另一個是來自Zhou等人2016年的視角合成算法 (下圖藍框) ,用來讓圖片裏的3D物體轉起來。要做到這一點,網絡會計算出一個外觀流 (Appearance Flow) :它知道,輸出的每個像素,色彩是來自輸入中的哪個像素。

外觀流擅長保存原圖的紋理,生成精細的結果,但不擅長腦補旋轉之後才露出的部分 (如下圖a) ;
而GANimation生成的圖像比較模糊,卻能腦補出旋轉前沒有露出的部分 (如下圖b) 。

最後,把兩個互補算法輸出的結果合爲一體,用到的主要是U-Net結構。
現在觀看一下成果吧。
順利遷移
首先,既然AI是用3D模型裏提取的圖片訓練的,就先用3D模型的圖片測試一下:



3D考試順利通過。
那麼,輸入2D圖片也能行麼?試一下手繪圖:



AI依然沒有被難住,不論輸入的是彩虹社虛擬偶像的照片,還是用Waifulabs自動生成的新妹子 (上圖右) 。
不過,這還不算完。
還能怎麼玩
和一個面部追蹤算法搭配食用,就能讓妹子隨着視頻裏的人臉,做出一樣的動作。
比如,輸入一段奧巴馬的視頻,妹子就學着他說起話來:

大叔變老婆,一點也不難。這就是虛擬偶像的本質吧 (誤) 。
另外,視頻不一定要從網上找,也可以自己錄,作者Pramook已經試過了:

這樣,教二次元老婆用溫柔的表情,說出愛你的話,就可以順暢地戀愛了。要是找不到可愛的聲優,可以考慮一下谷歌娘啊 (誤) 。
一切就等算法開源啦。
論文傳送門:
https://pkhungurn.github.io/talking-head-anime/
— 完 —