基於2-channel network的圖片類似度判別

1、相關理論算法

     本篇博文主要講解2015年CVPR的一篇關於圖像類似度計算的文章:《Learning to Compare Image Patches via Convolutional Neural Networks》,本篇文章對經典的算法Siamese Networks 作了改進。學習這篇paper的算法,須要熟悉Siamese Networks(經典老文獻《Signature Verification Using a Siamese Time Delay Neural Network》)、以及大神何凱明提出來的空間金字塔池化(2015年CVPR 文獻《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》),由於文獻基本上是在 Siamese Networks的基礎上作修改,而後也要藉助於空間金字塔池化實現不一樣大小圖片的輸入網絡。網絡

網絡總結構架構

 

       如上圖所示,咱們的目的是比較兩幅圖片是否類似,或者說類似度是多少,所以咱們構建的卷積神經網絡模型的輸入就是:兩幅圖片,而後網絡的輸出是一個類似度數值。其實我以爲,用「計算類似度」這個詞有點不合適,我以爲應該翻譯爲匹配程度。由於文獻所採用的訓練數據中,若是兩張圖片匹配,輸出值標註爲y=1,若是兩張圖片不匹配,那麼訓練數據標註爲y=-1,也就是說,這個訓練數據的標註方法,根本就不是一個類似度數值,而是一個是否匹配的數值。咱們打個比方,有三樣物體:鋼筆、鉛筆、書包,那麼在訓練數據中,就把鋼筆和鉛筆標註爲y=1,而不是用一個類似度數值來衡量,比我鋼筆和鉛筆的類似度咱們把它標註爲y=0.9……,因此說用於用類似度這個詞有點不合理,即便咱們最後計算出來的值是一個-1~1之間的數……app

paper主要創新點:在創新點方面,我以爲主要是把Siamese 網絡的雙分支,合在一塊兒,從而提升了精度,以下圖所示函數

Siamese 網絡學習

paper算法2-channel 網絡.net

 

先在這裏解釋下爲何做者要把它稱之爲:2-channel networks。理解了2-channel這個詞,有助於咱們後面理解算法。從上面Siamese 網絡,咱們能夠看到這個網絡有兩個分支組成,由於咱們是要比較兩張圖片patch一、patch2的類似度,因此Siamese 網絡的大致思路,就是讓patch一、patch2分別通過網絡,進行提取特徵向量,而後在最後一層對兩個兩個特徵向量作一個類似度損失函數,進行網絡訓練,這個後面在給進行比較詳細的講解,總的來講Siamese 對於兩張圖片patch一、patch2的特徵提取過程是相互獨立的,咱們也能夠把Siamese 網絡稱之爲「2-branches networks」。那麼paper所提出的算法:2-channel networks 又是什麼意思呢?原本patch一、patch2是兩張單通道灰度圖像、它們各不相干,因而做者的想法就是把patch一、patch2合在一塊兒,把這兩張圖片,當作是一張雙通道的圖像。也就是把兩個(1,64,64)單通道的數據,放在一塊兒,成爲了(2,64,64)的雙通道矩陣,而後把這個矩陣數據做爲網絡的輸入,這就是所謂的:2-channel。翻譯

      OK,這就是文獻的主要創新點,懂得了這個,後面看paper就容易多了,能夠說已經把paper的總思路領悟了一半了,是否是感受貌似很簡單的樣子。3d

2、Siamese網絡相關理論orm

本部分是爲了瞭解經典的Siamese網絡,若是已經知道Siamese網絡的結構的,請跳過這一部分。

一、《Learning a similarity metric discriminatively, with application to face verification》

Siamese網絡:這個是一個曾經用於簽字認證識別的網絡,也就是咱們平時說筆跡識別。這個算法能夠用於判斷簽名筆跡,n年前的一個算法。算法的原理利用神經網絡提取描述算子,獲得特徵向量,而後利用兩個圖片的特徵向量判斷類似度,這個有點像sift,只不過是利用CNN進行提取特徵,而且用特徵向量進行構造損失函數,進行網絡訓練。下面引用2005年CVPR上的一篇文獻《Learning a similarity metric discriminatively, with application to face verification》,進行簡單講解,這篇paper主要是利用Siamese網絡作人臉類似度判別,能夠用於人臉識別哦,由於我以爲這篇文獻的網絡結構圖畫的比較漂亮,比較容易看懂,因此就用這一篇文章,簡單講解Siamese網絡的思想。其網絡以下圖所示,有兩個分支分別輸入圖片x一、x2(須知:這兩個分支實際上是相同的,同一個cnn模型,一樣的參數,文獻只是爲了方便閱讀,因此才畫成兩個分支,由於他們採用的是權重共享),包含卷積、池化等相關運算。雙分支有點難理解,咱們仍是用單分支來理解吧,說的簡單一點把,siamese 網絡分紅前半部分、後半部分。前半部分用於特徵提取,咱們可讓兩張圖片,分別輸入咱們這個網絡的前半部分,而後分別獲得一個輸出特徵向量Gw(x1)、Gw(x2),接着咱們構造兩個特徵向量距離度量,做爲兩張圖片的類似度計算函數(如公式1所示)。

