1. 程式人生 > >特徵提取模型系列之spp-net原理介紹

特徵提取模型系列之spp-net原理介紹

背景介紹

spp-net的提出主要是基於這麼一個問題,如下圖(圖片來自論文):
圖片來自論文
我們一般用CNN時,輸入都是固定大小的(比如224x224),當遇到不同大小的圖片一般解決方法有兩種:一種是取圖片的幾個子區域(crop)然後分別輸入網路中,然後將得到的結果投票取多數的那個類別(個人感覺,crop時最好將圖片固定在一定的規模,比如最小那個邊是224,這樣crop的時候才更有可能得到想要的區域);另一種是直接將原圖resize到輸入圖片的大小。前者容易只取到目標物體的部分割槽域,後者則容易使得目標物體變形,不管哪個效果都容易讓最後的分類結果變差。能不能讓網路結構適應不同size的圖片,這就是spp-net的目的。

模型介紹

作者的分析思路是這樣子的:卷積層其實是可以適應不同size的圖片,只不過輸入圖片size不同,輸出的結果size也不同,而真正限制CNN要固定輸入圖片size的是全連結層,所以如果能在卷積層之後,全連線層之前加入某種層使得全連接獲得的輸入都是固定的大小的,那麼就解決這個問題了。於是作者提出了SPP-pooling層,結構如下圖(圖片來自原論文):
圖片來自原論文
圖片來自原論文
從卷積層獲得的feature map,將其分成1x1,2x2,4x4…的小塊,再在每個小塊上做max pooling,這樣最後得到的結果也就是固定大小的一個向量了。比如說feature map是32x32x256,然後把每一個32x32的feature map都分成1x1,2x2,4x4的小塊,這樣一個32x32的feature map就得到了長度為21(1+4+16)的一維向量,256個feature map最終串聯在一起就得到了就得到了長度為21x256的一維向量,對於24x24x256的feature map,經過同樣的結果,也是得到一個長度為21x256的一維向量,這樣就實現了全連線層的固定大小輸入了,也就讓cnn能夠適應不同size的圖片輸入。

實驗

訓練

  • single-size training:訓練的過程與之前的CNN訓練過程一樣,輸入都是固定的圖片大小,只不過將最後一個卷積層和第一個全連線層之間加入spp-pooling層,關於spp-pooling層的引數設定,如下圖(圖片來自原論文):
    圖片來自原論文
    圖片來自原論文
    注意訓練的時候也用到了crop,只不過這裡crop的作用是為了增強資料集(data augmentation)。測試的時候可以用crop也可以不用crop(論文中為了公平比較用了crop,而後面的實驗中也有不用crop的情況)。

  • multi-size training:與single-size training不同的是,輸入的照片規模會有所不同,作者使用了180x180和224x224兩種規模的圖片,採用迭代式的方法(第一個epoch全部用180x180的圖片,第二個epoch全部用224x224的圖片,第三個epoch又是180x180的圖片……)訓練。

效果

作者做了幾個實驗,具體的內容請看論文,這裡就不詳述了,最後得到的結果就是:

  • spp-pooling層能提升準確率

  • multi-size training能提升準確率

  • 整張照片(不管size多少)比單個照片中的一個crop作為輸入能提升準確率

小結

  • spp-pooling層能夠讓模型適應不同size的圖片