目前深度學習的應用已經深入各個方向,涌現了很多有意思的技術,尤其是最近很火的面部互換很有意思,本文將結合原理與代碼來進行一個比較簡單的入門介紹,分爲以下兩個部分:
原理
代碼
原理
Autoencoder
首先來看autoencoder結構,見下圖所示:
圖1. autoencoder結構
輸入(圖像)-網絡層-隱向量-網絡-輸出(圖像),即將輸入圖像通過網絡(encoder)編碼爲一個向量,然後再通過網絡(decoder)將向量解碼爲圖像,訓練的時候通常採用重構loss( 或 loss).
Training
圖2. 訓練過程
網絡結構可以看成包含兩個並列的autoencoder,只不過它們的encoder是參數共享的。訓練時,分別從A人物與B人物中取N張圖像,先將N張A人物人臉圖像輸入進網絡,得到A人物的輸出;再將B人物的N張人臉圖像輸入網絡,得到B人物的輸出。進行loss計算時,分別對人物A與人物B的輸出與輸入進行或者重構loss的計算即可。訓練若干次epoch之後即能看出效果。
Inference
圖3. 測試(使用過程)
測試的時候比較取巧,分爲以下四種情況:
- A===>A. 組合方式爲: 輸入A人臉圖像 + encoder + decoder A 的方式即可得到A的重構圖像
- B===>B. 組合方式爲:輸入B人臉圖像 + encoder + decoder B 的方式即可得到B的重構圖像
- A===>B. 組合方式爲:輸入A人臉圖像 + encoder + decoder B 的方式即可得到A與B的換臉圖像
- B===>A. 組合方式爲:輸入B人臉圖像 + encoder + decoder A 的方式即可得到A與B的換臉圖像
代碼
使用的代碼爲:https://github.com/Oldpan/Faceswap-Deepfake-Pytorch
裏面包含了很詳細的使用說明,抽幀+提取人臉+訓練+測試,這些操作都有。代碼寫的也很簡單易懂,這裏就不再詳細展開。貼一些訓練中的過程,可以有個直觀的感受。
0次迭代
100次迭代
10000次迭代
30000次迭代
50000次迭代
99900次迭代
每張圖像中由12列四組構成(每3列構成一組),分別表示不同的人臉,其中每一組的第一列表示輸入人臉圖像,第二列表示本人人臉重構(即輸入人物與decoder對應),第三列表示換臉結果。可以看出,隨着訓練次數的增加,本人人臉重構越來越精確,在達到一定訓練次數之後,換臉結果也較爲逼真。