siamese(孿生) 網絡

siamese 網絡, 是05年Yann Lecun提出來的。它的特色是它接收兩個圖片做爲輸入,而不是一張圖片做爲輸入。git


文獻資料:github

摘抄自caffe github的issue697

Siamese nets are supervised models for metric learning [1].   譯:孿生網絡是一種監督學習,用於度量學習。算法


[1] S. Chopra, R. Hadsell, and Y. LeCun. Learning a similarity metric discriminatively, with application to face verification. In Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on, volume 1, pages 539–546. IEEE, 2005. http://yann.lecun.com/exdb/publis/pdf/chopra-05.pdf


Speaking of metric learning, I remember that @norouzi had proposed and open sourced a method that learned a Hamming distance metric to distinguish similar and dissimilar images [2].   譯:說到度量學習,我記得@norouzi 曾經提出一個開源方法,該方法能夠學習Hamming 距離度量,來分辨類似和不類似的圖片。數據庫


[2] Mohammad Norouzi, David J. Fleet, Ruslan Salakhutdinov, Hamming Distance Metric Learning, Neural Information Processing Systems (NIPS), 2012.
安全


下面介紹原始的孿生網絡網絡


                             


目的:比較兩幅圖片是否類似,或者說類似度是多少app

輸入:兩幅圖片函數

輸出:一個類似度數值性能

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


下面介紹改進的的孿生網絡


         2015年CVPR的一篇關於圖像類似度計算的文章:《Learning to Compare Image Patches via Convolutional Neural Networks》,本篇文章對經典的算法Siamese Networks 作了改進。

        先在這裏解釋下爲何做者要把它稱之爲:2-channel networks。理解了2-channel這個詞,有助於咱們後面理解算法。Siamese 網絡,咱們能夠看到這個網絡有兩個分支組成,由於咱們是要比較兩張圖片patch一、patch2的類似度。

Siamese 網絡(2-branches networks)的大致思路:

1. 讓patch一、patch2分別通過網絡,進行提取特徵向量(Siamese 對於兩張圖片patch一、patch2的特徵提取過程是相互獨立的)

2. 而後在最後一層對兩個兩個特徵向量作一個類似度損失函數,進行網絡訓練。


paper所提出的算法(2-channel networks) 的大致思路:

1. 把patch一、patch2合在一塊兒,把這兩張圖片,當作是一張雙通道的圖像。也就是把兩個(1,64,64)單通道的數據,放在一塊兒,成爲了(2,64,64)的雙通道矩陣,

2. 而後把這個矩陣數據做爲網絡的輸入,這就是所謂的:2-channel。


     這樣,跳過了分支的顯式的特徵提取過程,而是直接學習類似度評價函數。最後一層直接是全鏈接層,輸出神經元個數直接爲1,直接表示兩張圖片的類似度。固然CNN,若是輸入的是雙通道圖片,也就是至關於網絡的輸入的是2個feature map,通過第一層的卷積後網,兩張圖片的像素就進行了相關的加權組合並映射,這也就是說,用2-channel的方法,通過了第一次的卷積後,兩張輸入圖片就不分你我了。而Siamese網絡是到了最後全鏈接的時候,兩張圖片的相關神經元才聯繫在一塊兒。2015年CVPR文章幾個重要創新寫在下面:


------------------------------------分割線(如下是patch選取)---------------------------------

Patch的選取

        假設咱們輸入的是大小爲64*64的一張圖片,那麼Central-surround two-stream network的意思就是把圖片64*64的圖片,處理成兩張32*32圖片,而後再輸入網絡,那麼這兩張32*32的圖片是怎麼計算獲得的?

法1. Central-surround方法,也就是第一張圖片是經過以圖片中心,進行裁剪出32*32的圖片,也就是下圖的淺藍色區域的圖片。


法2. 下采樣方法。直接經過對整張圖片下采樣的方法獲得的,也就是說直接把64*64的圖片進行下采樣獲得32*32的圖片。其實這個就像多尺度同樣,在圖片處理領域常常採用多分辨率、多尺度,好比什麼sift、還有什麼高斯金字塔什麼的,總之做者說了,多分辨率能夠提升兩張圖片的match效果

這個Central-surround two-stream network能夠和上面提到的2-channel、Siamese結合在一塊兒,提升精度。下面就是Siamese和Central-surround two-stream network結合在一塊兒的網絡結構:


-------------------------------------分割線(如下是SPP原理)------------------------------------

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


就是在全鏈接層的前面加了個SPP層。總之這一步是爲了使得網絡能夠輸入各類大小的圖片,提升網絡的實用性,魯棒性等。paper最後的算法就是:2-channel+Central-surround two-stream+SPP 的網絡結構。




---------------------------------------分割線(如下舉例)----------------------------------------

      有一篇文章和這個網絡差很少,文章:《 Learning Deep Face Representation 》譯:《學習深層人臉表示》。下面以這篇文章爲例解釋孿生網絡。

      人臉的表示,易於實施, 叫作Pyramid CNN (金字塔CNN),採用了greedy-filter-and-down-sample (貪心-濾波-和-向下-採樣) 的操做,使得訓練很是快,並且高效,而且PyramidCNN能夠和多尺度人臉特徵結合。97.3% 的LFW。


傳統的人臉特徵表示的方法:


    注意文章的基本的網絡結構不是傳統上的CNN結構,而是「Siamese」網絡【2005 Lecun 組的一篇文章】,它的特色是它接收兩個圖片做爲輸入,而不是一張圖片做爲輸入。    

而文章中,做者採用深度神經網絡,DCNN來提取特徵,其網絡結構圖:


網絡的主要特色:

1. 它們是由多個金字塔組成,分爲不一樣個level級別的特徵,

2. 每個level的網絡由兩部分組成,一部分是共享的層,它由它的前一個level的網絡層組成;另外一部分是一個非共享層在每一層中訓練只須要訓練非共享層就能夠

       共享層是由前一個level的的網絡層共享過來,每個神經網絡中,共享層用來進行數據的預處理,好比卷積下采樣等。非共享層用來訓練已經處理好的圖片(因爲網絡的共享層,使得每個level的訓練速度不會隨着網絡層數的增多而急劇變慢,提升訓練時間,說白了也就是說每次只須要訓練網絡的最後一層就能夠了,前面的層能夠保持固定。)

       採用金字塔的緣由在於:1.加快網絡的訓練速度;2. 能夠提取多尺度人臉結構特徵;

       注意每個非共享level多個神經網絡,分別對應於每一個輸入圖像的patch(小塊),有眼睛,鼻子,嘴。每一個網絡的訓練目標函數都是下面的損失函數:



其表示的意思就是同一我的的距離要相互接近,而非同一我的的表示要相互遠離。利用這個損失函數來進行網絡的訓練。訓練方法:


最終的特徵:它由全部的level全部的patch特徵級聯而成,而patch的選擇則依賴於人臉特徵點的檢測alignment(校訂)。最終造成的特徵實際上是過徹底的,也就是說有不少的冗餘,可是不少文章都代表這種冗餘性對於識別來講具備重要性。應該來講每個level全部的patch特徵鏈接起來以後的向量就是一我的臉這個level的特徵了,多個level的特徵再鏈接起來就造成了多尺度的特徵表示


文章還說了,Pyramid CNN方法提取的特徵能夠很稀疏,最少能夠在8d,而在這麼低緯度的特徵下,其識別率還不低。經過相同的維度特徵的狀況下進行識別率比較:其中LBP特徵是經過了PCA降維到相對應的維度。


新的評判標準:由於在LFW數據庫上面的識別率已經達到了99%以上了,因此做者他本身提出了一個新的評判標準,在人臉verification(驗證)中,正確的匹配可能會比錯誤的匹配少(在安全接入方面,但願false positive 要儘量的小,已防止非法進入)。新的評判標準就是在固定一個錯誤的接受率(false positive rate FPR )閾值下,評判各個算法的性能,如識別率等。