對sppnet網絡的理解


 

 

 前言:

   接着上一篇文章提到的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM