目標檢測(Object Detection)——理解SPP
來自專欄計算機視覺論文速遞8 人贊了文章
一、 前言
在目標檢測系列文章的上一篇R-CNN中,我們知道R-CNN在當時雖然取得了不錯的成績,但是其需要改進的地方也很多,比如演算法步驟比較繁瑣,需要大量的時間和內存去訓練和測試模型等。除此之外,在訓練和測試常見的CNN網路時,要求輸入的圖像有一個固定的大小,比如要求圖像的輸入為224*224。(網路前面的卷積層不要求輸入圖像的大小,後面的全連接層的輸入特徵數是固定的,需要固定的輸入)這就要求我們在使用網路前需要對圖像進行一些預處理操作,比如:裁剪(crop)、拉伸(warp)等。文章《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》提出來一種Spatial Pyramid Pooling(SPP)結構來解決這種問題,將這種結構放在卷積層與全連接層中間,在多個測試中取得了不錯的效果。
二、SPP原理
SPP的原理論文里寫的很簡單,在這裡要重新回顧一下CNN中的一些問題:
- 當尺寸大小不同的圖像輸入到相同的多層卷積網路中,得到的feature map大小是不同的,數量是相同(相同的filters)。
- 對一個一個固定的CNN,全連接層的輸入是一個固定的數值(這個數值提前設置好的),這就需要使用SPP插入多層卷積和全連接層中間。
在上面兩個問題的基礎上,以下圖為例介紹核心的思想。
- SPP的核心在於使用多個不同尺寸sliding window pooling(上圖中的藍色4*4、青色2*2、灰色1*1窗口)對上層(卷積層)獲得的feature maps 進行採樣(池化,文中使用最大池化),將分別得到的結果進行合併就會得到固定長度的輸出。
- 上圖可以看出SPP層就是在前一卷積層得到的feature maps上進行了3個池化操作(實際情況根據自己設定的池化個數,控制全連接層的輸入,下面會講)。最右邊的就是原圖像,中間的是把圖像分成大小是4的特徵圖,最右邊的就是把圖像分成大小是16的特徵圖。這樣每一個feature map就會變成固定的21(16+4+1)個feature maps。
通俗的講,SPP就相當於標準通道層,不管任何大小的圖像,我都用一套標準的pool(文中說叫: l-level pyramid)對圖像進行池化,最後組合成一列相同大小的特徵,作為全連接層的輸入,這一組相同大小的特徵是固定的,可以提前進行計算,計算的方法和規則下面進行講解。
三、Single-size training 計算規則
為了便於理解,我們將原文中一大段話整理為下面幾個步驟,並在最後給出一個論文中的圖,輔助理解。
- 按照傳統CNN網路,對於圖像的輸入需要一個固定的大小,假設為224×224。
- 經過五個卷積層後,conv5輸出的 feature maps的大小為a×a。在第一步假設輸入大小為224×224的基礎上,feature maps的大小為13×13。
- 開始使用SPP層插入在conv5層後(對應SPP原理圖),SPP層中想要得到一組n×n的和的特徵(比如SPP原理圖中1×1、2×2、4×4........一旦確定,就固定了),文中舉例用的n=3、2、1。想要得到這樣的一組特徵,就要使用一組sliding window 對conv5層得到的feature maps進行pooling。這裡涉及sliding window的大小(win)和步長(str)計算,計算如下:
n=2,n=1以此類推(那兩個計算符號分別為:向上取整和向下取整),將3個pooling後的結果合併,可以得到如下圖。
四、SPP評價
考慮到SPP就是為了奔著打破一些傳統網路和形式的目的搞出來的,所以優點主要有:
- 解決輸入圖片大小不一造成的缺陷。
- 由於把一個feature map從不同的尺寸進行pooling特徵抽取,再聚合,提高了演算法的robust和精度。
- 圖像分類、目標檢測都可以用,而且效果很棒。
- 一定程度上緩解了R-CNN耗時過多等問題。
最後,放一張論文中的圖,用不同尺寸的sliding window去pooling一張圖(feature map)確實可以獲得更多的特徵。
參考文獻
[1] Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
本人水平有限,表述不清楚或錯誤的地方請指出,一起進步!
歡迎點贊(開心臉)
推薦閱讀:
TAG:計算機視覺 | 目標檢測 | 深度學習DeepLearning |