【目標檢測】RCNN, Fast-RCNN, Faster-RCNN 目標檢測算法總結

之前有看過這幾篇論文,但都不是瞭解特別清楚。這次索性做個縱向對比,重新把這幾篇論文翻出來看,也當做一個閱讀筆記。
目前的目標檢測算法主要分爲兩類:一類是以RCNN領頭的two stage的檢測算法。另一類是以Overfeat領頭的one stage算法。其主要的綜述可以看
https://zhuanlan.zhihu.com/p/33277354
各項指標可以看以下鏈接:
https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html


RCNN

RCNN system

可以由上述的overview看到,RCNN主要分爲三部分:1)提取proposals 2)CNN提取特徵 3)分類。

1)提取特徵: RCNN還是採取了傳統的proposal算法:Selective Search 算法對 目標region進行提取。事實上,由於我們知道 Region proposals 提取下來後 尺寸大小不一,然後在特徵提取時,採用了CNN進行提取特徵,此處RCNN採取了Wrapped, 即無視原來的大小和長寬比,強行將proposal的大小拉伸至227 x 227。
2)提取特徵: 對每一個proposal進行CNN提取特徵。(其實我們可以看到,這種操作爲RCNN帶來了巨大的計算量)
3)分類: RCNN中採用了SVM對CNN提取下來的特徵進行分類。特徵矩陣爲 2000x4096, 則SVM的權重矩陣爲4096xN,其中N爲類別數。

Note:
1. CNN後面接一個Softmax就能分類, 爲什麼RCNN把CNN提取特徵和分類給分開做?
由於訓練數據不一樣:
CNN提取特徵的時候,設置IOU>0.5的作爲正樣本,其他作爲負樣本。
在一個mini-batch中,作者32個正樣本,96個負樣本進行輸入。
而SVM中:作者將groud truth作爲正樣本,IOU<0.3的爲負樣本,其他忽略。
2.由於把CNN提取特徵和SVM分類兩個任務分開,需要在硬盤上存入大量樣本數據,容易造成 disk-hungry.
3. 上面也提到,RCNN對每一個proposal都進行了CNN操作,存在着大量的冗餘計算。

RCNN中涉及到的bounding-box regression
由於Selective Search提取的box不會太準,RCNN在之後面又加了一個 linear regression。
box regression的輸入形式: P i = (Px i; Py i; Pw i ; Ph i) 分別表示 box中心點的x,y座標及box的寬和高、每個ground-truth bounding box G 同樣的定義設置。G = (Gx; Gy; Gw; Gh)
作者定義proposal P到ground-truth G之間的變換:


這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

其中在嶺迴歸中的 lamda 係數,作者將其設置爲1000。

RCNN的整個計算流程
這裏寫圖片描述



Fast-RCNN

這裏寫圖片描述

從上圖我們可以看到Fast-RCNN跟RCNN的流程裏面有幾個明顯區別。
1)Fast-RCNN 不再像RCNN一樣,對每個ROI分別去提取特徵,而是直接在輸入圖像上進行一次卷積。從而共享了大量的卷積計算量。
2)Fast-RCNN 將提取特徵和分類的部分進行了融合,因此不需要像之前一樣把feature進行存儲後投入到SVM訓練,從而避免了 disk storage。

那麼想對上述兩點進行了改進會帶來以下幾個問題:

  1. RCNN是對原始圖像進行提取proposal,然後在每一個proposal上分別去提取特徵。而Fast-RCNN僅僅是直接在原始圖像上進行了一次卷積後,如何把原始圖片中的ROI映射到feature map中,這將是一個難點。
  2. 每個proposal對應的feature map 如何去保持等長輸出到Fully connected network上。在RCNN中,是可以直接對原始圖像上提取的proposal進行wrapped進行投入網絡中。而在Fast-RCNN中,feature map 是無法進行扭曲變形後投入到後面的FC中的。因此作者提出了ROI Pooling. 來保證每個輸出的特徵是等長的,以爲了更方便的處理。

