(一)獲取人臉數(shù)據(jù)
需要準(zhǔn)備圖片數(shù)據(jù):兩個不同的人臉,各種表情,數(shù)量越多越好,約1萬張以上會有比較好的替換效果。
一般采用的方法是從視頻中截取,操作如下:
首先下載視頻(本例用風(fēng)行播放器下載)。

剪切視頻片段(本例用愛剪輯)。
因為目的是為了截取人臉部,所以剪切的視頻片段很講究。
視頻分辨率要高清(否則截取的人臉像素太低);片段中目的人臉比較大、突出、最好就是只有他自己一個人鏡頭特寫的視頻片段。

從視頻中截取圖片(本例用Ffmpeg軟件)。
此時得到有目的人臉的一張張圖片。
然后,需要刪除不需要的圖片(如有非目的人臉的,這就是數(shù)據(jù)清洗)。

然后寫幾行代碼檢測圖片中的人臉并截?。ɡ肙penCV)。

檢測并截取的人臉(用于輸入到神經(jīng)網(wǎng)絡(luò)中訓(xùn)練提取特征)。
人臉替換的效果非常依賴于這些截取到的人臉圖片的質(zhì)量:
如果截取的人臉包含了過多的干擾部分,那么替換效果就很差。
一直重復(fù)前面的步驟,直到獲取足夠多的人臉(兩個需要互換的人臉)。

然后再寫幾行代碼修改人臉圖片的寬高為統(tǒng)一大小,如256x256;
因為輸入到神經(jīng)網(wǎng)絡(luò)中訓(xùn)練的圖片寬高需要一致。

(二)進行模型訓(xùn)練
接下來,開始進行漫長的訓(xùn)練:
一般需要,一萬張圖片,訓(xùn)練100萬次,才有比較好的替換效果;
我計算了一下時間,普通i7-PC,訓(xùn)練一次約44s,100萬次需要運行約1.2萬小時,約500天;玩不起(本例訓(xùn)練了1000次)。
深度學(xué)習(xí)漫長的訓(xùn)練過程;
本例代碼是利用深度學(xué)習(xí)框架keras(backend is TensorFlow)構(gòu)建CNN;
訓(xùn)練完成之后,得到換臉模型;

(三)進行視頻人臉替換
?接下來進行視頻人臉替換;
?通俗點說就是通過提取面部的特定結(jié)構(gòu),如眼睛、鼻子、嘴巴的位置,顴骨、下巴、臉頰的形狀;
?然后按照這些特征點做替換;
?前面訓(xùn)練的模型,已經(jīng)有了兩個不同的人臉的特征;
?就目前了解的信息來說,通過深度學(xué)習(xí)替換人臉這一技術(shù)相對于工業(yè)使用的人臉表情提取技術(shù),優(yōu)勢是大大降低了使用門檻,但是遠遠還做不到以假亂真的完美效果;
接下來,仍然使用愛剪輯工具,從一段視頻,如電影中截取用于替換人臉的一個視頻片段;
截取的視頻片段也是需要精心挑選的:需要有利于檢測到被替換的人臉。
例如,截取的視頻中同時出現(xiàn)在鏡頭中人臉太多、人臉太小等都不利于檢測。

再利用ffmpeg工具,把需要被替換人臉的視頻按原幀速截取成每一張圖片;
注意:一定要按原幀速截取,否則后面替換人臉后再合成視頻會失幀。

接下來,利用神經(jīng)網(wǎng)絡(luò)進行人臉替換。
輸入數(shù)據(jù):上一步截取的每一幀圖片;
輸出數(shù)據(jù):人臉被替換后的每一幀圖片;

簡單點說,替換原理如下:
1.從原圖片中,檢測到人臉(用OpenCV),截取人臉部分;
2.把截取的人臉部分(人臉圖片)輸入到神經(jīng)網(wǎng)絡(luò)進行替換,得到一個新的人臉(圖片);
3.再把新人臉(圖片)替換原圖片中的人臉;
4.然后,進行圖片“消邊”、模糊等圖片處理;因為原圖人臉和新人臉,雖然尺寸一致,
但畢竟不是同一張圖片,新圖片(人臉)替換到原圖片之后,會有明顯的“邊”,無法
完全融入到原圖中,所以需要處理;這是數(shù)字圖像處理技術(shù)了;
5.如此重復(fù),知道每一張圖片的人都替換完成;
從上面的人臉替換原理可以知道,換臉效果受到以下幾個因素的影響:
?1、從原圖片截取的人臉(圖片)不能有過多的干擾像素。最理想的是截取的僅僅只有面部。
?2、訓(xùn)練的模型效果要非常好。這受到訓(xùn)練數(shù)據(jù)(圖片)的質(zhì)量、數(shù)量、尺寸大?。ㄔ酱笤胶?,但是會變慢)和訓(xùn)練次數(shù)(時間)的影響。
?3、要有很好的數(shù)字圖像處理技術(shù)。替換人臉后,新臉(圖片)不能很好與原圖背景(人物)融合的處理,包括“消邊”、模糊、融合等處理。
?4、要有很好的人臉檢測技術(shù)。因為OpenCV的人臉檢測功能準(zhǔn)確率并不是100%的,所以存在有某些幀(圖片)沒有檢測到人臉,那么就不會替換人臉。
(四)合成替換了人臉的視頻
?最后一步:把替換了人臉的每一張圖片(每一幀)按原來視頻的幀速合成視頻(用ffmpeg工具)。
?這就是整個視頻人臉替換的操作和原理。


(五)分析-總結(jié).
?從整個替換人臉過程、原理可以知道,最終的效果極大的受到人臉檢測技術(shù)、圖像處理技術(shù)的影響。
?在理想情況下,單從AI替換人臉這個功能來說,有足夠多的、高質(zhì)量的人臉數(shù)據(jù),足夠多次的訓(xùn)練,基于深度學(xué)習(xí)的方法替換人臉確實取得了很不錯的效果,如下圖:


上圖:特朗普基于原表情換成凱奇;下圖:反之;
?在整個視頻替換人臉應(yīng)用來說,除了通過AI替換人臉之外,還要受到訓(xùn)練數(shù)據(jù)收集、人臉檢測、后期圖像處理的極大影響,所以仍無法做到通用、實用。
?但是,也可以知道,如果基于某個非常必要的目的,因為單純的AI基于原表情換臉的效果還不錯,可以花時間、精力并掌握了圖像處理技術(shù)的話,理論上也是可以特定為某一段視頻換臉的。
(六)寫在最后
?突然發(fā)現(xiàn),通用的視頻換臉項目沒有做成,卻做了一個“視頻打碼器”。。。。。。
?在即將寫完本文章的時候,因為本人的不放棄精神,發(fā)現(xiàn)了“新大陸”,更新的替換技術(shù),很有可能會有更好的替換效果。接下來馬上進行研究,如果更好的效果,再寫一篇新文章,先定個題目:視頻換臉原理(進階)。
?最后,雖然吐槽不是很好的事情,但是偶爾輕微的吐槽一下就當(dāng)是記錄心情了:
?隨著研究這東西越久,越感覺像蚍蜉撼樹,大量高質(zhì)量的數(shù)據(jù)、強大的算力、枯燥的算法。。。。。。都不好弄啊。
?三年來,電腦不堪壓力第一次藍屏了,太慘了。

?完畢。