全文共 4175字,預計學習時長 8分鐘
最近,多項研究採用了生成對抗網路(Generative Adversarial Networks, 簡稱GANs)這一技術來生成解析度為1024x1024的高畫質圖片。超級逼真的人臉、動物和其他演算法生成的影像令人驚歎不已,要知道,這項技術出現也不過短短几年。從解析度低,畫素差的圖片到如今栩栩如生的高畫質畫質,在很短的時間內就實現了質的飛躍:這一領域進步多大,請看下圖。
生成式對抗網路技術人臉處理例項
這一領域相關度最高的研究是英偉達的 StyleGAN和谷歌的BigGAN。
要生成高質量的圖片需要極高的計算能力,所以目前仍不是個可以輕鬆解決的問題。因此,本文將介紹如何在不使用昂貴硬體的前提下利用GANs處理高畫質圖片,這對手上沒有高階顯示卡(GPU)的人來說是一個絕好機會。本文討論的所有內容都可以在谷歌的Colaboratory上找到,該平臺提供了免費GPU以供大眾完成自己的機器/深度學習專案。
目標
我們要使用一個很特別而簡單的GAN結構來完成任務,在兩個高畫質圖片之間進行風格轉換。此外,還會將一張普通的高畫質風景圖片編輯成梵高的風格。近幾年在計算機視覺領域,風格轉換非常流行。
《藝術化的神經網路演算法》引領了這股潮流,該論文在事先測試好的卷積網路中對圖片進行內容和風格上的調整。雖然這種方法能處理高畫質圖片,但它只能用一張影像作為參照,比如說,它只能用《星夜》作為梵高整體繪畫風格的參照,這不是我們想要的結果。
論文中關於風格遷移的例項
生成對抗網路技術(GAN)需要大量圖片作為輸入資料才能完全捕捉畫家的風格,CycleGAN這篇論文提到了很多關於風格遷移的有趣發現。
CycleGAN風格遷移例項
然而,除錯GANs對計算機配置要求很高:只有高階硬體再花上很長的除錯時間才能處理這一代高解析度圖片。希望本文介紹的方法能在處理高畫質圖片方面幫助到大家。
梵高的作品
處理成梵高風格的高畫質圖片
具體步驟如下
建立模型
這一步的目標是實現影像到影像的轉換(從A域到B域)。可以透過很多方法來實現,也有很多網路模型,其中最有名的可能就是CycleGAN,也有很多與這個話題相關的論文。
本文在孿生網路裡自定義了一個模型作為鑑別器,還採用了一個很特別但是非常簡單的損失函式。選擇這個方法的原因是每一個損失項都不那麼依賴於每個畫素之間的差異:這就意味著網路在生成高畫質圖片時沒有幾何限制,從而能編輯出畫面更加生動的圖片。(這個結論在本例中成立。)
下面將簡單介紹孿生生成式對抗網路(Siamese GAN)的架構。
孿生生成式對抗網路(Siamese GAN)架構
孿生生成式對抗網路由生成器和鑑別器組成。圖片輸入生成器,輸出編輯過的圖片。圖片輸入鑑別器,輸出一個潛在向量。
孿生鑑別器有兩個功能:其一,指揮生成器生成畫面更逼真的圖片;其二,對於那些畫面看起來不真實的圖片,維持現有的圖片內容,儘量保持和原圖風格一致。
從A域和B域分別隨機取圖片並命名為A1, A2和B1,B2,X是一張隨機圖片,G(X)是生成器合成的圖片,鑑別器需要將圖片加工成向量D(X),如:
1. D(B1)和一個固定點(以原點為例)之間的歐幾里得距離必須非常近,與此同時,D(G(A1))必須離這個點非常遠。相應地,向量與固定點距離越近,能生成的圖片越逼真。另外,在大多數研究對抗網路的例子中,生成器都要試著縮短從D(G(A1))到這個固定點之間的距離。
2. 如果要保留A和G(A)之間的“內容”,(D(A1)-D(A2))和 (D(G(A1)-D(G(A2))) 的餘弦相似度必須保持一致。生成器和鑑別器都會參與這個步驟。
孿生鑑別器
第一條根據向量大小的變化而變化,第二條更側重於向量的角度。如果能實現從A域到B域之間的影像轉換,目標就完成了。
現在有了一個模型,下面就一起探索怎樣運用網路來得到高畫質圖片吧。
影像提取
首先需要兩個高畫質相簿,在這個例子中,需要一個風景相簿作為A域,以及梵高的作品相簿作為B域。切記,圖片越大,預處理時間就越長,比如裁剪、調整大小等,但這些操作並不會延長除錯網路的時間。
然後需要選擇輸入生成器的圖片大小:顯然不能直接使用圖片庫裡的高畫質圖片,不然除錯時間會變得很長,網路的規模也很大,這樣就不能解決任何實質性的問題了。所以要選擇足夠小的尺寸(如畫素為64*64),以便控制除錯時間,即便是比如免費的谷歌Colaboratory等中等表現的影像處理器也能處理這些圖片。
相應地,想必讀者也已經考慮到了,輸入生成器之前,這些圖片需要預先處理,裁剪成更小的尺寸。輸入圖片後處理成為張量,以隨機的SxS尺寸打包一同輸入進網路。這聽起來很簡單,實際操作也非常簡單!
現在,假設用這種方法訓練生成對抗網路,直到生成器把所有尺寸調整好的圖片都轉換成了想要的“梵高風”,這時候問題就來了:如何才能將整張高畫質圖片從A域轉換到B域呢?
其實很簡單,將圖片畫素分解為SxS(如果高畫質圖片本來畫素為BxB,就會出現(B//S)x(B//S)的格式),每個畫素尺寸為SxS的圖片都會經過生成器處理,最終組合到一起。
有一個更簡單的方法,將圖片的尺寸由大裁小,但除錯GAN的過程中就會發現問題:透過這種方法調整後的圖片再經過生成器轉換到B域的時候,和原圖放在一起很違和。結果顯示,每個畫素為SxS的圖片中的輪廓都特別清晰,“奇蹟”般地失敗了。相對來講,這算是小問題,即使使用以畫素為單位的CycleGAN等方法也會出現同樣的毛病。
輪廓清晰可見
如何解決這一問題?
慣用的方法簡單易懂,並且貫徹了這篇文章想要傳達的中心思想。
首先需要重新訪問資料管道:先將圖片處理成2Sx2S的大小(如果S=64,就需要裁剪成128x128大小),然後再轉換成BxB高畫質圖片。接著,設定好生成器之後,建立一個新模型,命名為Combo,功能如下:
1. INP:輸入一批A域的圖片,格式為2Sx2S;
2. INPCUT:將每個圖片裁剪成4SxS的格式;
3. 將裁減好的4SxS的圖片(INPCUT)輸進生成器,得到OUTCUT(與INPCUT形狀相同,但每個SxS圖片都已經編輯過了);
4. 將OUTCUT裡的每組4SxS圖片組合起來,得到OUT(與INP形狀相同,但每個2Sx2S圖片都已經編輯過了);
5. 得到輸出結果OUT。
Combo模型:裁剪、編輯、組合
Combo模型的輸出就變成了鑑別器的輸入,並且輸入資料的大小變成了之前的兩倍。這點輕微的調整不會佔用太多計算時間,並且可以有效解決之前的問題。具體方法如下:
現在生成器必須生成邊緣和顏色都保持一致的圖片,否則鑑別器無法將這些圖片識別為真實圖片,這樣就無法幫助生成器進行最佳化。具體來講,對每張有4個邊界的SxS圖片,生成器必須要生成非常逼真的圖片,即便是一個邊界處理得不好都會毀掉增長2x2影像的真實感。
測試例項(從左到右):A域的圖片,編輯後的圖片(AB), B域的圖片
“全家桶”
為了保證目前為止所有步驟都清楚明瞭,再複習一下整個網路如何執行的。
我們的目的是將A類圖片編輯成B風格。2Sx2S的圖片大小是從A類和B類的高解析度圖片來的。A域的圖片是Combo的輸入,這個模型會先把圖片裁剪成4份更小的尺寸,然後使用生成器(G)來轉換它們,最後再組合到一起,稱其為偽影像(fake images)AB。
接著是孿生鑑別器(D),鑑別器的輸入資料大小是生成器輸入資料大小的兩倍(2Sx2S),其輸出是大小為LENVEC的向量。
D將圖片資訊解碼,處理成向量D(X),例如:
1. D(B)必須與原點相近(大小為VECLEN的零向量):
LossD1的值是D(B)到原點距離的歐幾里得距離的平方,也就是Eucl(D(A))2
2. D(AB)必須與原點相隔一定的距離:
LossD2 = (max(0, cost — Eucl(D(AB))))²
3. 轉換向量(D(A1)-D(A2))和(D(AB1)-D(AB2))必須是相似向量,才能保留圖片的內容:
LossD3 = cos_similarity(D(A1)-D(A2), D(AB1)-D(AB2))
另外,生成器必須輸出合成後的圖片AB,比如:
1. D(AB)必須與原點距離相近:
LossG1 = Eucl(D(AB))²
2.轉換向量(D(A1)-D(A2))和(D(AB1)-D(AB2))必須是相似向量(與鑑別器相同):
LossG2 = cos_similarity(D(A1)-D(A2), D(AB1)-D(AB2))
按照這個方法,生成器就能自主學習並生成指定風格的小尺寸圖片,其邊界不會有任何差錯。所以,如果要編輯一整張高畫質圖片,將其分成更小的SxS影像再輸入生成器就能得到一張賞心悅目且風格統一的高畫質圖片了。
高畫質圖片的編輯:雖然並不完美,但筆觸十分逼真,影像也很連貫。網路環境越好、效能越好的情況下圖片解析度越高。
結語
本文介紹的方法仍存在一些問題。
如果選擇了解析度極高的圖片,那麼用來除錯網路的更小尺寸的圖片可能裡面沒有任何相關資訊,很可能就是純色、單一畫素的圖片,這樣的除錯就沒有任何實際意義:生成器和鑑別器都需要處理一定的資訊。鑑別器必須根據其內容進行程式設計,如果資料內容沒有意義的話,這個過程中可能會出現一些問題。
失敗案例:生成器在一些區域混淆了風格不同的顏色和圖形
即使測試成功,把多個高解析度的圖片組合到一起時,雖然每一部分的風格進行了轉換,但對一整張高畫質圖片來講遠遠不夠,最後的結果往往和原圖差不多,只變換了一下顏色。
實驗中發現,測試階段使用低解析度的高畫質資料庫,要編輯的時候再切換為原大小的高畫質相簿的操作能有效解決第一個問題。
這種方法還有更多內容有待開發:除傳統風格轉換以外的其他影像編輯也是可能實現的。要知道,這個例子中的生成器並不知道圖片的原貌是什麼樣的,只能識別解析度比較低的圖片。所以,如果能給生成器提供更多內容,比如編碼後的“內容向量”,就能衍生出各種各樣的其他用法,為更復雜的內容為導向的高畫質圖片編輯開啟無限可能,比如由一種影像轉換成另一種影像、人臉、或動物等。
所以,仍有無限可能等待發掘。