讓照片動起來

Darren Wang
Taiwan AI Academy
Published in
9 min readAug 28, 2019

Few-Shot Adversarial Learning of Realistic Neural Talking Head Models

Photo by Eric TERRADE on Unsplash

當漫遊在美術館的時候,大家都只是在靜靜地觀賞名人的作品 。但如果能看到圖畫裡的人物會動是多麽讓人振奮的事!就在今年的5月20號,由Samsung團隊提出的paper就能完成像哈利波特裡才會出現裡的情節,太不可思議了啊。

近年來,很多影片生成都是採用puppeteering的方式進行生成,例如透過追蹤骨架,讓原本不會跳舞的人都變成舞神,如同木偶般被操縱。本篇論文亦是用landmark,就是fig 1.裡用彩線輪廓去控制source圖,來達到圖片會動的效果。

fig 1. 只要一張source圖,source圖就能根據target圖和landmark來當做變化的目標

網路架構

fig 2. talking head的網路架構

我們來一一分析網路架構吧!!!

— 符號表示 —

x_i[t] : 取第i個影片的第t個frame

y_i[t] : 取第i個影片的第t個影格之landmark

x_hat_i[t] : generator經由y_i[t]的輸入得到新的圖

ϕ : embedder network的參數

e_hat_i : 第i個影片經過embedder後輸出的平均向量

Ρ : project 矩陣 ,是可以訓練的

Ψ_hat_i : generator的參數,Ψ_hat_i = Ρ.e_hat_i

Ψ : generator的參數

θ : discriminator的參數

W : 一個可以train的矩陣,其訓練目標為columns存放每個影片的vector

W_i : 取出第i個column vector

L_DSC : discriminator loss

L_ADV : 對抗的loss

L_FM : discriminator 前幾層輸出的loss

L_CNT : content loss

L_MCH : e_hat_i和W_i的L1_loss

D : x_hat_i[t] 和 W_i算出的分數

架構分析

作者把訓練分成兩個部分,一個是meta-learning stage,另一個是fine-tuning stage。

通常在meta-learning stage訓練完後就可以生成圖,但會有不可識別身份的缺陷,所以根據作者敘述,再經過fine-tuning stage就可以改善這些gap。

meta-learning stage

  • Embedder
fig 3. embedder

首先我們先把重點放到embedder上,我們會用一段video來當作資料餵入網路,但當然不是整個影片,而是要把影片拆成很多影格(frame)及其對應的landmark餵入,稱之為sequence_i,經過embedder後取平均會得到該影片的embedded vector,來代表sequence_i的主要特徵為e_hat_i。

  • Generator
fig 4. generator

Generator network的參數可以拆分成2個部分,Ψ_hat_i和Ψ,Ψ_hat_i會經由e_hat_i和Ρ的矩陣乘積得來,其Ρ是可以訓練的。

將Ψ_hat_i丟到adaIN裡,adaIN 通常會設計在Generator的後半段。

adaIN全名叫 adaptive instance normalization,其主要目的是可以修改global information,這裡就先不再贅述。

generator會根據landmark y_i[t]產生一張圖x_hat_i[t],起初產生的圖一定很差,所以一定要有一個目標讓網路去更新,其目標就是x_i[t],其loss我們這邊就叫content loss,記做L_CNT。論文採用VGG19和VGGFace算L_CNT。

VGG19和VGGFace都是用train好的權重,將x_hat_i[t]和x_i[t]分別餵進這兩個網路,並用L1 loss算,其結果會如下:

fig 5.content loss

L_CNT =

L1_loss ( VGG19(x_hat_i[t]) , VGG19(x_i[t] ) ) +

L1_loss ( VGGFace(x_hat_i[t]) , VGGFace(x_i[t]) )

注意*1:每項loss前可以乘上一個weight

注意*2:VGG19會用Conv1,6,11,20,29結果concat算L1_loss,VGGFace則是用Conv1,6,11,18,25結果concat算L1_loss

  • Discriminator
fig 6.算出分數r,越大越好

生成圖x_hat_i[t] , 真圖x_i[t] 經過discriminator後會得到一個向量V,V會和W_i去做運算得到一個分數r,參考下列公式,w_0和b也是訓練參數,但sequence_i丟入網路後所更新到的參數只會影響W_i(W第i個column,其他column不會影響到),而w_0和b則是不同的sequence丟到網路都會更新 :

我們主要就是要讓V和W_i的運算結果越高越好(loss則前面要加負號),所以L_ADV為 :

L_FM : 生成圖x_hat_i[t]在discriminator前幾層的輸出 和 真圖x_i[t]在discriminator前面幾層輸出之L1_loss加總。

discriminator loss記做L_DSC :

在訓練的時候,我們會把生成圖x_hat_i[t]和landmark y_i[t] 及真圖x_i[t]和y_i[t]雙雙丟到discriminator裡,希望前者pair的分數會小於-1,後者pair的分數會大於1。

另外還會算一個L_MCH :

*個人覺得這個loss可有可無,就算沒有也是可以更新所有參數,此篇論文用L_MCH只是要讓結果更robust。

L_MCH = L1_loss ( W_i , e_hat_i)

主要是希望這兩個向量越接近越好,這兩個向量目標都是對第i個影片算出特徵向量,只是一個是透過embedder,另一個是透過discriminator。

— 訓練流程 —

The training proceeds by alternating updates of the embedder and the generator that minimize the losses L_CNT , L_ADV and L_MCH with the updates of the discriminator that minimize the loss L_DSC

原文之意是 L_CNT , L_ADV , L_MCH 和 L_DSC交替更新

— total loss 做個總結—

L_total = L_CNT + L_ADV + L_MCH

L_ADV = -D + L_FM

L_CNT會更新Generator , Embeder , P矩陣

L_ADV會更新所有網路參數(包括所有網路及P , W , w_0 , b)

L_MCH會更新Embeder和W

L_DSC會更新所有網路參數(和L_ADV一樣,但更新的目標不一樣)

fine-tuning stage

此階段可有可無,但經過這個階段,會讓蒙娜麗莎的顏藝更為逼真。

首先,你可以照一個你想讓它動的圖片,例如蒙娜麗莎的微笑,可以是一張也可以是多張,多張佳,但偏偏蒙娜麗莎的微笑只有一張,其他表情就沒有了,所以只能勉為其難就用一張

這裡的T就等於1。

Ψ_plum = P.e_hat_NEW

landmark y傳到已訓練好的generator,P亦是訓練好的project matrix

Ψ_plum可以當作微調蒙娜麗莎的參數

而Ψ是在meta-learning stage訓練的參數

所以generator在此階段會調整Ψ_plum和Ψ,因為有Ψ_plum,讓generator更新的時候會考慮到蒙娜麗莎的特徵,產生的圖會比較像蒙娜麗莎。

另外,此階段不用考慮W,因為蒙娜麗莎的圖片絕對不會出現在W column裡,但要怎麼算D呢(分數)。要算D會需要用到W column,所以

變成

我們用w_plum來取代原本的W_i+w_0,w_plum初始化則是e_hat_New+w_0,這點其實蠻直觀的,其實e和W_i本來就是要算sequence_i的特徵。

也因為沒有W,此階段也不用算L_MCH

其餘都跟meta-learning stage差不多。

實驗結果

下圖是實驗結果,FF(feed-forward model)是只訓練150 epochs且沒有算L_MCH,且也沒有進入fine-tuning stage,而FT model(原文沒寫是啥的縮寫),只訓練75 epochs,但有算L_MCH。

fig 7.實驗結果

以視覺上來看,FF看起來很真,但會有那麼一點點不像Ground truth,而FT經過fine-tuning stage後就比較接近Ground truth。

— —

reference

[1] Few-Shot Adversarial Learning of Realistic Neural Talking Head Models

--

--