1. 程式人生 > >【目標檢測】對SPPNet論文的一些理解

【目標檢測】對SPPNet論文的一些理解

SPPNet不得不說,對後續的Fast-RCNN,Faster-RCNN都起到了舉足輕重的作用。SPPNet主要解決的是固定輸入層尺寸的這個限制,也從各個方面說明了不限制輸入尺寸帶來的好處。文章在一開始的時候就說明了目前深度網路存在的弊端:如果固定網路輸入size的話,要麼選擇crop策略,要麼選擇warp策略。crop策略就是從一個大圖中裁剪出固定尺寸的大小來,這樣做有可能crop出object的一個部分而無法準確訓練出類別,採用warp策略就是把一個BBOX直接resize成固定尺寸,這樣會改變物體的寬高比,使得訓練精度下降。

接著分析出需要固定大小的原因主要是網路存在全連線層,那如何去做才能使得網路不受輸入尺寸的限制呢?Kaiming He 大神就想出,用不同尺度的pooling 來pooling出固定尺度大小的feature map,這樣就可以不受全連線層約束任意更改輸入尺度了。

核心思想

 SPP-Net在最後一個卷積層後,接入了金字塔池化層,使用這種方式,可以讓網路輸入任意的圖片,而且還會生成固定大小的輸出。

金字塔池化層

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

於是我們可以看出金字塔池化的意義,對於任意尺寸的圖片,我們可以一直進行卷積、池化,直到網路即將與fc層相連的時候,就要使用金字塔池化,使得任意大小的特徵圖都能轉化為相同大小的特徵向量,這就是空間金字塔池化的意義(多尺度特徵提取出固定大小的特徵向量。)

網路訓練階段

論文中將網路的訓練分為兩部分:一種是single-size,一種是Multi-size。

single-size:

理論上來說,SPP-Net支援直接以多尺度的原始圖片作為輸入後直接BP即可。實際上,caffe上的實現為了計算方便,GPU,CUDA等比較適合固定尺寸的輸入,所以訓練的時候輸入是固定了尺度的。

以224*224的輸入為例:

在conv5之後的特徵圖為:13x13(a*a)
金字塔層bins:   n*n
將pooling層作為sliding window pooling。
windows_size=[a/n] 向上取整 , stride_size=[a/n]向下取整。

例如論文中給出的引數如下:

對於pool 3*3:      sizeX=5 的計算公式是:[13/3]向上取整=5 ,stride = 4的計算公式是:[13/3]向下取整。

如果輸入改成180x180,這時候conv5出來的reponse map為10x10,類似的方法,能夠得到新的pooling引數。
 

對於Multi-size training即就是:使用兩個尺度進行訓練:224*224 和180*180

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

       兩種尺度下,在SSP後,輸出的特徵維度都是(9+4+1)x256,引數是共享的,之後接全連線層即可。

       論文中說,這樣訓練的好處是可以更快的收斂

在這裡之前產生了一個閱讀誤區,就是這個公式計算7*7的出現了問題,後來實際程式碼中進行了zero-padding操作。
 

網路推斷階段

 輸入為任意大小的圖片。

 

SPP用於目標檢測

整個過程如下:

1.通過SS方法產生region proposal

2.將一整張圖片送入SPPNet中,產生整張圖片的特徵圖。然後找到這張圖片的每個region proposal對應的特徵圖區域,對這個區域進行空間金字塔池化後進行後面的訓練。

3.最後一步與RCNN一樣,接一個SVM➕位置精修。

 

region proposal如何對映到feature map:

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

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

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

反過來,我們希望通過(x,y)座標求解(x’,y’),那麼計算公式如下:

其中S就是CNN中所有的strides的乘積,包含了池化、卷積的stride。

比如,對於下圖的集中網路結構,S的計算如下:

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

檢測演算法

對於檢測演算法,論文中是這樣做的:使用ss生成2k個候選框,縮放影象min(w,h)=s之後提取特徵,每個候選框使用一個4層的空間金字塔池化特徵,網路使用的是ZF-5的SPPNet形式。之後將12800d的特徵輸入全連線層,SVM的輸入為全連線層的輸出。

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