【CV論文筆記】Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

本文主要用于介紹rbg大神于2015年提出的Faster R-CNN網(wǎng)絡,該網(wǎng)絡架構(gòu)是在其前作Fast R-CNN上的升級改進版。本筆記主要為方便初學者快速入門,以及自我回顧。

論文鏈接:https://arxiv.org/pdf/1506.01497.pdf
github主頁:https://github.com/rbgirshick/py-faster-rcnn
rbg大神個人主頁:http://www.rossgirshick.info/#girshick2014rcnn

為更好的理解該論文,建議先行閱讀R-CNN,SPPNet,F(xiàn)ast R-CNN網(wǎng)絡的相關論文,這里也附上本菇之前寫的4篇論文筆記供大家參考~
R-CNN理解
SPPNet網(wǎng)絡理解
Fast R-CNN理解
全卷積網(wǎng)絡理解

基本目錄如下:

  1. 摘要
  2. 核心思想
  3. 總結(jié)

------------------第一菇 - 摘要------------------

1.1 論文摘要

現(xiàn)今流行的目標檢測網(wǎng)絡都依賴于“區(qū)域建議(region proposal)”算法來提前假設潛在的目標區(qū)域。像最新的SPPNet網(wǎng)絡,F(xiàn)ast R-CNN網(wǎng)絡都已經(jīng)在檢測網(wǎng)絡上節(jié)省了大量的時間,唯一效率上的瓶頸就在于第一步,候選框的提出。因此,在本論文中,我們提出了一種“區(qū)域建議網(wǎng)絡(Region Proposal Network,RPN)”,該網(wǎng)絡與檢測網(wǎng)絡共享卷積層參數(shù),因此使得新增的該網(wǎng)絡層的時間開銷幾乎為0。RPN的本質(zhì)就是同時計算每一個位置的目標邊界和目標分數(shù)的全卷積網(wǎng)絡,該網(wǎng)絡生成的候選區(qū)域框,將會輸入到后續(xù)的Fast R-CNN架構(gòu)用于目標檢測。本論文還同時,將RPN網(wǎng)絡和Fast R-CNN網(wǎng)絡合并進一個網(wǎng)絡中,因此能夠共享卷積層的參數(shù),且用于提取特征的網(wǎng)絡層用了最新流行的引入“注意力”機制的網(wǎng)絡。對于那種深度模型VGG16,我們新的架構(gòu)能夠達到單GPU,5fps目標檢測速度,并且還保證了準確率。在2015年的ILSVRC和COCO的目標檢測比賽中,第一名所用模型的架構(gòu)都有我們的影子。

------------------第二菇 - 核心思想------------------

2.1 Faster R-CNN的網(wǎng)絡架構(gòu)圖

Fast R-CNN的提出成功解決了目標檢測的時效性問題,并且已經(jīng)能接近達到實時的效果。但是,F(xiàn)ast R-CNN網(wǎng)絡運行的前提就是準備好一堆候選框,之前都是采用的傳統(tǒng)圖像算法,比如Selective Search。但是隨著后半部分問題的解決,前面生成候選框的時效性(主要還是想把整一套流程都放到GPU上來搞)也變的引人注目了。。。于是rbg大神們,也就索性放棄了傳統(tǒng)圖像算法,提出了一個新的RPN網(wǎng)絡來生成候選框,再把RPN網(wǎng)絡嵌入到Fast R-CNN中,也就是當紅炸子雞Faster R-CNN了,這里先直接上一張論文中的網(wǎng)絡架構(gòu)圖,方便大家對其有一個基本的認知,

Faster R-CNN網(wǎng)絡架構(gòu)圖.jpg

可以看到,紅色框的那部分(RPN)就是相比于Fast R-CNN新加的部分,因此只要理解了RPN網(wǎng)絡,再加上Fast R-CNN的基礎,那么對Faster R-CNN的整體把握就比較清晰了~所以,接下來我們就重點看一下RPN網(wǎng)絡的細節(jié)。

2.2 理解RPN網(wǎng)絡

首先明確RPN網(wǎng)絡的作用為:輸入任意大小的圖片,輸出一系列的方形目標候選框,每一個目標候選框都帶有objectness分數(shù)。該網(wǎng)絡其實是可以作為一個單獨的目標檢測網(wǎng)絡而存在的!只不過,作者將其嵌入進了Fast R-CNN架構(gòu)中,并將整個新的架構(gòu)命名為Faster R-CNN。

(注:這里必須強調(diào)一下,objectness想表達的意思是該候選目標框是否含有目標檢測物體(并不需要明確是哪一類),因此僅僅是一個二分類問題,含有目標或者是背景)

其次,必須明確Faster R-CNN架構(gòu)中的RPN網(wǎng)絡層為了共享卷積層參數(shù),會直接用前置卷積池化操作產(chǎn)生的特征圖(feature map)。有了特征圖以后,會在特征圖上的指定地方(由Anchors決定,不理解Anchors沒關系,后文會解釋,在這簡單理解為特征圖上的一個固定點)滑動一個小的神經(jīng)網(wǎng)絡(我姑且稱之為“候選生成網(wǎng)絡”,真的很小,就是由1個nn的卷積層再跟2個11卷積層的分支,分別對應分類和回歸),這個小神經(jīng)網(wǎng)絡的輸入就是一個Anchor生成的候選框,然后輸出每個候選框的分數(shù)和位置,如果有不清楚整體架構(gòu)的,直接看論文中原圖如下,應該也就能明白整體的架構(gòu)邏輯了~

RPN網(wǎng)絡架構(gòu)圖.jpg

(注:比較容易搞混的可能是“滑動一個小的神經(jīng)網(wǎng)絡”~傳統(tǒng)操作一般不都是滑動卷積核或池化核,其實操作的本質(zhì)類似,只不過這里滑動的是一個小的神經(jīng)網(wǎng)絡,從而達到輸出多個候選框的目的)

上圖應該來說是比較清晰了,接下來我們就再深入一些細節(jié),加深理解。

2.2.1 Anchors的理解

Anchors中文翻譯就是“錨點”,每一個錨點,我們都會生成大小各異的多個候選框,這里明確一個參數(shù)的意義,k,就表示每一個錨點生成的候選框的個數(shù)。

因此,上圖2k的意思就是,每一個框都會有2個分數(shù)(一個是:為目標的概率;另一個是:為背景的概率),總共有k個,那自然輸出是2k。同理,4k就是每一個框都由4個參數(shù)來定位,總共就是4k個。

論文中,作者采用的參數(shù)是9個,運行調(diào)用作者demo中的generate_anchors.py,可以得到9個矩形共有3種形狀(如下圖,來源【1】),長寬比大約控制在\{1:1, 2:1, 1:2\},每1個ratio對應3個scale,因此最終是9個,其本質(zhì)就是引入了檢測中常用的多尺度方法。

Anchor示意圖.jpg

作者也在文中強調(diào),該種多尺度的實現(xiàn)方法是整套的核心,

The design of multi- scale anchors is a key component for sharing features without extra cost for addressing scales.

那么在論文的參數(shù)設置下,最終的候選框個數(shù)是多少呢?假設原圖是800*600的,VGG下采樣16倍,每個錨點9個框,

ceil(800/16)*ceil(600/16)*9 = 17100

再從網(wǎng)上盜一張圖,加深理解,

Anchors示意圖2.jpg

這里再貼一張原圖上的錨點示意圖【3】,助于理解(因為下采樣了16倍,所以每個錨點在原圖上會有16個像素距離)

錨點示意圖3.jpg

這么多的候選框,自然是不可能全都送到后面的網(wǎng)絡中去的,訓練程序會在合適的anchors中隨機選擇128個positive anchors + 128個negative anchors進行訓練。因為大部分情況下都是背景居多(negative),如果positve少于128的話,那在當前批次里,就選取其他的negative補上。

2.2.2 損失函數(shù)

至此,大家對整一套RPN網(wǎng)絡應該有比較好的理解了,我們再上一張python版本中的VGG16模型中的faster_rcnn_test.pt的網(wǎng)絡結(jié)構(gòu)【1】,

faster_rcnn_test.py網(wǎng)絡結(jié)構(gòu)圖.jpg

上圖的表示相比于原論文,會更加清晰易懂,因此,損失函數(shù)也有2部分組成,其中一部分是分類,另一部分是回歸。整個網(wǎng)絡的損失函數(shù)可以表示為(其實與Fast R-CNN真的很像),

L(\{p_i\}, \{t_i\}) = \frac{1}{N_{cls}}\sum_{i}L_{cls}(p_i, p^*_i) + \frac{1}{N_{reg}}\sum_ip^*_iL_{reg}(t_i, t^*_i)

