1. 程式人生 > >特徵金字塔特徵用於目標檢測:Feature Pyramid Networks for Object Detection

特徵金字塔特徵用於目標檢測:Feature Pyramid Networks for Object Detection

前言:

這篇論文主要使用特徵金字塔網路來融合多層特徵,改進了CNN特徵提取。作者也在流行的Fast&Faster R-CNN上進行了實驗,在COCO資料集上測試的結果現在排名第一,其中隱含的說明了其在小目標檢測上取得了很大的進步。其實整體思想比較簡單,但是實驗部分非常詳細和充分。

摘要:

特徵金字塔是多尺度目標檢測系統中的一個基本組成部分。近年來深度學習目標檢測特意迴避金字塔特徵表示,因為特徵金字塔在計算量和記憶體上很昂貴。所以作者利用了深度卷積神經網路固有的多尺度、多層級的金字塔結構去構建特徵金字塔網路。使用一種自上而下的側邊連線,在所有尺度構建了高階語義特徵圖,這種結構就叫特徵金字塔網路

FPN)。其在特徵提取上改進明顯,把FPN用在Faster R-CNN上,在COCO資料集上,結果超過了目前所有的單模型(single-model)檢測方法,而且在GPU上可以跑到5 FPS。

概述:

多尺度目標檢測是計算機視覺領域的一個基礎且具挑戰性的課題。在影象金字塔基礎上構建的特徵金字塔(featurized image pyramids ,Figure1(a))是傳統解決思路,具有一定意義的尺度不變性。直觀上看,這種特性使得模型可以檢測大範圍尺度的影象。

Featurized image pyramids 主要在人工特徵中使用,比如DPM就要用到它產生密集尺度的樣本以提升檢測水平。目前人工特徵式微,深度學習的CNN特徵成為主流,CNN特徵的魯棒性很好,刻畫能力強。即使如此,仍需要金字塔結構去進一步提升準確性,尤其在多尺度檢測上。金字塔結構的優勢是其產生的特徵每一層都是語義資訊加強的,包括高解析度的低層。

對影象金字塔每一層都處理有很大的侷限性,首先運算耗時會增加4倍,訓練深度網路的時候太吃視訊記憶體,幾乎沒法用,即使用了,也只能在檢測的時候。因為這些原因,Fast/Faster R-CNN 都沒使用featurized image pyramids 。

影象金字塔並不是多尺度特徵表徵的唯一方式,CNN計算的時候本身就存在多級特徵圖(feature map hierarchy),且不同層的特徵圖尺度就不同,形似金字塔結構(Figure1(b))。結構上雖不錯,但是前後層之間由於不同深度(depths)影響,語義資訊差距太大,主要是高解析度的低層特徵很難有代表性的檢測能力。

SSD方法在借鑑利用featurized image pyramid上很是值得說,為了避免利用太低層的特徵,SSD從偏後的conv4_3開始,又往後加了幾層,分別抽取每層特徵,進行綜合利用(Figure1(c))。但是SSD對於高解析度的底層特徵沒有再利用,而這些層對於檢測小目標很重要。 


這篇論文的特徵金字塔網路(Figure1(d))做法很簡單,如下圖所示。把低解析度、高語義資訊的高層特徵和高解析度、低語義資訊的低層特徵進行自上而下的側邊連線,使得所有尺度下的特徵都有豐富的語義資訊。這種結構是在CNN網路中完成的,和前文提到的基於圖片的金字塔結構不同,而且完全可以替代它。

本文特徵金字塔網路自上而下的結構,和某些論文有一定的相似之處,但二者目的不盡不同。作者做了檢測和分割實驗,COCO資料集的結果超過了現有水平,具體結果參見實驗部分。值得說的是,本方法在訓練的時間和視訊記憶體使用上都是可接受的,檢測的時間也沒增加。


圖1. (a)使用影象金字塔建立特徵金字塔,每個獨立的影象尺度上計算特徵,這計算特別緩慢;(b)最近的檢測系統已選擇只使用單尺度特徵,以便更快的檢測;(C)另一種是利用金字塔特徵層次計算的ConvNet當作一個特徵化的影象金字塔;(d)提出的特徵金字塔網路(FPN)如(b)和(c),但更準確。在這個圖中,特徵圖由藍色輪廓和較粗的輪廓表示更高層次的特徵。

特徵金字塔網路:

