AI換臉實戰教學(FaceSwap的使用)---------第一步Extration:提取人臉。
2022-01-28 17:22 凍雨冷霧 閱讀(57808) 評論(4) 收藏 舉報市面上有多款AI換臉的方法,筆者這里節選了Github那年很火的開源項目FaceSwap:
(很早就實踐了,但是忘記記錄啦hhh,請勿用于不正當用途哦)
做了一篇詳細教學,包括配置,參數設置,換臉效果經驗之談。感興趣的學友可以留言一起交流。
先上成果展示下吧(垃圾顯卡跑了2天,有條件好的顯卡跑個1周估計效果會好一些):
左邊是替換后的效果,別告我侵權,求你了。。沒有商業用途。。


配置部分
ok,為了實現換臉,我們先從安裝到配置工具開始(配置好的請直接跳到第一步),以下請按步驟操作:
首先需要下載該項目,這里建議直接下載GUI版軟件:https://faceswap.dev/download/

然后是安裝:
第一頁選擇安裝地址,根據自己喜好。
第二頁需要選擇GPU或者CPU版。 有支持的GPU進行訓練當然是最好的,如果沒有的話只能CPU了(提取,訓練過程很慢)

{ PS: 如何查詢是否支持呢,
GPU版需要保證三個包是匹配的:
tensorflow-GPU, cuda,cudnn
首先,更新顯卡驅動:https://www.nvidia.com/Download/index.aspx?lang=en-us
其次,下載與GPU匹配的cuda:https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64
最后,下載與GPU匹配的cudnn: https://developer.nvidia.com/zh-cn/cudnn
最最后下載tensorflow-GPU
}
安裝好以后啟動,界面如下:

(landmark是68個點,提取生成的帶landmark和遮罩的文件格式是fsa,不是fsd,懶得重寫了,hh)
操作部分
第一步:
好的,我們開始第一步, extract的目的是:從視頻中的每一幀提取人臉,生成圖片集和一個fsa文件(帶landmark和mask的數據集),用于模型訓練的輸入。
什么是landmark?如下圖,是指算法識別出的每張圖片人臉邊界的68個點。

什么是mask?如下圖,是指算法識別出的每張臉的臉區,摒棄遮擋/背景/頭發等信息。

簡單來說,提取包括三個階段:檢測、對齊和遮罩生成:
- 檢測- 在框架內查找人臉的過程。檢測器掃描圖像并選擇圖像中它認為是人臉的區域。
- 對齊- 找到面部內的“landmark”并一致地定向面部。這會將候選者從檢測器中取出,并嘗試找出潛在面部的關鍵特征(眼睛、鼻子等)在哪里。然后它會嘗試使用此信息來對齊面部。
- 遮罩生成- 識別包含面部的對齊面部部分,并屏蔽那些包含背景/障礙物的區域。
1.1 Data模塊:

-
Input Dir:首先我們需要一個源文件。此處設置為視頻文件(視頻圖標)或包含一系列圖像的文件夾(圖片圖標)。
-
Output Dir:接下來我們需要告訴進程將提取的人臉圖片集保存到哪里。單擊旁邊的文件夾圖標以選擇輸出位置
-
Alignments:此選項用于為對齊文件指定不同的名稱/位置。建議留空,則生成的fsa文件會保存到默認位置,與源視頻名字相同(與源視頻/源圖位于同一位置)
1.2 plugins對應的設置如下圖:

1.2.1 遮罩
plugins模塊用于首先檢測圖像中的人臉、讀取人臉標志以對齊圖像并使用各種遮罩方法創建遮罩。
-
Detector, Aligner:檢測和對齊的算法,推薦使用S3FD作為檢測算法, FAN作為對齊算法 。(二者效果好,對顯卡要求高)
-
Masker:遮罩的算法。除了基于人臉landmark的遮罩之外,此處是另一種針對人臉區域的特殊遮罩(可不選,也可多選,好的遮罩算法有助于過濾掉遮擋物)。遮罩都使用 GPU,因此添加的遮罩越多,提取速度就越慢。
每個面具/遮罩都有不同的優點和缺點。(后面訓練和轉換的過程中若是基于神經網絡的遮罩進行訓練或轉換源文件時,建議此處選一個遮罩算法)
ps: 遮罩此處可不選,在步驟二中對fsa數據集優化后,在Tools里同樣可以補充再搞這個步驟。
遮罩算法對比:
- BiSeNet-FP,從面具中排除頭發和耳朵(默認設置):

- BiSeNet-FP,面罩中包含頭發和耳朵的(全頭訓練所需的頭發),可在界面上方的setting中找到對應的遮罩設置:


- Unet-DFL - 一種神經網絡掩碼,旨在提供大部分正面的智能分割。面具模型已經過社區成員的培訓。

- VGG-Clear - 一種神經網絡掩碼,旨在對大部分正面沒有障礙物的人臉進行智能分

