以下人臉變換都是由AI經過訓練後生成:
小哥向你微微笑:
大叔秒變魅力高:
如花一起來相會:
鮮肉招展浪滔滔:
我要在唐朝,也許也是詩人吧。。。
言歸正傳,以上人臉轉換是通過如下過程得到:
- 使用CelebA數據集訓練一個VAE
- 使用第一步得到的VAE對訓練集計算出屬性向量,比如把所有男性人臉圖片輸入encoder,算出一個平均值,再把所有女性人臉輸入encoder,算出一個平均值,兩者的差就是男女屬性的向量
- 把原圖輸入encoder,把得到的向量減去(如果向相反的方向變化就加上)屬性向量,再輸入到decoder,就得到了屬性轉換後的圖片。
所有代碼保存在我的github項目seasonyc/face_vae,裏面對如何使用和源文件已經做了簡短說明,此處不再贅述。因爲有些文件是多個項目公用,所以一些代碼可能並沒有在VAE中使用。
爲了方便處理CelebA數據集,項目使用tensorflow和tensorflow內置的Keras,tf.dataset API創建數據源,tf.keras創建網絡結構並進行訓練。創建數據源時,先使用dataset.cache()把所有圖片源文件緩存在內存中,再實時解碼和進行一些預處理得到每一個mini-batch,通過多使用一些內存來減少硬盤的訪問,這樣可以縮短一半的訓練時間,另外這樣還可以得到更平穩的GPU使用率。當然,我的電腦仍舊是機械尋道的硬盤,如果使用固態硬盤,也許並不需要這般操作。有關使用df.dataset創建高效流水線以及更全面的深度學習性能指南,請參考DenseNet性能分析。
使用VAE很難得到比較好的效果,參見破解VAE的迷思,所以還請讀者關注本系列後續作品。。。