佛爺帶你玩被火速封殺的Deepfake黑科技,用FakeApp深度換臉

介紹

Deepfake是一種人工智能基礎的人物圖像合成技術。它用於使用稱爲“ 生成對抗性網絡 ”(GAN)的機器學習技術將現有圖像和視頻組合併疊加到源圖像或視頻上。現有視頻和源視頻的組合產生假視頻,該視頻顯示在現實中從未發生過的事件中執行動作的一個或多個人。

例如,可以創建這樣的假視頻,以顯示執行他們從未參與的性行爲的人,或者可以用於改變政治家用來使其看起來像那個人說他們從未做過的事情的文字或手勢。由於這些功能,Deepfake可能被用來製作虛假的名人色情視頻或報復色情內容。Deepfakes也可用於製作假新聞和惡意惡作劇。

其一問世就被釘上了如此恥辱柱,現在在國內這項技術是已經被封了的。但是從科技的角度來看,這到底是人類的問題還是技術的無恥,我相信技術無罪就足夠了。

2018年1月,推出了名爲FakeApp的桌面應用程序。該應用程序允許用戶輕鬆創建和分享面部交換的視頻。該應用程序使用人工神經網絡和圖形處理器的功能以及3到4千兆字節的存儲空間來生成虛假視頻。對於詳細信息,程序需要來自要插入的人的大量視覺材料,以便使用基於視頻序列和圖像的深度學習算法來學習必須交換哪些圖像方面。

該軟件使用了AI-框架TensorFlow的谷歌,這除其他外已經用於程序DeepDream。名人是這類假視頻的主要目標,但其他一些人也受到影響。2018年8月,加州大學伯克利分校的研究人員發表了一篇論文,介紹了一種虛假的舞蹈應用程序,可以使用人工智能創造出高超的舞蹈能力。

這是一篇Fake APP的教程,自然現在開始言歸正傳。毫無疑問,創建Deepfakes的最容易獲得的應用程序是FakeApp,它最近達到2.2版本。本教程將向您展示如何安裝和使用它。(先提前說一聲,玩這個需要你是機器學習或者深度學習的愛好者, 稍微懂點編程, 雖然FakeApp不用編程,但是其他更好的技術就需要編程了; 有一臺Window10電腦, GPU(沒有GPU就不要玩了,CPU訓練太慢了))

安裝

步驟1. 安裝NVidia CUDA9

FakeApp依賴於神經網絡,這種網絡的訓練成本非常高。儘管它們有成本,但訓練神經網絡的過程是高度可並行的。出於這個原因,大多數機器學習框架(如Keras和TernsorFlow)可以分派在計算GPU。GPU代表 圖形處理單元,是機器內部通常處理圖形輸入的芯片。

GPU被設計爲並行執行操作,因此它們非常適合訓練建立在並行工作的獨立神經元上的神經網絡。FakeApp使用TensorFlow,一種機器學習框架,支持使用NVIDIA顯卡進行GPU加速計算。但是,在使用它之前,您需要安裝CUDA®,這是一個將密集計算委派給NVIDIA GPU的並行計算平臺。

檢查你的顯卡。 並非NVIDIA的所有顯卡都集成了對GPU計算的支持。您可以檢查您的GPU是否兼容訪問CUDA GPU列表。任何計算能力大於或等於3.0的圖形卡都可以使用。

安裝CUDA®Toolkit9.0, 官網直接去下載。確保爲CUDA和操作系統選擇正確的版本。
在這裏插入圖片描述
您可以選擇您喜歡的任何安裝程序類型。“exe(local)”將首先下載整個安裝程序。該文件相當大,所以準備等待。

在安裝過程中,選擇“自定義”選項並選擇其所有組件。

**安裝cuDNN。**雖然CUDA®Toolkit提供了GPU計算所需的基本工具集,但它不包括某些特定任務的庫。ML-Agents使用強化學習來訓練神經網絡。因此,您還需要下載CUDA®對深度神經網絡的支持,也稱爲cuDNN。

下載cuDNN需要登錄。您可以作爲NVIDIA開發者免費註冊,然後再次訪問該網頁以訪問下載鏈接。FakeApp適用於cuDNN 7,因此請務必選擇正確的版本。

本人Cuda版本:V9.0.176(我是成功實現FakeApp的使用,所以在配置上如果你不能準確配置,請和我的一樣)

