相信很多人都對之前大名鼎鼎的 Prisma 早有耳聞,Prisma 能夠将一張普通的圖像轉換成各種藝術風格的圖像,今天,我們将要介紹一下Prisma 這款軟體背後的算法原理。就是發表于 2016 CVPR 一篇文章,
“ Image Style Transfer Using Convolutional Neural Networks”
算法的流程圖主要如下:

總得來說,就是利用一個訓練好的卷積神經網絡 VGG-19,這個網絡在ImageNet 上已經訓練過了。
給定一張風格圖像 a 和一張普通圖像 p,風格圖像經過VGG-19 的時候在每個卷積層會得到很多 feature maps, 這些feature maps 組成一個集合 A,同樣的,普通圖像 p 通過 VGG-19 的時候也會得到很多 feature maps,這些feature maps 組成一個集合 P,然後生成一張随機噪聲圖像 x, 随機噪聲圖像 x 通過VGG-19 的時候也會生成很多feature maps,這些 feature maps 構成集合 G 和 F 分别對應集合 A 和 P, 最終的優化函數是希望調整 x 讓 随機噪聲圖像 x 最後看起來既保持普通圖像 p 的内容, 又有一定的風格圖像 a 的風格。
content representation
在建立目标函數之前,我們需要先給出一些定義: 在CNN 中, 假設某一 layer 含有 Nl 個 filters, 那麼将會生成 Nl 個 feature maps,每個 feature map 的次元為 Ml , Ml 是 feature map 的 高與寬的乘積。是以每一層 feature maps 的集合可以表示為 Fl∈RNl×Ml , Flij 表示第 i個 filter在 position j 上的 activation。
是以,我們可以給出 content 的 cost function:
Lcontent(p,x,l)=12∑ij(Flij−Plij)
style representation
為了建立風格的representation,我們先利用 Gram matrix 去表示每一層各個 feature maps 之間的關系,Gl∈RNl×Nl , Glij 是 feature maps i,j 的内積:
Glij=∑kFlikFljk
利用 Gram matrix,我們可以建立每一層的關于 style 的 cost :
El=14N2lM2l∑i,j(Glij−Alij)2
結合所有層,可以得到總的cost
Lstyle(a,x)=∑l=0LwlEl
最後将 content 和 style 的 cost 相結合,最終可以得到:
Ltotal(p,a,x)=αLcontent(p,x)+βLstyle(a,x)