1. 程式人生 > >基於卷積神經網路實現圖片風格的遷移 2

基於卷積神經網路實現圖片風格的遷移 2

VGG與風格遷移演算法原理

一、實驗介紹

1.1 實驗內容

上節課我們學習了卷積神經網路的基本原理,本節實驗我們將學習用於影象風格遷移的經典的卷積神經網路模型VGG,並用caffe提供的 draw_net.py 實現模型的視覺化,本節實驗我們也將學習影象風格轉換的演算法原理。

1.2 實驗知識點

  • 經典CNN模型 VGG16
  • 圖片風格演算法原理

1.3 實驗環境

  • python 2.7
  • caffe 實驗樓環境內建
  • Xfce終端

二、VGG

CNN的經典結構始於1998年的LeNet-5,成於2012年曆史性的AlexNet,從此大盛於影象相關領域,主要包括:

  • LeNet-5,1998年
  • AlexNet,2012年
  • ZF-net,2013年
  • GoogleNet,2014年
  • VGG,2014年
  • ResNet,2015年
  • Deep Residual Learning,2015年

vgg 和 googlenet 是2014年 ImageNet (影象分類大賽) 的雙雄,這兩類模型結構有一個共同特點是Go deeper。

VGG網路非常深,通常有 16/19層,稱作 VGG16VGG19 ,卷積核大小為 3 x 3 ,16和19層的區別主要在於後面三個卷積部分卷積層的數量。

本實驗主要講解VGG16。

2.1 視覺化VGG16

啟動終端,進入caffe下的python目錄:

$ cd /opt/caffe/python
$ ls

確認是否有 draw_net.py

檔案。

獲得我們提供的VGG16的網格配置檔案 vgg16_train_val.prototxt

$ sudo wget http://labfile.oss.aliyuncs.com/courses/861/vgg16_train_val.prototxt

安裝依賴包,這些都是基於python的畫圖工具包。

$ sudo apt-get install python-pydot
$ sudo apt-get install graphviz

安裝完畢,準備視覺化VGG16模型。

$ python draw_net.py /opt/caffe/python/vgg16_train_val.prototxt ~/Desktop/vgg16.png

程式執行完成之後,你可以通過以下命令檢視vgg16.png,這個即為視覺化後的VGG16。

$ cd ~/Desktop/
$ display vgg16.png

2.2 理解VGG16

下圖是官方給出的VGG16的資料表格:

此處輸入圖片的描述

首先我們先學會看懂一些式子的表達:

Conv3-512 → 第三層卷積後維度變成512;

Conv3_2 s=2 → 第三層卷積層裡面的第二子層,滑動步長等於2(每次移動兩個格子)

有了以上的知識可以開始剖析 VGG16 了。

由於篇幅的關係我們只推演從 InputConv1,再從 Conv1 過渡到 Conv2 的過程。

2.2.2 從 InputConv1

此處輸入圖片的描述

假如我們輸入的是 300x300的RGB影象,那麼輸入層接受的輸入就是 300x300x3個神經元。

圖中的兩個黃色表示卷積層,是VGG16網路結構十六層當中的第一層(Conv1_1)和第二層(Conv1_2),他們合稱為Conv1。由上節的知識,我們可以知道卷積核大小應為 3x3x3。經過卷積層的運算我們可以得到一維的 298x298x1 的矩陣(因為卷積核也是三維所以結果是一維),為了在下一層中可以繼續用 3x3 的卷積核做卷積,我們需要進行 Padding 操作,將影象擴充為 300x300x1,而 VGG16 在Conv1這層中使用了64個卷積核,那麼生成了64張對應不同卷積核的 feature map,這樣就得到了上圖最終的結果 300x300x64

2.2.2 從 Conv1Conv2 過渡

此處輸入圖片的描述

這一步操作使用 Pooling ,使用的 池化卷積核2*2*64,步長為 2 ,那麼滑動的矩陣本身沒有重疊;剛好減半,第三維度 64 不變。

其實之後的步驟都是類似的,根據我們剛剛畫出的VGG16或者官方給出的表格,理解每一層有什麼卷積核?多少個?池化的大小?步長多少?是否需要Padding?一步步思考,你就可以完全掌握VGG16的原理。

三、影象風格遷移 Image Style Transfer

以目前的深度學習技術,如果給定兩張影象,完全有能力讓計算機識別出影象具體內容。而影象的風格是一種很抽象的東西,人眼能夠很有效地的辨別出不同畫家不同流派繪畫的風格,而在計算機的眼中,本質上就是一些畫素,多層網路的實質其實就是找出更復雜、更內在的特性(features),所以影象的風格理論上可以通過多層網路來提取影象裡面可能含有的一些有意思的特徵。

3.1 簡介

此處輸入圖片的描述

將一幅影象的風格轉移到另外一幅影象上被認為是一個影象紋理轉移問題,傳統上一般採用的是一些非參方法,通過一些專有的固定的方法(提取影象的亮度、低頻顏色資訊、高頻紋理資訊)來渲染。但是這些方法的問題在於只能提取底層特徵而非高層抽象特徵,而且往往一個程式只能做某一種風格或者某一個場景。隨著CNN的日漸成熟,影象風格遷移技術也迎來了一次變革。需要注意的是,最近的很多應用型的研究成果都是將CNN滲透進各個領域,從而在普遍意義上完成一次技術的升級。

3.2 方法

實現影象的風格轉換我們需要下面幾個原料:

  • 一個訓練好的神經網路 VGG
  • 一張風格影象,用來計算它的風格representation
  • 一張內容影象,用來計算它的內容representation,
  • 一張噪聲影象,用來迭代優化
  • loss函式,用來獲得loss

給定一張風格影象 a 和一張普通影象 p,風格影象經過 VGG 的時候在每個卷積層會得到很多 feature maps, 這些 feature maps 組成一個集合 A,同樣的,普通影象 p 通過 VGG 的時候也會得到很多 feature maps,這些 feature maps 組成一個集合 P,然後生成一張隨機噪聲影象 x(在後面的實驗中,其實就是普通影象 p), 隨機噪聲影象 x 通過 VGG 的時候也會生成很多 feature maps,這些 feature maps 構成集合 GF 分別對應集合 AP, 最終的優化函式是希望調整 x , 讓隨機噪聲影象 x 最後看起來既保持普通影象 p 的內容, 又有一定的風格影象 a 的風格。

可以進行風格轉換的基礎就是將內容和風格區分開來,接下來我們來看CNN如何做到這一點。

3.2.1 內容表示 Content Representation

給定一個影象 p,卷積神經網路每層使用濾波器(卷積核 filter)對影象進行編碼。在 CNN 中, 假設 layer l此處輸入圖片的描述個 filters, 那麼將會生成此處輸入圖片的描述個 feature maps,每個 feature map 的維度為此處輸入圖片的描述 , 此處輸入圖片的描述代表 feature map 的高與寬的乘積。所以每一層 feature maps 的集合可以表示為

此處輸入圖片的描述此處輸入圖片的描述表示第 i 個 filterposition j 上的啟用值。

所以,我們可以給出 Content 的 cost function,其中,p 是內容影象,x 是生成影象 :

此處輸入圖片的描述

對其求導後對應的啟用函式為 :

此處輸入圖片的描述

有了這個公式之後要怎麼做呢?

使用現在公佈的訓練好的某些CNN網路,隨機初始化一個輸入圖片大小的噪聲影象x,然後保持CNN引數不變,將內容圖片 p 和隨機影象 x 輸入進網路,然後對x求導,這樣,x 就會在內容上越來越趨近於p

3.2.2 風格表示 Style Representation

對於風格提取,我們需要用到 Gram matrix

Gram矩陣是計算每個通道i的feature map與每個通道j的feature map的內積。這個值可以看作代表i通道的feature map與j通道的feature map的互相關程度。而它又為什麼能代表圖片風格呢?

此處輸入圖片的描述

假設我們要對梵高的星空圖做風格提取,在神經網路中某一層中有一個濾波器專門檢測尖尖的塔頂這樣的東西,另一個濾波器專門檢測黑色。又有一個濾波器負責檢測圓圓的東西,又有一個濾波器用來檢測金黃色。

對梵高的原圖做Gram矩陣,誰的相關性會比較大呢?如上圖所示,“尖尖的”和“黑色”總是一起出現的,它們的相關性比較高。而“圓圓的”和“金黃色”都是一起出現的,他們的相關性比較高。

因此在風格轉移的時候,其實也在內容圖(待風格轉換的圖)裡去尋找這種“匹配”,將尖尖的渲染為黑色(如塔尖),將圓圓的渲染為金黃色(如近圓的房頂)。如果我們承認“影象的藝術風格就是其基本形狀與色彩的組合方式” ,這樣一個假設,那麼Gram矩陣能夠表徵藝術風格就是理所當然的事情了。

風格的抽取仍然是以層為單位的,對於風格影象 a,為了建立風格的 representation,我們先利用 Gram matrix 去表示每一層各個 feature maps 之間的關係,此處輸入圖片的描述此處輸入圖片的描述x 的 feature maps i,j 的內積,此處輸入圖片的描述a 的feature maps i,j 的內積。

此處輸入圖片的描述

利用 Gram matrix,我們可以建立每一層的關於 style 的 cost function

此處輸入圖片的描述

求偏導後對應的激勵函式:

此處輸入圖片的描述

結合所有層,可以得到總的 cost :

此處輸入圖片的描述

不考慮風格轉換,只單獨的考慮內容或者風格,可以看到如圖所示:

此處輸入圖片的描述

上半部分是風格重建,由圖可見,越用高層的特徵,風格重建的就越粗粒度化。下半部分是內容重建,由圖可見,越是底層的特徵,重建的效果就越精細,越不容易變形。

最後將 content 和 style 的 cost 相結合,最終可以得到

此處輸入圖片的描述
3.2.3 風格轉換

提取了內容和風格之後,我們就可以開始進行圖片的風格遷移了。

具體過程如下圖所示:

此處輸入圖片的描述

四、實驗總結

本節實驗,我們學習了

  • 經典神經網路模型 VGG
  • 影象風格遷移的演算法原理基礎

下節實驗我們將親自動手實現任意圖片的風格轉換。

五、課後習題

本節實驗中,我們使用 draw_net.py 繪製出的結構圖儲存了引數資訊,細節豐富,但是缺點是結構不是很清晰明瞭,這一點會在大型模型上的體現尤為明顯,其實我們還可以用很多工具來實現網路模型的視覺化操作,請使用線上工具QuickStart繪製googlenet的模型,並對照著視覺化後的網路模型理解googlenet的操作原理。

六、參考文獻

相關推薦

基於神經網路實現圖片風格遷移 3

實現圖片的風格轉換 一、實驗介紹 1.1 實驗內容 上一節課我們介紹了經典的CNN模型 VGG ,以及影象風格遷移演算法的基本原理。本節課我們將使用另外一個經典的模型 GoogLenet 來實現我們的專案(這是由於環境的限制,用 googlenet可以更快的完成我們的風格轉換),如果你完成了上節課的作業,那

基於神經網路實現圖片風格遷移 2

VGG與風格遷移演算法原理 一、實驗介紹 1.1 實驗內容 上節課我們學習了卷積神經網路的基本原理,本節實驗我們將學習用於影象風格遷移的經典的卷積神經網路模型VGG,並用caffe提供的 draw_net.py 實現模型的視覺化,本節實驗我們也將學習影象風格轉換的演算法原理。 1.2 實驗知識點 經典CNN

基於神經網路實現圖片風格遷移 1

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

機器學習:利用神經網路實現影象風格遷移 (一)

相信很多人都對之前大名鼎鼎的 Prisma 早有耳聞,Prisma 能夠將一張普通的影象轉換成各種藝術風格的影象,今天,我們將要介紹一下Prisma 這款軟體背後的演算法原理。就是發表於 2016 CVPR 一篇文章, “ Image Style Transf

基於神經網路和tensorflow實現的人臉識別

以前在學習卷積神經網路的時候,發現了很多很有趣的demo,有一次發現了上面這個人臉識別的例子,不過當時還看不懂,經過一段時間之後決定試試能不能將上面的例子改一下,調以調參什麼的,於是就有了這篇文章。本以為我的程式碼和原文沒有什麼太大的區別,應該不會出現什麼錯誤,但是實際自己上

吳恩達作業9:神經網路實現手勢數字的識別(基於tensorflow)

提供資料集程式碼放在cnn_utils.py裡。 import math import numpy as np import h5py import matplotlib.pyplot as plt import tensorflow as tf from tensorfl

Pytorch實現基於神經網路的面部表情識別(詳細步驟)

文章目錄  一、專案背景  二、資料處理    1、標籤與特徵分離    2、資料視覺化    3、訓練集和測試集  三、模型搭建  四、模型訓練  五、完整程式碼 一、專案背景資料集cnn_train.csv包含人類面部表情的圖片的label和feature。在這裡,面部表情識別相當於一個分類問題,共有7個

Tensorflow學習筆記(五)——神經網路實現

今天來實現tensorflow架構下的卷積神經網路,首先了解清楚我們要構建的網路架構,資料集還是用mnist,所以輸入還是28X28。 建立的卷積神經網路架構是:卷積層->pooling層->卷積層->pooling層->全連線層1->全連線層2。 全連線層

基於神經網路的貓種類的識別

1 引言 我也是剛剛接觸卷積神經網路不久,理解的也不是特別深入,以下都是我自己的個人想法,如有錯誤希望大家指正。 這個是一個基於類似於VGG模型(模型來源於keras文件)的卷積神經網路實現的圖片分類器,實現的是對貓的種類識別,因為資料集比較難找所以只用了320張圖片做訓練集,用

實時神經網路實現人臉檢測和情感/性別分類

本文提出了一種通用的實現方法卷積神經網路(CNN)構建框架設計實時CNN。建立實時面部檢測視覺系統,實現性別分類和情緒分類。 其中:IMDB性別分類測試準確率:96%;fer2013情緒分類測試準確率:66%。 具體效果如下圖:  這裡提供下資料集下載: 1、情緒

基於神經網路特徵圖的二值影象分割

       目標檢測是當前大火的一個研究方向,FasterRCNN、Yolov3等一系列結構也都在多目標檢測的各種應用場景或者競賽中取得了很不錯的成績。但是想象一下,假設我們需要通過影象檢測某個產品上是否存在缺陷,或者通過衛星圖判斷某片海域是否有某公司的船隻

cs231n斯坦福基於神經網路的CV學習筆記(二)神經網路訓練細節

五,神經網路 注意點part1 例項:邏輯迴歸二層神經網路訓練函式 使用權重w和偏差值biase計算出第一個隱含層h,然後計算損失,評分,進行反向傳播回去 多種常用啟用函式(一般預設max(0,x)),如sigmoid函式具有飽和區梯度0,非零點中心,計算x複

深度學習:tensorflow入門:神經網路實現MNIST手寫字型識別

程式碼中./data/mnist/input_data/為真實MNIST資料集的路徑 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 定義

載入神經網路實現手寫體數字識別

上一篇部落格中,我們已經訓練好了模型 接下來我們要載入模型並識別真實場景下的一個手寫體數字 在此之前,我們先要準備好一張28*28畫素的影象(可用ps製作),然後通過處理將畫素的強度值變為0-1之間,之後即可輸入模型進行識別。 儲存已訓練的模型檔案如下: 程式

使用神經網路進行圖片分類 1

卷積神經網路原理一、實驗介紹1.1 實驗內容本課程將會先帶你理解卷積神經網路的原理,瞭解卷積神經網路的一些特性。然後動手使用caffe深度學習框架訓練一個卷積神經網路模型,並用訓練好的模型進行圖片分類。學習本課程之前,請先學習課程814 使用python實現深度神經網路以瞭解必要的基本概念,本實驗中涉及到的深

使用神經網路進行圖片分類 3

控制caffe模型的訓練過程一、實驗介紹1.1 實驗內容上次實驗,我們已經構建好了卷積神經網路,我們的模型已經蓄勢待發,準備接受訓練了。為了控制訓練程序,記錄訓練過程中的各種資料,caffe還需要定義另一個solver.prototxt檔案,這次實驗我們就來完成它,並開始激動人心的訓練過程。1.2 實驗知識點

使用神經網路進行圖片分類 2

使用caffe構建卷積神經網路一、實驗介紹1.1 實驗內容上一次實驗我們介紹了卷積神經網路的基本原理,本次實驗我們將學習如何使用深度學習框架caffe構建卷積神經網路,你將看到在深度學習框架上搭建和訓練模型是一件非常簡單快捷的事情(當然,是在你已經理解了基本原理的前提下)。如果上一次實驗中的一些知識點你還理解

使用神經網路進行圖片分類 4

利用訓練好的模型開發圖片分類程式一、實驗介紹1.1 實驗內容在snapshot目錄下已經有我們訓練好的模型的引數,為了利用我們的卷積神經網路模型和這些引數去對影象進行分類,我們這次實驗就來編寫程式碼實現一個圖片分類程式。1.2 實驗知識點caffe python api1.3 實驗環境python 2.7 o

基於神經網路電視節目推薦

本文使用文字卷積神經網路,並使用自己的電視節目資料集完成電影推薦的任務。  需要安裝TensorFlow1.0,Python3.5  文字卷積神經網路的圖如下,    圖片來自Kim Yoon的論文:Convolutional Neural Net

python神經網路案例——CNN神經網路實現mnist手寫體識別

全棧工程師開發手冊 (作者:欒鵬) 載入樣本資料集 首先我們要有手寫體的資料集檔案 我們實現一個MNIST.py檔案,專門用來讀取手寫體檔案中的資料。 # -*- coding: UTF-8 -*- # 獲取手寫資料。