Object Detection — Faster R-CNN

Jeremy Pai
Life’s a Struggle
11 min readMay 13, 2021
大部分地區的疫情慢慢減緩,旅遊的日子也即將歸來 :) (Photo by Pietro De Grandi on Unsplash)

Introduction

Fast R-CNN [2] 雖然相較 R-CNN [3] 與 SPP-net [4] 又更進步了一些,但現在變成取得 Region proposals 的步驟成了最花費計算時間的地方,也因此有了本篇的 Faster R-CNN [1]。最重要的貢獻就是重新設計一個小型的神經網路來取得 Region proposals,使得此步驟只需花費 10 ms/image!

Algorithm

Faster R-CNN 模型架構 (Image from Shaoqing Ren [1])

底下簡述 Faster R-CNN 的演算法流程:

  1. 首先將影像通過 CNN model 後取得 Feature maps
  2. 透過 Region Proposal Network (RPN) 從 Feature maps 學習 Region proposals
  3. 將 Region proposals 投影在 Feature maps 上,而這些區域就是我們接下來要分析的區域 (Region of Interest, ROI)
  4. 將這些區域通過 ROI pooling layer 與 fully-connected layer 後取得特徵向量,再分成兩條路徑作訓練。一條是預測區域的類別,另一條則是調整 bounding box 的位置。

如 Introduction 所述,Faster R-CNN 與 Fast R-CNN 就只差在取得 Region proposals 的方式不同,其餘部分皆相同。

Faster R-CNN 流程圖 [5]

Region Proposal Network (RPN)

RPN 架構 [5]

不過為什麼會選擇用神經網路來學習輸出 Region proposals 呢?

最直覺加速取得 Region proposals 的方式就是用 GPU 去跑 Selective search 的計算,但如果要這樣做的話,作者建議不如就直接從原來 Fast R-CNN 的架構中想辦法取得 Region proposals,然後一起用 GPU 加速計算。

設計出來的 RPN 會接受最後一層 convolution layer 輸出的 Feature maps,在經過神經網路的計算後,輸出 Region proposals 與關於 Region proposals 的分類機率 (只分類成物體與非物體)。以這樣子的設計就可以共用 Fast R-CNN 計算出來的結果,節省了不少計算時間。

由於 RPN 全是由 convolution layers 組成,因此是一種 fully convolutional network (FCN)。當中的 fully-connected layers 其實會透過 “1x1 filters 數” 的 convolution layer 搭建而成。

不過要了解 RPN 的全貌,還須了解 anchors,因此底下就來介紹什麼是 anchors,也會對 RPN 的輸出層做更進一步的說明。

Anchors

基於不同 scale 與 aspect ratio 產生的 anchors (Image from Sambasivarao. K [6])

每一次 sliding window 做處理時,為了分析 sliding window 中心點附近有無物體的存在,我們會生成以 sliding window 中心為中心點的 Region proposals,可以透過調整 scale 與 aspect ratio 來產生不同尺度的 Region proposals。而這一組 Region proposals 也被給予一個名稱,叫做 anchors!

生成 anchors 來評估當中是否有物體存在 (Image from Shaoqing Ren [1])

至於每一個點要生成幾個 anchors 是可以自己做調整的,以 Faster R-CNN 來說選擇生成 k=9 個 anchors 來做後續的分析。由於在 RPN 的分類層 (cls layer) 是分成 2 類 (物體、非物體),因此會有 2k=18 個輸出。而迴歸層 (reg layer) 是調整 bounding box 的座標,因此會有 4k=36 個輸出。如果 Feature maps 維度為 W x H,總共就會有 W x H x k 個 anchors。

簡單來說,RPN 就是對 Feature maps 的每個點產生 anchors,再對這些 anchors 作分類,得知哪些是 positive 的 Region proposals,哪些是 negative 的 Region proposals。

使用 anchors 也會有一個好處是此方法為平移不變性 (translation-invariant) 。如果將物體平移到其他位置,透過 anchors 的計算也應能在其他位置找出該物體的 Region proposals。作者也有提到使用 anchors 能夠降低 model 的參數量,不過這或許只是相對於被提到的方法 — MultiBox。

最後作者依據分類為 positive 的機率,挑選前 300 個機率最大的 anchors 作為 Region proposals。

Loss function

接下來就是設計 Loss function 來訓練 RPN,在這之前我們要先給定每一個 anchors 的 Label (物體或非物體),設定 Label 的方式如下:

  1. anchors 有沒有與其中一個 ground-truth bounding box 的 IoU ≧ 0.7,有的話就設定為 Positive label
  2. 計算 anchors 與任何一個 ground-truth bounding box 有著最大的 IoU,且此 IoU ≧ 0.3,但是 ≦ 0.7。滿足此條件一樣設定為 Positive label

而 Loss function 則表示如下:

i:anchor 的 index
pi:anchor i 預測為物體的機率
pi*:ground-truth label,如果 anchor 是 positive 則為 1,反之為 0
Ncls:mini-batch size
Nreg:anchor 位置的數量
x:預測的 bounding box
xa:anchor box
x*:ground-truth bounding box
ti:預測的 bounding box 經過參數調整後的結果 (offset)
ti*:ground-truth bounding box 經過參數調整後的結果 (offset)

Lcls 代表分類的 Loss,與 Fast R-CNN 相同用 log 來計算。而 Lreg 則是考慮 bounding box 位置是否需要做調整,與 Fast R-CNN 相同用 smooth L1 計算,一樣也只考慮 positive anchor 的部分。Loss function 中的 λ 是為了平衡 Ncls Nreg,使得 Loss function 可以平均考慮 LclsLreg。不過作者在經過實驗後發現其實 λ 不太會影響到最終的結果,而且或許這部分的 Normalization 也是不必要的。

需要注意的是如果有 k 個 anchors,就會有 k 個不同的 Bounding-box regressors,這是為了能準確地找出不同大小的 anchor 所對應的 bounding box。

Sharing Features for RPN and Fast R-CNN

接下來作者討論該如何訓練 RPN 與 Fast R-CNN 共用的 convolution layer,並且提出了下列方法:

  1. Alternating training:首先先獨自訓練 RPN 並且輸出 Region proposals 來訓練 Fast R-CNN,接著再將訓練好的 Fast R-CNN 回過頭來 fine-tuning RPN,這也是本篇所採用的訓練方式
  2. Approximate joint training:用 back propagation 直接訓練整個 Faster R-CNN,不過作者提到此過程會忽略由 RPN 產生的 proposals 的梯度,因此只是近似的結果。但是從實驗結果來說此方法可以提供相近的結果,而且訓練速度會比 Alternating training 來要快上 25%~50%
  3. Non-approximate joint training:此方法作者只有簡單提到會使用 ROI pooling layer,而且會對此 layer 與 Region proposals 的座標做梯度運算,但是並沒有說明細節

最後再說明作者採用的 Alternating training 而產生的 4-step alternating training!

對 RPN 載入經 ImageNet 訓練的權重並且作 fine-tuning,接著將 RPN 產生的 Region proposals 拿去訓練 Fast R-CNN 的架構。再來將 RPN 與 Fast R-CNN 共用的 convolution layer 固定住,只訓練 RPN 其他的神經層。到了這個階段才終於使 RPN 與 Fast R-CNN 共用了計算結果!最後依然將共用的 convolution layer 固定住,只訓練 Fast R-CNN 其他的神經層,至此訓練結束!

Results

Faster R-CNN 在 PASCAL VOC 2007, 2012 與 MS COCO 資料集達成了在當時最好的結果,而且一張影像只採用了 300 個 Region proposals。

PASCAL VOC 2007 test set [1]
PASCAL VOC 2012 test set [2]

而且取得 Region proposals 的速度也比之前 Selective search 還要快上不少!(這邊的時間單位為 ms)

根據實驗結果,使用越多的 anchors 能夠提升 mAP,但是也需考慮如果加入更多的 anchors,也會需要花更多的時間取得 Region proposals。

最後的表格則顯示說,訓練 RPN 的 Loss function 當中的 λ 確實不太會影響到 mAP。

[後記]:

以上大概我對這篇 paper 的理解,如有誤還請來信通知 XD。

Resource:

[1] Shaoqing Ren, et al. “Faster r-cnn: Towards real-time object detection with region proposal networks.” arXiv preprint arXiv:1506.01497 (2015)

[2] Ross Girshick. “Fast R-CNN.” Proceedings of the IEEE international conference on computer vision. 2015

[3] Ross Girshick, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2014

[4] Kaiming He, et al. “Spatial pyramid pooling in deep convolutional networks for visual recognition.” IEEE transactions on pattern analysis and machine intelligence 37.9 (2015): 1904–1916

[5] Jonathan Hui — What do we learn from region based object detectors (Faster R-CNN, R-FCN, FPN)?

[6] Sambasivarao. K — Region Proposal Network — A detailed view

--

--

Jeremy Pai
Life’s a Struggle

機器視覺演算法工程師~不限主題隨心寫下自己想寫的事物