- VGG-Obstructed - 旨在提供大部分正面的智能分割。面具模型經過專門訓練,可以識別一些面部障礙物(手和眼鏡)。

- landmark 68個點遮罩(不選也會有,真正的默認遮罩,有時候因為臉的不全原因,所以還是要加上上面的某1個或幾種遮罩):

-
PS: 默認landmark遮罩的其中一個主要大問題是這個算法僅會囊括檢測的臉眉毛上方,有可能會造成最終換臉兩重眉毛的效果,這也是以上這些自選算法遮罩的目的,能夠讓識別到眉毛上方的地方,避免這個問題。
1.2.2 歸一化
Normalization, 顧名思義,數據集的歸一化:歸一化可以在光照不理想的情況下更好地找到人臉。不同的歸一化方法適用于不同的數據集,實測的話推薦“hist”歸一化。選正則選項的話會稍微減慢提取速度,但對齊效果更好。
1.2.3 二次對準
Re Feed:此選項會將稍微調整過的檢測到的人臉重新送回對準器,然后平均最終結果。這有助于減少“微抖動”。 如果是用于訓練數據集,即第三步Training用,設置其為0,如果是為了轉換,設在0-8,反復提取可以實現精益求精用,但是會慢很多),效果也截一個。
下圖顯示了 re-feed 設置為 8(左)與 re-feed 設置為 0:

1.2.3 旋轉圖像
Rotate Images:針對 CV2-DNN !,可能會無法識別旋轉后的人臉。其他對齊算法選這個會降低速度,毫無收益。
1.3 人臉處理

Min Size:設置一個高于零但比較低的值,用以過濾掉明顯太小而不能成為臉的東西。(取決于源視頻中人臉的大小,比如都很小,那這個值確保比源視頻中的常見臉的尺寸要低,比如一個電影片段,鏡頭里除了需要提取的主人公的臉,旁邊還放有一本書上,書有人臉,這個值就是卡掉書上的這個大小的人臉,確保不算在內)
Filter/nFilter, Ref Threshold:這倆選項用于過濾掉不需要的臉。什么意思呢,就是針對性的要誰的臉(Filter選一張照片),或者針對性的不要誰(Nfilter上傳N張你不想要檢測到人臉的照片,記住是每個照片必須只有一個人臉,可以傳多張,用以屏蔽多個人)。Ref Threshold用于取決于判斷的嚴格度,就是拉到1的話就很松,越低就越嚴,相當于你想要的監考老師的分數,嚴的就很難受,分數就低。
PS: Filter/nFilter, Ref Threshold這部分可以不上傳圖,靠第二步的tools相關功能去篩選不想要的臉,根據官方FAQ的說法,用TOOLS在第二步中處理效率更高,因為如果使用了這個過濾器明顯的會降低提取速率。
1.4 輸出設置

Size: 提取圖像的大小,通常 512px 對于大多數模型來說都可以(全頭提取圖像的大小),這個就是神經網絡的輸入圖片像素,不同算法可能僅支持固定格式的輸入圖片大小。比如對于“面部”居中,模型可用的圖像大小將為 384 像素。使用“傳統”居中進行訓練時,可用的圖像大小為 308 像素。
Extract Every N: 這個選項意思是,多少幀提取一個臉,我舉個例子,一般的25fps的視頻,有可能25幀每一幀的變化很小,那么就是提取了一堆相似的廢物數據集,實際上每12-25提取一次就行(大約是半秒到1秒,也就是你換個表情和表情變化怎么也得半秒,不信的話你自己試試。。。)
Save Interval: 保存間隔,隨緣吧,多少幀保存一次。默認就行,默認就是全搞完了一次性存下來。
Debug Landmarks: 在提取的臉上調整landmarks(做事真就這么細?,正常不勾選)
1.5 設置,全局設置
Settings: 不解釋了,跳過已有的(指當前fsa文件中),跳過已有的臉(指當前fsa文件中),跳過已保存過的臉
Exclude Gpus: 哪個CPU你不想在跑的時候使用, 你如果全勾選了(說明你不想用任何GPU),會變成CPU模式??
Configfile:載入一個配置(就是剛剛設置的這些玩意可以保存,下次直接載入就行)
Loglevel: 日志類型,默認就行。選debug會有報告(你愿意看的話),選TRACE會有一大堆數據生成??
Logfile:log存放地址路徑,留空默認生成在faceswap的目錄下。
以上選好的話,

第一步,完成。
下一章教大家如何利用tools模塊里的各種工具。
{
Alignments:排序,刪臉,提取,重命名
Effmpeg: 視頻組裝合成
Restore:恢復訓練的模型
Mask: 添加遮罩
Sort:排序
Preview:交換效果預覽
)
第二章Tools部分月內更新吧,反正也是自己看的。。
最后,操作流程的任何問題都可以在官方FAQ中找到,貼個地址,真有問題,去社區發帖問或者留言探討~
https://forum.faceswap.dev/app.php/faqpage

浙公網安備 33010602011771號