1. 程式人生 > >RCNN 系列之SPPNet詳解

RCNN 系列之SPPNet詳解

轉自: https://blog.csdn.net/u010725283/article/details/79017070

RCNN系列:RCNN,SPPNet,Fast RCNN,Faster RCNN,R-FCN。這一系列是個遞進關係,也是目標檢測使用two-stage方法的一個發展過程。想要更好的理解Faster RCNN和R-FCN,只能把這演算法都梳理清楚了,才能明白這個遞進過程。

本篇講解的是SPPNet。2015年發表在IEEE。

SPPNet為何出現?

之前的網路,比如LeNet,AlexNet,ZF,VGG等,它們的輸入都是固定大小的,為什麼要固定大小吶?原因就在最後連線的全連線層上。全連線層的輸入一定是固定大小的。這一點很容易理解,因為全連線層網路就是傳統的神經網路,傳統的神經網路的輸入層必定是固定大小的。而卷積神經網路的conv層的輸入並不需要固定大小,

看完連線中的文章就明白為什麼conv層不用固定大小了。

那麼conv層不用固定大小,FC層的輸入又要固定大小,那麼在這兩者之間加上一層SPP即可解決這個問題了。

下圖即是SPPNet和其他的網路不同。

以上也即回答了SPPNet是什麼和能做什麼,總結一下,SPPNet就是為了能夠讓CNN能夠輸入不同尺度的圖片。

SPP如何實現的?

SPP(spatial pyramid pooling),中文名字就是空間金字塔池化。我的理解就是一種編碼方式。以上圖舉例,黑色影象就是conv5出來的feature map,之前我們輸入的圖片是固定大小的,那麼在conv5輸出的feature map同樣具有統一的大小。那現在如果輸入不是固定的大小了,那麼conv5輸出的feature map是不同的尺寸。我們再以兩種大小13*13,10*10的feature map來舉例,這兩個feature map大小不同,我們使用三種尺度的filter來做pooling,但最終的結果是可以得到4*4,2*2,1大小的256channels的feature map。那麼再把這些feature map 級聯在一起,就可以有固定大小的輸出了。其實就是無論多大的feature map輸入到SPP中,SPP都會輸出一個固定的k*M大小輸出。M就是我們選擇的4*4+2*2+1,k就是輸入feature map的通道數。

說的那麼好,這種方法到底work 不work吶?

那就是論文的實驗部分了,當然,深度學習論文中的實驗部分非常關鍵,都是一些作者的訓練深度網路的調參技巧。這一部分可以參考論文了,沒有什麼難點。

SPPNet現在已經完成了分類功能,那麼怎麼用它來做檢測吶?

做檢測首先要和RCNN做對比:

上圖對比,

RCNN的整個過程是這樣的:

  1. 通過selective search演算法為每一張待檢測圖片提取出2000左右的候選框;
  2. 每張圖片中的候選框調整到227*277大小,然後分別輸入到CNN中提取特徵;
  3. 提取到的特徵後,利用svm對這些特徵進行分類識別;
  4. 利用NMS演算法對結果進行抑制處理。

2000個左右的proposal都要使用CNN來提取特徵,計算量是很大的。然後利用這些特徵進行分類時,同樣需要很大的記憶體。

SPPNet的整個過程:

  1.  同樣是使用selective search演算法為每一張待檢測的圖片提取出2000左右的候選框,這一點和RCNN相同;
  2. 特徵提取階段,整個圖片輸入到SPPNet中,提取出整張圖片的feature map,然後將原圖上的候選框對映到feature map上。然後對各個候選框對應的feature map上的塊做金字塔空間池化,提取出固定長度的特徵向量;
  3. 使用SVM演算法對得到的特徵向量分類識別;
  4. 使用NMS做極大值抑制。

SPPNet和RCNN最大的不同就在於第二步處理上,對一張圖片只做一次特徵提取,顯然會提高效率,速度得到很大的提升。

其中第二步將原圖上的候選框對映到feature map上算是比較關鍵的點,怎麼做對映吶?

假設(x',y')表示特徵圖上的座標點,(x,y)表示原圖上的座標點,那麼我們希望通過(x,y)來求解(x',y'),作者給出的計算公式如下:

其中,S是SPPNet中所有的strides的乘積,包含了池化和卷積的stride。

對以上公式的理解,要建立在卷積的過程上,我們再看一遍卷積的過程:

假設上圖的左上角的點和右下角的點標出的區域就是我們要的候選區域,那麼它對應的feature map即是右圖。

我們就是利用這個區域兩個點的座標來求出來feature map上的對應的區域即可。

當然feature map上的一個點其實是對應了原圖上的一個區域,我們也稱作感受野。那麼這樣對映肯定會有誤差的。這裡不做過多的計較了。

總結:由於只關心檢測過程,那麼SPPNet對RCNN最大的提高即是:

RCNN對每個候選區域提取特徵,

SPPNet對整張圖片提取特徵然後根據候選區域去映射出候選區域的特徵。

當然能夠這樣做的原因是在於SPP層,SPP層的存在可以讓CNN輸入不同大小的圖片。

參考:

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition