天天看點

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 學習筆記

論文: R-FCN: Object Detection via Region-based Fully Convolutional Networks [NIPS 2016]

代碼: https://github.com/daijifeng001/r-fcn

作者: Jifeng Dai, Yi Li, Kaiming He, Jian Sun

一、R-FCN的提出

這篇論文的主要出發點有兩個:

  • Faster RCNN中檢測部分(Fast-RCNN)需要對每一個RoI進行獨立、耗時大(兩個全連接配接層)的計算
  • 圖像分類的平移不變性和目标檢測的平移變化性(translation variance)

Two-stage的目标檢測算法如Fast RCNN, Faster RCNN等,可以通過RoI pooling層分成兩部分: (1)和RoIs獨立的、且所有RoIs共享的全卷積子網絡;(2) 對逐個RoI進行分類和回歸的不共享計算的子網絡。

受啟發于分類網絡

AlexNet, VGGNets都是基于這樣的網絡設計: 全卷積網絡(含spatial pooling layer) + 幾個全連接配接層。但是GoogLeNets和ResNets的設計是fully convolutional(隻有最後一層是全連接配接的,當fine-tune成目标檢測任務的時候會把移除和替換),是以對于目标檢測一種很自然的想法就是使用全卷積網絡層建構共享的(提取特征的)子網絡,而且在RoI-wise子網絡中沒有隐藏層。

與分類網絡的不同

但是需要注意到,分類網絡是需要平移不變性的,目标檢測卻是平移變化(translation variance)的。

一般來講,圖像分類網絡中較深的卷積層對平移的敏感性降低。為了解決這個難題,ResNet論文中的解決方案是把RoI插入中間的卷積層;這樣RoI之後的卷積層不再具有平移不變性。但是此設計引入了大量的region-wise 層,如table1所示,是以犧牲了訓練和測試的效率。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 學習筆記

為了解決高效、且平移變化性(translation variance)的問題,論文中提出了Region-based Fully Convolution Network(R-FCN)。R-FCN的主要創新點有兩個:(1)提出了position-sensitive maps和position-sensitive pooling; (2)所有RoIs共享計算,分類層無參數層(卷積核全連接配接層),提高了效率。

二、R-FCN介紹

2.1 Position-sensitive score maps

在骨幹網絡的最後一個卷積層,對于每個類别(category)産生一組 k 2 k^2 k2position-sensitive score maps,是以對于有C類的資料集,會産生一個 k 2 ( C + 1 ) k^2(C + 1) k2(C+1)通道的輸出(+1對對于背景),如fig1所示。其中 k 2 k^2 k2個score maps對應着 k 2 k^2 k2個描述相對位置的空間grid。對于k = 3時, 3 * 3 = 9個score maps編碼了一個object category的top-left, to-center, top-right, …, bottom-right資訊等。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 學習筆記

通過end-to-end的訓練,這個RoI層指導最後一個卷積層學習position-sensitive score maps。如fig3,如果候選框與真實object重疊,RoI中的 k 2 k^2 k2個bins的大多數bins将會被激活,進而具有較高值。如fig4,如果一個候選框不能和一個真實的object重疊,RoI中的一些bins将不能被激活,進而會導緻score較低。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 學習筆記

Postion-sensitive RoI pooling(PSRoI pooling)對position-sensitive score maps進行操作得到一個 k 2 k^2 k2大小 C + 1 C + 1 C+1通道的特征圖,用于最後的分類。這份PSRoI pooling是逐個RoI進行的。具體操作如下:

對每一個RoI矩形,通過長方形的grdi把它divide成 k ∗ k k * k k∗k bins。對于一個 w ∗ h w * h w∗h的RoI,一個bin大小約為 w k ∗ h k \frac{w}{k} * \frac{h}{k} kw​∗kh​。Position-sensitive是包含 k 2 ( C + 1 ) k^2(C+1) k2(C+1)個通道的特征圖。對于第 ( i , j ) (i, j) (i,j)bin, 0 = < i , j < = k − 1 0 =< i,j <= k-1 0=<i,j<=k−1,position-sensitive RoI pooling(PSRoI pooling)操作如下:

r c ( i , j ∣ Θ ) = Σ ( x , y ) ∈ b i n ( i , j ) z i , j , c ( x + x 0 , y + y 0 ∣ Θ ) / n r_c(i, j|\Theta) = \Sigma_{(x, y) \in bin(i, j)}z_{i, j, c}(x+x_0, y + y_0 | \Theta) / n rc​(i,j∣Θ)=Σ(x,y)∈bin(i,j)​zi,j,c​(x+x0​,y+y0​∣Θ)/n

( x 0 , y 0 ) (x_0, y_0) (x0​,y0​)表示RoI的top-left corner, z i , j , c z_{i, j, c} zi,j,c​表示 k 2 ( C + 1 ) k^2(C+1) k2(C+1)個score maps中的 ( i , j , c ) (i, j, c) (i,j,c) score map, r c ( i , j ) r_c(i, j) rc​(i,j)表示對于 c c c類的第 ( i , j ) (i, j) (i,j)bin的response,也就是在 c c c個feature map, ( i , j ) (i, j) (i,j)位置的值。

公式看似複雜,但其實不難了解。經過PSRoI pooling,會産生 C + 1 C + 1 C+1個 k 2 k^2 k2大小的特征圖,對于 c c c特征圖的 ( i , j ) (i, j) (i,j)位置的值,它隻會從 k 2 ( C + 1 ) k^2(C + 1) k2(C+1)個score maps中的一個score map[i, j, c]進行average pooling(論文中提到max pooling也是可以的)得到,而且pooling的大小就是RoI的 ( i , j ) (i, j) (i,j)bin所對應在score maps上的區域。(這種思想第一次遇到,了解起來可能乖乖的,但後面有不少檢測的論文(Light-head RCNN, ThunderNet)都基于這種PSRoI pooling, 還是要努力的了解一下)

然後 k 2 k^2 k2個positive-scores開始對這個RoI進行投票。論文中采取了平均投票法, r c ( Θ ) = Σ i , j r c ( i , j ∣ Θ ) r_c(\Theta) = \Sigma_{i, j}r_c(i, j|\Theta) rc​(Θ)=Σi,j​rc​(i,j∣Θ),産生了 C + 1 C + 1 C+1維的特征向量,然後計算softmax responses: s c ( Θ ) = e r c ( Θ ) / Σ c ′ e r c ′ ( Θ ) s_c(\Theta) = e^{r_c(\Theta)}/\Sigma_{c'}e^{r_{c'}(\Theta)} sc​(Θ)=erc​(Θ)/Σc′​erc′​(Θ)。在訓練時用來計算交叉熵loss,在預測時用來排序RoIs。

論文中以同樣的方式解決了boudinng box的回歸問題。除了預測 k 2 ( C + 1 ) k^2(C+1) k2(C+1)維的卷積層,增加了一個 4 k 2 4k^2 4k2通道的sibling層。PSRoI pooling在這 4 k 2 4k^2 4k2score maps上進行,對于每一個RoI産生一個 4 k 2 4k^2 4k2維的向量,然後通過average voting産生了一個4維的向量 t = ( t x , t y , t w , t h ) t = (t_x, t_y, t_w, t_h) t=(tx​,ty​,tw​,th​),編碼資訊如R-CNN, Fast R-CNN, Faster RCNN所示:

t x = ( x − x a ) / w a , t y = ( y − y a ) / h a t_x = (x - x_a) / w_a, t_y = (y - y_a) / h_a tx​=(x−xa​)/wa​,ty​=(y−ya​)/ha​

t w = l o g ( w / w a ) , t h = l o g ( h / h a ) t_w = log(w / w_a), t_h = log(h / h_a) tw​=log(w/wa​),th​=log(h/ha​)

ROI層之後沒有可學習的層,可實作幾乎cost-free的region-wise計算,增加了訓練和預測的速度。

2.2 R-FCN訓練和預測

Loss函數: L ( s , t x , y , w , h ) = L c l s ( s c ∗ ) + λ [ c ∗ > 0 ] L r e g ( t , t ∗ ) L(s, t_{x, y, w, h}) = L_{cls}(s_{c^*}) + \lambda[c^* > 0]L_{reg}(t, t^*) L(s,tx,y,w,h​)=Lcls​(sc∗​)+λ[c∗>0]Lreg​(t,t∗), 即分類損失和回歸損失,分類損失采用的交叉熵損失,回歸損失是smooth L1 loss。

當RoI與任意一個groung-truth box的IoU大于0.5時是正樣本,其它的為負樣本。這個和原來的設定也不太一樣。

論文中在訓練時采用了online hard example mining(OHEM)。

其它的一些訓練參數就不詳細介紹了。

在測試時論文也是選用300個RoIs,後處理nms采用的IoU門檻值為0.3。

論文在骨幹網絡部分對ResNet進行了修改,将原始的stride=32改成了stride=16: 在conv5部分将stride從2改成了1,并使用了atrous卷積。這使得模型的AP提升了2.6points。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 學習筆記

三、R-FCN的實驗結果

R-FCN與其它的全卷積政策進行了對比,實驗結果如Table2所示。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 學習筆記

R-FCN與使用ResNet101的Faster-RCNN的對比,如Table3、Table4和Table5所示。

R-FCN(Object Detection via Region-based Fully Convolutional Networks) 學習筆記

繼續閱讀