其中,
i表示在一個批中的anchor的下標
p_i為該錨點是目標的概率
p^*_i為1如果是positive,為0如果是negetive
t_i就是預測的4個用于定位的坐標點
t^*_i就是GT,當然也只有是positive才會計入損失

當然,實際的訓練中會發(fā)現(xiàn),N_{cls}N_{reg}值相差過大,通常會引入?yún)?shù)\lambda來平衡,是總的Loss能均勻考慮2種Loss。

(注:推薦學有余力的同學看該博文對于回歸問題的一個細節(jié)描述,看懂了以后,再來理解文中給出的公式就不難了,簡單講一句就是,回歸分支真正要學的參數(shù)不是具體的坐標值,而是對于每一個Anchor的平移量和變化尺度)

至此,整一套RPN網(wǎng)絡就已經(jīng)講清楚了,至于RoI在Fast R-CNN中已經(jīng)講的很清楚了,這里就不展開了。

2.2.3 訓練過程

接下來,還有一個難點,就是如果訓練整一套Faster R-CNN網(wǎng)絡。文中作者給出了幾種可能的訓練方法,

1)分開單獨訓練,即先訓練RPN網(wǎng)絡,再用RPN生成的候選區(qū)域來訓練Fast R-CNN,再用Fast R-CNN訓練微調(diào)完的網(wǎng)絡來訓練RPN,迭代往復,這也是本文作者在做實驗中用的訓練方法。

2)放在一起訓練。。。說實話,有點懵。。。主要是我也沒想明白這個梯度更新的過程。。。

(以下內(nèi)容來自【4】)
然而,作者在源碼中的訓練細節(jié)一共分了4步,
1)用ImageNet模型初始化,獨立訓練一個RPN網(wǎng)絡

2)仍然用ImageNet模型初始化,但是使用上一步RPN網(wǎng)絡產(chǎn)生的proposal作為輸入,訓練一個Fast-RCNN網(wǎng)絡,至此,兩個網(wǎng)絡每一層的參數(shù)完全不共享;

3)使用第二步的Fast-RCNN網(wǎng)絡參數(shù)初始化一個新的RPN網(wǎng)絡,但是把RPN、Fast-RCNN共享的那些卷積層的learning rate設置為0,也就是不更新,僅僅更新RPN特有的那些網(wǎng)絡層,重新訓練,此時,兩個網(wǎng)絡已經(jīng)共享了所有公共的卷積層;

4)仍然固定共享的那些網(wǎng)絡層,把Fast-RCNN特有的網(wǎng)絡層也加入進來,形成一個unified network,繼續(xù)訓練,fine tune Fast-RCNN特有的網(wǎng)絡層,此時,該網(wǎng)絡已經(jīng)實現(xiàn)我們設想的目標,即網(wǎng)絡內(nèi)部預測proposal并實現(xiàn)檢測的功能。

訓練過程.jpg

以上就是訓練的細節(jié)步驟。

至此,整一套Faster R-CNN算是講明白了,其余的實驗設置和結(jié)果這邊就不展開了,有興趣的同學自己看原文就行~

------------------第三菇 - 總結(jié)------------------

3.1 總結(jié)

到這里,整篇論文的核心思想已經(jīng)說清楚了。本論文主要是提出了一種新的RPN網(wǎng)絡用于生成候選區(qū)域框,并將其嵌入到Fast R-CNN中,將其命名為Faster R-CNN,進一步提高了目標檢測算法的時效性,并實驗證明其可行性,為后續(xù)發(fā)展奠定了基礎。

簡單總結(jié)一下本文就是先羅列了一下該論文的摘要,再具體介紹了一下本文作者的思路,也簡單表述了一下,自己對Faster R-CNN網(wǎng)絡,尤其是其中的RPN網(wǎng)絡的理解。希望大家讀完本文后能進一步加深對該論文的理解。有說的不對的地方也請大家指出,多多交流,大家一起進步~??

參考文獻:
【1】https://zhuanlan.zhihu.com/p/31426458
【2】https://blog.csdn.net/shenziheng1/article/details/82907663
【3】https://www.jiqizhixin.com/articles/2018-02-23-3
【4】https://zhuanlan.zhihu.com/p/24916624

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容