常見特徵金字塔網路FPN及變體

忽逢桃林發表於2020-11-09
  • 好久沒有寫文章了(對不起我在划水),最近在看北京的租房(真真貴呀)。
  • 預告一下,最近無事,根據個人多年的證券操作策略和自己的淺顯的AI時間序列的演算法知識,還有自己Javascript的現學現賣,在微信小程式上弄了個簡單的輔助系統。我先試試效果如何,不錯的話將來弄個文章給大家介紹介紹。

感興趣可以聯絡煉丹兄哦,WX:cyx645016617。

1 概述

FPN是Feature Parymid Network的縮寫。

目標檢測任務中,像是在YOLO1中那種,對一個圖片使用卷積來提取特徵,經過了多個池化層或者stride為2的卷積層之後,輸出了一個小尺度的特徵圖。然後再這個特徵圖中來做目標檢測

換句話說,最後得到的目標檢測的結果,完全是依賴於這一個特徵圖,這種方法叫做單stage物體檢測演算法

可想而知,這種方法很難有效的識別出不同大小的目標,所以產生了多stage檢測演算法,其實就是要用到了特徵金字塔FPN。

簡單的說就是:一個圖片同樣是經過卷積網路來提取特徵,本來是經過多個池化層輸出一個特徵圖,現在是經過多個池化層,每經過一個池化層都會輸出一個特徵圖,這樣其實就提取出了多個尺度不同的特徵圖。

然後尺度不同的特徵圖,丟進特徵金字塔網路FPN,做目標檢測。

(如果還不明白,繼續往下看就明白啦~)

2 FPN接面構概述

從圖中可以看到:

  • 左邊的c1啊,c2啊表示不同尺度的特徵圖。原始的影像input的尺寸經過一個池化層或者stride為2的卷積層之後,尺寸減少一半,這樣就變成了C1特徵圖;如果又經過一個池化層,那麼就變成C2特徵圖。
  • C3,C4,C5,C6,C7這個四個尺度不同的特徵圖,進入FPN特徵金字塔網路進行特徵融合,然後再用檢測頭預測候選框。
  • 這裡說一些個人的理解(如果有錯誤,請指正呀): 這裡剛好區分一下多stage檢測演算法和特徵金字塔網路的區別。
    • 多stage檢測演算法:從上圖中我們可以看到P3,P4,P5,P6,P7這五個不同尺度的特徵圖進入一個檢測頭預測候選框,這個檢測頭其實就是一個人檢測演算法,不過這個神經網路的輸入是多個不同尺度的特徵圖,輸出則是候選框,所以這個多sgtage檢測演算法;
    • 特徵金字塔網路:這個其實是讓不同尺度的特徵圖之間互相融合,來增強特徵圖表徵能力的一種手段。這個過程不是預測候選框,應該算進特徵提取的過程。FPN神經網路的輸入也是多個不同尺度的特徵圖,輸出也是多個不同尺度的特徵圖,和輸入的特徵圖是相同的。

所以呢,一個多stage檢測演算法其實是可以沒有FPN接面構,直接用卷積網路輸出的C3,C4,C5,C6,C7放進檢測頭輸出候選框的。

3 最簡單的FPN接面構

自上而下單向融合的FPN,事實上仍然是當前物體檢測模型的主流融合模式。如我們常見的Faster RCNN、Mask RCNN、Yolov3、RetinaNet、Cascade RCNN等,自上而下的單向的FPN接面構如下圖所示

這個結構的精髓就是:C5的特徵圖,經過上取樣,然後和C4的特徵圖拼接,然後把拼接之後的特徵圖經過卷積層和BN層,輸出得到P4特徵圖。其中P4和C4的特徵圖的shape相同。

經過這樣的結構,所以P4可以學到來自C5更深層的語義,然後P3可以學到來自C4更深層的語義。個人對此結構有效的解釋,因為對於預測精度來說,肯定是越深層的特徵提取的越好,所以預測的越準確,但是深層的特徵圖尺度較小,通過上取樣和淺層的特徵圖融合,可以強化淺層特徵圖的特徵表述。

4 無FPN的多stage結構

這是一個沒有用FPN接面構的結構圖。無融合,又利用多尺度特徵的典型代表就是2016年日出的鼎鼎有名的SSD,它直接利用不同stage的特徵圖分別負責不同scale大小物體的檢測。

可以看到,卷積網路輸出的特徵圖直接就放進了特徵頭輸出候選框。

5 簡單雙向融合

原來的FPN是自深到淺單向的融合,現在是先自深到淺、再從淺到深雙向的的融合。PANet是第一個提出從下向上二次融合的模型:

  • PAnet: Path Aggregation Network.2018年的CVPR的論文了。
  • 論文地址:https://arxiv.org/abs/1803.01534
  • 論文名稱:Path Aggregation Network for Instance Segmentation

從圖中可以看到,先有一個跟FPN相同的上取樣過程,然後再從淺到深用stride為2的卷積完成下采樣。用stride為2的卷積層把淺層的特徵圖P3下采樣,然後尺寸和C4相同,兩者拼接之後再用3x3的卷積層進行整理,生成P4特徵圖

此外還有很多複雜的雙向融合的操作,這裡不仔細介紹啦。

6 BiFPN

上面的PAnet是最簡單的雙向FPN,但是真正起名為BiFPN的是另外一個論文。

  • BiFPN:2019年google團隊提出的。
  • 論文地址:https://arxiv.org/abs/1911.09070
  • 論文名稱:EfficientDet: Scalable and Efficient Object Detection

    結構不難理解,其實就是在PAnet的結構上,做了一些小改進。但是這個論文的主要貢獻還是EfficientDet的提出,所以BiFPN只是算是一個小貢獻。

7 Recursive-FPN迴圈特徵金字塔網路

  • Recursive-FPN:效果之好令人驚訝,使用遞迴FPN的DetectoRS算是目標檢測任務的SOTA了吧。(2020年的論文)
  • 論文連結:https://arxiv.org/abs/2006.02334
  • 論文名稱:DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution

個人在自身的目標檢測任務中,也使用了RFN結構,雖然要求的算力提升了一倍,但是效果確實提升的比較明顯,大概有3到5個點的提升。 下面來看結構圖:

可以看到,這個有一個虛線和實線構成了一個特徵圖和FPN網路之間的一個迴圈。下面展示一個2-step的RFP結構,也就是迴圈兩次的FPN接面構。(如果是1-step,那就是一般的FPN接面構)

可以看到,就是把之前的FPN接面構中的P3,P4,P5這些,再拼接到卷積網路的對應的特徵提取過程。拼接之後使用一個3x3卷積層和BN層,把通道數恢復到要求的值就可以用了。

相關文章