第2步. 安裝FakeApp

儘管仍需要一些配置,但安裝FakeApp是最簡單的步驟。可以從FakeApp下載頁面下載(www.fakeapp.org (不用想了,已經是上不去的了。如果想下,自行找辦法吧,網上有的是辦法下載,你懂的))安裝程序。

您需要下載兩個文件。一個是FakeApp二進制文件的實際安裝程序,而另一個名爲core.zip,包含它所需的所有依賴項。解壓縮後,其所有內容都應合併到C:\Users[USER]\AppData\Local\FakeApp\app-2.2.0\resources\api 文件夾,它應如下所示:
在這裏插入圖片描述
如果一切正常,您現在應該可以使用FakeApp。

使用

步驟1. 提取

爲了訓練您的模型,FakeApp需要大量的圖像數據集。除非您已經選擇了數百張圖片,否則FakeApp會提供一個便捷功能,可以從視頻中提取所有幀。這可以在GET DATASET選項卡中完成。您只需指定mp4視頻的鏈接即可。單擊EXTRACT將啓動該過程。
在這裏插入圖片描述
如果您的原始視頻名爲movie.mp4,則會在名爲dataset-video的文件夾中提取這些幀。在裏面,會有另一個名爲extract的文件夾 ,其中包含準備在訓練過程中使用的對齊圖像。您可能還會看到一個名爲alignments.json的文件,該文件爲每個對齊的幀指示其在提取它的圖像中的原始位置。

提取過程完成後,您唯一需要的是 extract 文件夾; 你可以刪除所有其他文件。在繼續下一步之前,只需確保對齊的面確實對齊(下圖)。面部檢測經常失敗,因此需要一些手動工作。
在這裏插入圖片描述
理想情況下,您需要的是人A的視頻和人B的視頻。然後,您需要運行該過程兩次,以獲得兩個文件夾。如果您有同一個人的多個視頻,請提取所有這些視頻合併文件夾。或者,您可以使用Movie Maker或等效程序依次附加視頻。

第2步. 訓練

在FakeApp中,您可以從TRAIN選項卡訓練您的模型。在數據A和數據B下, 您需要複製解壓縮文件夾的路徑。按照慣例,數據A是從背景視頻中提取的文件夾,數據B包含要插入數據A視頻的人物的面部。訓練過程將人A的面部轉換爲人B。實際上,神經網絡在兩個方向上工作; 你選擇哪一個和你選擇哪一個並不重要。
在這裏插入圖片描述
您還需要一個模型文件夾。如果這是您第一次從A人訓練到B人,您可以使用空文件夾。FakeApp將使用它來存儲訓練好的神經網絡的參數。

在開始此過程之前,需要設置訓練設置。紅色,下面,表示參考培訓過程的那些。節點和層 用於配置神經網絡; 批量大小用於在更多數量的面上訓練它。
在這裏插入圖片描述
如果您的GPU的RAM少於2GB,那麼您可以運行的最高設置可能是:
在這裏插入圖片描述
您必須根據GPU上可用的內存量來調整設置。這些是您通常應該運行的推薦設置,儘管這可能因您的型號而異。如果內存不足,則該過程將失敗。

監控進度。 在訓練時,您將看到一個窗口,顯示神經網絡的執行情況。
在這裏插入圖片描述
您可以隨時按Q停止培訓過程。要恢復它,只需使用與模型相同的文件夾再次啓動它。FakeApp還顯示一個分數,表示在嘗試將人A重建爲B而人B重建爲A時所犯的錯誤。低於0.02的值通常被認爲是可接受的。(至少15個小時以上)

第3步. 創作

創建視頻的過程與GET DATASET中的過程非常相似。您需要提供mp4視頻的路徑以及模型的文件夾。這是一個包含文件的文件夾:encoder.h5,decoder_A.h5 和decoder_B.h5。您還需要指定目標FPS。
在這裏插入圖片描述
按CREATE將自動:

  1. 從workdir-video 文件夾中的源視頻中提取所有幀,
  2. 裁剪所有面並在workdir-video / extracted 文件夾中對齊它們,裁剪所有面並在workdir-video / extracted 文件夾中對齊它們,
  3. 使用訓練過的模型處理每個面部,使用訓練過的模型處理每個面部,
  4. 將面合併回原始幀並將它們存儲在workdir-video / merged 文件夾中,將面合併回原始幀並將它們存儲在workdir-video / merged 文件夾中,
  5. 加入所有幀以創建最終視頻。加入所有幀以創建最終視頻。

