【技術分享】深度偽造(Deepfake)原理分析及實戰

前言
眾所周知,人工智能正迎來第三次發展浪潮,它既給社會發展帶來了巨大機遇,同時也帶來了諸多風險,人工智能對國家安全的影響已成為世界各國的重要關切和研究議程。作為人工智能深度學習領域的一個分支,Deepfake(深度偽造)技術在近幾年迅速興起,為國家間的政治抹黑、軍事欺騙、經濟犯罪甚至恐怖主義行動等提供了新工具,給政治安全、經濟安全、社會安全、國民安全等國家安全領域帶來了諸多風險。
本文會首先介紹Deepfake的相關背景及技術特點,然后以實戰為導向詳細介紹Deepfake的一種典型生成方案,最后會給出常用的防御(檢測)策略。
Deepfake背景
深度偽造一詞譯自英文“Deepfake”(“deep learning”和“fake”的組合), 最初源于一個名為“deepfakes”的Reddit社交網站用戶, 該用戶于2017年12月在 Reddit 社交網站上發布了將斯嘉麗·約翰遜等女演員的面孔映射至色情表演者身上的偽造視頻。
Deepfake目前在國際上并沒有公認的統一定義, 美國在其發布的《2018 年惡意偽造禁令法 案》中將“deep fake”定義為“以某種方式使合理的觀察者錯誤地將其視為個人真實言語或行為的真實記錄的方式創建或更改的視聽記錄”, 其中“視聽記錄”即指圖像、視頻和語音等數字內容。本文就采用這一定義,并針對“視聽記錄”中的視頻領域的技術進行分析及實戰。
視頻偽造
視頻偽造是Deepfake技術最為主要的代表,制作假視頻的技術也被業界稱為人工智能換臉技術(AI face swap)。其核心原理是利用生成對抗網絡或者卷積神經網絡等算法將目標對象的面部“嫁接”到被模仿對象上。由于視頻是連續的圖片組成,因此只需要把每一張圖片中的臉替換,就能得到變臉的新視頻。具體而言,首先將模仿對象的視頻逐幀轉化成大量圖片,然后將目標模仿對象面部替換成目標對象面部。最后,將替換完成的圖片重新合成為假視頻,而深度學習技術可以使這一過程實現自動化。
隨著深度學習技術的發展,自動編碼器、生成對抗網絡等技術逐漸被應用到深度偽造中。
自動編碼器
自動編碼器是神經網絡的一種,其基本思想就是直接使用一層或者多層的神經網絡對輸入數據進行映射,得到輸出向量,作為從輸入數據提取出的特征。基本的自編碼器模型是一個簡單的三層神經網絡結構:一個輸入層、一個隱藏層和一個輸出層。其中輸出層和輸入層具有相同的維數。自動編碼器本質上是一種數據壓縮算法,其中數據的壓縮和解壓縮函數是數據相關的、有損的、從樣本中自動學習。目前自編碼器的主要用途就是降維、去噪和圖像生成。

在應用于Deepfake的情況下輸入視頻幀,并編碼。這意味著它將從中收集的信息轉換成一些低維的潛在空間表示。這個潛在的表示包含關鍵特征的信息,如面部特征和身體姿勢的視頻幀。通俗地說,其中有關于臉在做什么的信息,是微笑還是眨眼等等。自動編碼器的解碼器將圖像從潛在表示中恢復出來,用于給網絡學習。
生成對抗網絡
生成對抗網絡是非監督式學習的一種方法,通過讓兩個神經網絡相互博弈的方式進行學習。該方法由伊恩·古德費洛等人于2014年提出。生成對抗網絡由一個生成網絡與一個判別網絡組成。生成網絡從潛在空間(latent space)中隨機取樣作為輸入,其輸出結果需要盡量模仿訓練集中的真實樣本。判別網絡的輸入則為真實樣本或生成網絡的輸出,其目的是將生成網絡的輸出從真實樣本中盡可能分辨出來。而生成網絡則要盡可能地欺騙判別網絡。兩個網絡相互對抗、不斷調整參數,最終目的是使判別網絡無法判斷生成網絡的輸出結果是否真實。

在Deepfake的場景下,通過使用生成對抗網絡可以生成更逼真的圖像/視頻。
但是在過去要使用Deepfake進行生成時,需要額外的信息。比如,如果想要生成頭部的移動,則我們需要臉部的landmark,如果想要生成全身的移動,還需要姿勢估計(pose-estimation)。此外,使用這些傳統技術如果想把原臉替換到目標臉上的話,需要使用大量的雙方人臉圖像的數據進行事先訓練訓練。
而本文將介紹的技術不需要這些附加約束條件,原文發在NIPS2019上,名為《First Order Motion Model for Image Animation》。
First Order Motion Model for Image Animation
從論文的題目就可以看出,其希望完成的任務是image animation,輸入一張源圖像(source image)和一個驅動視頻(driving video),輸出是一段視頻,其中主角是源圖像,動作是驅動視頻中的動作。如下所示,源圖像通常包含一個主體,驅動視頻包含一系列動作。

