Feature Pyramid Networks for Object Detection 论文笔记
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Jesse_Mx/article/details/54588085
論文地址:Feature Pyramid Networks for Object Detection
前言
這篇論文主要使用特征金字塔網絡來融合多層特征,改進了CNN特征提取。論文在Fast/Faster R-CNN上進行了實驗,在COCO數據集上刷到了第一的位置,意味著其在小目標檢測上取得了很大的進步。論文整體思想比較簡單,但是實驗部分非常詳細和充分。此博文對主要內容進行了翻譯和理解工作,不足之處,歡迎討論。
摘要
特征金字塔是多尺度目標檢測系統中的一個基本組成部分。近年來深度學習目標檢測卻有意回避這一技巧,部分原因是特征金字塔在計算量和用時上很敏感(一句話,太慢)。這篇文章,作者利用了深度卷積神經網絡固有的多尺度、多層級的金字塔結構去構建特征金字塔網絡。使用一種自上而下的側邊連接,在所有尺度構建了高級語義特征圖,這種結構就叫特征金字塔網絡(FPN)。其在特征提取上改進明顯,把FPN用在Faster R-CNN上,在COCO數據集上,一舉超過了目前所有的單模型(single-model)檢測方法,而且在GPU上可以跑到5幀。代碼暫未開源。
概述
多尺度目標檢測是計算機視覺領域的一個基礎且具挑戰性的課題。在圖像金字塔基礎上構建的特征金字塔(featurized image pyramids ,Figure1[a])是傳統解決思路,具有一定意義的尺度不變性。直觀上看,這種特性使得模型可以檢測大范圍尺度的圖像。
Featurized image pyramids 主要在人工特征中使用,比如DPM就要用到它產生密集尺度的樣本以提升檢測水平。目前人工特征式微,深度學習的CNN特征成為主流,CNN特征的魯棒性很好,刻畫能力強。即使如此,仍需要金字塔結構去進一步提升準確性,尤其在多尺度檢測上。金字塔結構的優勢是其產生的特征每一層都是語義信息加強的,包括高分辨率的低層。
對圖像金字塔每一層都處理有很大的局限性,首先運算耗時會增加4倍,訓練深度網絡的時候太吃顯存,幾乎沒法用,即使用了,也只能在檢測的時候。因為這些原因,Fast/Faster R-CNN 都沒使用featurized image pyramids 。
當然,圖像金字塔并不是多尺度特征表征的唯一方式,CNN計算的時候本身就存在多級特征圖(feature map hierarchy),且不同層的特征圖尺度就不同,形似金字塔結構(Figure1[b])。結構上雖不錯,但是前后層之間由于不同深度(depths)影響,語義信息差距太大,主要是高分辨率的低層特征很難有代表性的檢測能力。
SSD方法在借鑒利用featurized image pyramid上很是值得說,為了避免利用太低層的特征,SSD從偏后的conv4_3開始,又往后加了幾層,分別抽取每層特征,進行綜合利用(Figure1[c])。但是SSD對于高分辨率的底層特征沒有再利用,而這些層對于檢測小目標很重要。
這篇論文的特征金字塔網絡(Figure1[d])做法很簡單,如下圖所示。把低分辨率、高語義信息的高層特征和高分辨率、低語義信息的低層特征進行自上而下的側邊連接,使得所有尺度下的特征都有豐富的語義信息。這種結構是在CNN網絡中完成的,和前文提到的基于圖片的金字塔結構不同,而且完全可以替代它。
本文特征金字塔網絡自上而下的結構,和某些論文有一定的相似之處,但二者目的不盡不同。作者做了檢測和分割實驗,COCO數據集的結果超過了現有水平,具體結果參見論文中實驗部分。值得說的是,本文方法在訓練的時間和顯存使用上都是可接受的,檢測的時間也沒增加。
上圖簡要說下:(作者的創新之處就在于既使用了特征金字塔,又搞了分層預測)
(a) 用圖片金字塔生成特征金字塔
(b) 只在特征最上層預測
(c) 特征層分層預測
(d) FPN從高層攜帶信息傳給底層,再分層預測
特征金字塔網絡
論文的目標是利用CNN的金字塔層次結構特性(具有從低到高級的語義),構建具有高級語義的特征金字塔。得到的特征金字塔網絡(FPN)是通用的,但在論文中,作者先在RPN網絡和Fast R-CNN中使用這一成果,也將其用在instance segmentation proposals 中。
該方法將任意一張圖片作為輸入,以全卷積的方式在多個層級輸出成比例大小的特征圖,這是獨立于CNN骨干架構(本文為ResNets)的。具體結構如圖Figure 2。
自下而上的路徑
CNN的前饋計算就是自下而上的路徑,特征圖經過卷積核計算,通常是越變越小的,也有一些特征層的輸出和原來大小一樣,稱為“相同網絡階段”(same network stage )。對于本文的特征金字塔,作者為每個階段定義一個金字塔級別, 然后選擇每個階段的最后一層的輸出作為特征圖的參考集。 這種選擇是很自然的,因為每個階段的最深層應該具有最強的特征。具體來說,對于ResNets,作者使用了每個階段的最后一個殘差結構的特征激活輸出。將這些殘差模塊輸出表示為{C2, C3, C4, C5},對應于conv2,conv3,conv4和conv5的輸出,并且注意它們相對于輸入圖像具有{4, 8, 16, 32}像素的步長。考慮到內存占用,沒有將conv1包含在金字塔中。
自上而下的路徑和橫向連接
自上而下的路徑(the top-down pathway )是如何去結合低層高分辨率的特征呢?方法就是,把更抽象,語義更強的高層特征圖進行上取樣,然后把該特征橫向連接(lateral connections )至前一層特征,因此高層特征得到加強。值得注意的是,橫向連接的兩層特征在空間尺寸上要相同。這樣做應該主要是為了利用底層的定位細節信息。
Figure 3顯示連接細節。把高層特征做2倍上采樣(最鄰近上采樣法),然后將其和對應的前一層特征結合(前一層要經過1 * 1的卷積核才能用,目的是改變channels,應該是要和后一層的channels相同),結合方式就是做像素間的加法。重復迭代該過程,直至生成最精細的特征圖。迭代開始階段,作者在C5層后面加了一個1 * 1的卷積核來產生最粗略的特征圖,最后,作者用3 * 3的卷積核去處理已經融合的特征圖(為了消除上采樣的混疊效應),以生成最后需要的特征圖。{C2, C3, C4, C5}層對應的融合特征層為{P2, P3, P4, P5},對應的層空間尺寸是相通的。
金字塔結構中所有層級共享分類層(回歸層),就像featurized image pyramid 中所做的那樣。作者固定所有特征圖中的維度(通道數,表示為d)。作者在本文中設置d = 256,因此所有額外的卷積層(比如P2)具有256通道輸出。 這些額外層沒有用非線性(博主:不知道具體所指),而非線性會帶來一些影響。
實際應用
本文方法在理論上早CNN中是通用的,作者將其首先應用到了RPN和Fast R-CNN中,應用中盡量做較小幅度的修改。
Faster R-CNN+Resnet-101
要想明白FPN如何應用在RPN和Fast R-CNN(合起來就是Faster R-CNN),首先要明白Faster R-CNN+Resnet-101的結構,這部分在是論文中沒有的,博主試著用自己的理解說一下。
直接理解就是把Faster-RCNN中原有的VGG網絡換成ResNet-101,ResNet-101結構如下圖:
Faster-RCNN利用conv1到conv4-x的91層為共享卷積層,然后從conv4-x的輸出開始分叉,一路經過RPN網絡進行區域選擇,另一路直接連一個ROI Pooling層,把RPN的結果輸入ROI Pooling層,映射成7 * 7的特征。然后所有輸出經過conv5-x的計算,這里conv5-x起到原來全連接層(fc)的作用。最后再經分類器和邊框回歸得到最終結果。整體框架用下圖表示:
RPN中的特征金字塔網絡
RPN是Faster R-CNN中用于區域選擇的子網絡,具體原理就不詳細解釋了,可閱讀論文和參考博客:faster-rcnn 之 RPN網絡的結構解析 。
RPN是在一個13 * 13 * 256的特征圖上應用9種不同尺度的anchor,本篇論文另辟蹊徑,把特征圖弄成多尺度的,然后固定每種特征圖對應的anchor尺寸,很有意思。也就是說,作者在每一個金字塔層級應用了單尺度的anchor,{P2, P3, P4, P5, P6}分別對應的anchor尺度為{32^2, 64^2, 128^2, 256^2, 512^2 },當然目標不可能都是正方形,本文仍然使用三種比例{1:2, 1:1, 2:1},所以金字塔結構中共有15種anchors。這里,博主嘗試畫一下修改后的RPN結構(沒有完整畫出來,大概就是這樣):
訓練中,把重疊率(IoU)高于0.7的作為正樣本,低于0.3的作為負樣本。特征金字塔網絡之間有參數共享,其優秀表現使得所有層級具有相似程度的語義信息。具體性能在實驗中評估。
Fast R-CNN 中的特征金字塔網絡
Fast R-CNN的具體原理也不詳解了,參考博客:Fast R-CNN論文詳解 ,其中很重要的是ROI Pooling層,需要對不同層級的金字塔制定不同尺度的ROI。
此部分的理解不太肯定,請各位辯證看待。博主認為,這里要把視角轉換一下,想象成有一種圖片金字塔在起作用。我們知道,ROI Pooling層使用region proposal的結果和中間的某一特征圖作為輸入,得到的結果經過分解后分別用于分類結果和邊框回歸。
然后作者想的是,不同尺度的ROI,使用不同特征層作為ROI pooling層的輸入,大尺度ROI就用后面一些的金字塔層,比如P5;小尺度ROI就用前面一點的特征層,比如P4。那怎么判斷ROI改用那個層的輸出呢?這里作者定義了一個系數Pk,其定義為:
224是ImageNet的標準輸入,k0是基準值,設置為5,代表P5層的輸出(原圖大小就用P5層),w和h是ROI區域的長和寬,假設ROI是112 * 112的大小,那么k = k0-1 = 5-1 = 4,意味著該ROI應該使用P4的特征層。k值應該會做取整處理,防止結果不是整數。
然后,因為作者把conv5也作為了金字塔結構的一部分,那么從前全連接層的那個作用怎么辦呢?這里采取的方法是增加兩個1024維的輕量級全連接層,然后再跟上分類器和邊框回歸。作者認為這樣還能使速度更快一些。
目標檢測實驗
這個篇幅過長,不好搬上博客,只能大家自己去看了。實驗部分也沒有什么特別難懂的地方,該說的前面基本都講了一下。
--------------------- 作者:Jesse_Mx 來源:CSDN 原文:https://blog.csdn.net/Jesse_Mx/article/details/54588085?utm_source=copy 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的Feature Pyramid Networks for Object Detection 论文笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python图像处理专业博客
- 下一篇: Feature Pyramid Netw