Rethink Deepfakes,淺談深度學習落地

雷鋒網 AI 科技評論按:本文為兔子老大為雷鋒網 AI 科技評論撰寫的獨家稿件,未經許可禁止轉載。

最近關於生成模型有兩件事情得到廣泛的討論,其一是 Nvidia 的基於風格的 Style GAN 生成足以以假亂真的人臉高清圖(1024x1024)[1],另一件就是一篇論文 DeepFakes: a New Threat to Face Recognition? Assessment and Detection[2] 表明了 DeepFakes 生成的假臉足以欺騙大都數較為前沿人臉識別和檢測系統。藉著這兩件事,誕生於 2017 年末的,后又被封禁 Reddit 討論區的 deepfakes 再度進入我們的視野中,那麼時隔一年,deepfakes 此刻又取得了什麼進展?

除了 Deepfakes 外,另外一個熱點話題就是關於深度學習在工程上的落地問題。

本文希望通過 deepfakes 從初版到現在版本的演變,來思考一下深度學習的落地和發論文之間,存在着什麼差異。

什麼是 Deepfakes,原理是什麼?

在 Rethink Deepfakes 前,先回答一個可能初次接觸 Deepfakes 都可能會有的問題,為什麼要這樣設計,而不是使用 Cycle GAN?

看一幅圖(圖一):

此圖為 Cycle GAN 在同樣數據集(Trump,Cage)上的實現效果,其中第一列和第三列為輸入,第二列和第四列為相對應的輸出。

對於 successful example,生成圖像清晰,轉換是全局的轉換(Deepfakes 是局部的轉換,這一點後文會說),而對於 failed example 則問題比較多:

首先顯著的一點是表情不能一一對應,其二是出現混雜無意義的像素。

對於第二點,其實 Deepfakes 也會有,Deepfakes 作為一個工程項目有一定的手段來應對這一點,但第一點是一個 fatal error,如果表情神態都無法保證對應,輸出再清晰也毫無意義。

至於為什麼會造成這個原因,在介紹 DeepFakes 後會給出我的解釋。

我們得知 CycleGAN 在這裡的局限,CycleGAN 保證了語義上的轉變,卻沒法保證一些細節問題,接下來介紹 Deepfakes 的初始結構。

首先,DeepFakes 的整體架構是 denoise autoencoder,作者做出了一個假設:對於任意人臉 A,經過仿射變換后得到 WA ,其中 WA 等價於任意一張臉,即任意一張臉都是 A 扭曲而來的,所以如果網絡能學會從 WA 去噪修復至 A,那麼網絡就能將任意一張臉轉換成 A。

而在網絡結構的設計上,作者也應該花了一番心思。其在編碼器中採用全鏈接層破壞了之前卷積層提取的特徵內的空間關係,讓每一個像素之間都充分運算,而在解碼器中採用 PixelShuffler 結構亦是如此考慮,在 [3] 中,有知乎用戶提出,如果省略這些結構,該模型會退化成 AutoEncoder,得不到想要的結果。

整體網絡共用一個編碼器,分用兩個解碼器的目的是讓編碼器學習到更豐富的臉部特徵,把不同的人臉都編碼在同一個隱空間上,再通過不同的解碼器用不同的方式「重構」回來。

圖片來自[4]

不過有趣的是,乍一眼看過去,無論是假設和設計都獨出心裁,但在 2017 年末設計的模型竟然沒有用到一些在 CV 領域內常見的設置,比如殘差結構,甚至是連 norm layer 都沒有使用,也沒有把圖像縮放到[-1,1],而是[0,1],有相關文獻提出,殘差和 norm 都能起到平滑 loss 曲面的作用,後續的改進更改了這三點,有助於模型的收斂。

原版 DeepFakes 的輸出效果如圖所示:

 

第一列和第四列為原圖,第二和第五列為重構結果,第三和第六列為換臉結果,可以觀察到,deepfake 原版轉換中人臉的表情細節得到了保留,但比 GAN 生成的結果要模糊。

成因分析

