1. 程式人生 > >Fast R-CNN文章詳細解讀

Fast R-CNN文章詳細解讀

文章《Fast R-CNN》,是在SPP-net的基礎上對R-CNN的再次改造。
關於R-CNN的細節請檢視R-CNN文章詳細解讀,關於SPP-net的細節請檢視SPP-net文章詳細解讀

先來回顧一下R-CNN和SPP-net的缺點:
1.R-CNN的缺點

  • 訓練分為多個階段。首先要使用search selective演算法從輸入影象提取約2000個候選區域,其次要訓練CNN網路,最後還要訓練SVM進行分類、訓練bbox迴歸器進行更為精確的位置定位。

  • 訓練需要花費大量的時間和空間。因為是分階段的,CNN將候選區域的特徵提取出來以後要都存入硬碟中,之後取出用於訓練SVM和bbox迴歸器,儲存特徵需要耗費大量的硬碟空間,而且讀寫過程會造成時間的損耗。

  • 檢測階段特別耗時。因為檢測時也是對帶檢測影象中的候選區域進行檢測,沒個候選區域都要進行前向傳播,所以檢測一張影象特別耗時。

2.SPP-net的缺點
雖然SPP-net對R-CNN有所改進,即引入了SPP層,使得網路在檢測時不需要對每個候選區域進行前向傳播,但它也繼承了R-CNN的缺點並引入了新的缺點。

類似於R-CNN

  • 訓練需要分多階段進行

  • 需要將特徵存入硬碟

引入的新的缺點

  • 在fune-tuning階段不能對SPP層下面所有的卷積層進行後向傳播(如下圖所示)

    這部分新引入的缺點的原因,作者也花了點時間解釋,因為在fine-tuning的時候,R-CNN和SPP-net都是取mini-batch為128,其中32個正樣本,96個負樣本,而這些正負樣本通常來自不同的圖片。在這樣的fine-tuning策略下,當訓練樣本不是同一個圖片的時候,SPP層的更新效率會非常低,效率低的根本原因是每個RoI區域的感受野可能會非常大(對於這句話我的理解是,因為在
    SPP-net文章詳細解讀
    中計算感受野座標時是一個約等的關係,在卷積後輸出的特徵圖中對應的感受野的大小會比RoI的實際大小要大)。為什麼感受野大效率就會低,我的理解是,因為如果樣本不是來自一個圖片,在一次mini-batch訓練更新完樣本後,下次還的重新計算整張圖片的feature map,這樣會增加很多計算量,這裡僅是個人理解。

針對上述的缺點,Fast R-CNN就問世了,先看看Fast R-CNN的訓練框架,如下圖所示


Fast-RCNN作了以下改動:

  • 訓練機制有所改變,不再類似於R-CNN那樣使用均勻的隨機取樣128個訓練樣本,而是分層取樣,先隨機取樣N張圖片,然後從每張圖片中取樣R/N個RoIs,例如N=2,R=128,那麼每次做SGD的時候,有64個樣本來自同一張影象,這樣正反向都會有加速。這裡選取

    I o U 0.5 作為正樣本, I o U [ 0.1 , 0.5 ) 之間的為負樣本

  • 網路結構作了改變,首先是採用了SPP-net中的SPP層,只不過不同於SPP層的是,沒有多尺度的pooling,只有一個尺度的pooling(可以理解為特殊的SPP層),其次引入了多工損失函式,用於同時計算bbox迴歸和分類的損失。

先來看一下RoI層的反響傳播的計算方法,如下圖所示
假設下圖中大的綠色框和黃色框都是候選區域在feature map對應的區域,這裡RoI pooling的大小為2*2的(如下圖中小的綠色和黃色框)

反向傳播的函式為:
L x i = r j [ i = i ( r , j ) ] L y r j
其中,r表示第幾個候選區域,j表示輸出的第幾個節點, [ i = i ( r , j ) ] 表示i節點是否被候選區域r的第j個節點選為最大值輸出。

再來看一下為便於訓練而提出的多工損失函式
在FC層後接入了兩個分支,一個是softmax用於對每個RoI區域做分類,假如有K類待分(加上背景總共K+1類),輸出結果為 p = ( p 0 , , p K ) ,另一個是bbox,用於更精確的定位RoI的區域,輸出結果 t k = ( t x k , t y k , t w k , t h k )
多工損失函式定義為:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u 1 ] L l o c ( t u , v )
上式中, L c l s ( p , u ) = l o g p u 是個log形式的損失函式, L l o c v = v x , v y , v w , v h 是類為 u 的真實框的位置而 t u = ( t x u , t y u , t w u , t h u ) 是類為 u 的預測框位置。 [ u 1 ] 為1當 u 1 ,反之為0。文中實驗時 λ = 1
上式中, L l o c 定義為: