關於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
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-64→conv3-64→pool2→conv3-128→conv3-128→pool2→conv3-256→conv3-256→conv3-256→pool2→
conv3-512→conv3-512→conv3-512→pool2→conv3-512→conv3-512→conv3-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
(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--