論文的目標是利用CNN的金字塔層次結構特性(具有從低到高階的語義),構建具有高階語義的特徵金字塔。得到的特徵金字塔網路(FPN)是通用的,但在文中,作者先在RPN網路Fast R-CNN中使用這一成果,也將其用在instance segmentation proposals 中。

該方法將任意一張圖片作為輸入,以全卷積的方式在多個層級輸出成比例大小的特徵圖,這是獨立於CNN骨幹架構(本文為ResNets)的。具體結構如圖Figure 2。 


圖2 Top:一個自上而下的架構與skip連線,其預測是在最好的層;Bottom:模型有一個類似的結構,但利用它作為一個特徵金字塔,在各級獨立作出預測。

自下而上的路徑:

CNN的前饋計算就是自下而上的路徑,特徵圖經過卷積核計算,通常是越變越小的,也有一些特徵層的輸出和原來大小一樣,稱為相同網路階段(same network stage )。對於本文的特徵金字塔,作者為每個階段定義一個金字塔級別, 然後選擇每個階段的最後一層的輸出作為特徵圖的參考集。 這種選擇是很自然的,因為每個階段的最深層應該具有最強的特徵。具體來說,對於Res-Nets,作者使用了每個階段的最後一個殘差結構的特徵啟用輸出。將這些殘差模組輸出表示為{C2, C3, C4, C5},對應於conv2,conv3,conv4和conv5的輸出,並且注意它們相對於輸入影象具有{4, 8, 16, 32}畫素的步長。考慮到記憶體佔用,沒有將conv1包含在金字塔中。

自上而下的路徑和橫向連線:

自上而下的路徑(the top-down pathway )是如何去結合低層高解析度的特徵呢?方法就是把更抽象,語義更強的高層特徵圖進行上取樣,然後把該特徵橫向連線(lateral connections )至前一層特徵,因此高層特徵得到加強。值得注意的是,橫向連線的兩層特徵在空間尺寸上要相同。這樣做主要是為了利用底層的定位細節資訊。

Figure 3顯示連線細節。把高層特徵做2倍上取樣(最鄰近上取樣法),然後將其和對應的前一層特徵結合(前一層要經過1 * 1的卷積核才能用,目的是改變channels,是要和後一層的channels相同),結合方式就是做畫素間的加法。重複迭代該過程,直至生成最精細的特徵圖。迭代開始階段,作者在C5層後面加了一個1 * 1的卷積核來產生最粗略的特徵圖,最後作者用3 * 3的卷積核去處理已經融合的特徵圖(為了消除上取樣的混疊效應),以生成最後需要的特徵圖。{C2, C3, C4, C5}層對應的融合特徵層為{P2, P3, P4, P5},對應的層空間尺寸是相通的。


圖3 一個building block,說明橫向連線和自上而下的途徑,合併的加法

金字塔結構中所有層級共享分類層(迴歸層),就像featurized image pyramid 中所做的那樣。作者固定所有特徵圖中的維度(通道數,表示為d)。作者在本文中設定d=256,因此所有額外的卷積層(比如P2)具有256通道輸出。 這些額外層沒有用非線性,而非線性會帶來一些影響。

實際應用:

本文方法在理論上早CNN中是通用的,作者將其首先應用到了RPNFast R-CNN中,應用中儘量做較小幅度的修改。

Faster R-CNN+Resnet-101

FPN如何應用在RPNFast R-CNN 合起來就是Faster R-CNN)?首先要明白Faster R-CNN+Resnet-101的結構。

直接理解就是把Faster-RCNN中原有的VGG網路換成ResNet-101ResNet-101結構如下圖:


Faster-RCNN利用conv1到conv4-x的91層為共享卷積層,然後從conv4-x的輸出開始分叉,一路經過RPN網路進行區域選擇,另一路直接連一個ROI Pooling層,把RPN的結果輸入ROI Pooling層,對映成7 * 7的特徵。然後所有輸出經過conv5-x的計算,這裡conv5-x起到原來全連線層(FC)的作用。最後再經分類器和邊框迴歸得到最終結果。整體框架用下圖表示: 


RPN中的特徵金字塔網路

RPNFaster R-CNN中用於區域選擇的子網路,具體原理就不詳細解釋了,可閱讀論文和參考部落格:faster-rcnn 之 RPN網路的結構解析 。

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。 

訓練中,把重疊率(IoU)高於0.7的作為正樣本,低於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用於目標分割的架構圖:


實驗結果: