前言:
接着上一篇文章提到的RCNN網絡物體檢測,這個網絡成功的引入了CNN卷積網絡來進行特征提取,但是存在一個問題,就是對需要進行特征提取圖片大小有嚴格的限制。當時面對這種問題,rg大神采用的是對分割出的2000多個候選區域,進行切割或者縮放形變處理到固定大小,這樣雖然滿足了CNN對圖片大小的要求,確造成圖片的信息缺失或者變形,會降低圖片識別的正確率. 如下圖所示:
正文:
何凱明大神在看到RCNN模型,分析了CNN模型的特點后:由卷積部分和全連接兩部分構成,而對於卷積部分而言,比如任意圖片大小(w,h),任意的卷積核size(a,b),默認步長為1,我們都會得到卷積之后的特征圖F(w-a+1,h-b+1),所以這部分對圖片大小沒有要求,有要求的地方在全連接層(如下圖),全連接層的神經元設定之后是固定的(如圖 Input layer 神經元個數),而每一個都對應者一個特征,rg大神在進入CNN前對圖片進行warp處理,就是為了卷積之后的特征數,能夠和了全連接層的神經元個數相等.
但是何大神覺得,事情還可以更有趣,他提出將特征數據(特征圖)進一步處理,然后拼湊成和神經元個數相同的特征數,這樣就可以不用warp圖片大小也可以獲得相同數量的特征,那么他是咋樣處理這特征圖的呢?
論文中提到,比如我們有一張圖片為例子:
我們對這種圖進行卷積處理(我們以zf為例,最后一個卷積之后得到這樣的特征圖)
這張圖顯示的是一個60*40*256的特征圖,到這兒之后,如果要得到固定的神經元個數,論文中提到的是21,我們就需要將60*40的特征圖,我們暫且稱這個特征圖為feature A,進行處理,怎么處理呢?
我們先貼個圖:
如上圖所示:
我們使用三層的金字塔池化層pooling,分別設置圖片切分成多少塊,論文中設置的分別是(1,4,16),然后按照層次對這個特征圖feature A進行分別
處理(用代碼實現就是for(1,2,3層)),也就是在第一層對這個特征圖feature A整個特征圖進行池化(池化又分為:最大池化,平均池化,隨機池化),論文中使用的是最大池化,
得到1個特征。
第二層先將這個特征圖feature A切分為4個(20,30)的小的特征圖,然后使用對應的大小的池化核對其進行池化得到4個特征,
第三層先將這個特征圖feature A切分為16個(10,15)的小的特征圖,然后使用對應大小的池化核對其進行池化得到16個特征.
然后將這1+4+16=21個特征輸入到全連接層,進行權重計算. 當然了,這個層數是可以隨意設定的,以及這個圖片划分也是可以隨意的,只要效果好同時最后能組合成我們需要的特征個數即可
這就是sppnet的核心思想,當然在這個模型中,何大神還對RCNN進行了優化,上面介紹的金字塔池化代替warp最重要的一個,但是這個也很重要,是什么呢?
何大神覺得,如果對ss提供的2000多個候選區域都逐一進行卷積處理,勢必會耗費大量的時間,所以他覺得,能不能我們先對一整張圖進行卷積得到特征圖,然后
再將ss算法提供的2000多個候選區域的位置記錄下來,通過比例映射到整張圖的feature map上提取出候選區域的特征圖B,然后將B送入到金字塔池化層中,進行權重計算.
然后經過嘗試,這種方法是可行的,於是在RCNN基礎上,進行了這兩個優化得到了這個新的網絡sppnet.
值得一提的是,sppnet提出的這種金字塔池化來實現任意圖片大小進行CNN處理的這種思路,得到了大家的廣泛認可,以后的許多模型,或多或少在這方面都是參考了這種思路,就連
rg大神,在后來提出的fast-rcnn上也是收益於這種思想的啟發.
參考:
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition