0
雷鋒網(wǎng) AI 研習(xí)社按,本文作者 Lonely.wm,該文首發(fā)于知乎專欄智能單元,雷鋒網(wǎng) AI 研習(xí)社獲其授權(quán)轉(zhuǎn)載。
前言
Deepfake 就是前一陣很火的換臉 App,從技術(shù)的角度而言,這是深度圖像生成模型的一次非常成功的應(yīng)用,這兩年雖然涌現(xiàn)出了很多圖像生成模型方面的論文,但大都是能算是 Demo,沒有多少的實(shí)用價(jià)值,除非在特定領(lǐng)域(比如醫(yī)學(xué)上),哪怕是英偉達(dá)的神作:漸進(jìn)生成高清人臉 PGGAN 好像也是學(xué)術(shù)意義大于實(shí)用價(jià)值。其實(shí)人們一直都在追求更通用的生成技術(shù),我想 Deepfake 算是一例,就讓我們由此出發(fā),看看能否從中獲取些靈感。
一、基本框架
我們先看看 Deepfake 到底是個(gè)何方神圣,其原理一句話可以概括:用監(jiān)督學(xué)習(xí)訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)將張三的扭曲處理過的臉還原成原始臉,并且期望這個(gè)網(wǎng)絡(luò)具備將任意人臉還原成張三的臉的能力。
說了半天這好像是一個(gè)自編碼模型嘛~,沒錯(cuò),原始版本的 deepfake 就是這樣的,公式如下:
這里的 XW 是經(jīng)過扭曲處理過的圖片,用過 Deepfake 的童鞋可能會(huì)有人提出質(zhì)疑,「要讓代碼跑起來好像必須要有兩個(gè)人的人臉數(shù)據(jù)吧」。沒錯(cuò),之所以要同時(shí)用兩個(gè)人的數(shù)據(jù)并不是說算法只能將 A 與 B 互換,而是為提高穩(wěn)定性,因?yàn)?Encoder 網(wǎng)絡(luò)是共享的,Deocder 網(wǎng)絡(luò)是分開的,上公式:
為了方便理解我照搬項(xiàng)目二(加了 Gan 的版本)上的說明圖片:
特別注意:原版是沒有 Mask 的~
版本二我不打算討論,僅介紹一下,簡而言之就是增加了 Adversarial Loss和Perceptual Loss,后者是用訓(xùn)練好的 VGGFace 網(wǎng)絡(luò)(該網(wǎng)絡(luò)不做訓(xùn)練)的參數(shù)做一個(gè)語義的比對(duì)。
二、技術(shù)細(xì)節(jié)
Deepfake 的整個(gè)流程包括三步,一是提取數(shù)據(jù),二是訓(xùn)練,三是轉(zhuǎn)換。其中第一和第三步都需要用到數(shù)據(jù)預(yù)處理,另外第三步還用到了圖片融合技術(shù)。所以我在技術(shù)上主要分三個(gè)方面來剖析:圖像預(yù)處理、網(wǎng)絡(luò)模型、圖像融合。
1. 圖像預(yù)處理
從大圖(或視頻)中識(shí)別,并摳出人臉圖像,原版用的是 dlib 中的人臉識(shí)別庫(這個(gè)識(shí)別模塊可替換),這個(gè)庫不僅能定位人臉,而且還可以給出人臉的 36 個(gè)關(guān)鍵點(diǎn)坐標(biāo),根據(jù)這些坐標(biāo)能計(jì)算人臉的角度,最終摳出來的人臉是擺正后的人臉。
2. 網(wǎng)絡(luò)模型
Encoder: 64x64x3->8x8x512
x = input_
x = conv(128)(x)
x = conv(256)(x)
x = conv(512)(x)
x = conv(1024)(x)
x = Dense(ENCODER_DIM)(Flatten()(x))
x = Dense(4 * 4 * 1024)(x)
x = Reshape((4, 4, 1024))(x)
x = upscale(512)(x)
Decoder:8x8x512->64x64x3
x = input_
x = upscale(256)(x)
x = upscale(128)(x)
x = upscale(64)(x)
x = Conv2D(3, kernel_size=5, padding='same', activation='sigmoid')(x)
整個(gè)網(wǎng)絡(luò)并不復(fù)雜,無非就是卷積加全連接,編碼->解碼,但是仔細(xì)研究后發(fā)現(xiàn)作者其實(shí)是匠心獨(dú)運(yùn)的,為什么我不急著說,我們先看看 con 和 upscale 的內(nèi)部實(shí)現(xiàn):
def conv(filters):
def block(x):
x = Conv2D(filters, kernel_size=5, strides=2, padding='same')(x)
x = LeakyReLU(0.1)(x)
return x
return blockdef upscale(filters):
def block(x):
x = Conv2D(filters * 4, kernel_size=3, padding='same')(x)
x = LeakyReLU(0.1)(x)
x = PixelShuffler()(x)
return x
return block
conv 是中規(guī)中矩的卷積加 relu 激活函數(shù),upscale 中有個(gè)函數(shù)叫 PixelShuffler,這個(gè)函數(shù)很有意思,其功能是將 filter 的大小變?yōu)樵瓉淼?1/4,讓后讓高 h、寬 w 各變?yōu)樵瓉淼膬杀?,這也就是為什么前面的卷積層的 filter 要乘以 4 的原因。
經(jīng)過測試對(duì)比,比如拿掉 upscale 換成步長為 2 的反卷積,或者簡單 resize 為原來的兩倍,實(shí)驗(yàn)的效果都大打折扣,結(jié)果是網(wǎng)絡(luò)只能自編碼,而得不到需要的人臉。雖然作者沒有說這樣設(shè)計(jì)是引用那篇論文的思想,筆者也未讀到過直接討論這個(gè)問題的論文,但是有一篇論文可以佐證:Deep Image Prior,包括 Encoder 中的全連接層都是人為打亂圖像的空間依賴性,增加學(xué)習(xí)的難度,從而使網(wǎng)絡(luò)能夠更加充分地理解圖像。所以 Encoder 中的全連接層和 PixelShuffler 都是必不可少的。經(jīng)筆者測試,在不加 Gan 的情況下,去掉這兩個(gè)要素,網(wǎng)絡(luò)必定失敗。
3. 圖像融合
圖像融合放在技術(shù)難點(diǎn)分析中討論。
三、難點(diǎn)分析
1. 清晰度問題
原版的人臉像素是 64*64,顯然偏低,但要提高人臉清晰度,并不能僅靠提高圖片的分辨率,還應(yīng)該在訓(xùn)練方法和損失函數(shù)上下功夫。眾所周知,簡單的 L1Loss 是有數(shù)學(xué)上的均值性的,會(huì)導(dǎo)致模糊。解決方案個(gè)人比較傾向在 L1Loss 的基礎(chǔ)上加入 GAN,因?yàn)閺?qiáng)監(jiān)督下的 GAN 具有區(qū)分更細(xì)微區(qū)別的能力,很多論文都提到這一點(diǎn),比如較早的一篇超分辨率的文章。但是 GAN 也有很多問題,這個(gè)后面討論。還有一個(gè)思路就是用 PixelCNN 來改善細(xì)節(jié)的,但經(jīng)實(shí)踐,這種方法不僅生成速度慢(雖然速度可以通過加入緩存機(jī)制,一定程度上優(yōu)化),而且在質(zhì)量上也不如 GAN。
2. 人臉識(shí)別問題
由于第一個(gè)環(huán)節(jié)是對(duì)人臉做預(yù)處理,算法必須首先能識(shí)別出人臉,然后才能處理它,而 dlib 中的人臉檢測算法,必須是「全臉」,如果臉的角度比較偏就無法識(shí)別,也就無法「換臉」。所以項(xiàng)目二就用了 MTCNN 作為識(shí)別引擎。
3. 人臉轉(zhuǎn)換效果問題
原版的算法人臉轉(zhuǎn)換的效果,筆者認(rèn)為還不夠好,比如由 A->B 的轉(zhuǎn)換,B 的質(zhì)量和原圖 A 是有一定關(guān)聯(lián)的,這很容易理解,因?yàn)樗惴ū旧淼脑?,?XW->X 中不管 X 如何扭曲總會(huì)有一個(gè)限度。所以導(dǎo)致由美女 A 生成美女 B 的效果要遠(yuǎn)遠(yuǎn)優(yōu)于由丑男 A 生成美女 B。這個(gè)問題的解決筆者認(rèn)為最容易想到的還是 Gan,類似 Cycle-Gan 這樣框架可以進(jìn)行無監(jiān)督的語義轉(zhuǎn)換。另外原版的算法僅截取了人臉的中間部分,下巴還有額頭都沒有在訓(xùn)練圖片之內(nèi),因此還有較大的提高空間。
4. 圖片融合問題
由于生成出來的是一個(gè)正方形,如何與原圖融合就是一個(gè)問題了,原始項(xiàng)目有很多種融合方法,包括直接覆蓋,遮罩覆蓋,還有就是泊松克隆「Seamless cloning」,從效果上而言,遮罩覆蓋的效果與泊松克隆最好,二者各有千秋,遮罩覆蓋邊緣比較生硬,泊松克隆很柔和,其單圖效果要優(yōu)于遮罩覆蓋,但是由于泊松克隆會(huì)使圖片發(fā)生些許位移,因此在視頻合成中會(huì)產(chǎn)生一定的抖動(dòng)。圖片融合問題的改進(jìn)思路,筆者認(rèn)為還是要從生成圖片本身著手,項(xiàng)目二引入了遮罩,是一個(gè)非常不錯(cuò)的思路,也是一個(gè)比較容易想到的思路,就是最終生成的是一個(gè) RAGB 的帶通明度的圖片。
筆者還嘗試過很多方法,其中效果比較好的是,在引入 Gan 的同時(shí)加入非常小的自我還原的 L1Loss,讓圖片「和而不同」。經(jīng)測試,這種方法能夠使圖片的邊緣和原圖基本融合,但是這種方法也有弊端,那就是像臉型不一樣這樣的比較大的改動(dòng),網(wǎng)絡(luò)就不愿意去嘗試了,網(wǎng)絡(luò)更趨向于小修小補(bǔ),僅改變五官的特征。
5. 視頻抖動(dòng)問題
視頻抖動(dòng)是一個(gè)很關(guān)鍵的問題。主要源自兩點(diǎn),第一點(diǎn)是人臉識(shí)別中斷的問題,比如 1 秒鐘視頻的連續(xù) 30 幀的圖片中間突然有幾幀由于角度或是清晰度的問題而無法識(shí)別產(chǎn)生了中斷。第二點(diǎn)是算法本身精確度問題會(huì)導(dǎo)致人臉的大小發(fā)生變化。這是由算法本身帶來的,因?yàn)榭偸亲?XW->X,而 XW 是被扭曲過的,當(dāng) XW 是被拉大時(shí),算法要由大還原小,當(dāng) XW 被縮小時(shí),要由小還原大。也就是說同一張人臉圖片,讓他合成大于自己的或小于自己的臉都是有道理的,另外當(dāng)人臉角度變化較大時(shí),這種抖動(dòng)就會(huì)更明顯。視頻抖動(dòng)目前尚未有很好的解決方案,唯有不斷提高算法的精確度,同時(shí)提高人臉識(shí)別和人臉轉(zhuǎn)換的精確度。
四、關(guān)于Gan改進(jìn)版的Deepfake
在原始版本上加入 Gan,項(xiàng)目二是這么做的,筆者也進(jìn)行過較深入的研究。
Gan 的優(yōu)點(diǎn)是能比較快進(jìn)行風(fēng)格轉(zhuǎn)換,相同參數(shù)下 Gan 訓(xùn)練兩萬次就生成比較清晰目標(biāo)人臉,而原始算法大概需要五萬次以上,Gan 生成的人臉較清晰,而且能減少對(duì)原圖的依賴等,同時(shí)加入 Gan 之后,可以減少對(duì)特定網(wǎng)絡(luò)模型的依賴,完全可以去掉原網(wǎng)絡(luò)中的 FC 和 Shuffer。
Gan 的缺點(diǎn)也很突出,其訓(xùn)練難以把控,這是眾所周知的。Gan 會(huì)帶來許多不可控的因子。比如一個(gè)人的膚色偏白,則生成的人臉也會(huì)變白,而忘記要與原圖的膚色保持一致,比如有的人有流海,訓(xùn)練數(shù)據(jù)中大部分都是有劉海的圖片,則 Gan 也會(huì)認(rèn)為這個(gè)人必須是有劉海的,而不考慮原圖是否有劉海。即使加入了 Condition,Gan 這種「主觀臆斷」和「自以為是」的特點(diǎn)也無法得到根除,總而言之,加入 Gan 以后經(jīng)常會(huì)「過訓(xùn)練」。 這種情況在筆者之前做的字體生成項(xiàng)目中也出現(xiàn)過,比如在由黑體字合成宋體字時(shí),Gan 經(jīng)常會(huì)自以為是地為「忄」的那一長豎加上一鉤(像「刂」一樣的鉤)。另外 Gan 有一個(gè)最大的弊端就是他會(huì)過分趨近訓(xùn)練集的樣本,而不考慮表情因素,比如原圖的人是在大笑,但是訓(xùn)練集中很少有這類圖片,因此生成的圖片也許只是在微笑。我不禁聯(lián)想到了 Nvidia 的那篇論文,沒有條件的 Gan 雖然可以生成高清的圖片,但是沒法人為控制隨機(jī)因子 z,無法指定具體要生成生成什么樣的臉,而有條件的 Gan 樣本又過于昂貴。Gan 的這一大缺點(diǎn)會(huì)使生成的視頻中人物表情很刻板,而且畫面抖動(dòng)的情況也更劇烈,即使加入了強(qiáng)監(jiān)督的 L1Loss,GAN 還是會(huì)有上述弊端??傊谠娴幕A(chǔ)上加入 Gan 還需要進(jìn)一步地研究,2017 年 Gan 的論文很多,但沒有多少令人眼前一亮的東西,Google 甚者發(fā)了一篇論文說,這么多改進(jìn)的版本與原版的差別并不顯著,經(jīng)測試,筆者得到的結(jié)論是 Gan 困最難的地方是抖動(dòng)較大,合成視頻時(shí)效果不太好,也許是 Gan 力量太強(qiáng)的原故。
五、結(jié)束語
單純從技術(shù)的層面上來看,Deepfake 是一個(gè)很不錯(cuò)的應(yīng)用,筆者更期望它能用在正途上,能在電影制作,錄制回憶片,紀(jì)錄片中發(fā)揮作用,真實(shí)地還原歷史人物的原貌,這可能是無法僅由演員和化妝師做到的,筆者也期望在 2018 年,基于圖像的生成模型能涌現(xiàn)出更多可以落地的應(yīng)用。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。