Object Detection — Fast R-CNN

Jeremy Pai
Life’s a Struggle
13 min readApr 29, 2021
Fast R-CNN 流程圖 (Image from Ross Girshick [2])

Introduction

從名稱就可以知道本篇的研究目的是為了增進 R-CNN 的計算效率,而 R-CNN 主要有以下缺點:

  1. 需分階段訓練 (R-CNN [2], SPP-net [3], OverFeat [4] 都有這個問題)
  2. 訓練費時且需足夠大的儲存空間存放 Region proposals 的特徵向量
  3. 沒有辦法實現即時的物體偵測 (使用 GPU 的情況下,每張影像需花費 47 s 處理)

針對以上問題,本篇研究出可訓練 end-to-end 的 model,也因此不再需要儲存特徵向量的空間,並且每張影像只需時 0.3 s 就能實現物體偵測 (不考慮尋找 Region proposals 的時間),大大的提升計算速度與效率,準確率也有了更進一步的提升 (mAP: 66 %)!

Algorithm

Fast R-CNN 流程圖 [5]

Paper 提供的流程圖,我覺得如果是第一次看或許沒那麼直觀,剛好網路上有看到大神畫的圖我覺得還滿容易懂的,重新畫一次後就如同上圖 [5]。可以發現 Fast R-CNN 與 R-CNN 的不同之處~

Fast R-CNN 與 R-CNN 第一個不同點:Fast R-CNN 是可以訓練 end-to-end 的 model,可直接用 back propagation 更新所有權重,整個訓練流程不像 R-CNN 一樣需分成很多階段。

簡述一下 Fast R-CNN 的演算法流程,底下會再做更進一步的說明

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

Feature maps

Fast R-CNN 與 R-CNN 第二個不同點:Fast R-CNN 會先將原影像通過 CNN 取得 Feature maps 後,再將 Region proposals 投影在此 Feature maps 上,找出之後要分析的區域。

R-CNN 一開始會先對原影像切出好幾個 Region proposals,之後再對這些 Region proposals 作分析。但是如果 Region proposals 之間有互相重疊的區域,這些重疊的區域在通過 CNN 的計算中就會被重複計算,增加沒有必要的運算量。

因此 Fast R-CNN 選擇將原影像先通過 CNN 的計算,直接取得整張影像的 Feature maps,再來才將 Region proposals 的區域投影到 Feature maps 上,如此一來也就不會計算到已經計算過的區域。

此方法在 SPP-net 也有使用到,並且很顯著的提升計算速度,比 R-CNN 訓練時間快上 3 倍。不過 Fast R-CNN 整體又比 SPP-net 快上 3 倍!

Region proposals

Fast R-CNN 尋找 Region proposals 的方式依然是 Selective search,因為是同樣的內容就不深入探討。

CNN model — VGG16

各種 VGG 系列的 model (Image from Karen Simonyan [6])

Fast R-CNN 與 R-CNN 第三個不同點:Fast R-CNN 是使用 VGG16 [6] 來提取特徵,且一樣是匯入經過 ImageNet 預先訓練好的權重。不過作者也有對原來的 VGG16 做了些修改,底下會慢慢介紹。

ROI pooling layer

在之前 R-CNN 會有將 Region proposals 縮放的步驟,使得每一個 Region proposals 的大小相同。但是在 Fast R-CNN 是從原影像取得 Feature maps,之後再從 Feature maps 中去尋找 Region proposals 的位置。這時問題來了,如果 Region proposals 的大小不同該怎麼辦?

作者他們將 VGG16 最後一層的 Max pooling 替換掉成自己設計的 ROI pooling layer,目的就是將這些 Region proposals 轉換成相同大小的 Feature maps,作者也有提到 Region proposals 的大小是個 hyperparameter,可視情況作調整。(研究是使用 7 x 7)

以下就說明說該怎麼計算 ROI pooling layer,感謝 Jonathan Hui [5] 的範例讓這部分的說明非常淺顯易懂!

[例]:假設我們現在有 8 x 8 的 Feature map,Region proposal 是 5 x 7,而目標要將此 Region proposal 轉換成 2 x 2 的 Feature map 輸出。

首先將 Region proposal 的高跟寬與最終 Feature map 的高跟寬相除來取得此 Region proposal 該分割成多大的小區域,才可以變成最終 Feature map 的高跟寬。由於 5/2 = 2.5 與 7/2 = 3.5,因此我們知道需要將 Region proposal 切出大約 2 x 3 的小區域,不足填滿 Region proposal 的部分由剩下的小區域補齊即可。最後一個步驟就是從每個小區域找出最大值作為代表輸出 (Max pooling)。

ROI pooling layer 的例子 (Image from Jonathan Hui [5])

題外話,由於 ROI pooling layer 只會 pooling 成一個 Feature map,因此這部分的計算 Fast R-CNN 算是 SPP-net 的特例。

SPP-net 會 pooling 成好幾個不同大小的 Feature maps (Image from Jonathan Hui [7])
Fast R-CNN 只會 pooling 成一個 Feature map (Image from Jonathan Hui [7])

Output layer

作者將 VGG16 修改成有兩個輸出層,一個是預測區域的類別,另一個則是調整 bounding box 的位置。預測區域類別的輸出層在 ImageNet 訓練時有 1000 個類別,但是如果只有 K 個類別,就只需要有 K+1 個神經元 (1 是指 background)。而調整 bounding box 位置的輸出層則會輸出關於每個類別的 bounding box,此輸出層的功用就如同 R-CNN 的 Bounding box regressor,只是 Fast R-CNN 直接設計在單一個神經網路當中。

Loss function

由於現在的輸出層有兩個,因此在設計 Loss function 時,也需考慮該如何整合這兩個輸出的 Loss。經過設計後如下所示,Lcls 代表分類的 Loss,而 Lloc 代表 Region proposal 與 ground-truth bounding box 之間的差異。

當中的 λ 可以調整兩個 Loss 影響的比例 (作者採用 λ = 1)。[u ≧ 1] 則是代表當 u ≧ 1時為 1,反則為 0,因為 background 並不會有 ground-truth bounding box,所以當然就不會去計算 Lloc (u = 0 代表 background)。

p:各個類別的預測機率
u:Label
v:ground-truth bounding box
tu:Region proposal 與 ground-truth bounding box 之間的差異
(也就是 R-CNN 也有使用的 t)

選擇使用 smooth L1 是因為不想要受到離群值影響,如下圖就可以發現 smooth L1 比起 L2 loss 是更不容易受到離群值影響的。

用 Python 畫出 smooth L1 與 L2

Input layer

什麼!連輸入層也有修改?其實只是除了原影像外,還有多了 Selective search 提供的 Region proposals 一起輸入到 VGG16 中...沒了XD。

Truncated SVD

為了更進一步提升物體偵測時的速度,會以 SVD 分解的方式來協助加速 fully-connected layers 的計算。矩陣 W 儲存 fully-connected layer 的權重,再用 SVD 分解就會得到底下的結果,中間的 Σ 會是一個 diagonal matrix。可以想像如果我們只取出前 t 個 singular values,並且 UΣV 也不會與 W 相差太多的話,就能夠降低 fully-connected layer 的計算量。

經過 SVD 分解後,可以將計算量從 uv 降到 t(u+v),也就是說如果 t 遠小於 uv 的話,計算速度的提升會更為明顯。t 的選擇也是要經過實驗的,必須在與原來計算結果不會差距太多的前提下來選擇 t 的大小。

神經網路上的實現則是將一層的 fully-connected layer 用兩層的 fully-connected layers 取代,並且在這兩層之間是不採用 Activation function 的。第一層是計算 ΣV 的部分,第二層則計算 U

Results

Fast R-CNN 達成了

  1. 當時在 VOC07, 2010, and 2012 這些資料集中最出色的 mAP
  2. 訓練時間比 R-CNN 與 SPP-net 更短且能夠更快速實現物體偵測

底下呈現一些作者的實驗成果

Truncated SVD

經過 Truncated SVD 加速的成果 (Image from Ross Girshick [2])

作者在 fc6 layer 選擇前 1024 個 singular values 與 fc7 layer 選擇前 256 個 singular values,在 mAP 只損失 0.3 的情況下,降低了超過 30 % 的計算時間!

Fine-tuning

從實驗中可以發現 fine-tuning 不只對 fully-connected layers 很有效,對於 convolution layers 也很有效,這也是 SPP-net 無法提升至更高 mAP 的原因。不過也不是每一層 convolution layer 都要做 fine-tuning,因為最前面幾層 convolution layer 其實都只是在做簡單的特徵萃取,而這部分不管是在哪一個 task 上都會得到很相近的結果,所以最前面幾層做 fine-tuning 就不會有太大的成效!

Scale

一開始我們可能會很直覺的認為分析越多的 scale 的影像肯定會得到更準確的物體偵測,但經過作者實驗後發現的確 mAP 是有增加,但增加的幅度並不大,卻很顯著的增加作物體偵測的時間。

SVM v.s. softmax

實驗結果顯示用 softmax 大概會提升 0.1 ~ 0.8 的 mAP,或許並不大,不過最大的好處是不用再拆成好幾個階段作訓練,降低訓練的難度。

More region proposals?

作者在實驗過後,發現增加 Region proposals 可以提升一點 mAP,但是過多的 Region proposals 反而會傷害 mAP。不管是用 softmax 還是 SVM 都有同樣的結果 (不過 SVM 還是降得比較誇張一點...),因此 Region proposals 的數量不要一昧的追求高數量才是明智之舉...

除了討論是否要使用更多 Region proposals 之外,作者也證實了先尋找 Region proposals 再用 Fast R-CNN 分析確實是可以提升準確率的,並不是只有降低計算時間這麼簡單。

[後記]:

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

Resource:

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

[2] 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

[3] 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

[4] Pierre Sermanet, et al. “Overfeat: Integrated recognition, localization and detection using convolutional networks.” arXiv preprint arXiv:1312.6229 (2013)

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

[6] Karen Simonyan, and Andrew Zisserman. “Very deep convolutional networks for large-scale image recognition.” arXiv preprint arXiv:1409.1556 (2014)

[7] Jonathan Hui — Fast R-CNN and Faster R-CNN

--

--

Jeremy Pai
Life’s a Struggle

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