在設置(下方)中,可以選擇是否要將人A轉換爲人B(A至B)或人B轉換爲人A(B至A)。
在這裏插入圖片描述

結論:

這是我用GPU訓練30小時的示例效果:
在這裏插入圖片描述
可以看得出來還是有部分是沒有訓練融合完整的。自然改進的方法除了增加訓練樣本,繼續增加訓練時間之外。還可以嘗試更多deepfake的方式。

GAN的入門原理總結(其實不是深度學習算法從業者到這裏就沒必要看了)

Generative Adversarial Network,就是大家耳熟能詳的 GAN,由 Ian Goodfellow 首先提出,在這兩年更是深度學習中最熱門的東西,彷彿什麼東西都能由 GAN 做出來。我最近剛入門 GAN,看了些資料,做一些筆記。

1.Generation

什麼是生成(generation)?就是模型通過學習一些數據,然後生成類似的數據。讓機器看一些動物圖片,然後自己來產生動物的圖片,這就是生成。

以前就有很多可以用來生成的技術了,比如 auto-encoder(自編碼器),結構如下圖:

開發者自述:我是這樣學習 GAN 的

你訓練一個 encoder,把 input 轉換成 code,然後訓練一個 decoder,把 code 轉換成一個 image,然後計算得到的 image 和 input 之間的 MSE(mean square error),訓練完這個 model 之後,取出後半部分 NN Decoder,輸入一個隨機的 code,就能 generate 一個 image。

但是 auto-encoder 生成 image 的效果,當然看着很彆扭啦,一眼就能看出真假。所以後來還提出了比如VAE這樣的生成模型,我對此也不是很瞭解,在這就不細說。

上述的這些生成模型,其實有一個非常嚴重的弊端。比如 VAE,它生成的 image 是希望和 input 越相似越好,但是 model 是如何來衡量這個相似呢?model 會計算一個 loss,採用的大多是 MSE,即每一個像素上的均方差。loss 小真的表示相似嘛?

開發者自述:我是這樣學習 GAN 的

比如這兩張圖,第一張,我們認爲是好的生成圖片,第二張是差的生成圖片,但是對於上述的 model 來說,這兩張圖片計算出來的 loss 是一樣大的,所以會認爲是一樣好的圖片。

這就是上述生成模型的弊端,用來衡量生成圖片好壞的標準並不能很好的完成想要實現的目的。於是就有了下面要講的 GAN。

2.GAN

大名鼎鼎的 GAN 是如何生成圖片的呢?首先大家都知道 GAN 有兩個網絡,一個是 generator,一個是 discriminator,從二人零和博弈中受啓發,通過兩個網絡互相對抗來達到最好的生成效果。流程如下:

開發者自述:我是這樣學習 GAN 的

主要流程類似上面這個圖。首先,有一個一代的 generator,它能生成一些很差的圖片,然後有一個一代的 discriminator,它能準確的把生成的圖片,和真實的圖片分類,簡而言之,這個 discriminator 就是一個二分類器,對生成的圖片輸出 0,對真實的圖片輸出 1。

接着,開始訓練出二代的 generator,它能生成稍好一點的圖片,能夠讓一代的 discriminator 認爲這些生成的圖片是真實的圖片。然後會訓練出一個二代的 discriminator,它能準確的識別出真實的圖片,和二代 generator 生成的圖片。以此類推,會有三代,四代。。。n 代的 generator 和 discriminator,最後 discriminator 無法分辨生成的圖片和真實圖片,這個網絡就擬合了。

這就是 GAN,運行過程就是這麼的簡單。這就結束了嘛?顯然沒有,下面還要介紹一下 GAN 的原理。

3.原理

首先我們知道真實圖片集的分佈 Pdata(x),x 是一個真實圖片,可以想象成一個向量,這個向量集合的分佈就是 Pdata。我們需要生成一些也在這個分佈內的圖片,如果直接就是這個分佈的話,怕是做不到的。

我們現在有的 generator 生成的分佈可以假設爲 PG(x;θ),這是一個由 θ 控制的分佈,θ 是這個分佈的參數(如果是高斯混合模型,那麼 θ 就是每個高斯分佈的平均值和方差)

