1. 程式人生 > >SPP-net論文學習

SPP-net論文學習

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition


這篇是目標檢測一系列論文中的第二篇,第一作者是發明ResNet的何凱明。

論文地址:https://arxiv.org/pdf/1406.4729.pdf
本部落格參考了前輩v1_vivian的博文:https://blog.csdn.net/v1_vivian/article/details/73275259

Abstract

之前的CNNs都需要一個固定大小的輸入影象,這就會損害對任意大小影象的識別準確度。在這篇論文裡,作者提出了一個新的池化方法 — “Spatial pyramid pooling”(金字塔池化),以解決上述問題。新的網路被稱作SPP-net,不管影象輸入的大小,它都能產生一個固定長度的輸出。Pyramid pooling對變形了的目標也很魯棒。因此,SPP-net能有效提升所有的基於CNN的影象分類演算法。在ImageNet 2012, Pascal VOC 2007, Caltech 101 等資料集上,SPP-net都表現不俗。

在目標檢測上SPP-net也很有用。通過SPP-net,只需要計算整張圖的特徵對映一次,然後在任意區域中pool特徵,生成固定長度的輸出給檢測器去訓練。這樣避免了重複計算卷積特徵。在測試影象上獲得相同準確性的情況下,此方法比R-CNN快24-102倍。
在ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014資料集上,此方法在目標檢測排名第二,在影象分類排名第三。

1. Introduction

之前的方法都需要固定長度的輸入影象,比如224 × \times 224,當輸入影象是任意時,它們就需要裁剪或扭曲影象以滿足固定輸入的要求。但是裁剪下的區域可能只是物件的一部分,扭曲也會損害影象的幾何結構。這都會損害影象識別的準確度。
那麼為什麼CNN一定需要固定長度的輸入呢?CNN主要包含兩個部分,卷積層和全連線層。卷積層通過操作一個滑動視窗來輸出能代表影象空間分佈的特徵圖。但是卷積層並不需要一個固定長度的輸入,它能產生任意大小的特徵圖。另一方面,全連線層卻需要固定長度的輸入,因為它要把輸入的所有畫素點連線起來,需要指定輸入層神經元個數和輸出層神經元個數,所以需要規定輸入的feature的大小。
因此這篇論文提出的Spatial pyramid pooling(空間金字塔池化)層來去除那個束縛,作者在最後一個卷積層上增加一個SPP層。SPP層池化特徵,生成固定長度的輸出,然後這些輸出被匯入全連線層。這樣,通過“聚合”卷積層和全連線層之間的資訊,就不需要再去裁剪和扭曲影象。下圖是兩個網路的對比:

SPP按從優到次等級將影象分為若干個部分,然後聚合區域性特徵。在CNN稱霸之前的分類和檢測競賽中,SPP都是演算法贏得比賽的關鍵組成部分。但是至今想到過在CNN中加入SPP,作者發現在CNN中加入SPP會有以下特性:

  • 不管輸入的大小,SPP能夠產生固定長度輸出,但是CNN中滑動視窗池化不行;
  • SPP 利用multi-level spatial bins,但是滑動視窗池化只有一個視窗;
  • SPP能池化由不同的scale上產生的特徵,因為它輸入size很靈活。

用不同大小的影象來訓練能夠提升scale-invariance(大小不變性),並降低過擬合。針對不同的輸入大小,作者想出了一個簡單的訓練方法。讓一個網路去接受不同大小的輸入,可以近似地看作我們有多個共享引數的網路,然後每一個網路用給定大小的輸入去訓練。在每次訓練迭代中,向網路中輸入一個給定大小的輸入,然後在下一次迭代中,再向網路中輸入另一個大小的輸入。實驗表明與單一size的訓練相比,multi-size的訓練收斂,而且測試準確性更高。

在R-CNN中,特徵計算很費時間,因為在每張影象的warped region上它都會重複使用卷積網路。而在這篇論文中,作者提出只需在整張影象上應用一次卷積網路,然後用SPP-net在特徵圖上提取特徵。這就比R-CNN快接近一百倍。結合快速proposal方法EdgeBoxes, 此方法只需要0.5秒就能處理一張圖片。