1. 對於 CycleGAN 的結果,我們可以分析其 loss,CycleGAN 是如何衡量 A 轉換到 B 的?沒錯,對抗損失。無論是 KL 散度,JS 散度……都是衡量兩個分佈之間的距離。由基本的概率論知識我們可知,當 X,Y 同分佈的時候,我們指 X,Y 在概率上具有相同性質,如 EX=EY,但不能得到 X=Y,這就說明了 GAN 具有很強大的」創造力「。同時,當數據量不夠時,GAN 的訓練是有問題的(因為數據不能很好的代表分佈,容易發生崩塌到生成某個特例上)。在數據集中,cage 具有較少側臉數據,而 trump 則相反,故 trump 側臉轉換時基本都是失敗。如圖一第三行,第一二列。

同樣的問題,在 cyclegan 應用於馬和斑馬的轉換的過程中,也可以觀察到。

而這些問題,在使用 MSE 和 MAE 這種逐像素誤差作為優化目標時,可以得到緩解。

2. DeepFakes 也並非完美,其一是因為使用 MAE 作為 loss 具有均值性,會導致圖片模糊。其二,WA=任意一張臉,這個假設是有局限的。

第一點,將男臉 A 換成女臉 B,比女臉 A 換成女臉 B 先天要困難。

第二點,這個假設局限了只能在五官周圍一部分進行轉換,且人臉對齊與否,仿射變換的參數都會對結果造成影響。改進版的 DeepFakes 每一個模型插件都對應不同的仿射變換參數,且花費了大量的功夫對人臉進行預處理。而 cyclegan 對預處理的要求沒有這麼高。正是因為只能在局部進行變換,且原模型的生成圖片大小固定在 64x64,因此生成後幾乎必然還要做一次 resize,原本模糊的人臉會進一步模糊。

第三點,這一點則完全是對數據的理解能力了。在美圖橫行的時代,若只考慮五官數據,部分女星的人臉數據五官部分區分度極低,造成效果令人不滿。

改進

在分析問題后,首要也是最為容易解決的問題就是清晰度問題。

對於生成圖片的清晰度問題是因為 MAE 的均值性,這一點我們可以通過引入 GAN 來進行解決,目前在 [4] 作者引入兩個 Discriminator,分別對應於 AB 圖片,如同 cycleGAN,甚至引入了 cycle consistant loss,而在官方的項目中,作者像在 pix2pix 中,一樣引入了 conditionGAN,除了判別真假,還能判別是否配對。

 

而在我的實驗中,因為已經判定 deepfakes 是一種 denoise autoencoder 的思路,所以只需引入一個 Discriminator,用於補充生成圖片的細節,而不考慮 A 與 B 的差異。如同其他 SR 和 denoise 的任務一樣。 這樣得出的結果在視覺上是相仿的,一來可以省點參數,二來如果 A 和 B 任一個的數據量不大時,其實這樣會使訓練更穩定。 其中特別指出的,gan 雖然會使得圖像變清晰,但並不能保證細節和原圖一致,這就涉及兩種應用場景。更注重視覺效果還是更注重細節恢復,顯然 Deepfakes 是前者,所以引入對抗,是可以接受的。

可以看見 GAN 得到的結果要比沒有 GAN 的結果更為清晰,但同時亦有另外一個問題,當 A 沒有鬍子時,B 的訓練樣本具有鬍子時,GAN 會抓取到 B 具有鬍子的特徵,在 A 轉換 B 時,會自動加上鬍子。如果 AB 任一方具有眼鏡,而另一方沒有,那麼轉換效果亦然。

為什麼要提這一點,因為雖然從常識理解,GAN 這種"添油加醋"是不正確的,但事實上,我們不妨從人類自身出發,以人類感知來說,我們是如何判別 A 是 A?

很簡單,相比五官,這個人是否有鬍子,眼鏡,髮型也同樣重要,其實五官單拿出來,對人來說辨識率其實不高。如果是全身照,身體的體態也同樣重要,那麼如果一個常年以有鬍子的形象示人的人,你看到他沒鬍子的形象,反而感覺違和了。所以 GAN 從數據中抓取主要特徵,導致多了鬍子,其實不是什麼主要問題,更重要的是解決視頻轉換中,鬍子這種特徵會在某一幀中突然丟失,產生的違和感要更重一些。

為了解決這點問題,在 [4] 中以及 DeepFakes 的官方更新中,都採用了 Mask 機制。Mask 網絡和生成網絡共享編碼器和解碼器除最後一層外的其他所有層,最後一層生成一個數值範圍 0~1 的 Mask,假設生成的圖片記為 G,原圖為 S,那麼最後採用的圖片為

通過這個方法,讓模型自己學習圖像需要轉換的部分。

圖片來自於 [4] 的項目主頁

關於 GAN 的架構再談多幾點,曾經我也有過疑惑,目前這麼多圖像轉換或圖像編輯中,為什麼更多的是用 StandardGAN 的 loss,而其他無論理論和結果都很漂亮的 GAN(如 WGAN-GP,SAGAN)卻很少用到。而經過一番討論后得到的結果便是,這些 GAN 帶來的差別,不如在論文中貼一張好看的圖。結果令人無語,但很現實。

這一現實可能有以下幾點原因:

1.任務類型不同,目前發現驚人成果的 GAN,多是在隨機分佈生成圖片,而圖片轉換多是在 encoder-decoder 的結構下改進,後者比前者多了一個 encoder 對圖像進行編碼,額外的先驗信息可能降低了對生成器的結構的依賴。

2.GAN 評價本身存在局限。

在知乎中有知友在 [5] 和 [6] 中指出了 IS 和 FID 兩種評價的不足,GAN 作者本人亦提出新的評價 GAN 的方法,但並沒有引起多大反響。

在我看來,不同的 GAN 肯定是有差別的,但至少在圖片視覺效果上沒有到非應用另一種 GAN 不可。

在 [4] 中作者引入了 self-attention 機制,即 SAGAN,且 self-attention 的層數比 SAGAN 要多,而在官方的改進版中,並沒有引入這一點,我按照 SAGAN 的結構,加入 self-attention,得出如下的生成結果:

 

可見,相比引入 self-attention 和 SpectralNorm 帶來額外的計算量,SAGAN 並沒有給 Deepfakes 帶來足夠的優勢。

在探討完 loss function 對清晰度的影響外,來談談影響清晰度的另外一個因素,尺寸問題。

尺寸的問題很簡單,現在生成模型連 1024 的圖像都能生成,高清人臉不是問題。但在這裡想大家思考一個問題,DeepFakes 真的需要生成一張高清人臉嗎?或者是什麼時候需要?

在前面簡述 Deepfakes 的原理時,我們提到,最好不要除去全連接層,那麼此時增加圖像尺寸,必然會導致全連接層的參數暴增,導致延遲用戶在自己數據集上遷移的時間。

我們需要準確認識到尺寸在 DeepFakes 對應用場景上的影響,市面上換臉的場景大概可以分為兩種,第一種是如之前「軍裝照」,這屬於單張照片的換臉,另一種是合成視頻影像。

前者,人臉多佔圖像的絕大多數部分,這時產生高質量的人臉是重要的。後者中,人多是以半身照出現,人臉的分辨率對感知影響不大,而此時產生高分辨率圖像后,還需 resize 會低分辨率,同樣會造成細節的損失。

數據質量對 DeepFake 的影響

在數據挖掘和機器學習領域,有一句話特別被強調,即 Garbage In,Garbage Out.數據質量決定了模型的上限,這一個特點,在 DeepFake 中體現得淋漓盡致。

前文提及 DeepFake 的關鍵假設在於認為 Wrap face = any face,從而採用了 denoiseGAN 的結構,那麼不難想到,除了使用仿射變換製造噪音臉部外,是否有其他方法?答案是有的。在 [4] 中,作者使用了 probrandomcolor_match,交換兩張不同人臉顏色的均值和方差來製作噪音,以及 motion blurs,運動模糊來損壞原臉,同時這兩種處理方法亦可視作是一種數據強化的手段。

除此之外,為了讓模型更好的訓練,使用了 eye-aware(做了眼部對齊),edge loss 以及上文提及的 Mask 機制,更改了官方原有的 Dlib,改為 MTCNN 來做人臉的定位和關鍵點定位,以及人臉對齊等操作,獲得更好、更靈活的數據。因為 Dlib 在側臉和有遮擋的情況下表現比 MTCNN 要差。

對於數據的干擾不僅僅包括數據的預處理,也包括其後處理。

在獲取模型輸出后,需要映射回去,這時需要用到圖像融合的手段,如高斯模糊,泊松融合這些傳統圖像處理的方法也得以施展拳腳。

我們不難得知,不論是 [4] 還是官方的項目,在第一版的 DeepFakes 後進行的改進中,在模型的 layer 上只是採取了場景的 NormLayer 和 ResBlock 等常見的手段,而並不是重新發明一個更厲害的網絡結構或者用上一些高大上的 layer 和理論,而是把心思放在數據的干預上和對問題建模的重新思考。