假設我們在真實分佈中取出一些數據,{x1, x2, ... , xm},我們想要計算一個似然 PG(xi; θ)。

對於這些數據,在生成模型中的似然就是

開發者自述:我是這樣學習 GAN 的

我們想要最大化這個似然,等價於讓 generator 生成那些真實圖片的概率最大。這就變成了一個最大似然估計的問題了,我們需要找到一個 θ* 來最大化這個似然。

開發者自述:我是這樣學習 GAN 的

尋找一個 θ* 來最大化這個似然,等價於最大化 log 似然。因爲此時這 m 個數據,是從真實分佈中取的,所以也就約等於,真實分佈中的所有 x 在 P分佈中的 log 似然的期望。

真實分佈中的所有 x 的期望,等價於求概率積分,所以可以轉化成積分運算,因爲減號後面的項和 θ 無關,所以添上之後還是等價的。然後提出共有的項,括號內的反轉,max 變 min,就可以轉化爲 KL divergence 的形式了,KL divergence 描述的是兩個概率分佈之間的差異。

所以最大化似然,讓 generator 最大概率的生成真實圖片,也就是要找一個 θ 讓 P更接近於 Pdata。

那如何來找這個最合理的 θ 呢?我們可以假設 PG(x; θ) 是一個神經網絡。

首先隨機一個向量 z,通過 G(z)=x 這個網絡,生成圖片 x,那麼我們如何比較兩個分佈是否相似呢?只要我們取一組 sample z,這組 z 符合一個分佈,那麼通過網絡就可以生成另一個分佈 PG,然後來比較與真實分佈 Pdata。

大家都知道,神經網絡只要有非線性激活函數,就可以去擬合任意的函數,那麼分佈也是一樣,所以可以用一直正態分佈,或者高斯分佈,取樣去訓練一個神經網絡,學習到一個很複雜的分佈。

開發者自述:我是這樣學習 GAN 的

如何來找到更接近的分佈,這就是 GAN 的貢獻了。先給出 GAN 的公式:

開發者自述:我是這樣學習 GAN 的

這個式子的好處在於,固定 G,max  V(G,D) 就表示 PG 和 Pdata 之間的差異,然後要找一個最好的 G,讓這個最大值最小,也就是兩個分佈之間的差異最小。

開發者自述:我是這樣學習 GAN 的

表面上看這個的意思是,D 要讓這個式子儘可能的大,也就是對於 x 是真實分佈中,D(x) 要接近與 1,對於 x 來自於生成的分佈,D(x) 要接近於 0,然後 G 要讓式子儘可能的小,讓來自於生成分佈中的 x,D(x) 儘可能的接近 1。

現在我們先固定 G,來求解最優的 D:

開發者自述:我是這樣學習 GAN 的

開發者自述:我是這樣學習 GAN 的

對於一個給定的 x,得到最優的 D 如上圖,範圍在 (0,1) 內,把最優的 D 帶入

開發者自述:我是這樣學習 GAN 的

可以得到:

開發者自述:我是這樣學習 GAN 的

開發者自述:我是這樣學習 GAN 的

JS divergence 是 KL divergence 的對稱平滑版本,表示了兩個分佈之間的差異,這個推導就表明了上面所說的,固定 G。

開發者自述:我是這樣學習 GAN 的

表示兩個分佈之間的差異,最小值是 -2log2,最大值爲 0。

現在我們需要找個 G,來最小化

開發者自述:我是這樣學習 GAN 的

觀察上式,當 PG(x)=Pdata(x) 時,G 是最優的。

4.訓練

有了上面推導的基礎之後,我們就可以開始訓練 GAN 了。結合我們開頭說的,兩個網絡交替訓練,我們可以在起初有一個 G0 和 D0,先訓練 D找到 :

開發者自述:我是這樣學習 GAN 的

然後固定 D0 開始訓練 G0, 訓練的過程都可以使用 gradient descent,以此類推,訓練 D1,G1,D2,G2,...

但是這裏有個問題就是,你可能在 D0* 的位置取到了:

開發者自述:我是這樣學習 GAN 的

然後更新 G0 爲 G1,可能

開發者自述:我是這樣學習 GAN 的

了,但是並不保證會出現一個新的點 D1* 使得

開發者自述:我是這樣學習 GAN 的

這樣更新 G 就沒達到它原來應該要的效果,如下圖所示:

開發者自述:我是這樣學習 GAN 的