2. Deep networks with spatial pyramid pooling

2.1 Convolution layers and feature maps

在CNN中,卷積層後會跟著池化層,這些池化層也可以被認為是卷積,因為它們也利用滑動視窗。最後是全連線層,N-way softmax作為輸出,N是類別的個數。

深度網路需要固定長度的輸入,但是這一要求僅僅是因為全連線層需要。而卷積層可以給定任意長度的輸入。卷積層使用滑動濾波器,輸出與輸入有著幾乎一致的長寬比。這些輸出稱作feature map. 以下是 c o n v 5 conv_5 層生成的特徵圖的視覺化:

從圖2中可看出,特徵圖的生成不需要固定長度的輸入。這與傳統方法的特徵圖類似,傳統方法是然後將這些特徵通過Bag of words或Spatial pyramids進行池化。

2.2 The spatial pyramid pooling layers

卷積層接受任意的輸入大小,但是輸出的大小不是固定的。而且分類器(SVM/softmax)是需要固定長度的輸入向量。Spatial pyramid pooling 改進了bag of words,因為它通過在local spatial bin中池化,以保持空間資訊。這些bin與影象大小是成比例的,所以bin的個數是固定的。這就和滑動視窗不同,滑動視窗的個數取決於輸入的大小。
因此,作者替換了最後一個池化層 p o o l 5 pool_5 為spatial pyramid pooling層。下圖為方法的介紹:

在每一個bin,都用max-pool池化每個濾波器的response。這樣,SPP的輸出就是kM維度,M是bin的個數,k是濾波器的個數。固定維度的向量作為全連線層的輸出。這樣,輸入可以是任意的大小。圖中輸出大小為 ( 16 + 4 + 1 ) × 256 (16+4+1) \times 256

以下圖為例:

黑色圖片代表卷積之後的特徵圖,接著我們以不同大小的塊來提取特徵,分別是44,22,1*1,將這三張網格放到下面這張特徵圖上,就可以得到16+4+1=21種不同的塊(Spatial bins),我們從這21個塊中,每個塊提取出一個特徵,這樣剛好就是我們要提取的21維特徵向量。這種以不同的大小格子的組合方式來池化的過程就是空間金字塔池化(SPP)。比如,要進行空間金字塔最大池化,其實就是從這21個圖片塊中,分別計算每個塊的最大值,從而得到一個輸出單元,最終得到一個21維特徵的輸出。

2.3 Training network

理論上,上述的網路可以通過標準的反向傳播來訓練,不用管輸入的大小。但實際上,caffe等實現中,為了計算的方便,GPU,CUDA等比較適合固定尺寸的輸入,所以訓練的時候輸入是固定了尺度了的。
論文中將網路的訓練分為兩種:一種是single-size,一種是Multi-size。

Single-size training

首先考慮網路接受一個固定大小輸入的情況,需要從原圖片中做裁剪。裁剪的目的在於資料增廣。如果給定了圖片的大小,我們可以提前計算SPP所需bin的大小。假設 c o n v 5 conv_5 輸出的特徵圖大小是 a × a a \times a ,pyramid level有 n × n n \times n 個bin。這就是滑動視窗池化,視窗大小為 w i n = a / n win = \lceil a/n \rceil ,stride是 s t r = a / n str = \lfloor a/n \rfloor . 對於 l l -level pyramid,我們有 l l 個這樣的層。然後全連線層把這 l l 個輸出串在一起。

對於pool 3 × 3 3 \times 3 : sizeX=5 的計算公式是: 13 / 3 = 5 \lceil 13/3\rceil=5 ,stride = 4的計算公式是: 13 / 3 = 4 \lfloor13/3\rfloor=4
如果輸入改成 180 × 180 180\times180 ,這時候conv5出來的reponse map為 10 × 10 10\times10 ,類似的方法,能夠得到新的pooling引數。

Multi-size training

為了能輸入不同大小的影象,使用兩個尺度來訓練, 180 × 180 180 \times 180 224 × 224 224\times 224

訓練的時候, 224 × 224 224\times 224 的圖片通過crop得到, 180 × 180 180 \times 180 的圖片通過縮放 224 × 224 224\times 224 的圖片得到。之後,迭代訓練,即用224的圖片訓練一個epoch,之後180的圖片訓練一個epoch,交替地進行。

