1. 程式人生 > >目標檢測(二)——SPP-Net

目標檢測(二)——SPP-Net

上一篇R-CNN中提到過, R-CNN是先提取region,每個region都過這五個卷積。這樣做計算量非常龐大。針對這個問題,SPP-Net做了改進,它是整個圖過一次卷積(五個卷積操作),然後取對應得region。同樣的,卷積可使用Alex和VGG。

一、SPP-Net的結構

Conv5計算出的feature map也是任意大小的,現在經過SPP之後,就可以變成固定大小的輸出了,以上圖為例,一共可以輸出(16+4+1)*256的特徵。

重點解釋:

1.之前的卷積操作都需要輸入統一尺寸的圖片,這裡為什麼可以接受任意尺寸圖片呢?

 卷積層的引數和輸入大小無關,它僅僅是一個卷積核在影象上滑動,不管輸入影象多大都沒關係,只是對不同大小的圖片卷積出不同大小的特徵圖,但是全連線層的引數就和輸入影象大小有關,因為它要把輸入的所有畫素點連線起來,需要指定輸入層神經元個數和輸出層神經元個數,所以需要規定輸入的feature的大小。

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

2.什麼是金字塔池化?

黑色圖片代表卷積之後的特徵圖,在這裡SPP一共3層:第一層對整張影象做池化(最大、均值等);第二層將影象劃分為2*2=4個塊,分別做池化;第三層劃分為4*4=16個塊,分別做池化
通過以上步驟,最後獲得1+4+16=21個特徵值。這樣剛好就是全連線的輸入要求為21維。

這種以不同的大小格子的組合方式來池化的過程就是空間金字塔池化(SPP)。

3.經過前面的卷積和池化,如何在feature maps裡找到對應的候選區域?

對於對映關係,論文中給出了一個公式:假設(x’,y’)表示特徵圖上的座標點,座標點(x,y)表示原輸入圖片上的點,那麼它們之間有如下轉換關係,這種對映關心與網路結構有關: (x,y)=(S*x’,S*y’)反過來,我們希望通過(x,y)座標求解(x’,y’),那麼計算公式如下:

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

二、SPP-Net與R-CNN的對比

對於R-CNN,整個過程是:

1.首先通過ss對待檢測的圖片進行搜尋出2000個候選視窗。

2.把這2k個候選視窗的圖片都縮放到227*227,然後分別輸入CNN中,每個proposal提取出一個特徵向量,也就是說利用CNN對每個proposal進行提取特徵向量。

3.把每個候選視窗的對應特徵向量,利用SVM演算法進行分類識別。

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


而對於SPP-Net,整個過程是:

1.首先通過ss,對待檢測的圖片進行搜尋出2000個候選視窗。

2.特徵提取階段就是和R-CNN最大的區別了。這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特徵提取,得到feature maps,然後將原圖中2K個候選視窗對映到feature maps中,找到各個候選框的區域,再對各個候選框採用金字塔空間池化,提取出21維的特徵向量。

因為SPP-Net只需要一次對整張圖片進行特徵提取,速度會大大提升。

3.最後一步也是和R-CNN一樣,採用SVM演算法進行特徵向量分類識別。