1. 程式人生 > >常見特徵金字塔網路FPN及變體

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

- 好久沒有寫文章了(對不起我在划水),最近在看北京的租房(真真貴呀)。 - 預告一下,最近無事,根據個人多年的證券操作策略和自己的淺顯的AI時間序列的演算法知識,還有自己Javascript的現學現賣,在微信小程式上弄了個簡單的輔助系統。我先試試效果如何,不錯的話將來弄個文章給大家介紹介紹。 感興趣可以聯絡煉丹兄哦,WX:cyx645016617。 ## 1 概述 FPN是Feature Parymid Network的縮寫。 目標檢測任務中,像是在YOLO1中那種,對一個圖片使用卷積來提取特徵,經過了多個池化層或者stride為2的卷積層之後,輸出了一個小尺度的特徵圖。然後再這個特徵圖中來做**目標檢測**。 換句話說,最後得到的目標檢測的結果,完全是依賴於這一個特徵圖,這種方法叫做**單stage物體檢測演算法**。 可想而知,這種方法很難有效的識別出不同大小的目標,所以產生了**多stage檢測演算法**,其實就是要用到了特徵金字塔FPN。 簡單的說就是:**一個圖片同樣是經過卷積網路來提取特徵,本來是經過多個池化層輸出一個特徵圖,現在是經過多個池化層,每經過一個池化層都會輸出一個特徵圖,這樣其實就提取出了多個尺度不同的特徵圖。** **然後尺度不同的特徵圖,丟進特徵金字塔網路FPN,做目標檢測。** (如果還不明白,繼續往下看就明白啦~) ## 2 FPN接面構概述 ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/756957fb0b8849e4baf88af0eb627a68~tplv-k3u1fbpfcp-watermark.image) 從圖中可以看到: - 左邊的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接面構如下圖所示** : ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9bd64b2d913742af88744b5ea72ad24f~tplv-k3u1fbpfcp-watermark.image) 這個結構的精髓就是:**C5的特徵圖,經過上取樣,然後和C4的特徵圖拼接,然後把拼接之後的特徵圖經過卷積層和BN層,輸出得到P4特徵圖。其中P4和C4的特徵圖的shape相同。** 經過這樣的結構,所以P4可以學到來自C5更深層的語義,然後P3可以學到來自C4更深層的語義。**個人對此結構有效的解釋**,因為對於預測精度來說,肯定是越深層的特徵提取的越好,所以預測的越準確,但是深層的特徵圖尺度較小,通過上取樣和淺層的特徵圖融合,可以強化淺層特徵圖的特徵表述。 ## 4 無FPN的多stage結構 這是一個沒有用FPN接面構的結構圖。無融合,又利用多尺度特徵的典型代表就是2016年日出的鼎鼎有名的SSD,它直接利用不同stage的特徵圖分別負責不同scale大小物體的檢測。 ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5027f0838d384dcb8591b33790b5954f~tplv-k3u1fbpfcp-watermark.image) 可以看到,卷積網路輸出的特徵圖直接就放進了特徵頭輸出候選框。 ## 5 簡單雙向融合 原來的FPN是自深到淺單向的融合,現在是**先自深到淺、再從淺到深雙向的**的融合。PANet是第一個提出從下向上二次融合的模型: - PAnet: Path Aggregation Network.2018年的CVPR的論文了。 - 論文地址:https://arxiv.org/abs/1803.01534 - 論文名稱:Path Aggregation Network for Instance Segmentation ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/371ef864af91497d94a4f010978055ad~tplv-k3u1fbpfcp-watermark.image) 從圖中可以看到,先有一個跟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 ![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b427b133f2204fe7b76ed0e62ecf3789~tplv-k3u1fbpfcp-watermark.image) 結構不難理解,其實就是在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個點的提升。** 下面來看結構圖: ![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/66930de73988432a9dcfa880c21028bc~tplv-k3u1fbpfcp-watermark.image) 可以看到,這個有一個虛線和實線構成了一個特徵圖和FPN網路之間的一個迴圈。下面展示一個2-step的RFP結構,也就是迴圈兩次的FPN接面構。(如果是1-step,那就是一般的FPN接面構) ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/79a81a26f66f4c55ad076af4e3c91015~tplv-k3u1fbpfcp-watermark.image) 可以看到,就是把之前的FPN接面構中的P3,P4,P5這些,再拼接到卷積網路的對應的特徵提取過程。拼接之後使用一個3x3卷積層和BN層,把通道數恢復到要求的值就可以