Siamese網絡 

 

如上圖所示,咱們要判斷圖片X1和X2是否類似,因而咱們構建了一個網絡映射函數Gw(x),而後把x一、x2分別做爲參數自變量,咱們能夠獲得Gw(x1)、Gw(x2),也就是獲得用於評價X一、X2是否類似的特徵向量。而後咱們的目的就是要使得函數:

 

而後利用這個損失函數,對網絡進行訓練,就能夠判別兩張人臉的類似度了。上面過程當中網絡的兩個分支所用的是同一個函數,也就是權值、網絡結構是同一個,咱們徹底能夠把Gw(x)當作是一個特徵提取器,所以siamese network網絡其實就是一個提取一直圖片的特徵算子的過程,而後再網絡的最後一層,是用於定義了特徵向量間類似度的損失函數。

二、Siamese網絡

OK,咱們回到本篇博文的主題,下面是paper所用的Siamese網絡(shared  weights)。在網絡的最後頂層,由線性全鏈接和ReLU激活函數,構成輸出層。在paper中,採用的最後是包含兩個全鏈接層,每一個隱層包含512個神經元。

 

除了Siamese網絡,文獻還提了另一種Pseudo-siamese網絡,這個網絡與siamese network網絡最大的區別在於兩個分支是權值不共享的,是真正的雙分支網絡模型。Pseudo-siamese在網絡的兩個分支上,每一個分支是不一樣的映射函數,也就是說它們提取特徵的結構是不同的,左右兩個分支,有不一樣的權值、或者不一樣的網絡層數等,兩個函數互不相關,只是在最後的全鏈接層,將他們鏈接在一塊兒了。這個網絡至關於訓練參數比Siamese網絡的訓練參數多了將近一倍,固然它比Siamese網絡更加靈活。

其實到了這裏,咱們提到了原始的Siamese、以及Pseudo-siamese,都只是爲了陪襯後面做者所提出的算法:2-channel networks,由於最後咱們要作算法精度對比,因此做者就囉嗦了這麼多。這一部分我以爲囉嗦的太多反而會亂掉,因此仍是不細講,覺得這個不是重點。下面要講解的2-channel 網絡纔是paper的主要創新點,因此纔是咱們須要好好細讀的部分。由於paper的講解方法,是根據一步一步改進網絡的,因此我就根據文獻的思路進行講解,以siamese network爲基礎:paper首先提出了把siamese 改爲2-channel ,這個是第一次對算法的進化,提升了精度。接着提出Central-surround two-stream network,這個算法只是在網絡的輸入上作了改變,沒有改變網絡的結構,能夠與2-channel、siamese 結合在一塊兒,提升精度

3、第一次進化,從siamese 到2-channel (創新點1)

網絡整體結構,2-channel:與前面講的Siamese網絡、Pseudo-siamese網絡本質上每一個分支就至關於一個特徵提取的過程,而後最後一層就至關計算特徵向量類似度的函數同樣。因而接着做者提出了2-channel網絡結構,跳過了分支的顯式的特徵提取過程,而是直接學習類似度評價函數。雙通道網絡結構,就至關於把輸入的兩張灰度圖片當作是一張雙通道的圖片同樣。

 

這樣算法的最後一層直接是全鏈接層,輸出神經元個數直接爲1,直接表示兩張圖片的類似度。直接用雙通道圖片進行訓練會比較快,比較方便,固然CNN,若是輸入的是雙通道圖片,也就是至關於網絡的輸入的是2個feature map,通過第一層的卷積後網,兩張圖片的像素就進行了相關的加權組合並映射,這也就是說,用2-channel的方法,通過了第一次的卷積後,兩張輸入圖片就不分你我了。而Siamese網絡是到了最後全鏈接的時候,兩張圖片的相關神經元才聯繫在一塊兒,這就是2-channel 與Siamese給我感受最大的區別。這個做者後面經過試驗,驗證了從第一層開始,就把兩張圖片關聯在一塊兒的好處,做者的原話:This is something that indicates that it is important to jointly use information from both 

patches right from the first layer of the network.

這邊順便提一下文獻的一個網絡架構細節,卷積核大小Paper全部的卷積核大小都是採用3*3的,由於在《Very Deep Convolutional Networks for Large-Scale Image Recognition》文獻中提到,對於小的卷積核來講,比大尺寸的卷積核有更多的非線性,效果更牛逼,總之就是之後遇到CNN,建議用卷積核比較小的,好處多多。

