SPPNet-引入空間金字塔池化改進RCNN

繼續總結一下RCNN系列。上篇RCNN- 將CNN引入目標檢測的開山之作 介紹了CNN用於目標檢測的基本思想和流程。後續出現了SPPnet,Fast-RCNN ,Faster-RCNN等一些列改進。最終實現了端對端學習,同時帶來速度與精度的提升。

在RCNN中CNN階段的流程大致如下:

紅色框是selective search 輸出的可能包含物體的候選框(ROI)。

一張圖圖片會有~2k個候選框,每一個都要單獨輸入CNN做卷積等操作很費時。SPP-net提出:能否在feature map上提取ROI特徵,這樣就只需要在整幅圖像上做一次卷積。

雖然總體流程還是 Selective Search得到候選區域->CNN提取ROI特徵->類別判斷->位置精修,但是由於所有ROI的特徵直接在feature map上提取,大大減少了卷積操作,提高了效率。

有兩個難點要解決:

1. 原始圖像的ROI如何映射到特徵圖(一系列卷積層的最後輸出)

2. ROI的在特徵圖上的對應的特徵區域的維度不滿足全連接層的輸入要求怎麼辦(又不可能像在原始ROI圖像上那樣進行截取和縮放)?

【空間金字塔池化 (Spatial Pyramid Pooling)】

對於難點2我們分析一下:

  • 這個問題涉及的流程主要有: 圖像輸入->卷積層1->池化1->...->卷積層n->池化n->全連接層。

  • 引發問題的原因主要有:全連接層的輸入維度是固定死的,導致池化n的輸出必須與之匹配,繼而導致圖像輸入的尺寸必須固定。

不就是為了使一些列卷積層的最後輸出剛維度好是全連接層的輸入維度嗎?聰明的你有沒有好的解決辦法?先思考幾秒鐘。

解決辦法可能有:

  1. 想辦法讓不同尺寸的圖像也可以使 池化n 產生固定的 輸出維度。(打破圖像輸入的固定性)
  2. 想辦法讓全連接層(罪魁禍首)可以接受非固定的輸入維度。(打破全連接層的固定性,繼而 也打破了圖像輸入的固定性)
  3. 其它方法(肯定不止這兩個解決辦法,讀者有新想法歡迎交流)

以上的方法1就是SPPnet的思想。它在池化n 的地方做了一些手腳 (特殊池化手段:空間金字塔池化),使得 不同尺寸的圖像也可以使 池化n 產生固定的 輸出維度。

(至於方法2 其實就是全連接轉換為全卷積,作用的效果等效為在原始圖像做滑窗,多個窗口並行處理,具體方法日後在寫)

所謂空間金字塔池化就是沿著 金字塔的低端向頂端 一層一層做池化。

假設原圖輸入是224x224,對於conv5出來後的輸出是13x13x256的,可以理解成有256個這樣的filter,每個filter對應一張13x13的reponse map。如果像上圖那樣將reponse map分成1x1(金字塔底座),2x2(金字塔中間),4x4(金字塔頂座)三張子圖,分別做max pooling後,出來的特徵就是(16+4+1)x256 維度。如果原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256維度。這樣就實現了不管圖像尺寸如何 池化n 的輸出永遠是 (16+4+1)x256 維度。

實際運用中只需要根據全連接層的輸入維度要求設計好空間金字塔即可。

【整幅圖像做一次卷積】

將conv5的pool層改為SPP之後就不必把每一個都ROI摳出來送給CNN做繁瑣的卷積了,整張圖像做卷積一次提取所有特徵再交給SPP即可。

R-CNN重複使用深層卷積網路在~2k個窗口上提取特徵,特徵提取非常耗時。SPPNet將比較耗時的卷積計算對整幅圖像只進行一次,之後使用SPP將窗口特徵圖池化為一個固定長度的特徵表示。

如下圖 第二個流程:

(備註:還有難點1沒有提,找了一些資料看,總感覺沒有徹底搞清楚,有些公式不知怎麼推導得到的,改日再寫吧)

參考:

  • RCNN學習筆記(3):Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPP-net)

  • mp7.watson.ibm.com/ICCV

  • 《Spatial Pyramid Pooling in Deep ConvolutionalnNetworks for Visual Recognitionn》

推薦閱讀:

擔心的事情還是發生了,AI水軍你根本看不出來
Python · RNN
為什麼梯度反方向是函數值局部下降最快的方向?
Caffe入門與實踐-簡介

TAG:深度学习DeepLearning | 计算机视觉 | 神经网络 |