原論文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition https://arxiv.org/abs/1406.4729
綜述
在R-CNN出來之后,卷積神經網絡都要求輸入固定的圖像尺寸(比如224×224),而卷積層對與輸入的尺寸是不敏感的,只是一種滑動濾波,輸入的尺寸大輸出的特征圖就大,之所以限制喂入的卷積層圖片尺寸是因為若干卷積層之后會接入全連接層(Fully connected layer),全連接層是要求有固定的特征圖輸入的,反推若干層前的卷積層就需要固定尺寸的土拍你輸入。
論文中提出的“空間金字塔池化”(spatial pyramid pooling)的池化策略,可以有效消除上述限制。SPP-net結構能夠產生固定大小的特征表示(fixed-length representation),而不關心輸入圖像的尺寸或比例。用SPP-net,我們只需要從整張圖片計算一次特征圖(feature map),然后對任意尺寸的區域(子圖像)進行特征池化,以產生一個固定尺寸的表示(representation)用於訓練檢測器(detectors)。 這個方法避免了反復計算卷積特征。
SSP-Net
算法過程:
1.將經過SS處理后(含有2k個region proposal)的整幅圖像輸入CNNs,不需要對圖像中的每一個proposal進行訓練,然后得到整個featuremap,大大減少了計算proposal的特征時候的運算開銷。為什么不用訓練呢?原來是輸入的proposal邊界框位置與featuremap對應的邊界框位置是線性的! a.取得ROI(region proposal)中心點位置(x,y) b.則對應的feature map上的邊框左上角點為$\lfloor x / S\rfloor+1$,右下角點為$\lfloor x / S\rfloor-1$
省了很多計算有木有,對於每一副圖像不需要訓練CNN網絡多次。只需要訓練一次CNN,從特征圖中得到候選窗口。
2.通過SS等方法得到的Region proposal(candidate windows)不再需要進行crop/wrap了,對比RCNN再喂入卷積層時需要映射到相同大小,因為convolution layer和Pooling layer並沒有對圖像尺寸大小的約束,而是在FC層有要求,該論文在FC層之前在最后的卷積層之后pool5層采用SSP,替代常規的Pooling,這也是該論文的其創新點。
spatial pyramid pooling(SPP)金字塔層
SSP層是對於卷積得到的N個feature maps進行多次池化操作, 並且池化核的大小逐漸增大, 這會導致着池化的輸出逐漸減小,(像金字塔形狀一樣) 將這些池化后的輸出合並起來, 作為FC的輸入, 以此來解決FC要求的輸入必須要一致的問題.
SPP層原理如下所所示,假定CNN層得到的特征圖大小為a×a(比如13×13,隨輸入圖片大小而變化),設定的金字塔尺度為n×n bins(對於不同大小圖片是固定的),那么SPP層采用一種滑動窗口池化,窗口大小win_size=⌈a/n⌉,步為stride=⌊a/n⌋,采用max pooling,本質上將特征圖均分為n×n個子區域,然后對各個子區域max pooling,這樣不論輸入圖片大小,經過SPP層之后得到是固定大小的特征。一般設置多個金字塔級別,文中使用了4×4,2×2和1×1三個尺度。每個金字塔都得一個特征,將它們連接在一起送入后面的全連接層即可,這樣就解決了變大小圖片輸入的問題了。
論文作者說 Multi-level pooling has been shown to be robust to object deformations,It is worth noticing that the gain of multi-level pooling is not simply due to more parameters; rather, it is because the multi-level pooling is robust to the variance in object deformations and spatial layout. 即 這種機制下會對目標的形變問題有很好的健壯性. 在我的理解下, 因為采用了這種多級的pooling操作, 所以在一定程度上, 在訓練的過程中讓網絡學習到了在小范圍和大范圍下的形變下, 仍然能采樣到標志性的特征.

黑色圖片代表卷積層之后的特征圖,隨后我們以不同大小的塊來提取特征,分別是4 * 4,2 * 2,1 * 1,將這三張網格放到下面這張特征圖上,就可以得到16+4+1=21種不同的塊(Spatial bins)。我們從這21個塊中,每個塊提取出一個特征,這樣剛好就是我們要提取的21維特征向量。這種以不同的大小格子的組合方式來池化的過程就是空間金字塔池化(SSP)。

Conv5計算出的feature map也是任意大小的,現在經過SPP之后,就可以變成固定大小的輸出了,以上圖為例,一共可以輸出(16+4+1)*256的特征
金字塔池化的意義是什么?
總結而言,當網絡輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網絡的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化,使得任意大小的特征圖都能夠轉換成固定大小的特征向量,這就是空間金字塔池化的意義(多尺度特征提取出固定大小的特征向量)。
網絡訓練階段:
論文中將網絡的訓練分為兩種:一種是single-size,一種是Multi-size。
a.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參數。
b.Multi-size訓練過程
訓練的時候,224x224的圖片通過crop得到,180x180的圖片通過縮放224x224的圖片得到。之后,迭代訓練,即用224的圖片訓練一個epoch,之后180的圖片訓練一個epoch,交替地進行。
兩種尺度下,在SSP層后,輸出的特征維度都是(9+4+1)x256,參數是共享的,之后接全連接層即可。
論文中說,這樣訓練的好處是可以更快的收斂。
Mapping a Window to Feature Maps
我們知道,在原圖中的proposal,經過多層卷積之后,位置還是相對於原圖不變的(如下圖所示),那現在需要解決的問題就是,如何能夠將原圖上的proposal,映射到卷積之后得到的特征圖上,因為在此之后我們要對proposal進行金字塔池化。

對於映射關系,論文中給出了一個公式:
假設($x^{\prime}$,$y^{\prime}$)表示特征圖上的坐標點,坐標點(x,y)表示原輸入圖片上的點,那么它們之間有如下轉換關系,這種映射關心與網絡結構有關: (x,y)=(S*x’,S*y’)
反過來,我們希望通過(x,y)坐標求解($x^{\prime}$,$y^{\prime}$),那么計算公式如下:
Left 、Top $x^{\prime}=\lfloor x / S\rfloor+1$
Right 、Bottom $x^{\prime}=\lfloor x / S\rfloor-1$
其中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到五個尺度:480,576,688,864,1200,加自己6個。然后在map window to feature map一步中,選擇ROI框尺度在{6個尺度}中大小最接近224x224的那個尺度下的feature maps中提取對應的roi feature。這樣做可以提高系統的准確率。
最后是SSP-Net的完整網絡結構圖

Reference
[2] https://baike.baidu.com/item/SPP-Net/22701886?fr=aladdin
[3] https://blog.csdn.net/programmingfool5/article/details/82667581
[4] https://zhuanlan.zhihu.com/p/109059216
[5] https://www.cnblogs.com/smartwhite/p/8794144.html