第一列是給定的圖片,而第一排圖像是給定的動作序列,通過人臉和表情的遷移,分別使其完成了一系列的動作。換句話說,把提取到的動作特征用作圖像的動作依據。
作者采用了一種源于Monkey Net(見參考文獻[6])的自我監控策略。在訓練時,作者使用了大量包含相同對象類別的對象的視頻序列。模型通過組合一個單一的幀和一個學習的動作的潛在表示來重建訓練視頻。通過觀察從同一視頻中提取的幀對,它會學習到將動作編碼為特定于動作的關鍵點位移和局部仿射變換的組合。在測試時,將模型應用到由源圖像和驅動視頻的每一幀組成的對上,并根據源對象生成對應的圖像動畫。
整個模型的運作流程如下

整個模型分為運動估計模塊和圖像生成模塊兩個主要組成部分。在運動估計模塊中,該模型通過自監督學習將目標物體的外觀和運動信息進行分離,并進行特征表示。而在圖像生成模塊中,模型會對目標運動期間出現的遮擋進行建模,然后從給定的名人圖片中提取外觀信息,結合先前獲得的特征表示,進行視頻合成。
1)運動估計模塊
輸入:源圖像S , 驅動圖像D
輸出:
1、密集運動場:表征了驅動圖像D中的每個關鍵點到源圖像S的映射關系
2、貼圖遮罩:表明了在最終生成的圖像中,對于驅動圖像D而言,那部分姿態可以通過S扭曲得到,哪部分只能通過impainting得到
在這里,S到D有一個較大的形變,直接映射,誤差較大,采用的技巧是提出了一個過渡幀R,首先建立R幀到S幀、R幀到D幀的映射,然后再建立D幀到S幀的映射
運動估計模塊中有兩個子模塊:
1、關鍵點檢測器:檢測圖片中的關鍵點信息。接著采用局部仿射變換,在關鍵點附近建模它的運動,主要用一階泰勒展開來實現。同理,R幀到D幀通過這種方式并行得到
2、稠密運動網絡:根據前面得到的映射關系J和源圖像S產生上面說的2個輸出。
2)圖像生成模塊:圖像生成模型,根據輸入的圖片和第一部分得到的信息,生成一個新的圖片
這里有論文原作者的分享報告:
https://www.youtube.com/watch?v=u-0cQ-grXBQ&feature=emb_imp_woyt,感興趣的師傅們可以看看
##### 要點分析
在上圖中我們看到Motion module(黃色底色)實際上有兩個子模塊(一左一右),分別是關鍵點檢測器(keypoint detector)和稠密運動網絡(dense motion),這是論文的核心,在本節接下來的部分我們會依次介紹關鍵點檢測器、稠密運動網絡、訓練損失、測試階段的關鍵細節,幫助大家更容易理解本文的工作思路(注意,原論文文后還有10頁的附錄都是關于公式細節的,我們這里均略過,下面只會分析、推導正文給出的關鍵公式)。
#### 關鍵點檢測器
論文中物體的運動用其關鍵點處的運動表示,關鍵點通過自監督的方式學習。首先假設存在一個抽象的參考幀R,這樣的話,預測Ts<-D可以拆分成預測Ts<-R和TR<-D。注意R是抽象的,可以在推導中消除。引入R的好處是可以將S和D分離。
對于某類物體,假設有K個關鍵點p1,p2,…,pK。
假設有一幀圖片X,對于函數Tx<-R,用在pK處的一階泰勒展開表示R中的任意像素p點處的值有:

忽略高無窮小量,得到

假設TX<-R在關鍵點的鄰域是雙射,于是有TR<-X=T-1X<-R,此時在關鍵點pK附近就有

帶入一階泰勒展開,得到

其中,

于是,TS<-D在任一點處的值可以通過關鍵點處的值和關鍵點處的導數估計。
TS<-R(pk)和TD<-R(pk)用關鍵點預測器預測。關鍵點預測器使用標準的U-Net結構,預測K個熱力圖,每個熱力圖代表一個關鍵點。關鍵點預測器對每個關鍵點額外預測4個通道,用于計算

和

稠密運動網絡
論文這里的目的是用稠密運動網絡聯合各關鍵點的局部運動和源圖像得到稠密的運動場。
根據K個關鍵點的局部運動,將原圖像變形(warp)成S1,S2,….,SK,再添加一個不運動的S0=S表示背景。另外計算Hk用于表示運動發生的像素點位置:

轉換得到的圖片S1,S2,….,SK和Hk拼接在一起通過另外一個U-Net得到掩碼Mk。最后稠密運動場使用下面的公式計算:

在源圖像中存在遮擋的時候,目標圖像并不能完全通過變形源圖像獲得。所以考慮預測一個遮擋映射

其用于表示源圖像哪些區域需要被inpainted
轉換后的特征圖被寫作

上式中fw表示反向變形操作。
訓練損失
訓練的損失由多項組成。首先是基于感知損失(perceptual loss)的重構損失(reconstruction loss)。該loss用預訓練的VGG-19網絡作為特征提取器,對比重建幀和驅動視頻的真實幀的特征差異:

另外考慮到關鍵點的學習是無標簽的,這會導致不穩定的表現,所以引入不變性約束(Equivariance constraint)用在無監督關鍵點的學習中。假設圖片X經過一個已知的變換TX<-Y,得到Y。標準的不變性約束是

通過對兩邊進行一階泰勒展開有

使用L1損失對上面兩個公式進行約束
#### 測試階段
測試階段也就是實際的合成階段,其目標是用驅動視頻的每一幀D1,…,DT驅動源圖像S1。論文采用相對運動的方式驅動Dt ,也就是通過D1和Dt 的相對運動驅動S1。好處是可以保持源圖像中物體的幾何信息

關鍵代碼
關鍵點檢測
KPDetector類用于檢測關鍵點,它會返回關鍵點的位置

轉換圖像
OcclusionAwareGenerator類,給定源圖像和關鍵點,根據由關鍵點推導出的運動軌跡轉換圖像


動作計算
DenseMotionNetwork類根據給定的kp_source和kp_driving預測稠密運動,動作的計算主要都集中在這里。其中包括以下三個關鍵函數
1)計算熱力圖的函數

對應論文中的公式(6)

2)計算稀疏軌跡的函數

對應論文中的公式(4)

3)計算最終得到的密集運動預測

對應論文中的公式(7)

#### 生成測試
注:由于可能涉及侵犯隱私,這里源圖像選用安全客的小安動漫形象以及小熊貓,驅動視頻選用github上開源出的小李子和川普的動態視頻,同時由于官網投稿時無法上傳mp4,故轉換成gif。
小安圖像如下

小李子視頻如下:

生成效果如下:

小熊貓圖像如下:

川普視頻如下:

生成效果如下:

檢測
隨著Deepfake技術的發展,互聯網上充斥著大量包含偽造人臉的虛假視頻,Deepfakes類技術的濫用帶來巨大的負面影響,本文給出一些典型檢測思路及方案。
基于傳統圖像取證
傳統的圖像取證初始主要是基于傳統的信號處理方法,大多數依賴于特定篡改的證據,利用圖像的頻域特征和統計特征進行區分,如局部噪音分析、圖像質量評估、設備指紋、光照等,解決復制-移動、拼接、移除這些圖像篡改問題。而Deepfake視頻本質也是一系列偽造合成的圖片合成,因此可以將此類方法應用到Deepfake檢測。
基于生理信號特征
偽造視頻往往忽略人的真實生理特征,無法做到在整體上與真人一致。比如,有研究人員發現Deepfakes創造的是分離的合成臉區域,這樣在計算3D 頭部姿態評估的時候,就會引入錯誤。因為Deepfakes是交換中心臉區域的臉,臉外圍關鍵點的位置仍保持不變,中心和外圍位置的關鍵點坐標不匹配會導致3D 頭部姿態評估的不一致,故用中心區域的關鍵點計算一個頭方向向量,整個臉計算的頭方向向量,衡量這兩個向量之間的差異. 針對視頻計算所有幀的頭部姿態差異,最后訓練一個支持向量機(SVM)分類器來學習這種差異,由此便可以檢測出虛假視頻。
基于圖像篡改
深度偽造圖像受限于早期深度網絡的生成技術,在生成的人臉在細節上存在很多不足。比如有研究人員利用真假臉的不一致性來區分,如(1) 全局不一致性:新的人臉的生成,圖像的數據點插值是隨機的,并不是很有意義,這會導致的全局眼睛的左右顏色不一致,鼻子的左右色彩等;(2) 光照不一致性:篡改區域和正常區域對光照的反射不一樣,如眼睛區域,Deepfakes生成的視頻大多丟失這個眼睛反射細節;(3)幾何位置不一致:細節位置缺失,如牙齒,只有一些白色斑點,這個細節沒有建模。通過對這些特定區域(牙齒、眼睛等)提取的特征向量訓練多層感知機進行分類。