FPN(feature pyramid networks)演算法講解
這篇論文是CVPR2017年的文章,採用特徵金字塔做目標檢測,有許多亮點,特來分享。
論文:feature pyramid networks for object detection
論文連結:https://arxiv.org/abs/1612.03144
論文概述:
作者提出的多尺度的object detection演算法:FPN(feature pyramid networks)。原來多數的object detection演算法都是隻採用頂層特徵做預測,但我們知道低層的特徵語義資訊比較少,但是目標位置準確;高層的特徵語義資訊比較豐富,但是目標位置比較粗略。另外雖然也有些演算法採用多尺度特徵融合的方式,但是一般是採用融合後的特徵做預測,而本文不一樣的地方在於預測是在不同特徵層獨立進行的。
程式碼的話應該過段時間就會開源。
論文詳解:
下圖FIg1展示了4種利用特徵的形式:
(a)影象金字塔,即將影象做成不同的scale,然後不同scale的影象生成對應的不同scale的特徵。這種方法的缺點在於增加了時間成本。有些演算法會在測試時候採用影象金字塔。
(b)像SPP net,Fast RCNN,Faster RCNN是採用這種方式,即僅採用網路最後一層的特徵。
(c)像SSD(Single Shot Detector)採用這種多尺度特徵融合的方式,沒有上取樣過程,即從網路不同層抽取不同尺度的特徵做預測,這種方式不會增加額外的計算量。作者認為SSD演算法中沒有用到足夠低層的特徵(在SSD中,最低層的特徵是VGG網路的conv4_3),而在作者看來足夠低層的特徵對於檢測小物體是很有幫助的。
(d)本文作者是採用這種方式,頂層特徵通過上取樣和低層特徵做融合,而且每層都是獨立預測的。
如下圖Fig2。上面一個帶有skip connection的網路結構在預測的時候是在finest level(自頂向下的最後一層)進行的,簡單講就是經過多次上取樣並融合特徵到最後一步,拿最後一步生成的特徵做預測。而下面一個網路結構和上面的類似,區別在於預測是在每一層中獨立進行的。後面有這兩種結構的實驗結果對比,非常有意思,因為之前只見過使用第一種特徵融合的方式。
作者的主網路採用ResNet。
作者的演算法大致結構如下Fig3:一個自底向上的線路,一個自頂向下的線路,橫向連線(lateral connection)。圖中放大的區域就是橫向連線,這裡1*1的卷積核的主要作用是減少卷積核的個數,也就是減少了feature map的個數,並不改變feature map的尺寸大小。
自底向上其實就是網路的前向過程。在前向過程中,feature map的大小在經過某些層後會改變,而在經過其他一些層的時候不會改變,作者將不改變feature map大小的層歸為一個stage,因此每次抽取的特徵都是每個stage的最後一個層輸出,這樣就能構成特徵金字塔。
自頂向下的過程採用上取樣(upsampling)進行,而橫向連線則是將上取樣的結果和自底向上生成的相同大小的feature map進行融合(merge)。在融合之後還會再採用3*3的卷積核對每個融合結果進行卷積,目的是消除上取樣的混疊效應(aliasing effect)。並假設生成的feature map結果是P2,P3,P4,P5,和原來自底向上的卷積結果C2,C3,C4,C5一一對應。
貼一個ResNet的結構圖:這裡作者採用Conv2,CONV3,CONV4和CONV5的輸出。因此類似Conv2就可以看做一個stage。
作者一方面將FPN放在RPN網路中用於生成proposal,原來的RPN網路是以主網路的某個卷積層輸出的feature map作為輸入,簡單講就是隻用這一個尺度的feature map。但是現在要將FPN嵌在RPN網路中,生成不同尺度特徵並融合作為RPN網路的輸入。在每一個scale層,都定義了不同大小的anchor,對於P2,P3,P4,P5,P6這些層,定義anchor的大小為32^2,64^2,128^2,256^2,512^2,另外每個scale層都有3個長寬對比度:1:2,1:1,2:1。所以整個特徵金字塔有15種anchor。
正負樣本的界定和Faster RCNN差不多:如果某個anchor和一個給定的ground truth有最高的IOU或者和任意一個Ground truth的IOU都大於0.7,則是正樣本。如果一個anchor和任意一個ground truth的IOU都小於0.3,則為負樣本。
看看加入FPN的RPN網路的有效性,如下表Table1。網路這些結果都是基於ResNet-50。評價標準採用AR,AR表示Average Recall,AR右上角的100表示每張影象有100個anchor,AR的右下角s,m,l表示COCO資料集中object的大小分別是小,中,大。feature列的大括號{}表示每層獨立預測。
從(a)(b)(c)的對比可以看出FRN的作用確實很明顯。另外(a)和(b)的對比可以看出高層特徵並非比低一層的特徵有效。
(d)表示只有橫向連線,而沒有自頂向下的過程,也就是僅僅對自底向上(bottom-up)的每一層結果做一個1*1的橫向連線和3*3的卷積得到最終的結果,有點像Fig1的(b)。從feature列可以看出預測還是分層獨立的。作者推測(d)的結果並不好的原因在於在自底向上的不同層之間的semantic gaps比較大。
(e)表示有自頂向下的過程,但是沒有橫向連線,即向下過程沒有融合原來的特徵。這樣效果也不好的原因在於目標的location特徵在經過多次降取樣和上取樣過程後變得更加不準確。
(f)採用finest level層做預測(參考Fig2的上面那個結構),即經過多次特徵上取樣和融合到最後一步生成的特徵用於預測,主要是證明金字塔分層獨立預測的表達能力。顯然finest level的效果不如FPN好,原因在於PRN網路是一個視窗大小固定的滑動視窗檢測器,因此在金字塔的不同層滑動可以增加其對尺度變化的魯棒性。另外(f)有更多的anchor,說明增加anchor的數量並不能有效提高準確率。
另一方面將FPN用於Fast R-CNN的檢測部分。除了(a)以外,分類層和卷積層之前添加了2個1024維的全連線層。細節地方可以等程式碼出來後再研究。
實驗結果如下表Table2,這裡是測試Fast R-CNN的檢測效果,所以proposal是固定的(採用Table1(c)的做法)。與Table1的比較類似,(a)(b)(c)的對比證明在基於區域的目標卷積問題中,特徵金字塔比單尺度特徵更有效。(c)(f)的差距很小,作者認為原因是ROI pooling對於region的尺度並不敏感。因此並不能一概認為(f)這種特徵融合的方式不好,博主個人認為要針對具體問題來看待,像上面在RPN網路中,可能(f)這種方式不大好,但是在Fast RCNN中就沒那麼明顯。
同理,將FPN用於Faster RCNN的實驗結果如下表Table3。
下表Table4是和近幾年在COCO比賽上排名靠前的演算法的對比。注意到本文演算法在小物體檢測上的提升是比較明顯的。
另外作者強調這些實驗並沒有採用其他的提升方法(比如增加資料集,迭代迴歸,hard negative mining),因此能達到這樣的結果實屬不易。
總結
作者提出的FPN(Feature Pyramid Network)演算法同時利用低層特徵高解析度和高層特徵的高語義資訊,通過融合這些不同層的特徵達到預測的效果。並且預測是在每個融合後的特徵層上單獨進行的,這和常規的特徵融合方式不同。
期待程式碼