影像風格轉換,主要是利用兩張影像的輸入,這兩張影像,一張被稱為 content 的影像,通常是由相機拍攝真實場景而成數位相片,另外一個影像輸入則被稱為 style 的影像,通常是具有特殊風格的藝術畫作,如梵谷或畢卡索的畫作。影像風格轉換類神經網路,所做的事情便是融合這兩種影像,使得 content 影像具有 style 影像的風格,而創造出新的影像,宛如已過世的畫家親筆繪製般。
在進入解說影像風格轉換的類神經系統的技術細節前,我們需要先思考一下什麼叫做風格,以及該如何用數學的公式來定義風格?若以人的感官來理解風格,顯然地,對於將賦予產生新影像風格的來源影像, style 影像,其所繪製的物件並不是風格所關心的重點,相對的,要讓一個真實影像具有 style 影像的方格,只要筆觸和紋理相符合,便可以讓人在感官上認為風格相近。
也就是說,在物件識別的任務中,像素間的空間關係構成物件的特點,在風格萃取中,會擾亂生成 content 影像相近的物件。相對的,在同一空間中的像素,在不同 Channels 之間的相關程度則會造成紋理和筆觸上的不同。我們用下方的課程投影片來做說明:
而在數學上,我們則用 style matrix 來量測不同 channel 之間的相關性,也就是上圖投影片截圖中所繪。用來使用作為 style matrix encoding 的 convolution layer output volume 如上圖左上所示。上圖左下則是每個 channel 輸出的模式。若紅色和黃色 channels 的 activation output 總是出現一樣的模式,我們便可以宣稱這兩個 channels 是高相關。相反的若紅色和藍色 channels 的 activation output 總出現不同的模式,則是低相關。
在課程中,style matrix 亦是在線性代數中的 Gram Matrix。 Gram Matrix 中的元素,包含兩同長度向量的所有內積,所以也可以看做一個 un-normalized cross covariance matrix。
有了正式的風格數學定義,現在我們可以來建構這個風格轉換的類神經系統。
然而要建立影像風格轉換的類神經系統,讓兩輸入影像能夠各司其職,則需要特別的網路架構和特製的目標損失函數。為了和課程的投影片解釋相符合,在下面圖片中,輸入 content 影像會被簡稱為 C,而輸入 style 影像則會被簡稱為 S,而輸出影像,則會被簡稱為 G(generated image)。
類神經風格轉移系統的演算法步驟可以簡述如下:
影像風格轉移的訓練,需要維持 content 影像和輸出影像的相似度,同時也能增加 style 影像和輸出影像的相似度。依據此目標,設計風格轉移的目標損失函數包括兩個主要的 loss terms:我們以 J(.) 代表損失函式的通用符號,則 content 影像和輸出影像之間的差異損失,則可以用 J(C, G) 來表示。而 J(S, G) 則是 style 影像和輸出影像之間的差異損失,用 J(S, G)來表示。
這兩個 terms 分別乘上權重參數後,以相加的方式來組成一個線性總損失,因為這兩個 terms 彼此之間互相獨立,所以類神經網路的最佳化演算法,可以分別對兩個 loss terms 做最佳化,而不至於造成 content / style 影像訓練時的干擾。
接著,我們就兩個不同的 loss terms 來解說,如何藉由對這兩個 loss terms 做最佳化而達到風格轉移的效果:
Content Loss Function: content loss function 的設計概念和 face verification 系統相似,為了比較兩個影像(輸入影像,C 和輸出影像 G)的不同,我們需要先將兩個影像的特徵編碼,或將原影像轉移到能表示其獨特性的特徵向量空間裡(feature embedding),然後再用合適的 distance function 去量測兩影像的特徵編碼。
Convolution layer 可以將影像做局部特徵萃取,而透過深層堆疊的 convolution network,在較高層的 convolution layer 輸出,可以對物件概念意義的特徵編碼。若選取較低層的 convolution layer 輸出,則會造成像素等級的細節拷貝。但太過接近分類層的輸出,所編碼的特徵則會過於通用抽象,所以作為 content loss 的影像特徵編碼的層數選取,盡量選取在中間的位置。
另外,可以利用已經對影像分類任務做訓練的 convolution network,如先前所介紹的 VGG-16 等,取出在第 l hidden 層的 activation output (下圖中標註為 a[l])作為影像的特徵編碼。
Style Loss Function: style loss function 則是要量測來源的 style image 和最後產生的 image 之間中風格的不同。由於,我們已定義風格的量測方式,接著我們便可以取出 ConvNet 中較為底層的 convolution layers 的 activation 輸出。style loss function 的數學公式,則可以見下圖課程投影片:
最後,在選擇哪一層的 activation 輸出作為計算 style loss 和 content loss 的影像編碼,可以參考以下兩點:
最後,介紹一篇 pytorch 的 Neural Style Transfer 的實作。
明天,我們將要和偽造大師見面!