這個讓一張圖用另外一張圖的筆觸重新演繹出來的軟體是怎麼實現的?
Ostagram
這個軟體太酷了, 是怎麼實現的?
這個最近一直在研究,在深度學習沒有大規模流行的時候,有很多傳統的方法比如MRF等,深度學習流行後,憑藉著卷積網路強大的特徵表示能力,使用pretrained的model能夠在很多情況下表示圖像中的feature,在http://arxiv.org/abs/1508.06576 A Neural Algorithm of Artistic Style 這篇文章中,作者使用pre-trained的VGG模型,來對輸入圖像進行feature respresentation, 之後會經過如下圖的網路結構定義content 和 style loss,最小化loss過程來生成對應的最終的圖像:
Content Reconstruction: 上圖中下面部分是Content Reconstruction對應於CNN中的a,b,c,d,e層,注意最開始標了Content Representations的部分不是原始圖片(可以理解是給計算機比如分類器看的圖片,因此如果可視化它,可能完全就不知道是什麼內容),而是經過了Pre-trained之後的VGG network model的圖像數據, 該model主要用來做object recognition, 這裡主要用來生成圖像的Content Representations。理解了這裡,後面就比較容易了,經過五層卷積網路來做Content的重構,文章作者實驗發現在前3層的Content Reconstruction效果比較好,d,e兩層丟失了部分細節信息,保留了比較high-level的信息。
Style Reconstruction: Style的重構比較複雜,很難去模型化Style這個東西,Style Represention的生成也是和Content Representation的生成類似,也是由VGG network model去做的,不同點在於a,b,c,d,e的處理方式不同,Style Represention的Reconstruction是在CNN的不同的子集上來計算的,怎麼說呢,它會分別構造conv1_1(a),[conv1_1, conv2_1](b),[conv1_1, conv2_1, conv3_1],[conv1_1, conv2_1, conv3_1,conv4_1],[conv1_1, conv2_1, conv3_1, conv4_1, conv5_1]。這樣重構的Style 會在各個不同的尺度上更加匹配圖像本身的style,忽略場景的全局信息。
github還有 共享的項目源碼:GitHub - anishathalye/neural-style: Neural style in TensorFlow!, 代碼很漂亮,很容易讀懂
這之後,有人就開始討論如何在生產上快速使用neural style,畢竟前面說的模型無法保證快速的生成,他每次需要根據content image和style image來合成,實際當中很難有人願意等待,而在http://arxiv.org/pdf/1603.08155v1.pdf 提出了一種基於Perceptual Losses 的fast neural style的方法,如下圖,文章主要是構建transform network 和loss network, 其中loss network參數固定不做更新,而transform Network的參數根據style image的不同更新,且能夠有效地保存,這樣,當我們實際當中需要將我們的圖像風格化時我們只需要load對應的style model但是本人在實驗過程中效果很差,很難達到paper裡面展示效果,可能是content loss 和style loss 比例問題,測試了幾套參數都很難達到比較好的效果,所以個人覺得prisma的成果應該是結合這塊有更多相關的工作。
還有一種結合MRF和CNN的工作,最近正在研究paper和代碼,過段時間會發布在博客上,到時候也會來更新下這部分答案上述內容參考自我個人的學習博客:1, http://hacker.duanshishi.com/?p=1651 TensorFlow之深入理解neural style2,http://hacker.duanshishi.com/?p=1693 TensorFlow之深入理解fast neural stylecvpr的文章:http://arxiv.org/abs/1508.06576
代碼:GitHub - jcjohnson/neural-style: Torch implementation of neural style algorithm用深度神經網路去把第一張圖的content與第二張圖的style結合起來。具體自己看吧。
https://www.zhihu.com/question/35216546
具體可以看論文A Neural Algorithm of Artistic Style 作者(Leon A. Gatys等)
等會更新我個人讀完論文後的理解。
因為本人只是大二新生,理解可能有誤差,想要準確的解釋最好還是直接看另一答案給的論文。首先,我們有一個被訓練用於物體識別神經網路,它由多層節點組成。如果我們輸入一個圖片,它將會把圖片轉化成「representations that increasingly care about the actual content of the image」,即反映圖片內容的信號(我們可以通過信號復原這張圖,但不是100%復原,具體看提取的是第多少層的信息)。同樣,通過一個用於獲取紋理信息的「feature space」(特徵空間),我們可以獲取圖片的風格信息。分別獲取兩張圖的對應信息後,生成能匹配這兩張圖的風格和內容信息的圖片即可。更新:
有一篇總結目前風格化演算法的綜述文章[1705.04058] Neural Style Transfer: A Review對應的Github項目鏈接為ycjing/Neural-Style-Transfer-Papers,對風格化演算法做了一個匯總,並對未來的工業界應用以及風格化領域未來的發展情況做了一個匯總,大家如果感興趣可以參考一下,希望能夠幫到大家~ 具體也可以參考我下面這個回答:
如何評價德國計算機神經網路科學家發表的這篇可以讓電腦模仿任何畫家的風格作畫的論文? - 知乎
-----------------------------------------------------------------------------------------------------------------
Note: Li-Fei Fei組ECCV文章的原版代碼作者十幾分鐘前已經放出,地址:GitHub - jcjohnson/fast-neural-style: Feedforward style transfer
------------------------------------------------------------------------------------------------------------------
最近也在做風格化這一塊,也關注了很多github上關於風格化的源碼,大家有興趣可以參考我的github ycjing (Yongcheng Jing) · GitHub中近兩個月點過star或提過issue的項目,基本都是關於風格化的源碼。
下面回答題主的問題,@段石石的回答很全面,第一篇論文裡面是最原始的方法,速度還是比較慢的,第二篇論文是ECCV2016 Li Fei-Fei組的文章,改進了原始論文的方法,用了一個很smart的loss function (將VGG網路作為loss function),將時間代價轉移到訓練階段,使用前向網路生成新的風格化的圖片,速度快很多。對第二篇文章補充一下,除了 @段石石博客裡面提到的tensorflow版本的源碼外,其實在它之前還有一個基於chainer實現的版本 GitHub - yusuketomoto/chainer-fast-neuralstyle: Chainer implementation of quot;Perceptual Losses for Real-Time Style Transfer and Super-Resolutionquot;.,個人覺得效果比tensorflow那個版本好一些,tensorflow那個版本的代碼的實現個人覺得可能還是有一些問題的。但chainer代碼改成多GPU並行運算還是比較困難的,不能多GPU並行的話跑超清大圖的時候,單塊GPU顯存可能就不夠了。但tensorflow是原生支持多GPU並行和分散式的,所以個人覺得著重關注完善下tensorflow版本的代碼是更有意義的一件事情。
另外,再補充一篇論文http://arxiv.org/abs/1603.03417,這篇是ICML2016的一篇論文,和Li Fei-Fei組論文要解決的問題相同,都要主要研究如何提高風格化速度的,對應的源碼release在了github上,我點過star,大家可以在我star過的項目中找一下。
-----------------------------------------------
PS:吐槽一句,大家不覺得Ostagram這個網站上風格化圖片的速度太慢了嘛?我試了下一張圖片居然讓我等了一天.....
推薦閱讀:
※梯度下降演算法中的初始值和收斂條件怎樣理解?
※如何評價google 開源的TensorFlow Serving?
※在集成電路設計領域(數字,模擬),人工智慧有無可能取代人類?
※怎麼樣理解SVM中的hinge-loss?
※如何評價猿輔導分散式機器學習庫ytk-learn、分散式通信庫ytk-mp4j?
TAG:編程 | 機器學習 | 程序 | 深度學習DeepLearning |