AI換臉項目faceswap研究報告

緣起

deepfakes是利用AI技術換臉的開源項目,目前基於deepfakes的開源項目很多,而faceswap認可度很高,到目前爲止有28.5千Star,可以說是換臉這類項目最火的了。小弟在當下有換臉需求,選取了這個項目進行研究嘗試,將自己的經驗和體會記錄下來,希望對你有所幫助!

感謝公司、領導、一切關心支持我的人!

效果

先上一些效果,增加一些趣味性!

官方換臉效果1

官方效果2,小紮在國會舌戰羣儒的場景

第一次嘗試換臉,演講者左右換姿勢,似乎是爲不冷落兩邊的觀衆

另外一個換臉後的效果

嘗試了很多此換臉,不在此一一列舉。

+++++++++++++++++++++++

準備

需要一塊好的nvidia顯卡,最低是1080或以上,衆所周知,機器學習是費時的,一塊好的顯卡可以幫助你節省大量的時間,我用的機器配置了4塊TITAN xp顯卡,這個項目訓練時大部分小弟用到其中兩張顯卡,在訓練villain模型時,用到了其中三張,villain很喫顯存,基本上一天可以訓練出一個比較清晰的模型。

如果只有CPU,我建議還是放棄嘗試,據說訓練時間是以周爲單位的,訓練出一個結果,可能需要數週,那就需要極大的耐性。訓練中你機器CPU100%的被燒數週,不能幹其他事情。而訓練一個模型可能並不讓人滿意,每次調整參數,又的繼續等待數週。大概你周遊完歐洲各國後,回家一看結果還沒出來!

如果在linux上運行程序,需要一些ffmpeg知識、一些shell腳本經驗

該項目在windows上可以直接運行圖形,我只有ssh命令行連接的ubuntu服務器,所以自己寫了寫腳本來處理,很羨慕GUI版本

後來突然領悟可以在我的mac筆記本上運行圖形界面,用來查看配置選項。

圖形界面是這樣:

能運行圖形界面操作起來更方便,但是如果像我一樣在服務器上通過ssh登陸,也無妨。

在本地調整好參數,同步到服務器上就行啦。

安裝好CUDA 10.0  和 anaconda,這個到處都是教程,在此不累敘。

安裝faceswap

下載項目https://github.com/deepfakes/faceswap

需要注意的是這個項目經常更新,有時可能不穩定,所以我clone了一份在自己的github裏https://github.com/hnjiakai/faceswap ,幸運的是我用clone的這個版本,訓練和轉換等整個過程都很順利,沒有出現論壇裏討論的各種奇奇怪怪的問題。

1、利用conda創建好運行faceswap的虛擬環境

conda create -n face tensorflow=1.14 python=3.6

2、切換到虛擬環境

conda activate face 

3、安裝依賴環境

pip -r requirements.txt

conda install opencv 

這些其實已經完整99%的安裝,剩下1%用到時提示缺少可以用conda install xxx安裝。詳細的安裝過程可以參照https://github.com/deepfakes/faceswap/blob/master/INSTALL.md

人臉資源準備

A人臉,以後簡稱A臉,從需要變臉的視頻中得到,我用ffmpeg將視頻A轉換成圖片到A-src文件夾,然後利用faceswap抽取人臉到A-desc文件夾爲後續訓練做準備。

B人臉,以後簡稱B臉,從另外一個視頻中得到,同樣用ffmpeg抽取幀B-src文件夾,然後利用faceswap抽取人臉到B-desc文件夾。

抽取的配置圖:

抽取人臉的配置截圖中,紅框部分做調整就可以,其他默認就OK

1++++抽取幀的ffmpeg命令

ffmpeg -i a_movie.mp4 -qscale:v 2 -f image2 -r 1 zhubo-src/img_%d.jpg

更多ffmpeg用法請看https://blog.csdn.net/jiakai82/article/details/103288726

2++++利用faceswap抽取人臉圖片

