音容笑貌,兩臻佳妙,人工智慧AI換臉(deepfake)技術復刻《卡薩布蘭卡》名場面(Python3.10)

2023-05-23 15:00:27

影史經典《卡薩布蘭卡》是大家耳熟能詳的傳世名作,那一首壯懷激烈,激奮昂揚的馬賽曲,應當是通片最為激動人心的經典橋段了,本次我們基於faceswap和so-vits庫讓AI川普復刻美國演員保羅·亨雷德高唱《馬賽曲》的名場面。

設定人臉替換DeepFakes專案

關於人臉替換,業內鼎鼎有名的deepfakes代表了這個人工智慧細分領域的最高水平,旗下的faceswap庫正好適合這種視訊二次創作的場景。

首先克隆faceswap專案:

git clone https://github.com/deepfakes/faceswap.git

隨後進入專案的目錄:

cd faceswap

確保本地已經設定好python3.10的開發環境

隨後在根目錄即可編譯安裝:

python3.10 setup.py

這裡的setup.py指令碼會自動判斷系統本地軟體環境進行依賴的安裝,如果想要手動安裝依賴,也可以通過pip命令:

For Nvidia GPU users: pip install -r ./requirements/requirements_nvidia.txt  
For AMD GPU users: pip install -r ./requirements/requirements_amd.txt  
For CPU users: pip install -r ./requirements/requirements_cpu.txt

這裡分為三種使用者,N卡使用者使用requirements_nvidia.txt,也是最主流的解決方案,其次是A卡使用者:requirements_amd.txt,最後是cpu使用者requirements_cpu.txt。

事實上,這裡並不推薦cpu執行專案,因為無論是訓練還是推理,速度實在是太慢了,就算是Intel最新的第十三代酷睿I9處理器,也是杯水車薪,更遑論蘋果的M系列晶片,吹得再牛逼,也只是送人頭的水平。

所以,玩深度學習,最低的要求就是手裡得有一塊N卡,不需要太高階,傾家蕩產買一塊3090或者是4090其實沒有任何必要,一塊相對親民的4050或者是4060足矣,當然,有錢任性則另當別論。

至此,faceswap就設定好了。

構建訓練集

讓我們再來回顧一下需求場景,現在需要將懂王的臉替換到《卡薩布蘭卡》中保羅·亨雷德的臉,所以我們現在需要收集兩張臉,即原視訊保羅·亨雷德的臉,以及替換者懂王的臉。

此時原視訊素材是存在的,即《卡薩布蘭卡》電影,而懂王的臉則需要在網上尋找視訊素材進行下載,這裡需要注意的是,素材中最好包含臉部的特寫,並且不包括其他人的臉,否則會在模型訓練環節產生「噪音」。

由於《卡薩布蘭卡》中還有很多別的場景,而我們需要的只是保羅·亨雷德高唱《馬賽曲》的面部特寫片段,所以需要對素材進行剪輯,這裡推薦使用ffmpeg,首先執行安裝命令:

winget install ffmpeg

接著將可執行目錄設定到系統的環境變數中:

C:\Users\[使用者名稱]\AppData\Local\Microsoft\WinGet\Packages\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\ffmpeg-6.0-full_build\bin

隨後通過命令將片段從原始素材中扣取出來:

ffmpeg -ss 01:34:00 -i 卡薩布蘭卡.mp4 -to 01:55:00 -c copy 保羅面部素材.mp4

這裡視訊素材就儲存好了。

接著利用faceswarp指令碼將素材轉換為面部的圖片集合:

python3.10 faceswap.py extract -i ~/faceswap/src/保羅面部素材.mp4 -o ~/faceswap/faces/paul

效果就是將視訊逐幀進行儲存,只保留面部資訊:

懂王的訓練集也如法炮製。

至此,訓練集就構建好了。

模型訓練

當訓練集設定好之後,下一步就是模型訓練,模型訓練是指使用已知的資料集對機器學習模型進行調整和優化,以便它能夠更準確地對未知資料進行預測,沒錯,所謂換臉,就是在處理預測問題。

執行命令,開始訓練:

python3.10 faceswap.py train -A ~/faceswap/faces/paul -B ~/faceswap/faces/trump -m ~/faceswap/mymodel/ -p

這裡A資料集為保羅的,B則是懂王,-m引數是模型的儲存目錄,-p引數則可以對模型效果進行預覽。

模型訓練過程中會不斷輸出損失率函數,一般情況下,訓練過程中損失率穩定在0.01左右代表模型已經收斂。

訓練過程中每隔一段時間會儲存一次模型,程式中斷後再次執行會在上次的模型基礎上訓練,訓練需要手動停止,訓練完後模型儲存在上面指定的路徑下。

這裡需要注意的是,模型訓練過程將會付出大量的時間成本,多長時間取決於許多因素,使用的模型,訓練集的數量,N卡等級等等。在GTX4060的GPU上大概5個小時左右損失率會相對穩定,如果在CPU上訓練,短時間內很難看到損失率下降。

本地推理

模型訓練完畢後,我們就可以使用模型來進行換臉的推理操作,這裡有個問題需要澄清一下,即我們訓練的不是通用模型,而是針對訓練集的模型,也就是說,這個模型只是為了將原素材中保羅的臉替換為懂王的臉而訓練的,並不是在任意素材中都能夠這樣替換。

因此,就算模型有過擬合問題,也不會影響最終效果。

所以,我們就可以直接使用訓練集資料進行驗證,執行命令進行推理:

python3.10 faceswap.py convert -i ~/faceswap/faces/paul -o ~/faceswap/faces/output -m ./mymodel/  

這裡使用模型針對原訓練集資料進行替換。

效果如下:

保羅英俊的面龐瞬間灰飛煙滅,懂王睿智的面容緩緩浮現。

相同的流程,將片中好萊塢巨星英格麗·褒曼的臉:

替換為漫威超級女英雄寡姐的臉:

臉型有些違和,但音容宛在。

最後,只須將《馬賽曲》的歌聲替換為懂王即可,請移步:AI天后,線上飆歌,人工智慧AI孫燕姿模型應用實踐,復刻《遙遠的歌》,原唱晴子(Python3.10) ,囿於篇幅,這裡不再贅述。

結語

看到這裡,相信很多朋友都不約而同地有了一些非常大膽卻又不太成熟的想法,但請記住,無論何時何地,網際網路都並非法外之地,當執行推理指令碼的那一刻,需要思考一下自己是不是真的很刑。在Youtube(B站)搜尋劉悅的技術部落格,即可欣賞復刻版本的《卡薩布蘭卡》,歡迎諸君品鑑。