都是第一次玩DeepFakes

2020-11-13 18:01:34

欄目介紹DeepFakes。

目標

之前沒碰過DeepFakes,突然想發B站視訊玩兒一下。試了試還挺麻煩的,這裡記錄一下自己踩的坑。

本文的目標就是將The Singing Trump的視訊換成我們的川建國同志。

最後效果:

視訊連結:https://www.bilibili.com/video/BV12p4y1k7E8/

環境說明

本文嘗試的環境為linux伺服器的環境,因為跑得比較快吧。

Python環境:Anoconda python3.7版本

GPU:K80, 12G視訊記憶體

DeepFake版本:2.0

其他工具:ffmpeg

素材準備

首先需要準備一個或者多個The Singing Trump的視訊,以及川建國同志的視訊。用作換臉素材。

視訊切分

首先通過ffmpeg將視訊素材切分成多個圖片。

mkdir output
ffmpeg -i 你的視訊.mp4 -r 2 output/video-frame-t-%d.png複製程式碼

這裡視訊不一定要mp4,其他格式也行,然後 -r 2表示是2幀,也就是每秒鐘採集兩張圖片,各位可以按照自己的視訊嘗試。 最後是輸出到output資料夾裡面,字首隨便定義就好了,名字也不是關鍵。

這裡最好多找幾個視訊,因為deepfake會提示要保證人臉個數大於200張才會比較好,我這裡分別準備了3個視訊,一共6個視訊。

ffmpeg -i sing_trump1.mp4 -r 2 sing_trump_output/st1-%d.png
ffmpeg -i sing_trump2.flv -r 2 sing_trump_output/st2-%d.png
ffmpeg -i sing_trump3.mp4 -r 2 sing_trump_output/st3-%d.png複製程式碼
ffmpeg -i trump1.webm -r 2 trump_output/t1-%d.png
ffmpeg -i trump2.mp4 -r 2 trump_output/t2-%d.png
ffmpeg -i trump3.mp4 -r 2 trump_output/t3-%d.png複製程式碼

弄完了還挺大,亂七八糟加起來3.7個G。

clone程式碼+裝依賴

這裡沒啥可說的,從github上下程式碼。

git clone https://github.com/deepfakes/faceswap.git複製程式碼

然後根據自己的實際情況裝環境,我這裡是現在PC上裝cpu這個,然後在伺服器上裝nvidia。

抽取臉部

接下來將所有的臉部抽出來。

python3 faceswap.py extract -i trump_output -o trump_output_face
python3 faceswap.py extract -i sing_trump_output -o sing_trump_output_face複製程式碼

這裡抽完了臉就是這樣了。

篩選臉部

接下來需要手工把我們不需要的臉都刪掉。

修改alignment

在我們呼叫extract生成臉部時,會自動生成一個校對檔案,用於在原圖上儲存臉部的資訊。刪除臉部之後,需要將臉部和原圖片進行對齊。

這裡可以開啟gui工具

python3 faceswap.py gui複製程式碼

然後選擇Tools下的Alignments。

接下來選擇Remove-Faces,然後輸入對齊檔案路徑,臉的路徑,以及原圖的路徑。

然後點選綠色按鈕開始,執行即可。

然後將sing_trump_out也執行同樣的操作。

開始訓練

接下來就可以開始訓練了,-m引數為儲存模型的位置。

python3 ./faceswap.py train -A sing_trump_output_face -ala sing_trump_output/alignments.fsa -B trump_output_face -alb trump_output/alignments.fsa  -m model複製程式碼

小問題

這裡如果用gpu的話,我發現tensorflow2.2開始要用cuda10.1以上,但我這邊兒沒法裝,所以需要用tensorflow1.14或者tensorflow1.15,這就需要deepfake的1.0版本才能用。

github.com/deepfakes/f…

訓練截圖

我發現faceswap1.0和master分支的操作是一樣的,沒太大變化。

我這裡的速度大概是2分鐘100個step。

轉換視訊

準備視訊幀

首先要準備我們要轉換的視訊,然後把視訊切分,這裡就不是按照之前的幀數了。

ffmpeg –i sing_trump2.flv input_frames/video-frame-%d.png 
複製程式碼

這裡我的視訊是1分41秒。

轉換完了大概有3050張圖片,也就是差不多30幀的,然後一共7.1G(mac就256G真的有點兒遭不住)

再次對齊一遍

接下來,需要對我們要轉換的視訊圖片再來一遍人臉對齊,首先抽臉。

python3 faceswap.py extract -i input_frames -o input_frames_face複製程式碼

然後再把多餘的臉刪掉,像前面的步驟一樣的操作用gui工具選擇Remove-Faces,然後進行對齊。

對每一幀進行AI換臉

通過convert命令進行轉換

python3 faceswap.py convert -i input_frames/ -o output_frames -m model/複製程式碼

我這裡的速度大概是每秒1張圖片,不過真正的臉只有600多張,如果臉比較密集的話我估計可能沒有那麼快,所有的圖片轉換完大概是5分多鐘(這個gpu當時有別的程式在跑真實可能會更快一點兒)。

效果

訓練20分鐘後

在訓練了1200step之後,大概是這個樣子,效果看著還不是很好哈,不過已經有點兒意思了。

訓練一個小時後

訓練一天以後

把圖片合成視訊

最後通過ffmpeg把圖片合成一個視訊。

ffmpeg -i output_frames/video-frame-%d.png -vcodec libx264 -r 30  out.mp4複製程式碼

這裡合併完了我發現是2分鐘,不過影響也不大,畢竟後面還要進行剪輯,用PR等軟體再編輯一下就好了。

總結

看視訊可以發現當臉比較小的時候,faceswap並沒有識別出來臉,所以也就沒有做替換,還是有點兒遺憾。

個人感覺整個deepfake的最費時間的流程其實就是在刪掉多餘的臉上面。

相關免費學習推薦:

以上就是都是第一次玩DeepFakes的詳細內容,更多請關注TW511.COM其它相關文章!