4、第二次進化,結合Central-surround two-stream network(創新點2)

這個創新點,須要對上面的網絡結構稍做修改。假設咱們輸入的是大小爲64*64的一張圖片,那麼Central-surround two-stream network的意思就是把圖片64*64的圖片,處理成兩張32*32圖片,而後再輸入網絡,那麼這兩張32*32的圖片是怎麼計算獲得的?這就是Central-surround方法,也就是第一張圖片是經過以圖片中心,進行裁剪出32*32的圖片,也就是下圖的淺藍色區域的圖片。

 

那麼第二張圖片是怎麼計算的:這張圖片是直接經過對整張圖片下采樣的方法獲得的,也就是說直接把64*64的圖片進行下采樣獲得32*32的圖片。那麼做者爲何要把一張64*64的圖片,拆分紅兩張32*32的圖片。其實這個就像多尺度同樣,在圖片處理領域常常採用多分辨率、多尺度,好比什麼sift、還有什麼高斯金字塔什麼的,總之做者說了,多分辨率能夠提升兩張圖片的match效果。這個Central-surround two-stream network能夠和上面提到的2-channel、Siamese結合在一塊兒,提升精度。下面就是Siamese和Central-surround two-stream network結合在一塊兒的網絡結構:

 

上面是Siamese網絡模型,利用Central-surround two-stream network構建新的網絡模型,就是在網絡輸入部分,把輸入圖片改爲多尺度輸入。

5、第三次進化,結合空間金字塔池化SPP

     空間金字塔池化採樣:這個又稱之爲SPP(Spatial pyramid pooling)池化,這個又什麼用呢?這個跟上面的有點相似,這個其實就相似於多圖片多尺度處理,咱們知道現有的卷積神經網絡中,輸入層的圖片的大小通常都是固定的,這也是我以前所理解的一個神經網絡。直到知道SPP,感受視覺又開闊了許多,菜鳥又長見識了。咱們知道如今的不少算法中,講到的訓練數據圖片的大小,都是什麼32*32,96*96,227*227等大小,也就是說訓練數據必須歸一化到一樣的大小,那麼假設個人訓練數據是各類各樣的圖片大小呢?我是否必定要把它裁剪成所有同樣大小的圖片才能夠進入卷積神經網絡訓練呢?這就是SPP算法所要解決的問題,訓練數據圖片不須要歸一化,並且江湖傳說,效果比傳統的方法的效果還好。下面是Siamese和SPP結合在一塊兒的網絡結構:

就是在全鏈接層的前面加了個SPP層。

     關於SPP池化方法,大牛何凱明發表了好幾篇文章《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》、《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》,SSP的相關實現之後再進行講解,一篇博文一口氣若是講的太多,看着也會以爲累。

總之這一步是爲了使得網絡能夠輸入各類大小的圖片,提升網絡的實用性,魯棒性等。

OK,通過上面的三次進化,網絡最後的結構,也就是精度最高,paper最後的算法就是:2-channel+Central-surround two-stream+SPP 的網絡結構,由於文獻沒有把這個網絡的結構圖畫出來,我也懶得畫,因此不能給你們提供最後的網絡結構圖。

6、網絡訓練

首先paper採用了以下損失函數:

 

公式第一部分就是正則項,採用L2正則項。第二部分偏差損失部分是網絡第i對訓練圖片的輸出神經元,而後yi的取值是-1或1,當輸入圖片是matching的時候,爲1,當non-matching的時候是-1。

參數訓練更新方法採用ASGD,其學習率恆爲1.0,動量參數選擇0.9,而後權重衰減大小選擇:

 

訓練的min-batch大小選擇128。權重採用隨機初始化方法。

OK,上面是一些網絡參數設置。接着就是數據處理部分了,通常就是數據擴充,也就是給圖片加上旋轉、鏡像、等操做。Paper採用的數據擴充,包含水平翻轉、垂直翻轉、還有就是旋轉,包含90、180、270角度的旋轉。訓練迭代終止的方法不是採用什麼early stop,而是啓動讓電腦跑個幾天的時間,等到閒的時候,回來看結果,作對比(ps:這個有點low)。若是你是剛入門CNN的,還沒聽過數據擴充,能夠看看:http://blog.csdn.net/tanhongguang1/article/details/46279991。Paper也是採用了訓練過程當中,隨機數據的擴充的方法。

參考文獻:

一、《Learning to Compare Image Patches via Convolutional Neural Networks》

二、《Discriminative Learning of Local Image Descriptors》

三、《signature verification using a siamese time delay neural network_bromley》

四、《Learning visual similarity for product design with convolutional neural networks》

五、《Learning a similarity metric discriminatively, with application to face verification》

相關文章
相關標籤/搜索