1.原始圖像中的ROI映射到feature map 上的方法
截取自Hekaiming IICV 2015的slide
這裏寫圖片描述

關於詳細的ROI映射到feature map上可以參考:https://zhuanlan.zhihu.com/p/24780433

2.ROI pooling方法
由於Fast-RCNN無法對feature map 進行warped 投入到CNN中,因此採用了ROI pooling算法,輸出等長的feature。

此處假設某個ROI區域座標爲(x1,y1,x2,y2),那麼輸入size爲(y2-y1)(x2-x1)。如果pooling的輸出size爲 pooledheight pooledwidth
那麼每個網格的size爲((y2-y1)/pooledheight * (x2-x1/pooledwifdth))

此處參考一個博客上的例子對ROI pooling進行更好的講解:
https://blog.csdn.net/AUTO1993/article/details/78514071
但後來我發現原博主應該是理解錯了,我重新放上我的理解。


這裏寫圖片描述

黑框表示 ROI.(7x5) 那麼假設輸出的大小爲2x2。那麼對其進行pooling時,分成7/2 * 5/2。因此分成4個區域爲 3x2,3x2, 3x2,3x2。(每個區域的大小應該是相同的,這也導致了一些特徵被忽略了,從而導致了misalignment,之後在Mask RCNN中,作者重新提出了ROI align) 如下:


這裏寫圖片描述

最後對每個section做max pooling後的feature map爲:
0.85 0.84
0.69 0.86

3. 關於損失函數
FastRCNN採取了Multi-task loss,結合了分類損失和bounding-box regression。
這裏寫圖片描述
其中第一項:Lcls = -log(pu) 其中pu爲真實類別u的概率。
其中第二項:bounding-box regression,採用了 與RCNN不同的損失。Fast-rcnn採用了smooth L1損失函數:
這裏寫圖片描述

這裏稍微解釋一下,爲什麼要採用 smooth L1 loss (網易2018春招的筆試題之一)

robust L1 loss that is less sensitive to outliers than the L2 loss used in R-CNN and SPPnet. When the regression targets are unbounded, training with L2 loss can require careful tuning of learning rates in order to prevent exploding gradients. Eq. 3 eliminates this sensitivity

因爲Smooth L1 loss 對 異常值不敏感,當出現一個異常值,導致迴歸偏差很大時,smooth L1 loss能夠有效的避免梯度爆炸。

Fast-RCNN的整個計算流程
這裏寫圖片描述



Faster-RCNN

這裏寫圖片描述

從上文我們知道:RCNN採用了3個部分:Selective Search + CNN + SVM
Fast-RCNN 將提取特徵和分類兩者合在了一起,但是proposal仍然還是由SS算法。
這就導致了一個尷尬的處地,提取proposal的時間比後面分類+迴歸的總時間都長。Faster-RCNN則着重於這點,提出了RPN網絡,並引入anchor框。

爲了更好的理解RPN網絡,這裏附上Caffe的RPN實現:


這裏寫圖片描述

由Con5/relu5 輸出了 feature map, 在對feature map上作者採用了3x3的滑動框。對於滑動框在滑動的中心,對應了9個anchor,3x3的形式:3種大小(128^2, 256^2, 512^2),3種比例:(1:1, 1:2, 2:1)。之所以選擇這麼9種anchor框,由於後面的loss會對box regression。所以前面的anchor可以設置的稍微粗糙些。注意這裏的輸入大小,作者對shorter side re-scale到600pixle。


這裏寫圖片描述

Faster-RCNN的整個計算流程


這裏寫圖片描述

參考文獻:

  1. https://zhuanlan.zhihu.com/p/23006190
  2. https://zhuanlan.zhihu.com/p/24780395
  3. https://zhuanlan.zhihu.com/p/24916624
  4. https://zhuanlan.zhihu.com/p/24780433
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章