A臉提取

faceswap.py extract -i A-src -o A-desc -D s3fd -A fan -M extended 

其中-M extended我選擇是增強,其他參數選擇默認就行,我嘗試了很多參數,走了不少彎路,最後發現這個最適合我

B臉提取

faceswap.py extract -i B-src -o B-desc -D s3fd -A fan -M extended 

抽取時的截圖:

最下方會顯示抽取進度,可以看到當前進度8%。

實際操作過後,抽取思路其實比較清晰了,有上面這些其實已經夠啦。

在抽取過程中您仍然可能碰到各種問題,可以在下面連接裏獲取更多信息

最全的人臉抽取指導在這個https://forum.faceswap.dev/viewtopic.php?f=5&t=27

個人覺得-M extended 選項最有用,可以根據自己需要調整extended或者是其他,剩餘的選項其實大多默認就行

extended增強模版,用意在儘量包含眉毛。

A-src A-desc B-src B-desc 這四個目錄最好換成你的工作目錄路徑,便於管理

我的某個模型的工作目錄大概這樣

目錄文件一目瞭然,train.ini放置的是本模型訓練的配置文件,my_conf.sh放置的是訓練時的命令行參數配置信息,

train75-original,75表示的是比例、original表示的是模型插件名。

我使用的人臉全都是正面的,項目需求是這樣安排的,視頻中始終只有一人,所以不用考慮人臉清理等操作,也節省了不少時間。

下圖是需要換臉的A臉其中的一張

A臉我大概收集了5000張,是從一段3分鐘視頻中截取

下圖是B臉圖片其中的一張

B臉圖片大概也收集了5000張,同樣是從另外一段三分鐘視頻中截取。

人臉準備很快就說完了,其實爲了整理人臉,費了不少時間,包括人臉視頻選取,下載處理,美容等。

在沒有美容前,B臉偏暗,是這樣的:

訓練出來的結果總是灰頭土臉,後來提亮膚色後,好很多。

參數調整

現在人臉圖片已經準備好了,接下來就是準備訓練train了。

train的最全指南在這裏https://forum.faceswap.dev/viewtopic.php?f=6&t=146

+++++++++++++++++++++++++++++++++++++++++

用默認參數完全可以開始訓練了,但是考慮到訓練是個漫長的過程,在調整好你想要的參數後再訓練,可以節省無謂的時間浪費。

train的參數大概有幾十個吧,這麼多參數各種組合起來數量還是很多的,如果都要實驗一遍的話,可以玩很久。

+++++主要參數

train的參數有很多,包括Plugins部分的參數(Configure Train Plugins )和train階段時用到的命令行參數,大部分參數其實默認就挺好,有些特定參數,做些調整,

從而可以訓練出更好的結果。

首先說下Plugins參數

Global部分,最有調整性的是Coverage,我嘗試了很多,從62%到100%都有,最後得出結果是68%到75%之間的效果最好

Coverage並不是越大越好,自己可以嘗試調整。

MaskType用none,其他我也有嘗試,但是並沒有什麼進步,還是回到none。

Train Plugins之model標籤:

我最常用的是original和villain,GPU內存夠用就沒勾選 lowmem。

下面這些選項可以根據自己需要調整,我基本不調整他

下面是命令行參數選項卡

我更關心紅色部分,這是些主要的選項

各個選項都很好理解,其中WriteImage可以將圖片中間結果保存,可以隨時查看訓練結果,覺得滿意啦就可以停止訓練

圖片是這樣的:

在選擇好你的參數後,將faceswap項目目錄下的config裏的幾個.ini文件,拷貝到服務器上,如果是本地訓練可以忽略

點擊generate按鈕,會生成命令行,可以粘貼到服務器上運行,如果是本地直接點擊train按鈕運行

訓練

上面已經開始訓練了,訓練中可以隨時查看faceswap目錄下的training_preview.jpg文件,覺得不錯就可以停止。

