1. 程式人生 > >計算圖片的相似度(深度學習)

計算圖片的相似度(深度學習)

轉載:https://blog.csdn.net/hjimce/article/details/50098483

一、相關理論

     本篇博文主要講解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之間的數……

paper主要創新點:在創新點方面,我覺得主要是把Siamese 網路的雙分支,合在一起,從而提高了精度,如下圖所示

Siamese 網路

paper演算法2-channel 網路


先在這裡解釋下為什麼作者要把它稱之為:2-channel networks。理解了2-channel這個詞,有助於我們後面理解演算法。從上面Siamese 網路,我們可以看到這個網路有兩個分支組成,因為我們是要比較兩張圖片patch1、patch2的相似度,所以Siamese 網路的大體思路,就是讓patch1、patch2分別經過網路,進行提取特徵向量,然後在最後一層對兩個兩個特徵向量做一個相似度損失函式,進行網路訓練,這個後面在給進行比較詳細的講解,總的來說Siamese 對於兩張圖片patch1、patch2的特徵提取過程是相互獨立的,我們也可以把Siamese 網路稱之為“2-branches networks”。那麼paper所提出的演算法:2-channel networks 又是什麼意思呢?本來patch1、patch2是兩張單通道灰度影象、它們各不相干,於是作者的想法就是把patch1、patch2合在一起,把這兩張圖片,看成是一張雙通道的影象。也就是把兩個(1,64,64)單通道的資料,放在一起,成為了(2,64,64)的雙通道矩陣,然後把這個矩陣資料作為網路的輸入,這就是所謂的:2-channel。

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

二、Siamese網路相關理論

本部分是為了瞭解經典的Siamese網路,如果已經知道Siamese網路的結構的,請跳過這一部分。

1、《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網路的思想。其網路如下圖所示,有兩個分支分別輸入圖片x1、x2(須知:這兩個分支其實是相同的,同一個cnn模型,同樣的引數,文獻只是為了方便閱讀,所以才畫成兩個分支,因為他們採用的是權重共享),包含卷積、池化等相關運算。雙分支有點難理解,我們還是用單分支來理解吧,說的簡單一點把,siamese 網路分成前半部分、後半部分。前半部分用於特徵提取,我們可以讓兩張圖片,分別輸入我們這個網路的前半部分,然後分別得到一個輸出特徵向量Gw(x1)、Gw(x2),接著我們構造兩個特徵向量距離度量,作為兩張圖片的相似度計算函式(如公式1所示)。

Siamese網路 

如上圖所示,我們要判斷圖片X1和X2是否相似,於是我們構建了一個網路對映函式Gw(x),然後把x1、x2分別作為引數自變數,我們可以得到Gw(x1)、Gw(x2),也就是得到用於評價X1、X2是否相似的特徵向量。然後我們的目的就是要使得函式:

 

然後利用這個損失函式,對網路進行訓練,就可以判別兩張人臉的相似度了。上面過程中網路的兩個分支所用的是同一個函式,也就是權值、網路結構是同一個,我們完全可以把Gw(x)看成是一個特徵提取器,因此siamese network網路其實就是一個提取一直圖片的特徵運算元的過程,然後再網路的最後一層,是用於定義了特徵向量間相似度的損失函式。

2、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 結合在一起,提高精度

三、第一次進化,從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,建議用卷積核比較小的,好處多多。

四、第二次進化,結合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構建新的網路模型,就是在網路輸入部分,把輸入圖片改成多尺度輸入。

五、第三次進化,結合空間金字塔池化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 的網路結構,因為文獻沒有把這個網路的結構圖畫出來,我也懶得畫,所以不能給大家提供最後的網路結構圖。

六、網路訓練

首先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也是採用了訓練過程中,隨機資料的擴充的方法。

參考文獻:

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

2、《Discriminative Learning of Local Image Descriptors》

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

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

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

**********************作者:hjimce   時間:2015.10.25  聯絡QQ:1393852684  原創文章,轉載請保留原文地址、作者等資訊***************
先碼這,之後看看,覺得會用到,,哭死,難很