1. 程式人生 > >關於Faster R-CNN的一切——筆記3:Faster R-CNN

關於Faster R-CNN的一切——筆記3:Faster R-CNN

博主課題需要研究Faster RCNN,先後看了RCNN、Fast RCNN和Faster RCNN三篇paper,然而有點懵逼= =所以準備再捋一遍總結一下~

三、Faster R-CNN【Faster R-CNN--Towards Real-Time Object Detection with Region Proposal Networks.2015NIPS

理解了R-CNN和Fast R-CNN之後,我們終於可以昂首闊步進入Faster R-CNN的解讀啦~\(≧▽≦)/~啦啦啦

SPPnet和Fast R-CNN都加速了R-CNN的檢測過程,然而瓶頸問題:region proposal computation卻沒有考慮。因此,Faster R-CNN的核心改進就是設計了一個Region Proposal Network

(RPN),在每個影象位置輸出一個預測的object bounding box和objectness score,這個網路與原來的Fast R-CNN共享conv feature map,所以幾乎不增加計算量。

1.什麼結構

網路輸入是一張image 

經過RPN生成一系列rectangular object proposals

image和它的object proposals一起送入Fast R-CNN網路,輸出最終的檢測結果

顯然,最重要的就是這個Region Proposal Network(RPN)怎麼設計,下面分析。

  • RPN的整體結構

(1)首先生成conv feature map

 

         明確一點,RPN與原來的Fast R-CNN網路共享從image生成conv feature map的過程。

         例如對於VGG16,結構如下:

【image→conv3-64conv3-64→pool2→conv3-128conv3-128→pool2→conv3-256conv3-256conv3-256→pool2→

conv3-512conv3-512conv3-512→pool2→conv3-512conv3-512conv3-512→pool2→FC4096→FC4096→FC1000】

         那麼從image到最後一個conv3-512層這13個卷積層和4個pooling層是RPN和Fast R-CNN共享的,對於VGG16,最後一個conv3-512層輸出的是512通道的W*H大小的(W和H=原影象寬高/16,因為有4個pooling層,每次大小減半)conv feature map

,接下來的RPN操作就是基於這個conv feature map

(2)在conv feature map的每個sliding window位置上生成特徵向量

         用一個n*n(本文是3*3)大小的滑動視窗(可以理解為卷積核)以1為步長在conv feature map上滑動。在每個sliding位置上,卷積核與它覆蓋的conv featue map對應元素相乘並相加輸出對應值,也就是卷積了。注意:conv feature map是3維的,對於VGG16而言是第三維是512通道,則每個通道獨立的與卷積核作用,所以最後卷積核在每個滑動視窗位置都會生成一個1*512維的向量。然後,這個1*512維的向量被送入兩個並列的FC層,一個分類的FC層輸出分類結果,一個迴歸的FC層輸出box regressor也就是物體位置座標。

         上面所說的sliding window模式,在所有的空間位置上的FC層的引數是共享的,所以這樣的結構很自然的可以被應用為一個n*n的卷積層和兩個並列的1*1的卷積層【1*1的卷積層其實就是每個卷積核通道數與輸入通道數相同,卷積核的個數就是你想要的輸出維數。例如對於VGG16,每個卷積核是512通道。】

(3)每個sliding window位置的特徵向量送入兩個並列的FC層做預測

         有了特徵向量,顯然可以分類了,那麼分幾類?文章說我們要在這個sliding window位置根據它的特徵向量同時預測出k個region proposals,那麼迴歸的FC層輸出就是4k維的了,因為每個proposal有4個座標嘛~分類的FC層輸出2k個分數來估計每個proposal是物體的概率和不是物體的概率。但是這k個proposal不是憑空整出來的,而是要相對一個參照,叫做archors,這也是RPN網路很核心的一個概念,下面詳細說明:

  • 平移不變的Anchors

         在每個sliding window·的中心,定義3種尺度和3種aspect ratio共9種anchors。對於一個大小是W*H的conv feature map,一共有W*H*9個anchors。注意,anchors是圈出原image中的某塊區域,所以按照Fast R-CNN RoI pooling層要完成的第一個任務【即把region proposal投影到conv feature map上,參考博主的Fast R-CNN筆記啦啦啦~】,我們需要把sliding window【這是在conv feature map上的啊注意了】的中心座標投影到原image上,然後就能找到原image上這些anchors應該對應的區域。這一點文章中並沒有明確說出,但是可以推斷出來。因為首先文章中使用的anchors最小也是128*128畫素的,而feature map大小在40*60,所以anchors不可能是在feature map上;然後,從archors的意義上我們來想,它是你的網路將要預測的region proposal的參照物對吧,region proposal是在原image上的對吧,所以anchors必然是在原image上的。但是sliding window是在conv feature map上的,所以我們一定會需要conv feature map往原image位置的對映,這就和Fast R-CNN要把原image上的region proposal投影到conv feature map是一個道理,只不過過程反過來了,我說清楚了吧~#這是吐槽。。。我看paper的時候就這一點十分不解,還是看了SPPnet的文章才明白這個投影是什麼鬼的,強烈譴責Faster R-CNN的作者╭(╯^╰)╮#

附上原paper的圖總結一下RPN網路的結構:

(4)根據分類的score對region proposals進行非極大值抑制

先去掉所有IoU小於0.7的那些proposal,然後剩下的執行NMS(和以前一樣了啦不再詳細說)。然後用前N個region proposal送入Fast R-CNN進行物體檢測。

2.怎麼訓練

顯然,我們需要訓練RPN和Fast R-CNN兩個網路。首先以預訓練的VGG16為例比較兩個網路的結構:

所以為了共享conv feature map,兩個網路的交替訓練流程應該是:

用預訓練模型初始化網路引數,然後fine-tune訓練RPN

用同一個預訓練模型初始化網路引數,然後fine-tune訓練Fast R-CNN,使用RPN網路輸出的region proposals

用Fast R-CNN初始化RPN(肯定是共有部分啦),固定共有的conv層(引數不再變化),只fine-tuned RPN獨有的層

固定共有的conv層,fine-tune Fast R-CNN的FC層

Fast R-CNN不說了,就是和原Fast R-CNN的訓練一毛一樣只不過產生region proposals的方法由selective search變成RPN網路啦~

  • 預訓練

         用ImageNet網路來初始化RPN和Fast R-CNN啦~比較了ZFnet和VGG16net兩個。

  • RPN網路的fine-tune

         #剛剛經歷了電梯驚魂的博主回來繼續寫了......生命苦短,要好好珍惜,好好學習T T#

         (1)首先是loss function怎麼定義

         先明確一下有兩個任務:一是分類任務,即判斷這個anchor是不是物體;二是迴歸任務,即給出bounding box的預測座標。所以說這種multi task的東東,肯定有兩個loss項啦:

         i是一個mini-batch(在本文就是一張image和它裡面的所有anchor)裡的anchor的index;pi是演算法輸出的anchor i是物體的概率;pi*是anchor i的ground-thuth label;ti是一個四元素的向量,是演算法預測的bounding box的引數化座標;ti*是與一個正anchor相關的ground-truth box。

         分類loss是兩類上的log loss(是物體和不是物體),迴歸loss和Fast R-CNN中的定義一樣。

         關於ti和ti*,都是引數化的座標,也就是都相對於anchor而定義,如下圖,所以你可以理解為:在原image上有很多ground-truth box,現在人為的規定了很多anchor box,你的演算法要做的事情其實就是把anchor box迴歸到離它最近的ground-truth box那裡去~

     

         (2)anchor的標籤怎麼定義

         有兩種情況anchor的標籤是正:一種是與某個ground-truth box有最大的IoU的那些;另一種是與任何ground-truth的IoU都大於0.7的那些。

         有一種情況anchor的標籤是負:與所有的gound-truth box的IoU都小於0.3。

         (3)其他訓練細節

         Mini-batch怎麼取樣:先隨機取樣一張圖片,然後以1:1的比例從這張圖隨機取樣256個anchors,如果正樣本的數目少於128的話,只好用負樣本填充mini-batch啦。也就是說1個mini-batch就是1張image和它的256個正負anchors。

         新的卷積層用均值為0,標準差為0.01的高斯分佈初始化,共享的那些層就用預訓練的模型初始化啦。

         前60k個mini-batch用學習率0.001,後20k個mini-batch用學習率0.0001。momentum是0.9,weight decay是0.0005.在PASCAL資料集喔~

3.怎麼測試

測試就簡單啦~對於一張測試image,先執行RPN生成2000個region proposal,然後把這些region proposal投影到conv feature map上進行後續的Fast R-CNN網路的操作就行啦。由於共享了conv feature map,一張圖只用計算一次,大的縮短時間。

來一個三個網路的執行時間對比:

        R-CNN : 47s/img

        Fast R-CNN:3s/img

        Faster R-CNN:0.2s/img

--The End of Faster R-CNN--