論文和工程區別

在回顧完 DeepFakes 的發展歷程,不難得出一些和我們平常寫論文時思路的區別。首先明顯特點就是在論文中,我們更注重論文的可發性。比如論文的工作是否潮流,理論是否漂亮。比如深度學習火了后,各種領域都用上了深度學習,有些是突破,有些就是為了吸引眼球了。而在 GAN 火了后,又紛紛湧入 GAN。而在工程上,很大程度要拋棄這種新潮模型==效果好的態度,在知乎問題 [7] 上有對這個問題的更廣泛的討論。在上文中亦體現了 SAGAN 相比使用 LSGAN 來說,在 DeepFakes 上沒有帶來足夠的優勢。

其次一點是要理解論文的一些套路。很多東西,比如一些對實驗結果的統計陷阱,或者對結果的展示的挑選,都會對讀者造成迷惑。比如連 BigGAN 這種級別的網絡的都會產生無意義的輸出,其餘 GAN 的就不太可能全部像論文展示的那麼穩定。而且線上應用有時對錯誤要敏感得多,不像論文一樣把失敗的樣本掩蓋掉就行。當然,事物發展需要過程,要是太嚴格,那很多論文可能都要斃掉。

對模型影響最大的反而是數據,GIGO 原則其實大家都知道,但是因為大家寫論文都是在公開數據集上做測試,而公開數據集一般比較乾淨,久而久之倒是可能忘記和習慣無視了。而一旦經歷過線上項目或者個人項目,需要自己去收集數據或清洗數據時,就能感知到當中的滋味。有 70% 的時間都是和數據本身打交道,並不是危言聳聽。

在論文 [8] 中,比較了幾種常見的 data augmentation 對模型性能影響。可見,在公開數據集上使用不同的數據處理方案亦會對模型性能產生影響,但只做數據預處理的文章很難發表,除非諸如 mixup 這種取得驚艷效果的新手段。

還有對業務場景的理解,這點也經常聽到,但新人會很疑惑,什麼樣才叫對業務場景的理解?回顧上文,關於視頻單幀和大頭照人臉尺寸的思考,怎麼提出更合適的假設,關於遮擋物是否影響人對」臉「和其身份的感知,這些就是對應用場景的思考。只有理解了業務場景,才能做出合適的模型架構,數據的預處理和后處理。比如一些場景上需要先做關鍵點對齊,亦是這個原因。總的來說,Deep Learning 的潛力很大,但前提是用在合適的地方。

另一點,相比論文開源出來的訓練腳本,如果有更為成熟的工業庫,其實更值得學習。因為在工程項目上,當數據規模達到一定程度,在分佈式的環境上,有些模型的實現是有多種變體的。比如在 [9] 中提到的跨卡同步的 BN。有興趣的同學可以讀一些偏工程驅動的論文,如 YouTuBe 的推薦系統的那篇,比如阿里的魯班,和美團的一個相似的智能海報技術。雖然是」生成「海報,但實際上 GAN 只是其中一個部件,而且很巧妙的把這個看着很像 image generate 這樣目前還是黑盒的問題換成了要比較好控制和干預的 Seq2Seq 問題。

后話

關於上文對論文和工程的區別,可能大家在很多場合都常見,有些是顯然的結論,但如果你找身邊的人抓着某一個點去問,往往言之無物。本文接着 DeepFakes 的發展路程,加上個人見解,分析了當我們預着這麼一個問題時,可以從那些方面分析和改進。

至於為什麼選 DeepFakes,雖然不是什麼大型項目,但 DeepFakes 一開始就往着 app 上走,而不是 script 上發展,相對應的,DeepFakes 的設計和考慮的細節,總歸是偏向工程一些,還是有參考價值的。

參考

[1] https://arxiv.org/pdf/1812.04948.pdf

[2] https://arxiv.org/pdf/1812.08685.pdf 

[3]https://zhuanlan.zhihu.com/p/34042498

[4]https://github.com/shaoanlu/faceswap-GAN

[5]https://zhuanlan.zhihu.com/p/54146307

[6]https://zhuanlan.zhihu.com/p/54213305

[7]https://www.zhihu.com/question/304599202/answer/546354846

[8]https://zhuanlan.zhihu.com/p/51870052

[9]https://zhuanlan.zhihu.com/p/40496177


想在手機閱讀更多其他資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems