點擊上方「計算機視覺cv」便可「進入公衆號」
git
重磅乾貨第一時間送達github
-
論文題目:FeaturePyramidNetworksforObjectDetection -
論文連接:https://arxiv.org/abs/1612.03144

所要解決的問題
針對小目標檢測網絡,CV領域通常用的是特徵金字塔。即將原圖以不一樣的比例採樣,而後獲得不一樣分辨率的圖像進行訓練和測試,在多數狀況下是有效的。可是特徵金字塔的計算、內存和時間開銷都很是大,致使在工程中應用是及其困難。FPN(即特徵金字塔)提出了一個獨特的特徵金字塔網絡來避免圖像金字塔產生的超高計算量,同時能夠較好的處理目標檢測中的尺度變化問題,對於小目標檢測具備很強的魯棒性。web
簡介
下圖表示FPN的總體結構:微信
圖a 多尺度金字塔 這是一個特徵圖像金字塔,整個過程是先對原始圖像構造圖像金字塔,而後在圖像金字塔的每一層提出不一樣的特徵,而後進行相應的預測。這種方法的缺點是計算量大,須要大量的內存;優勢是能夠得到較好的檢測精度。網絡
圖b 淺層的網絡更關注於細節和位置信息,高層的網絡更關注於語義信息,而高層的語義信息可以幫助咱們準確的檢測出目標,所以咱們能夠利用最後一個卷積層上的feature map來進行預測。app
圖c 同時利用低層特徵和高層特徵,分別在不一樣的層同時進行預測,這是由於個人一幅圖像中可能具備多個不一樣大小的目標,區分不一樣的目標可能須要不一樣的特徵,對於簡單的目標咱們僅僅須要淺層的特徵就能夠檢測到它,對於複雜的目標咱們就須要利用複雜的特徵來檢測它。整個過程就是首先在原始圖像上面進行深度卷積,而後分別在不一樣的特徵層上面進行預測。編輯器
圖d(FPN網絡) 首先咱們在輸入的圖像上進行深度卷積,而後對Layer2上面的特徵進行降維操做(即添加一層1x1的卷積層),對Layer4上面的特徵就行上採樣操做,使得它們具備相應的尺寸,而後對處理後的Layer2和處理後的Layer4執行加法操做(對應元素相加),將得到的結果輸入到Layer5中去。其背後的思路是爲了得到一個強語義信息,這樣能夠提升檢測性能。其實看下面的代碼就能夠明白,把卷積以後的{Ck}層和上採樣以後的{Pk}層進行相加,目的是把低層次高分辨率的信息和高層次強語義的信息結合起來,提升檢測性能和小目標識別。ide
FPN結構

自底向上
這是神經網絡的前向計算,就是由卷積和池化層組成的特徵提取網絡。在這個自底向上的結構中,一個stage對應特徵金字塔的一個level。對於以ResNet爲backbone的主幹網絡,選取conv二、conv三、conv四、conv5層的最後一個殘差block層特徵做爲FPN的特徵,記爲{C二、C三、C四、C5},也便是FPN網絡的4個級別。這幾個特徵層相對於原圖的步長分別爲四、八、1六、32。性能
自上向下和側向鏈接
自上向下是前向計算後將輸出的特徵圖放大的過程,咱們通常採用upsample(上採樣)來實現。FPN的巧妙之處就在於從高層特徵上採樣不只能夠利用頂層的高語義、低分辨率信息(有助於分類),並且利用淺層的、低語義、高分辨率信息(有助於定位)。爲了將上述二者相結合,論文提出了相似於殘差結構的側向鏈接。向鏈接將上一層通過上採樣後和當前層分辨率一致的特徵,經過相加的方法(如:pytorch的torch.cat或torch.add)進行融合。同時爲了保持全部級別的特徵層通道數都保持一致,這裏使用1*1卷積來實現。學習
ResNet+FPN網絡結構及代碼實現

# Build the shared convolutional layers.# Bottom-up Layers# Returns a list of the last layers of each stage, 5 in total.# 扔掉了C1_, C2, C3, C4, C5 = resnet_graph(input_image, "resnet101", stage5=True)# Top-down Layers# TODO: add assert to varify feature map sizes match what's in configP5 = KL.Conv2D(256, (1, 1), name='fpn_c5p5')(C5)P4 = KL.Add(name="fpn_p4add")([ KL.UpSampling2D(size=(2, 2), name="fpn_p5upsampled")(P5), KL.Conv2D(256, (1, 1), name='fpn_c4p4')(C4)])P3 = KL.Add(name="fpn_p3add")([ KL.UpSampling2D(size=(2, 2), name="fpn_p4upsampled")(P4), KL.Conv2D(256, (1, 1), name='fpn_c3p3')(C3)])P2 = KL.Add(name="fpn_p2add")([ KL.UpSampling2D(size=(2, 2), name="fpn_p3upsampled")(P3), KL.Conv2D(256, (1, 1), name='fpn_c2p2')(C2)])# 把每一個{Pk}層都乘以一個3*3的卷積生成特徵圖.P2 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p2")(P2)P3 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p3")(P3)P4 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p4")(P4)P5 = KL.Conv2D(256, (3, 3), padding="SAME", name="fpn_p5")(P5)# P6 is used for the 5th anchor scale in RPN. Generated by# subsampling from P5 with stride of 2.P6 = KL.MaxPooling2D(pool_size=(1, 1), strides=2, name="fpn_p6")(P5)# Note that P6 is used in RPN, but not in the classifier heads.rpn_feature_maps = [P2, P3, P4, P5, P6]mrcnn_feature_maps = [P2, P3, P4, P5]
實驗
FPN對Fast RCNN的影響
使用和實驗1相同的規則對Fast RCNN作了實驗,結果以下表所示。

FPN對Segment Proposal的影響

結論
本文提出了一種簡單、有效的創建特徵金字塔的方式。它的使用對RPN方法和Fast/Faster RCNN方法都有極大的性能提高。另外,它的訓練和測試時間和普通的Faster RCNN方法相差很小。所以,它能夠做爲圖像特徵金字塔的一種較好的替代。
論文開源代碼
https://github.com/unsky/FPN

AI研究學術交流羣已成立啦!
掃碼可添加博主微信,微信羣有國際頂級Top期刊做者、高等學府博士生、碩士生等多位學者,本羣致力於純學術探討,方向不限(一個好的學者一定是交叉學科下的產物)。想要進羣一塊兒學習探討的童鞋能夠加博主微信,備註學術交流、你也能夠選擇技術交流。
▲掃碼加羣
本文分享自微信公衆號 - 計算機視覺CV(jsjsjcv)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。