可微圖像參數表示
來自專欄論智11 人贊了文章
作者:Alexander Mordvintsev、Nicola Pezzotti、Ludwig Schubert、Chris Olah
編譯:weakish
出人意料,為分類圖像而訓練的神經網路具有出色的生成圖像的能力。DeepDream、風格遷移、特徵可視化之類的技術將這一能力作為探索神經網路內部機制的強力工具,推動了一場基於神經網路的小型藝術運動。
這些技術的機制大致相同。用於計算機視覺的神經網路具有圖像的豐富內在表示。我們可以使用這一表示來描述我們希望圖像具有的性質(例如,風格),接著優化輸入圖像使其具備這些性質。這種優化之所以可行,是因為網路在其輸入上可微:我們可以微調圖像以更好地擬合所需性質,接著在梯度下降中迭代應用這些微調。
參數化輸入圖像的典型方法是將其表示為每個像素的RGB值,但這不是唯一的方式。只要參數到圖像的映射是可微的,我們就可以通過梯度下降優化其他形式的參數表示。
可微圖像參數表示邀請我們提出了這樣一個問題:「反向傳播通過的是什麼樣的圖像生成過程?」答案是相當多樣的過程,其中一些奇異的可能性,可以創造多種多樣的有趣效果,包括3D神經藝術,透明圖像,對齊內插。之前一些使用不同尋常的圖像參數表示的工作(arXiv:1412.1897、3D對抗樣本、特徵可視化)展示了激動人心的結果——我們覺得概覽下這一領域的進展能夠提示更具潛力的方法。
為什麼參數表示很重要?
在保持實際進行優化的目標函數不變的情況下,改變優化問題的參數表示就能明顯改變結果,這看起來比較驚人。參數表示的選擇為什麼具有顯著的效應,我們認為有四個原因:
- 改良優化 —— 轉換輸入以降低優化問題的難度——這一技術稱為預處理(preconditioning)——是優化的主要內容。
- 吸引盆 —— 通常有多種優化方案,對應不同的局部極小值。優化過程落入任一特定極小值的概率由其吸引盆控制(吸引盆為在極小值影響下的優化區域)。改變優化問題的參數表示,可以改變吸引盆的大小,從而影響結果。
- 額外限制 —— 有些參數表示僅僅覆蓋可能輸入的一個子集,而不是整個空間。在這樣的參數表示上工作的優化器仍能找到最小化或最大化目標函數的解,但它們將置於參數表示的限制之下。
- 隱式優化其他目標 —— 一個參數表示可能內部使用和供優化的輸出目標不同的目標。例如,儘管視覺網路的自然輸入是RGB圖像,我們可以將其參數化為3D物體的渲染,讓反向傳播通過其渲染過程。由於3D物體相比圖像自由度更高,我們一般使用隨機(stochastic)參數表示,該表示產生不同角度的渲染圖像。
本文剩下的部分將給出具體的例子,體現這類方法的優勢,以及它們如何導向驚奇、有趣的視覺效果。
對齊特徵可視化內插
特徵可視化最常用來可視化單個神經元,但它同樣可以用來可視化神經元的組合,以研究它們是如何交互的。
當我們想要切實理解兩個神經元之間的交互時,我們可以更進一步,創建多元可視化。某種意義上,這類似於GAN這樣的生成式模型的潛空間內插。
不過我們還要應對一項小挑戰:特徵可視化是隨機的。即時我們優化的目標完全一致,每次可視化的布局仍將不同。通常情形下這不會導致問題,但是確實影響解釋性可視化,所得可視化會沒對齊:像眼睛這樣的視覺標記在每幀的不同位置出現。缺乏對齊使得比較略微不同的目標更加困難,因為布局上的差異最大、最明顯,蓋過了其他差異。
如何解決這一對齊問題,使得視覺標記不因幀的不同而移動。有一些可供嘗試的方法,其中之一是使用共享參數表示(shared parameterization):每幀參數化為其自身唯一的參數表示和一個共享參數表示的組合。
通過部分共享幀間的參數表示,我們鼓勵所得可視化自然對齊。從直覺上說,共享參數表示提供了視覺標記放置位置的共有參考,而唯一參數表示基於內插權重賦予每幀自身的視覺效果。這樣的參數化並沒有改變目標,但確實擴大了對齊可視化的吸引盆。
配套colab頁面:
https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/differentiable-parameterizations/aligned_interpolation.ipynb基於非VGG架構的風格遷移
神經風格遷移有一個不解之謎:儘管使用神經網路進行風格遷移非常成功,但幾乎所有的風格遷移都基於VGG架構的變體。這並不是因為沒人對使用其他架構進行風格遷移感興趣,而是因為在其他架構上的嘗試表現一直不好。
人們提出了一些假說,解釋VGG為何比其他模型的表現好這麼多。其中一種解釋是VGG的大尺寸使其捕捉了其他模型丟棄的信息。這些無助於分類的額外信息,使得這一模型在風格遷移上表現更好。另一種替代假說是其他模型比VGG更激進的下採樣導致空間信息的損失。我們懷疑可能有其他因素:大多數現代的視覺模型,其梯度中都有棋盤效應(checkerboard artifacts),這可能加大了優化風格圖像的難度。
在之前的工作中,我們發現,去相關性的參數表示可以顯著改善優化。我們發現這一方法同樣可以改善風格遷移,讓我們可以使用原本無法產生有視覺吸引力的風格遷移結果的模型:
左上為風格圖像(梵高的《星空》),右上為內容圖像(Andyindia拍攝的照片)。下為模型生成的風格遷移圖像(最終優化結果)。生成圖像的左半部分為去相關性空間(Decorrelated Space)優化結果,右半部分為像素空間(Pixel Space)優化結果,兩部分的優化目標完全一樣,僅僅參數表示不同。
下面我們稍稍介紹一些細節。風格遷移涉及三張圖像:內容圖像,風格圖像,優化圖像。這些圖像都傳給CNN,風格遷移目標則基於這些圖像如何激活CNN的差異。我們唯一進行的改動是參數化優化圖像的方法。從基於像素參數化(相鄰像素高度相關)轉為基於尺度傅立葉變換參數化。
我們同時使用了部分風格遷移實現沒有使用的轉換魯棒性。具體實現見配套的colab頁面:
https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/differentiable-parameterizations/style_transfer_2d.ipynb複合模式生成網路
到目前為止,我們探索的圖像參數表示,相對接近我們通常對圖像的認知,像素或傅立葉成分。本節將探索使用不同的參數表示給優化過程施加額外限制的可能性。更具體地說,我們將圖像參數化為神經網路——複合模式生成網路(Compositional Pattern Producing Network,CPPN)。
CPPN是將(x, y)位置映射到圖像色彩的神經網路:
CPPN可以生成任意解析度的圖像。CPPN網路的參數——權重和偏置——決定生成什麼樣的圖像。取決於CPPN的架構,所得圖像中的像素,在一定程度上受到共享相鄰像素顏色的限制。
隨機參數可以產生美學上有趣的圖像,然而,通過學習CPPN的參數,我們能生成更有趣的圖像。學習CPPN參數經常通過演化達成(例如,K. Sims、K.O. Stanley、A.M. Nguyen等的工作);這裡我們探索了通過反向傳播某個目標函數(例如特徵可視化目標)學習CPPN參數的可能性。這不難做到,因為CPPN網路是可微的(和卷積神經網路一樣)。這就是說,CPPN是一種可微圖像參數表示——在任何神經藝術或可視化任務中,CPPN是一個參數化圖像的通用工具。
使用基於CPPN的圖像參數表示,可以給神經藝術加上有趣的藝術性,隱約讓人聯想起光繪(light-paintings,運用彩色光束、稜鏡、平面鏡創造圖像)。
在偏理論的層面,它們可以看成是對圖像的組分複雜性(compositional complexity)的限制。優化特徵可視化目標時,CPPN可以生成獨具特色的圖像:
選擇的CPPN架構對生成圖像的視覺質量影響很大。這裡CPPN架構不僅包括網路的形狀(網路層和過濾器的數量),也包括激活函數和歸一化。例如,相比較淺的網路,較深的網路生成細節上更精細的圖像。我們鼓勵讀者通過修改CPPN的架構生成不同的圖像。這並不難,只需改動配套的colab頁面中的代碼:
https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/differentiable-parameterizations/xy2rgb.ipynbCPPN生成模式的演化自身就是藝術品。回到光繪的比喻上來,優化過程對應光束方向和形狀的迭代調整。相比像素參數表示之類的其他參數表示,CPPN的迭代變動更具全局效應,因此在優化剛開始的時候,只能看到主要的模式。隨著迭代調整權重的進行(我們想像中的光束變換位置),出現了精細的細節。
【視頻地址:可微圖像參數表示】
繼續這一比喻,我們可以創造一種新的動畫,從上面的一幅圖像漸變為另一幅。直觀地講,我們從其中一幅光繪開始,然後移動光束以創作另一幅不同的光繪。事實上,這是通過內插兩種模式的CPPN表示權重做到的。給定經內插替換的CPPN表示,可以生成一組中間幀。像之前一樣,改動參數具有全局效應,能夠生成具有視覺吸引力的中間幀。
【視頻地址:可微圖像參數表示】
這一節展示了一種不同於標準圖像表示的參數表示。神經網路(這裡的CPPN),可以用來參數化為給定目標函數優化的圖像。更具體地說,我們結合了特徵可視化目標函數和CPPN參數表示,以創建視覺風格獨特的無窮解析度圖像。
生成半透明模式
本文介紹的神經網路都接受二維RGB圖像作為輸入。有沒有可能使用同樣的網路合成超出這一範圍的圖像?為了做到這一點,我們可以讓可微參數表示定義一系列圖像而不是單張圖像,接著在每個優化步驟中從圖像序列中取樣一張圖像或多張圖像。這很重要,因為我們即將探索的許多優化目標比傳入網路的圖像的自由度更高。
讓我們來看一個具體的例子,半透明圖像。這些圖像在RGB通道之外,還有一個編碼透明度的Alpha通道。為了將這樣的圖像傳入在RGB圖像上訓練的神經網路,我們需要通過某種方法塌縮Alpha通道。達成這一點的一種方法是將RGBA圖像覆蓋在一張背景圖像BG之上,這可以應用標準的Alpha混合公式:
其中, 為圖像I的Alpha通道。
如果我們使用固定的背景圖像,例如全黑圖,透明度將僅僅指示背景直接貢獻優化目標的像素位置。事實上,這等價於優化一張RGB圖像,使其在顏色與背景相同的區域透明!直覺上,我們想要透明區域對應於「這一區域的內容可能是任意的」之類的東西。基於這一直覺,我們在每一個優化步驟使用了不同的隨機背景。(實際上,我們同時嘗試了從真實圖像取樣以及應用不同種類的雜訊。我們發現,只要充分隨機化,不同的分布並不會影響最終的優化結果。所以,出於簡單性,我們使用了平滑2D高斯雜訊。)
默認配置下,優化半透明圖像將導致圖像變得完全不透明,這樣網路總能得到最優輸入。為了避免這一問題,我們需要修改目標,採用一個鼓勵部分透明的目標函數。我們發現,對原目標函數進行如下替換很有效:
這一新目標函數自動在原目標函數objold和降低透明度均值間尋找平衡。如果圖像變得很透明,它將專註於原本的目標。如果圖像變得很不透明,它會暫時停止關注原目標,專註於降低平均透明度。
我們發現,半透明圖像在特徵可視化上很有用。特徵可視化的目標是,通過創建能夠最大化神經元激活程度的圖像,理解視覺模型中的神經元在找什麼。不幸的是,這些可視化無法區分圖像的哪些區域對某個神經元的激活影響很大,哪些區域的影響甚少。
理想情況下,我們想要找到一種方法,讓可視化可以區分重要性——一種自然的方式,是將不重要的部分透明化。因此,如果我們優化一張帶Alpha通道的圖像,並鼓勵整張圖像變得透明,那麼在特徵可視化目標看來不重要的圖像區域應該變得透明。
配套colab頁面:
https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/differentiable-parameterizations/transparency.ipynb基於3D渲染的高效紋理優化
前一節使用針對RGB圖像的神經網路創建半透明RGBA圖像。可不可以更進一步?這一節將探索為特徵可視化目標優化3D物體。我們使用3D渲染過程轉換出2D RGB圖像,傳入神經網路,然後反向傳播渲染過程以優化3D物體的紋理。
我們的技術類似Athalye等用來創建真實世界對抗樣本的方法,依賴反向傳播目標函數至隨機取樣的3D模型視圖。和現有的藝術紋理生成方法(arXiv:1711.07566)不同,我們並不在反向傳播過程中修改物體的幾何性質。通過拆分紋理生成和頂點定位,我們可以為複雜物體創建細節豐富的紋理。
在描述我們的方法之前,首先需要了解3D物體是如何儲存,如何在屏幕上渲染的。物體的幾何性質通常保存為一組相連的三角形,這稱為三角網格(triangle mesh),簡稱網格。之後在網格上繪製紋理(texture)以渲染逼真的模型。紋理保存為一張圖像,通過UV映射(UV-mapping)應用於模型。網格中的每個頂點ci關聯紋理圖像中的一個坐標(ui, vi)。渲染模型(即在屏幕上繪製)時,給每個三角形貼上由頂點坐標(u, v)界定的圖像區域。
一個簡單粗暴的創建3D物體紋理的方法是照常優化圖像,並將其作為紋理貼到物體上。然而,這一方法生成的紋理沒有考慮UV映射,因此會在渲染好的物體上造成多種視覺效應,包括接縫(seams)、隨機朝向、縮放不一致。
從上圖可以看到,左面的圖像出現了接縫、朝向錯誤的問題。
將上圖展開為二維紋理表示,能夠更清楚地看到兩者的差別。
我們沒有直接優化紋理,而是優化3D物體渲染過程中的紋理:
我們首先基於傅立葉參數表示隨機初始化紋理。每個訓練迭代取樣一個隨機拍攝位置(朝向物體包圍盒的中心),然後渲染貼上紋理的物體為圖像。接著我們反向傳播所需目標函數(神經網路感興趣的特徵)的梯度至渲染圖像。
不過,更新渲染圖像並不對應紋理(我們的優化目標)的更新。因此,我們需要進一步傳播變動至物體紋理。應用逆向UV映射,這很容易實現。
此外,由於優化函數從物體的幾何性質中分離出來,紋理可以使用任意大的解析度。在下一節中,我們將看到,如何復用這一框架,進行物體紋理的藝術風格遷移。
配套colab頁面:
https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/differentiable-parameterizations/texture_synth_3d.ipynb基於3D渲染的紋理風格遷移
既然我們已經有了一個高效地反向傳播UV映射紋理的框架,我們可以基於該框架將現有的風格遷移技術應用於3D物體。和2D情形類似,我們的目標是依據用戶提供的圖像風格重繪原物體的紋理。
和前一節一樣,我們從隨機初始化的紋理開始。在每一次迭代中,我們取樣一個隨機視角(同樣朝向物體包圍盒的中心),並渲染兩張圖像:內容圖像(content image)(原紋理)和學習圖像(learned image)(正優化的紋理)。
渲染內容圖像和學習圖像後,我們基於Gatys等提出的風格遷移的目標函數(arXiv:1508.06576)進行優化,並像前一節一樣將參數表示映射回UV映射紋理。迭代此過程,直到混合內容和風格的目標紋理符合要求。
每個視角獨立優化,迫使優化在每個迭代中嘗試加上所有風格元素。例如,如果我們的風格圖像是梵高的《星空》,那麼每個視角都會加上星辰。我們發現,通過引入之前視角的風格作為某種「記憶」,能夠得到更滿意的結果。我們通過這種方式維護了最近取樣的視圖的平均風格表示格拉姆矩陣。在每個優化迭代中,我們基於這些平均矩陣(而不是特定視角的矩陣)計算風格損失。
所得紋理在保持原紋理特性的同時,結合了所需風格的元素。以應用梵高《星空》風格至Greg Turk和Marc Levoy的Stanford Bunny模型為例:
所得紋理包含了梵高的作品特有的富於韻律和活力的筆觸。然而,儘管風格圖像以冷色調為主,最終得到的紋理卻保留了原紋理的暖色(皮毛的底色為橙色)。更有趣的地方,是不同風格遷移下,如何保留兔眼的形態。例如,當風格取自梵高的作品時,兔眼轉換為類似星辰的漩渦。如果使用的是康丁斯基的作品,兔眼則變為類似眼睛的抽象模式。
生成的紋理模型易於在流行的3D建模軟體和遊戲引擎中使用。作為演示,我們3D列印了其中一項設計:
配套colab頁面:
https://colab.research.google.com/github/tensorflow/lucid/blob/master/notebooks/differentiable-parameterizations/style_transfer_3d.ipynb結語
對富於創意的藝術家和研究者而言,參數化優化圖像的方法是一個巨大的空間。這一切並不局限於靜態圖像,還可以用於生成動畫的3D物體!本文探索的可能性僅僅觸及了表面。例如,可以探索擴展3D物體紋理優化至材質和反射率的優化——甚至進一步優化網格頂點的位置,正如Kato等所做的(arXiv:1711.07566)那樣。
本文關注的是可微圖像參數表示,因為它們易於優化,並且覆蓋了廣闊範圍的可能應用。不過,基於強化學習和演化策略(jmlr/v15/wierstra14a、arXiv:1703.03864),優化不可微或部分可微的圖像參數表示當然是可行的。使用不可微的參數表示可以為圖像生成和場景生成提供許多激動人心的可能性。
推薦閱讀:
※讓圖像動起來 好玩 好看 好喜歡 [33P]
※圖像解析杏眼、桃花眼和丹鳳眼的區別
※淺談年畫中吉祥花鳥圖像的寓意_楊峰子竹齋
※圖像記譜