最近在閱讀FPN for object detection,看了網上的很多資料,有些認識是有問題的,當然有些很有價值。下面我自己總結了一下,以供參考。
1. FPN解決了什麼問題?
答: 在以往的faster rcnn進行目标檢測時,無論是rpn還是fast rcnn,roi 都作用在最後一層,這在大目标的檢測沒有問題,但是對于小目标的檢測就有些問題。因為對于小目标來說,當進行卷積池化到最後一層,實際上語義資訊已經沒有了,因為我們都知道對于一個roi映射到某個feature map的方法就是将底層坐标直接除以stride,顯然越後,映射過去後就越小,甚至可能就沒有了。 是以為了解決多尺度檢測的問題,引入了特征金字塔網絡。
下面我們介紹一下特征金字塔網絡。如下引用[1]
- 圖(a)是相當常見的一種多尺度方法,稱為featurized image pyramid,這種方法在較早的人工設計特征(DPM)時被廣泛使用,在CNN中也有人使用過。就是對input iamge進行multi scale,通過設定不同的縮放比例實作。這種可以解決多尺度,但是相當于訓練了多個模型(假設要求輸入大小固定),即便允許輸入大小不固定,但是也增加了存儲不同scale圖像的記憶體空間。
-
圖(b)就是CNN了,cnn相比人工設計特征,能夠自己學習到更進階的語義特征,同時CNN對尺度變化魯棒,是以如圖,從單個尺度的輸入計算的特征也能用來識别,但是遇到明顯的多尺度目标檢測時,還是需要金字塔結構來進一步提升準确率。
從現在在imageNet和COCO資料集上領先的的一些方法來看,在測試的時候都用到了featurized image pyramid方法,即結合(a),(b)。 說明了特征化圖像金字塔的每一級的好處在于,産生了多尺度的特征表示,每一級的特征都有很強的語義(因為都用cnn生成的特征),包括高分辨率的一級(最大尺度的輸入圖像)。
但是這種模式有明顯的弊端,相比于原來方法,時間增長了4倍,很難在實時應用中使用,同樣,也增大了存儲代價,這就是為什麼隻是在測試階段使用image pyramid。但是如果隻在測試階段使用,那麼訓練和測試在推斷的時候會不一緻。是以,最近的一些方法幹脆舍棄了image pyramid。
但是image pyramid不是計算多尺度特征表示的唯一方法。deepCNN能夠階層化的特征,而且因為池化的作用,會産生金字塔形的特征,具有一種内在的多尺度。但是問題在于,高分辨率的map(淺層)具有low-level的特征,是以淺層的目辨別别性能較弱。這也是不同level融合的目的。
- 如圖(c),SSD較早嘗試了使用CNN金字塔形的層級特征。理想情況下,SSD風格的金字塔 重利用了前向過程計算出的來自多層的多尺度特征圖,是以這種形式是不消耗額外的資源的。但是SSD為了避免使用low-level的特征,放棄了淺層的feature map,而是從conv4_3開始建立金字塔,而且加入了一些新的層。是以SSD放棄了重利用更高分辨率的feature map,但是這些feature map對檢測小目标非常重要。這就是SSD與FPN的差別。
- 圖(4)是FPN的結構,FPN是為了自然地利用CNN層級特征的金字塔形式,同時生成在所有尺度上都具有強語義資訊的特征金字塔。是以FPN的結構設計了top-down結構和橫向連接配接,以此融合具有高分辨率的淺層layer和具有豐富語義資訊的深層layer。這樣就實作了從單尺度的單張輸入圖像,快速建構在所有尺度上都具有強語義資訊的特征金字塔,同時不産生明顯的代價。
下面我們再來看一下相似的網絡:
上面一個帶有skip connection的網絡結構在預測的時候是在finest level(自頂向下的最後一層)進行的,簡單講就 是經過多次上采樣并融合特征到最後一步,拿最後一步生成的特征做預測。而FPN網絡結構和上面的類似,差別在于 預測是在每一層中獨立進行的。後面的實驗證明finest level的效果不如FPN好,原因在于FPN網絡是一個視窗大小固定的滑動視窗檢測器,是以在金字塔的不同層滑動可以增加其對尺度變化的魯棒性。另外雖然finest level有更多的anchor,但仍然效果不如FPN好,說明增加anchor的數量并不能有效提高準确率。
自下而上的路徑
CNN的前饋計算就是自下而上的路徑,特征圖經過卷積核計算,通常是越變越小的,也有一些特征層的輸出和原來大小一樣,稱為“相同網絡階段”(same network stage )。對于本文的特征金字塔,作者為每個階段定義一個金字塔級别, 然後選擇每個階段的最後一層的輸出作為特征圖的參考集。 這種選擇是很自然的,因為每個階段的最深層應該具有最強的特征。具體來說,對于ResNets,作者使用了每個階段的最後一個殘差結構的特征激活輸出。将這些殘差子產品輸出表示為{C2, C3, C4, C5},對應于conv2,conv3,conv4和conv5的輸出,并且注意它們相對于輸入圖像具有{4, 8, 16, 32}像素的步長。考慮到記憶體占用,沒有将conv1包含在金字塔中。
自上而下的路徑和橫向連接配接
自上而下的路徑(the top-down pathway )是如何去結合低層高分辨率的特征呢?方法就是,把更抽象,語義更強的高層特征圖進行上取樣,然後把該特征橫向連接配接(lateral connections )至前一層特征,是以高層特征得到加強。值得注意的是,橫向連接配接的兩層特征在空間尺寸上要相同。這樣做應該主要是為了利用底層的定位細節資訊。
下圖顯示連接配接細節。把高層特征做2倍上采樣(最鄰近上采樣法,可以參考反卷積),然後将其和對應的前一層特征結合(前一層要經過1 * 1的卷積核才能用,目的是改變channels,應該是要和後一層的channels相同),結合方式就是做像素間的加法。重複疊代該過程,直至生成最精細的特征圖。疊代開始階段,作者在C5層後面加了一個1 * 1的卷積核來産生最粗略的特征圖,最後,作者用3 * 3的卷積核去處理已經融合的特征圖(為了消除上采樣的混疊效應),以生成最後需要的特征圖。為了後面的應用能夠在所有層級共享分類層,這裡坐着固定了3*3卷積後的輸出通道為d,這裡設為256.是以所有額外的卷積層(比如P2)具有256通道輸出。這些額外層沒有用非線性。
{C2, C3, C4, C5}層對應的融合特征層為{P2, P3, P4, P5},對應的層空間尺寸是相通的。
2. 應用
Faster R-CNN+Resnet-101
本部分來源自:http://www.voidcn.com/article/p-xtjooucw-dx.html
要想明白FPN如何應用在RPN和Fast R-CNN(合起來就是Faster R-CNN),首先要明白Faster R-CNN+Resnet-101的結構,這部分在是論文中沒有的,部落客試着用自己的了解說一下。
直接了解就是把Faster-RCNN中原有的VGG網絡換成ResNet-101,ResNet-101結構如下圖:
Faster-RCNN利用conv1到conv4-x的91層為共享卷積層,然後從conv4-x的輸出開始分叉,一路經過RPN網絡進行區域選擇,另一路直接連一個ROI Pooling層,把RPN的結果輸入ROI Pooling層,映射成7 * 7的特征。然後所有輸出經過conv5-x的計算,這裡conv5-x起到原來全連接配接層(fc)的作用。最後再經分類器和邊框回歸得到最終結果。整體架構用下圖表示:
RPN中的特征金字塔網絡
本部分來源自:http://www.voidcn.com/article/p-xtjooucw-dx.html
RPN是Faster R-CNN中用于區域選擇的子網絡,RPN是在一個13 * 13 * 256的特征圖上應用9種不同尺度的anchor,本篇論文另辟蹊徑,把特征圖弄成多尺度的,然後固定每種特征圖對應的anchor尺寸,很有意思。也就是說,作者在每一個金字塔層級應用了單尺度的anchor,{P2, P3, P4, P5, P6}分别對應的anchor尺度為{32^2, 64^2, 128^2, 256^2, 512^2 },當然目标不可能都是正方形,本文仍然使用三種比例{1:2, 1:1, 2:1},是以金字塔結構中共有15種anchors。這裡,部落客嘗試畫一下修改後的RPN結構:
從圖上看出各階層共享後面的分類網絡。這也是強調為什麼各階層輸出的channel必須一緻的原因,這樣才能使用相同的參數,達到共享的目的。
注意上面的p6,根據論文中所指添加:
正負樣本的界定和Faster RCNN差不多:如果某個anchor和一個給定的ground truth有最高的IOU或者和任意一個Ground truth的IOU都大于0.7,則是正樣本。如果一個anchor和任意一個ground truth的IOU都小于0.3,則為負樣本。
Fast R-CNN 中的特征金字塔網絡
Fast R-CNN 中很重要的是ROI Pooling層,需要對不同層級的金字塔制定不同尺度的ROI。
ROI Pooling層使用region proposal的結果和中間的某一特征圖作為輸入,得到的結果經過分解後分别用于分類結果和邊框回歸。
然後作者想的是,不同尺度的ROI使用不同特征層作為ROI pooling層的輸入,大尺度ROI就用後面一些的金字塔層,比如P5;小尺度ROI就用前面一點的特征層,比如P4。那怎麼判斷ROI改用那個層的輸出呢?這裡作者定義了一個系數Pk,其定義為:
224是ImageNet的标準輸入,k0是基準值,設定為5,代表P5層的輸出(原圖大小就用P5層),w和h是ROI區域的長和寬,假設ROI是112 * 112的大小,那麼k = k0-1 = 5-1 = 4,意味着該ROI應該使用P4的特征層。k值應該會做取整處理,防止結果不是整數。
然後,因為作者把conv5也作為了金字塔結構的一部分,那麼從前全連接配接層的那個作用怎麼辦呢?這裡采取的方法是增加兩個1024維的輕量級全連接配接層,然後再跟上分類器和邊框回歸,認為這樣還能使速度更快一些。
最後,部落客根據自己的了解畫了一張草圖,猜想整個網絡經FPN修改後的樣子,也就是Faster R-CNN with FPN。
總結
作者提出的FPN(Feature Pyramid Network)算法同時利用低層特征高分辨率和高層特征的高語義資訊,通過融合這些不同層的特征達到預測的效果。并且預測是在每個融合後的特征層上單獨進行的,這和正常的特征融合方式不同。
目前官方開源代碼尚未公布,網上有一部分開源代碼,如unsky/FPN-caffe:Feature Pyramid Network on caffe
參考文獻
- FPN-Feature Pyramid Networks for Object Detection [重點推薦]
- Feature Pyramid Networks for Object Detection論文筆記 [重點推薦]
- Feature Pyramid Networks for Object Detection 論文筆記
- 特征金字塔特征用于目标檢測:Feature Pyramid Networks for Object Detection [重點推薦]
- FPN(feature pyramid networks)算法講解
- 目标檢測–Feature Pyramid Networks for Object Detection
- unsky/FPN-caffe:Feature Pyramid Network on caffe
- FPN(Feature Pyramid Networks for Object Detection)安裝與訓練