這樣不同大小的圖片只有解析度的差異,而不存在內容或佈局的差異。兩種尺度下,在SSP後,輸出的特徵維度都是(9+4+1)x256,引數是共享的,之後接全連線層即可。這樣在訓練中,我們就通過兩個固定大小且共享引數的網路來實現了一個輸入大小可變的SPP-net。論文中說,這樣訓練的好處是可以更快的收斂。

以上single-size和multi-size只是針對訓練時候用,在測試階段,SPP-net的輸入是任意大小的。

3.Comparison between SPP-net and R-CNN

  • 對於R-CNN,整個過程是:
  1. 首先通過選擇性搜尋,對待檢測的圖片進行搜尋出~2000個候選視窗。
  2. 把這2k個候選視窗的圖片都縮放到 227 × 227 227\times227 ,然後分別輸入CNN中,每個proposal提取出一個特徵向量,也就是說利用CNN對每個proposal進行提取特徵向量。
  3. 把上面每個候選視窗的對應特徵向量,利用SVM演算法進行分類識別。

可以看出R-CNN的計算量是非常大的,因為2k個候選視窗都要輸入到CNN中,分別進行特徵提取。

  • 對於SPP-Net,整個過程是:
  1. 首先通過選擇性搜尋,對待檢測的圖片進行搜尋出2000個候選視窗。這一步和R-CNN一樣。
  2. 特徵提取階段。這一步就是和R-CNN最大的區別了,這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特徵提取,得到feature maps,然後在feature maps中找到各個候選框的區域,再對各個候選框採用金字塔空間池化,提取出固定長度的特徵向量。而R-CNN是直接提取image region,然後在進入CNN,因為SPP-Net只需要一次對整張圖片進行特徵提取,速度會大大提升。
  3. 最後一步也是和R-CNN一樣,採用SVM演算法進行特徵向量分類識別。

Mapping a window to feature maps

我們知道,在原圖中的proposal,經過多層卷積之後,位置還是相對於原圖不變的(如下圖所示),那現在需要解決的問題就是,如何能夠將原圖上的proposal,對映到卷積之後得到的特徵圖上,因為在此之後我們要對proposal進行金字塔池化。

對於對映關係,論文中給出了一個公式:

假設 ( x , y ) (x', y') 表示特徵圖上的座標點,座標點 ( x , y ) (x,y) 表示原輸入圖片上的點,那麼它們之間有如下轉換關係,這種對映關心與網路結構有關: ( x , y ) = ( S × x , S y ) (x,y)=(S \times x',S*y')

反過來,我們希望通過 ( x , y ) (x,y) 座標求解 ( x , y ) (x',y') ,那麼計算公式如下:
x = x / S + 1 , ( l e f t t o p ) x'=\lfloor x/S \rfloor + 1, (left-top)
x = x / S 1 , ( r i g h t b o t t o m ) x'=\lceil x/S \rceil - 1, (right-bottom)
其中S就是CNN中所有的strides的乘積,包含了池化、卷積的stride。

論文中使用的是 ZF-5: S = 2 × 2 × 2 × 2 = 16 S=2\times 2\times 2\times 2 = 16
Overfeat-5/7 : S = 2 × 3 × 2 = 12. S =2\times 3\times 2 =12.

Object detection

對於檢測演算法,論文中是這樣做到:使用"fast" mode of selective search生成約2000個候選框,縮放影象 m i n ( w , h ) = s min(w,h)=s 之後提取特徵,每個候選框使用一個4層的空間金字塔池化特徵,網路使用的是ZF-5的SPP-Net形式。之後將12800維的特徵輸入全連線層,binary linear SVM的輸入為全連線層的輸出。

這個演算法可以應用到多尺度的特徵提取:先將圖片resize到五個尺度:480,576,688,864,1200,加自己6個。然後在map window to feature map一步中,選擇ROI框尺度在{6個尺度}中大小最接近 224 × 224 224\times 224 的那個尺度下的feature maps中提取對應的ROI feature。這樣做可以提高系統的準確率。

4. Conclusion

SPPnet總體流程如下圖所示: