Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” Advances in Neural Information Processing Systems. 2015.
本文是繼RCNN[1],fast RCNN[2]之后,目標檢測界的領軍人物Ross Girshick團隊在2015年的又一力作。簡單網絡目標檢測速度達到17fps,在PASCAL VOC上准確率為59.9%;復雜網絡達到5fps,准確率78.8%。
作者在github上給出了基於matlab和python的源碼。
上一節我們介紹到Fast R-CNN網絡,Fast R-CNN看似很完美了,但是Fast R-CNN中還存在着一個優點尷尬的問題,它需要先使用Selective Search提取框,這個方法比較慢,有時,檢測一張圖片,大部分時間不是花費在計算神經網絡分類上,而是花在Selective Search提取框上!在Fast R-CNN升級版Faster R-CNN中,使用RPN(Region Proposal Network)網絡取代了Selective Search,不僅速度得到了大大提高,而且還獲得了更加精確的結果。
一 Faster R-CNN思路
從R-CNN到Fast R-CNN,再到本文的Faster R-CNN,目標檢測的四個基本步驟(候選區域生成,特征提取,分類,位置精修)終於被統一到一個深度網絡框架之內。所有計算沒有重復,完全在GPU中完成,大大提高了運行速度。
Faster R-CNN可以簡單地看做“區域生成網絡(RPN)+Fast RCNN“的系統,用區域生成網絡代替Fast R-CNN中的Selective Search方法,網絡結構如下圖。本篇論文着重解決了這個系統中的三個問題:
- 如何設計區域生成網絡
- 如何訓練區域生成網絡
- 如何讓區域生成網絡和Fast R-CNN網絡共享特征提取網絡
步驟如下:
- 首先向CNN網絡【ZF或VGG-16】輸入任意大小圖片$M\times{N}$;
-
經過CNN網絡前向傳播至最后共享的卷積層,一方面得到供RPN網絡輸入的特征圖,另一方面繼續前向傳播至特有卷積層,產生更高維特征圖;
- 供RPN網絡輸入的特征圖經過RPN網絡得到區域建議和區域得分,並對區域得分采用非極大值抑制【閾值為0.7】,輸出其Top-N【文中為300】得分的區域建議給RoI池化層;
- 第2步得到的高維特征圖和第3步輸出的區域建議同時輸入RoI池化層,提取對應區域建議的特征;
- 第4步得到的區域建議特征通過全連接層后,輸出該區域的分類得分以及回歸后的bounding-box。
二 RPN詳解
基本設想是:在提取好的特征圖上,對所有可能的候選框進行判別。由於后續還有位置精修步驟,所以候選框實際比較稀疏。
1、特征提取
RPN還是需要使用一個CNN網絡對原始圖片提取特征。為了方便讀者理解,不妨設這個前置的CNN提取的特征為$51\times{39}\times{256}$,即高為51,寬為39,通道數為256.對這個卷積特征再進行一次卷積計算,保持寬、高、通道數不變,再次得到一個$51\times{39}\times{256}$的特征。
為了方便敘述,先來定義一個“位置”的概念:對於一個$51\times{39}\times{256}$的卷積特征,稱它一共有$51\times{39}$個"位置"。讓新的卷積特征的每一個"位置"都"負責”原圖中對應位置的9種尺寸框的檢測,檢測的目標是判斷框中是否存在一個物體,因此共用$51\times{39}\times{9}$個“框”。在Faster R-CNN原論文中,將這些框都統一稱為"anchor"。
2、候選區域(anchor)
特征可以看做一個尺度$51\times{39}$的256通道圖像,對於該圖像的每一個位置,考慮9個可能的候選窗口:三種面積分別是$128\times{128}$,$256\times{256}$,$512\times{512}$,每種面積又分成3種長寬比,分別是2:1,1:2,1:1 。這些候選窗口稱為anchors。做着就是通過這些anchors引入了檢測中常用到的多尺度方法(檢測各種大小的目標),下圖示出$51\times{39}$個anchor中心,以及9種anchor示例。
對於這$51\times{39}$個位置和$51\times{39}\times{9}$個anchor,下圖展示了接下來每個位置的計算步驟:
- 設$k$為單個位置對應的anchor的個數,此時$k=9$,通過增加一個$3\times{3}$滑動窗口操作以及兩個卷積層完成區域建議功能;
- 第一個卷積層將特征圖每個滑窗位置編碼成一個特征向量,第二個卷積層對應每個滑窗位置輸出$k$個區域得分,表示該位置的anchor為物體的概率,這部分總輸出長度為$2\times{k}$(一個anchor對應兩個輸出:是物體的概率+不是物體的概率)和k個回歸后的區域建議(框回歸),一個anchor對應4個框回歸參數,因此框回歸部分的總輸出的長度為$4\times{k}$,並對得分區域進行非極大值抑制后輸出得分Top-N(文中為300)區域,告訴檢測網絡應該注意哪些區域,本質上實現了Selective Search、EdgeBoxes等方法的功能。
3、框回歸
如圖綠色表示的是飛機的實際框標簽(ground truth),紅色的表示的其中一個候選區域(foreground anchor),即被分類器識別為飛機的區域,但是由於紅色區域定位不准確,這張圖相當於沒有正確檢測出飛機,所以我們希望采用一種方法對紅色的框進行微調,使得候選區域和實際框更加接近:
對於目標框一般使用四維向量來表示$(x,y,w,h)$,分別表示目標框的中心點坐標、寬、高,我們使用$A$表示原始的foreground anchor,使用$G$表示目標的ground truth,我們的目標是尋找一種關系,使得輸入原始的Anchor $A$經過映射到一個和真實框$G$更接近的回歸窗口$G'$,即:
- 給定:$A=(A_x,A_y,A_w,A_h)$,$G=(G_x,G_y,G_w,G_h)$;
- 尋找一種變換$F$,使得$F(A_x,A_y,A_w,A_h)=(G_x',G_y',G_w',G_h')$,其中$(G_x,G_y,G_w,G_h)≈(G_x',G_y',G_w',G_h')$;
那么如何去計算$F$呢?這里我們可以通過平移和縮放實現$F(A)=G'$:
- 平移:
$$G_x'=A_x + A_w\cdot d_x(A)$$
$$G_y'=A_y + A_h\cdot d_y(A)$$
- 縮放:
$$G_w'=A_w\cdot exp(d_w(A))$$
$$G_h'=A_h\cdot exp(d_h(A))$$
上面公式中,我們需要學習四個參數,分別是$d_x(A),d_y(A),d_w(A),d_h(A)$,其中$(A_w\cdot d_x(A),A_w\cdot d_y(A))$表示的兩個框中心距離的偏移量。當輸入的anchor A與G相差較小時,可以認為這種變換是一種線性變換, 那么就可以用線性回歸來建模對目標框進行微調(注意,只有當anchors A和G比較接近時,才能使用線性回歸模型,否則就是復雜的非線性問題了)。
接下來就是如何通過線性回歸獲得$d_x(A),d_y(A),d_w(A),d_h(A)$。線性回歸就是給定輸入的特征向量$X$,學習一組參數$W$,使得線性回歸的輸出$WX$和真實值$Y$的差很小。對於該問題,輸入$X$是特征圖,我們使用$\phi$表示,同時訓練時還需要A到G變換的真實參數值:$(t_x,t_y,t_w,t_h)$;輸出是$d_x(A),d_y(A),d_w(A),d_h(A)$,那么目標函數可以表示為:$$d_*(A)=w_*^T\cdot \phi(A)$$
其中$\phi(A)$是對應anchor的特征圖組成的特征向量,$w$是需要學習的參數,$d(A)$是得到預測值,(*表示$x,y,w,h$,也就是每一個變換對應一個上述目標函數),為了讓預測值$d_x(A),d_y(A),d_w(A),d_h(A)$和真實值差距$t_x,t_y,t_w,t_h$最小,代價函數如下:
$$loss=\sum\limits_{i=1}^{N}(t_*^i - \hat{w}_*^T\cdot \phi(A^i))^2$$
函數優化目標為:
$$w_*=\mathop{\arg\min}_{\hat{w}_*} \sum\limits_{i=1}^{N}(t_*^i - \hat{w}_*^T\cdot \phi(A^i))^2+\lambda \|{\hat{w*}}\|2$$
需要說明,只有在G和A比較接近時,才可近似認為上述線性變換成立,下面對於原文中,A與G之間的平移參數$(t_x,t_y)$和尺度因子$(t_w,t_h)$為:
$$t_x=(G_x-A_x)/A_w$$
$$t_y=(G_y-A_y)/A_h$$
$$t_w=log(G_w/A_w)$$
$$t_h=log(G_h/A_h)$$
對於訓練bouding box regression網絡回歸分支,輸入是特征圖$\phi$,監督信號是A到G的變換參數$(t_x,t_y,t_w,t_h)$,即訓練的目標是:輸入$\phi$的情況下使網絡輸出與監督信號盡可能接近。那么bouding box regression工作時,再輸入$\phi$時,回歸網絡分支的輸出就是每個anchor的平移參數和變換尺度$(t_x,t_y,t_w,t_h)$,顯然即可用來修正anchor位置了。
4、候選框修正
在得到每一個候選區域anchor A的修正參數$(d_x(A),d_y(A),d_w(A),d_h(A))$之后,我們就可以計算出精確的anchor,然后按照物體的區域得分從大到小對得到的anchor排序,然后提出一些寬或者高很小的anchor(獲取其它過濾條件),再經過非極大值抑制抑制,取前Top-N的anchors,然后作為proposals(候選框)輸出,送入到RoI Pooling層。
三 RoI Pooling層
RoI Pooling層負責收集所有的候選框,並計算每一個候選框的特征圖,然后送入后續網絡,從Faster RCNN的結構圖我們可以看到RoI Pooling層有兩個輸入:
- 原始的特征圖;
- RPN網絡輸出的候選框;
1、為何使用RoI Pooling
先來看一個問題:對於傳統的CNN(如AlexNet,VGG),當網絡訓練好后輸入的圖像尺寸必須是固定值,同時網絡輸出也是固定的大小。如果輸入圖像大小不定,這個問題就變得比較麻煩。有2種解決辦法:
- 從圖像中crop一部分傳入網絡;
- 將圖像warp成需要的大小后傳入網絡;
兩種辦法的示意圖如上圖,可以看到無論采取那種辦法都不好,要么crop后破壞了圖像的完整結構,要么warp破壞了圖像原始形狀信息。
回憶RPN網絡生成的proposals的方法:對foreground anchors進行bounding box regression,那么這樣獲得的proposals也是大小形狀各不相同,即也存在上述問題。所以Faster R-CNN中提出了RoI Pooling解決這個問題。不過RoI Pooling是從Spatial Pyramid Pooling發展而來,有興趣的讀者可以自行查閱相關論文。
2、RoI Pooling原理
我們把每一個候選框的特征圖水平和垂直分為pooled_w(文章中為7)和pooled_h(7)份,對每一份進行最大池化處理,這樣處理后,即使大小不一樣的候選區,輸出大小都一樣,實現了固定長度的輸出:
然后我們把Top-N個固定輸出($7\times{7}=49$)連接起來,組成特征向量,大小為$Top-N\times{49}$,這里可以把Top-N看做樣本數,49看做每一個樣本的特征維數,送入全連接層。
四 分類和框回歸
通過RoI Pooling層我們已經得到所有候選區組成的特征向量,然后送入全連接層和softmax計算每個候選框具體屬於哪個類別,輸出類別的得分;同時再次利用框回歸獲得每個候選區相對實際位置的偏移量預測值,用於對候選框進行修正,得到更精確的目標檢測框。
這里我們來看看全連接層,由於全連接層的參數$w$和$b$大小都是固定大小的,假設大小為$49\times26$,那么輸入向量的維度就要為$Top-N\times{49}$,所以這就說明了RoI Pooling的重要性。
五 訓練
Faster R-CNN使用RPN生成候選框后,剩下的網絡結構和Fast R-CNN中的結構一模一樣。在訓練過程中,需要訓練兩個網絡,一個是RPN網絡,一個是在得到框之后使用的分類網絡。通常的做法是交替訓練,即在一個batch內,先訓練RPN網絡一次,再訓練分類網絡一次。關於訓練的詳細流程可以參考一文讀懂Faster RCNN。
參考文章:
[4]Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
[5]基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN(強烈推薦)
[7]RCNN,Fast RCNN,Faster RCNN 總結
[9]一文讀懂Faster RCNN(這位大佬講的很細、相信這看了這篇文章,對Faster RCNN的實現細節你會有了更深的了解)