1. 程式人生 > >影象風格遷移【老版】

影象風格遷移【老版】

深度學習目前為止最有用的東西是影象處理,我們可以用它在極早期判斷癌症, 也可以用它在茫茫人海里尋找犯人,但是要我說你能寫一個小程式取悅女朋友, 你就不一定能信, 這一招叫藝術風格變換,就是你點選一下,就可以把你女朋友的大頭照換成一個畢加索的後現代藝術作品(當然是取代還是找打要看你的藝術品位)。

入行需謹慎

藝術風格遷移是一個古老而現代的主題 , 多少藝術家為了描摹他人作品而競折腰。 在出現了IT之後, 它也成為adobe之類的公司競相追求的寵兒,卻始終進展緩慢。

而深度學習, 卻可以輕輕點選自動完成這個任務, 鐵哥在此給大家拆拆招 , 看如何玩轉神經風格遷移。

我們說,神經風格遷移就是把一張圖片的內容和另一個圖片的風格合成的一個方法,比如說你給出一個貓的圖片和一個梵高的自畫像,就可以生成一隻梵高的貓。

在深度學習之前,機器視覺的工程師就嘗試用各類神奇的濾鏡提取影象的紋理資訊,抽取取來的紋理圖在經過某個變換放回到原圖片裡,就得到了一個新的風格的圖片。 

深度學習所作的事情,是把這個東西給自動化。我們利用卷積網路的深層結構提取的資訊,來替代之前的各種濾鏡。 

首先,卷積網路不僅能夠做貓狗識別這一類分類任務,在其中間層裡,其實包含了豐富的有用資訊,而這些資訊,正是我們做風格遷移的基礎。如果你視覺化CNN的各層級結構,你會發現裡面的每一層神經元的啟用態都對應了一種特定的資訊,越是底層的,就越接近畫面的紋理資訊,如同物品的材質。 越是上層的,就越接近實際內容(能說出來是個什麼東西的那些資訊),如同物品的種類。

研究人員提出的一套視覺化CNN的方法,把深層的內容通過反捲積映射回圖象,好比你關心什麼,就給你投影出來(Visualizing CNN 2014 )。

底層神經元關心畫面的材質

深層神經元關心物品的種類

那麼好了,風格遷移不就是這麼簡單嗎,把一張圖片的底層資訊和另一張圖片的上層資訊合成一起不久可以了嗎? 用適當的數學方法,我們可以在卷積網路的中間層裡左手提取圖象內容有關的資訊,右手提取圖象風格有關的資訊。

用中間層的資訊恢復的內容,可以看到不同層裡裡都可以找到風格和內容有關的資訊, 但是層次越深, 具體的資訊就越少, 而“實體” 的概念輪廓猶在

看起來是的,我們可以通過一個已經訓練好的CNN, 把一張風格圖片和內容圖片的資訊都抽取出來, 然後拼在一起!

為什麼這裡要用一個已經訓練好的CNN呢? 一個用分類任務訓練好的CNN,通常已經具有了對世界大多數影象提取資訊的能力, 因為影象傳遞資訊的底層機制是想通的。 我們把這個網路連線的權衡直接共享過來, 圖片一導進來, 網路就可以生成直接可用的特徵! 這正是遷移學習的原理。

這裡我們匯入一個已經訓練好的VGG19網路,一種非常流行的CNN影象分類框架

所有深度學習和機器學習,都是預先設定好一個損失函式,然後在進行梯度回傳,這裡也不例外,我們可以通過設定合理的損失函式,來解決問題。這個損失函式,正是一種能夠測量生成圖片與風格圖片,內容圖片距離的函式。 

來,兄弟們,看我們如何設定這樣一個函式。既然我們的深度卷積網路可以做到測量與內容有關的特徵, 那麼我們只需要在這個層次上找一下特徵向量的距離就好了。 

影象無非是高維空間的一個點,通過神經網路變換再經過特定降維方法處理後我們可以給它轉化成二維曲面上的一個點, 我們會發現,在這個世界裡, 狗在狗的國度 , 貓在貓的國度。 而我們只需要度量不同影象的空間距離,就測量了內容的相似度。

哇, 這不就是定義距離的公式嗎!

然後呢,如何搞定風格,風格通常是一個藝術家眼中主關的有點虛無縹緲的概念,也就是我們通常說的感覺, 比如梵高或者莫奈的畫,你沒有經過藝術薰陶也可以得來。

而在深度學習的角度下, 這種感覺卻發現與不同神經元活動的相關性有關! 也就是說,風格是深度網路神經元活動的某種統計特性! 悄悄的,我們把藝術和數學對接上了。 統計果然是上帝的語言啊有木有!

這裡我們藉助一個叫gram矩陣的數學工具,它通過測量同一層卷積輸出不同通道之間的相關性(計算不同通道間的相關性,組成一個矩陣)給出一個對風格的度量。然後,我們在測量一下風格之間的距離不就行了嗎?

把CNN某一層對應不同特徵的神經元像攤煎餅一樣攤開, 然後計算之間的相關性

得到一個矩陣,矩陣的每個元素對應不同特徵間的相關性

這個損失函式就是gram 矩陣之間的距離!

注意,衡量風格之間的距離, 我們是把不同網路層級間的gram矩陣的距離都計算一下加在一起,這樣可以把不同層次度量的東西綜合起來 。

好了,到這一步, 大功告成, 把兩個損失函式疊加在一起就好了。

目標函式的設計學問可大了,改變a和b的比例就能造成很多區別,大家注意風格圖片的比例越高,影象就越紋理化。

風格的權重變大的時候, 那影象就變成了義大利瓷磚!

然後我們可以做什麼呢? 梯度下降!但注意,這裡我們優化的目標不是網路權重而是影象本身,這樣我們就大功告成了!

當然這裡說的只是風格遷移的一種, 這種方法的優點是通俗易懂, 而缺點是速度很慢。 還有一個方法,是借用生成網路,直接給搞出來, 這個方法更快速, 更加適合工業封裝。 我來給大家展示一下這個方法的實質。

像不像GAN的結構!

哈哈,這樣我們就可以完成一幅藝術作品交給家裡領導了,但是不要忘記哦, 這件事給我們的啟示絕不止這一個呀。 它給我們啟示的是,我們深層神經編碼的機制裡,深度學習的蹤影, 你對風格的認知,其實是和內容的認知一樣, 是可以量化的,而不像某些藝術家所言, 完全主觀,與數學無關。 不僅可以量化,而且這個資訊是可以獨立被提取的, 這種資訊不是存在於某個神經元之上, 而是分散式的存在於多級神經網路的不同尺度之間, 通過每一層神經元的統計規律表達。

雖然我們尚不知道這些猜想是否正確, 他們我們人類深奧的視覺處理機制提供了一種聰明的理解方法。

附: 程式碼, 看看用pytorch做出來是多麼簡潔:

計算內容損失函式

計算風格損失函式

設定模型主體!

訓練過程!