文章目錄:web
1 概述面試
2 FPN結構概述算法
3 最簡單的FPN結構小程序
4 無FPN的多stage結構微信小程序
5 簡單雙向融合微信
6 BiFPN網絡
7 Recursive-FPN循環特徵金字塔網絡數據結構
很久沒有寫文章了(對不起我在划水),最近在看北京的租房(真真貴呀)。app
預告一下,最近無事,根據我的多年的證券操做策略和本身的淺顯的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、Yolov三、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的論文了。
-
論文名稱:Path Aggregation Network for Instance Segmentation
從圖中能夠看到,先有一個跟FPN相同的上採樣過程,而後再從淺到深用stride爲2的卷積完成下采樣。用stride爲2的卷積層把淺層的特徵圖P3下采樣,而後尺寸和C4相同,二者拼接以後再用3x3的卷積層進行整理,生成P4特徵圖
此外還有不少複雜的雙向融合的操做,這裏不仔細介紹啦。
6 BiFPN
上面的PAnet是最簡單的雙向FPN,可是真正起名爲BiFPN的是另一個論文。
-
BiFPN:2019年google團隊提出的。
-
論文名稱:EfficientDet: Scalable and Efficient Object Detection 結構不難理解,其實就是在PAnet的結構上,作了一些小改進。可是這個論文的主要貢獻仍是EfficientDet的提出,因此BiFPN只是算是一個小貢獻。
7 Recursive-FPN循環特徵金字塔網絡
-
Recursive-FPN:效果之好使人驚訝,使用遞歸FPN的DetectoRS算是目標檢測任務的SOTA了吧。(2020年的論文) -
-
論文名稱: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層,把通道數恢復到要求的值就能夠用了。
擴展之Tensorflow2.0 | 22 Keras的API詳解(下)池化、Normalization層
擴展之Tensorflow2.0 | 21 Keras的API詳解(上)卷積、激活、初始化、正則
擴展之Tensorflow2.0 | 20 TF2的eager模式與求導
擴展之Tensorflow2.0 | 19 TF2模型的存儲與載入
擴展之Tensorflow2.0 | 18 TF2構建自定義模型
擴展之Tensorflow2.0 | 17 TFrec文件的建立與讀取
擴展之Tensorflow2.0 | 16 TF2讀取圖片的方法
擴展之Tensorflow2.0 | 15 TF2實現一個簡單的服裝分類任務
小白學PyTorch | 14 tensorboardX可視化教程
小白學PyTorch | 13 EfficientNet詳解及PyTorch實現
小白學PyTorch | 12 SENet詳解及PyTorch實現
小白學PyTorch | 11 MobileNet詳解及PyTorch實現
小白學PyTorch | 9 tensor數據結構與存儲結構
小白學PyTorch | 7 最新版本torchvision.transforms經常使用API翻譯與講解
小白學PyTorch | 6 模型的構建訪問遍歷存儲(附代碼)
小白學PyTorch | 5 torchvision預訓練模型與數據集全覽
小白學PyTorch | 3 淺談Dataset和Dataloader
小白學目標檢測 | RCNN, SPPNet, Fast, Faster
小白學圖像 | BatchNormalization詳解與比較
小白學圖像 | Group Normalization詳解+PyTorch代碼
<<小白學機器學習>>
小白學SVM | SVM優化推導 + 拉格朗日 + hingeLoss
小白學LGB | LightGBM = GOSS + histogram + EFB
機器學習不得不知道的提高技巧:SWA與pseudo-label
<<小白麪經>>
秋招總結 | 一個非Top學校的跨專業的算法應屆研究生的幾十場面試
<<小白健身>>
【小白健身】背闊大做戰(上)
本文分享自微信公衆號 - 機器學習煉丹術(liandanshu)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。