避免上述情況的方法就是更新 G 的時候,不要更新 G 太多。

知道了網絡的訓練順序,我們還需要設定兩個 loss function,一個是 D 的 loss,一個是 G 的 loss。下面是整個 GAN 的訓練具體步驟:

開發者自述:我是這樣學習 GAN 的

上述步驟在機器學習和深度學習中也是非常常見,易於理解。

5.存在的問題

但是上面 G 的 loss function 還是有一點小問題,下圖是兩個函數的圖像:

開發者自述:我是這樣學習 GAN 的

log(1-D(x)) 是我們計算時 G 的 loss function,但是我們發現,在 D(x) 接近於 0 的時候,這個函數十分平滑,梯度非常的小。這就會導致,在訓練的初期,G 想要騙過 D,變化十分的緩慢,而上面的函數,趨勢和下面的是一樣的,都是遞減的。但是它的優勢是在 D(x) 接近 0 的時候,梯度很大,有利於訓練,在 D(x) 越來越大之後,梯度減小,這也很符合實際,在初期應該訓練速度更快,到後期速度減慢。

所以我們把 G 的 loss function 修改爲

開發者自述:我是這樣學習 GAN 的

這樣可以提高訓練的速度。

還有一個問題,在其他 paper 中提出,就是經過實驗發現,經過許多次訓練,loss 一直都是平的,也就是

開發者自述:我是這樣學習 GAN 的

JS divergence 一直都是 log2,P和 Pdata 完全沒有交集,但是實際上兩個分佈是有交集的,造成這個的原因是因爲,我們無法真正計算期望和積分,只能使用 sample 的方法,如果訓練的過擬合了,D 還是能夠完全把兩部分的點分開,如下圖:

開發者自述:我是這樣學習 GAN 的

對於這個問題,我們是否應該讓 D 變得弱一點,減弱它的分類能力,但是從理論上講,爲了讓它能夠有效的區分真假圖片,我們又希望它能夠 powerful,所以這裏就產生了矛盾。

還有可能的原因是,雖然兩個分佈都是高維的,但是兩個分佈都十分的窄,可能交集相當小,這樣也會導致 JS divergence 算出來 =log2,約等於沒有交集。

解決的一些方法,有添加噪聲,讓兩個分佈變得更寬,可能可以增大它們的交集,這樣 JS divergence 就可以計算,但是隨着時間變化,噪聲需要逐漸變小。

還有一個問題叫 Mode Collapse,如下圖:

開發者自述:我是這樣學習 GAN 的

這個圖的意思是,data 的分佈是一個雙峯的,但是學習到的生成分佈卻只有單峯,我們可以看到模型學到的數據,但是卻不知道它沒有學到的分佈。

造成這個情況的原因是,KL divergence 裏的兩個分佈寫反了

開發者自述:我是這樣學習 GAN 的

這個圖很清楚的顯示了,如果是第一個 KL divergence 的寫法,爲了防止出現無窮大,所以有 Pdata 出現的地方都必須要有 PG 覆蓋,就不會出現 Mode Collapse。

機器學習參考教程

佛爺芸: 機器學習算法原理總結系列—算法基礎之(1)機器學習介紹
機器學習算法原理總結系列—算法基礎之(2)決策樹(Decision Tree)
機器學習算法原理總結系列—算法基礎之(3)隨機森林(Random Forest)
機器學習算法原理總結系列—算法基礎之(4)最鄰近規則分類(K-Nearest Neighbor)
機器學習算法原理總結系列—算法基礎之(5)樸素貝葉斯(Naive Bayesian)
機器學習算法原理總結系列—算法基礎之(6)支持向量機(Support Vectors Machine)
機器學習算法原理總結系列—算法基礎之(7)神經網絡(Neural Network)
機器學習算法原理總結系列—算法基礎之(8)簡單線性迴歸(Simple Linear Regression)
機器學習算法原理總結系列—算法基礎之(9)多元迴歸分析(Multiple Regression)
機器學習算法原理總結系列—算法基礎之(10)非線性迴歸(Logistic Regression)
機器學習算法原理總結系列—算法基礎之(11)聚類K均值(Clustering K-means)
機器學習算法原理總結系列—算法基礎之(12)層次聚類(hierarchical clustering)
機器學習算法原理總結系列—算法基礎之(13)模糊C均值聚類(Fuzzy C-means Clustering)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章