對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圖片大小也能夠得到相同數量的特徵,那麼他是咋樣處理這特徵圖的呢?優化

    

論文中提到,好比咱們有一張圖片爲例子:blog

              

咱們對這種圖進行卷積處理(咱們以zf爲例,最後一個卷積以後獲得這樣的特徵圖)圖片

    

這張圖顯示的是一個60*40*256的特徵圖,到這兒以後,若是要獲得固定的神經元個數,論文中提到的是21,咱們就須要將60*40的特徵圖,咱們暫且稱這個特徵圖爲feature A,進行處理,怎麼處理呢?it

咱們先貼個圖:io

        

如上圖所示:ast

    咱們使用三層的金字塔池化層pooling,分別設置圖片切分紅多少塊,論文中設置的分別是(1,4,16),而後按照層次對這個特徵圖feature A進行分別基礎

處理(用代碼實現就是for(1,2,3層)),也就是在第一層對這個特徵圖feature A整個特徵圖進行池化(池化又分爲:最大池化,平均池化,隨機池化),論文中使用的是最大池化,map

獲得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

相關文章
相關標籤/搜索