論文地址:

R-FCN: Object Detection via Region-based Fully Convolutional Networks?

arxiv.org

筆者讀論文的學習筆記,本人水平有限,如有錯誤,請指出。

碼字不易,如果您覺得寫得不錯,請點個贊,謝謝。


一、背景介紹

先說兩個性質:轉換不變性(translation invariance)轉換可變性(translation variance)。轉換不變性是指在圖像分類時,圖像的平移、旋轉不會給網路的結果帶來影響,卷積神經網路都具備這個性質;轉換可變性是指目標檢測時,物體的偏移應當被網路檢測到,但當網路層數較深時,最後一層輸出的feature map解析度太低,原圖上物體的小偏移難以被檢測到,所以深網路不具備轉換可變性。

two-stage的目標檢測模型分為兩個部分:

  1. 全卷積子網路backbone
  2. 針對RoI的子網路

Faster R-CNN原文用的backbone是ZFNet和VGGNet,網路較淺所以具備轉換可變性,例如VGG16將原圖下採樣16倍所以還可以接受;ResNet原文中使用的backbone是Res101,由於層數太深,如果在網路的最後一層(即stage5,下採樣32倍)加入RoI層就會導致轉換可變性很差,於是原文在stage4後面加入RoI層,以此保證轉換可變性。但這樣做帶來的問題是:得到每個RoI之後還要分別經過10層網路,即後面的網路對於RoI是不共享計算的,這導致訓練和預測的時間顯著變長。這個問題也是在此之前的two-stage模型的通病,R-FCN通過引入position-sensitive score map既保證了共享計算(每個RoI無需經過可學習的卷積層或全連接層),又保證了檢測的轉換可變性。

二、模型細節

論文中R-FCN的backbone仍然使用Res101,先在ImageNet上預訓練,之後去除最後的全局平均池化層和全連接層,此時網路最後輸出的feature map的channel數為2048,後面加一層1 x 1卷積將其降維到1024維,後面再加上三個分支:

  1. RPN
  2. k^2(C+1) 個卷積核卷積,得到position-sensitive score maps(用於分類)
  3. 4k^2 個卷積核卷積,得到用於bounding box回歸的maps

第一個分支無需多說,Faster R-CNN中已經解釋得很清楚了,這個分支會產生很多RoI,這些RoI對應到第二個和第三個分支上直接使用,如圖1所示:

圖1 分支之間的關係
  • Position-sensitive score maps(用於分類)

第二個分支得到的score maps的channel數為 k^2(C+1) ,如圖2所示,每一層都被賦予不同的含義;首先將RPN生成的RoI分成 k	imes k 個bin(圖中 k=3 ),同時score maps沿著channel這個維度也被分成 k^2 個部分,每個部分都有 C+1 層( C 個分類類別和1個背景類別),對應RoI中不同的bin,例如前 C+1 層對應RoI左上角那個bin, C+22C+2 層對應RoI上面中間那個bin,以此類推。

之後就要執行RoI pooling了,這裡需要注意:每個bin執行pooing時需要找到對應的score maps,而不是針對整個score maps。例如當前要對左上角這個bin執行pooling時,找到其對應的score maps,即前 C+1 個score maps,在這個bin對應位置執行平均池化(最大池化也是可以的),所以輸出是一個 C+1 長度的向量。以此類推,總共可以得到 k^2C+1 長度的向量,接著再進行一次全局平均池化(就是圖2中的vote步驟)可以得到一個 C+1 長度的向量,最後經過Softmax層就可以得到每個類別的概率。在訓練時,交叉熵作為損失函數;在預測時,概率值在NMS時將被用到

圖2 position-sensitive score maps

為了方便理解,再舉兩個論文中的例子:

圖3 RoI定位偏差小時,輸出的score maps

當RoI定位偏差小時,輸出的score maps如圖3所示。注意中間的九張圖只針對Person這個類別(也就是說,圖3展示時只取前面提到的 C+1 層中的Person這一層),可以看到,最後RoI pooling之後每個方塊顏色都較淡,說明每個方塊和vote之後的值更大,於是對於這個RoI會預測為Person。

圖4 RoI定位偏差大時,輸出的score maps

當RoI定位偏差大時,輸出的score maps如圖4所示。RoI pooling之後大部分方塊顏色都較深,說明每個方塊和vote之後的值更小,於是對於這個RoI不會預測為Person。

圖5 backbone使用Res101時網路結構的比較
  • 採用Position-sensitive score maps優勢在哪?
  1. 轉換可變性:R-FCN將RoI劃分成 k	imes k 個bin,每個bin之間有相對位置信息,所以仍然能保證轉換可變性
  2. 效率:如圖5所示,Faster R-CNN在使用Res101作為backbone時,RoI層後面還有十層網路,且這十層網路對於每個RoI不共享,所以效率較低;而R-FCN的RoI層後面沒有可學習的網路(因為全是取均值),所以對於訓練和預測速度都得到提升

第三個分支得到的score maps的channel數為 k^2	imes 4 ,每個RoI在vote之後可以得到一個四維向量,代表參數化後的bounding box的中心坐標、寬和高,這一點和Fast R-CNN一樣,但和YOLOv1直接擬合不一樣。為了簡便,所有類別共享回歸器,不再針對每個不同的類別都設置一個回歸器。

三、訓練和預測細節

  • Training

對於每個RoI,損失函數如圖6所示:

圖6 損失函數

第一項是分類的交叉熵損失,第二項是bounding box回歸損失, c^* 代表真實標籤, c^*=0 代表真實標籤是背景,此時不計算也無法計算回歸損失, lambda=1

正樣本定義為bounding box與ground truth的IoU至少為0.5,小於0.5為負樣本。對於R-FCN,訓練時可以很方便地使用OHEM(online hard example mining):正向傳播時,假設提取出了N個RoI,計算這N個RoI的loss然後排序,選取出B個loss最大的RoI進行反向傳播。論文中設置B = 128,八塊GPU,每塊GPU一張圖片,所以每塊GPU反向傳播128個RoI。R-FCN的優勢就在於RoI後的計算量極小,所以使用OHEM代價很小;而Fast R-CNN使用OHEM代價就很大了,幾乎會使訓練時間加倍,因為N個RoI都要經過後面的全連接層,而只有B個RoI才會真正被利用到。

為了達到共享網路的目的,R-FCN使用和Faster R-CNN一樣的四步輪流訓練法。

  • 空洞卷積

Res101的stage5之前的網路層都不變,stage5第一個block的步長從2變成1,這使得整個網路最後輸出的feature map解析度下採樣了16倍而非32倍,也就是說最後的feature map解析度變大了;但這樣做會導致感受野變小,所以R-FCN在stage5後面的block中使用空洞卷積增大感受野作為補償

  • Inference

預測時,對於得到的所有RoI,使用IoU閾值為0.3的NMS篩選。

四、實驗

實驗部分不再贅述,提幾個關鍵點:

  1. 如果設置 k=1 ,即不利用相對位置信息,效果會相對更差
  2. 訓練多尺度可以使效果更好,但更耗時
  3. Selective Search或Edge Boxes可以替代RPN,但RPN效果最好
  4. R-FCN對於小物體效果很好,但大物體欠佳

Reference:

  • zhuanlan.zhihu.com/p/30
  • zhuanlan.zhihu.com/p/32

推薦閱讀:

相关文章