重要的事情再說一遍,看到training_preview.jpg文件,效果不錯了,就可以停止了

++++++++並不是迭代次數越多越好,也不是看lose越小越好

肉眼直接看training_preview.jpg圖片是最好的方法

model文件夾裏的文件結構

如果中間訓練時出錯,無法繼續訓練,可以通過.bk文件還原

爲了防止過分迭代,比如,可以加入-it 100000,迭代10萬次會自動停止

接下來是個漫長的過程,時間長短取決於你的GPU性能。。。。。。。。。。。。。。。。

轉換

在覺得訓練結果已經不錯,或者想看看結果如何,都可以停止訓練,開始轉換人臉,就是將A臉換成B臉

train是個很重要的過程,有很多參數,convert也同樣挺重要,也有很多參數,不同參數影響結果也挺大

conver命令行參數:

在嘗試很多參數變更後,最後回到調整紅色部分的主要參數

ColorAdjustment 主要調整avg-color和seamless-clone

ColorAdjustment如果支持組合模式,我覺得可能更完美些,已經向作者提出建議

++單純用seamless-clone五官抖動厲害,單獨用其他的融合很不完美

seamless-clone效果圖:

不用seamless-clone效果更不好

MaskType主要用到extended和predicted

extended能解決眉毛問題,但是下巴有問題

predicted眉毛有問題

++extended能夠將眉毛包含覆蓋,predicted要差些,眉毛總有問題

++++如果換臉時有多人,可以用排除法,或者包含法,避免替換了額外的人臉。

我嘗試很多組合,大概訓練了2位數那麼多的模型,花費了無數時間,但是始終沒找到完美的組合!

這些模型佔用磁盤達到383GB,GPU在日夜不停的訓練

所以我覺得,faceswap完成完美的替換在某些情況下還是比較困難的。

faceswap有很多參數可以選擇,可玩性很強,可選很多,容易陷入選擇泥團。

雖然有不完美但是faceswap是個不平凡的項目!

合成視頻

轉換後的圖片,我通過ffmpeg合成視頻,暫時沒考慮語音,語音也可以通過ffmpeg後期合成

"ffmpeg -i ./converted-$convert_name/img_%0d.png -c:v libx264 -vf "fps=25,format=yuv420p" convert-movie-$convert_name-$dname.mp4"

合成了文章開頭那些視頻

+++++++++

總結

這次換的有瑕疵,原因有多種可能:

第一、可能是選擇的AB膚色有關係,圖片中女性臉都非常白,稍有差池就能看到暇疵,我覺得膚色比較黑的可能更好;

第二、可能也和算法有很大關係,期待作者出更完美的算法,包括在學習部分和臉部融合部分,在convert階段,如果支持多種融合的組合,比如semaless-clone加vag-color組合,等,效果可能更好,我以向作者提出這個建議,他們考慮會加上,但是可能時間比較長;

第三、可能是要找到適合AB臉的參數,需要更多的嘗試,比較費時,每個換臉的參數可能都不同;

第四、可能是人臉始終是正臉,光影很單調,我覺得如果是經常左右動的臉(有些演講人會),可能更好些;

機器學習是個學習過程,沒有完美答案,也不能1+1=2那麼直接,更多是概率,這次沒成功可能下次會成功。

時間有限,關注那些重要的參數。

小弟接觸換臉時間不長,能力也有限,希望大牛不吝賜教,萬分感謝!

感謝

感謝公司、感謝領導、感謝一切關心支持我的人!

後記

期待faceswap的進步,讓換臉更完美!

近聞微軟和北大搞出了個新的換臉算法,https://mp.weixin.qq.com/s/gGCyMq4PM_Whv-Ssiwt-HA,據說可以秒殺faceswap!目前只有論文沒有代碼,希望有大佬可以開發出來並開源,造福萬千程序員!

 

免責聲明

文中人物圖片來自網絡,如果有侵權行爲,請留言作者刪除。

 

全文結束

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章