Fast-RCNN
基本實現端對端(除了proposal
階段外),下一步自然就是要把proposal
階段也用CNN
實現(放到GPU
上)。這就出現了Faster-RCNN
,一個完全end-to-end
的CNN
對象檢測模型。
論文提出:網絡中的各個卷積層特徵(feature map
)也可以用來預測類別相關的region proposal
(不需要事先執行諸如selective search
之類的算法),但是如果簡單的在前面增加一個專門提取proposal
的網絡又顯得不夠優雅,所以最終把region proposal提取和Fast-RCNN部分融合進了一個網絡模型 (區域生成網絡 RPN層),雖然訓練階段仍然要分多步,但是檢測階段非常方便快捷,準確率也與原來的Fast-RCNN
相差不多,從此,再也不用擔心region proposal
提取耗時比實際對象檢測還多這種尷尬場景了。(faster RCNN可以大致看做“區域生成網絡+fast RCNN“的系統,用區域生成網絡代替fast RCNN中的Selective Search方法)
區域生成網絡 ( Region Proposal Networks )
分析:
如何訓練出一個網絡來替代selective search
相類似的功能呢?
論文借鑑SPP
和ROI
中的思想,在feature map
中提取proposal
。 先通過對應關係把feature map
的點映射回原圖(參看:原始圖片中的ROI如何映射到到feature map?),在每一個對應的原圖設計不同的固定尺度窗口(bbox
),根據該窗口與ground truth
的IOU
給它正負標籤,讓它學習裏面是否有object
,這樣就訓練一個網絡(Region Proposal Network
)。
由於我們只需要找出大致的地方,無論是精確定位位置還是尺寸,後面的工作都可以完成,作者對bbox
做了三個固定:固定尺度變化(三種尺度),固定scale ratio變化(三種ratio),固定採樣方式(只在feature map的每個點在原圖中的對應ROI上採樣,反正後面的工作能進行調整) 。如此就可以降低任務複雜度。
可以在特徵圖上提取proposal
之後,網絡前面就可以共享卷積計算結果(SPP
減少計算量的思想)。這個網絡的結果就是卷積層的每個點都有有關於k
個achor boxes
的輸出,包括是不是物體,調整box
相應的位置。
具體過程:
- 得到最終用來預測的
feature map
:圖片在輸入網絡後,依次經過一系列conv+relu
(套用ImageNet
上常見的分類網絡即可, 本論文實驗了5層的ZF
,16層的VGG-16
)得到的feature map
,額外添加一個conv+relu
層,輸出51*39*256
維特徵(feature map
)。準備後續用來選取proposal
,並且此時座標依然可以映射回原圖。 - 計算
Anchors
: 在feature map
上的每個特徵點預測多個region proposals
。具體作法是:把每個特徵點映射回原圖的感受野的中心點當成一個基準點,然後圍繞這個基準點選取k
個不同scale
、aspect ratio
的anchor
。論文中3個scale
(三種面積),3個aspect ratio
({1:1,1:2,2:1}
)。
-
關於正負樣本的劃分: 考察訓練集中的每張圖像(含有人工標定的
ground true box
)的所有anchor
(N*M*k
)-
a. 對每個標定的
ground true box
區域,與其重疊比例最大的anchor
記爲 正樣本 (保證每個ground true
至少對應一個正樣本anchor
) -
b. 對a)剩餘的
anchor
,如果其與某個標定區域重疊比例大於0.7,記爲正樣本(每個ground true box
可能會對應多個正樣本anchor
。但每個正樣本anchor
只可能對應一個grand true box
);如果其與任意一個標定的重疊比例都小於0.3,記爲負樣本。 -
c. 對a),b)剩餘的
anchor
,棄去不用。 -
d. 跨越圖像邊界的
anchor
棄去不用。
-
-
定義損失函數:對於每個
anchor
,首先在後面接上一個二分類softmax
,有2個score
輸出用以表示其是一個物體的概率與不是一個物體的概率,然後再接上一個bounding box
的regressor
輸出代表這個anchor
的4個座標位置,因此RPN
的總體Loss
函數可以定義爲 :
-
表示第個
anchor
,當anchor
是正樣本時 ,是負樣本則=0 。表示 一個與正樣本anchor
相關的ground true box
座標 (每個正樣本anchor
只可能對應一個ground true box
: 一個正樣本anchor
與某個grand true box
對應,那麼該anchor
與ground true box
的IOU
要麼是所有anchor
中最大,要麼大於0.7) -
分別表示
box
的中心座標和寬高,分別表示predicted box
,anchor box
, andground truth box
(同理)。表示predict box
相對於anchor box
的偏移,表示ground true box
相對於anchor box
的偏移,學習目標自然就是讓前者接近後者的值。
- 其中是:
-
表示這些
regressor
的loss
指針對正樣本而言,因爲負樣本時該項被消去。 -
是關於兩種類別 (
object vs. not object
) 的log loss
。
訓練:正負樣本的選擇,文中提到如果對每幅圖的所有anchor
都去優化loss function
,那麼最終會因爲負樣本過多導致最終得到的模型對正樣本預測準確率很低(It is possible to optimize for the loss functions of all anchors, but this will bias towards negative samples as they are dominate
)。
-
訓練
RPN
:文中提到如果每幅圖的所有anchor
都去參與優化loss function
,那麼最終會因爲負樣本過多導致最終得到的模型對正樣本預測準確率很低。因此在每幅圖像中隨機採樣256個anchors
去參與計算一次mini-batch
的損失。正負比例1:1
(如果正樣本少於128則補充採樣負樣本)
注意點:
- 在到達全連接層之前,卷積層和
Pooling
層對圖片輸入大小其實沒有size
的限制,因此RCNN
系列的網絡模型其實是不需要實現把圖片resize
到固定大小的; - n=3看起來很小,但是要考慮到這是非常高層的
feature map
,其size
本身也沒有多大,因此3×3
9個矩形中,每個矩形窗框都是可以感知到很大範圍的。
Sharing Features for RPN and Fast R-CNN
前面已經討論如何訓練提取proposal
的RPN
,分類採用Fast R-CNN
。如何把這兩者放在同一個網絡結構中訓練出一個共享卷積的Multi-task
網絡模型?
我們知道,如果是分別訓練兩種不同任務的網絡模型,即使它們的結構、參數完全一致,但各自的卷積層內的卷積核也會向着不同的方向改變,導致無法共享網絡權重,論文作者提出了三種可能的方式:
-
Alternating training
:此方法其實就是一個不斷迭代的訓練過程,既然分別訓練RPN
和Fast-RCNN
可能讓網絡朝不同的方向收斂,a) 那麼我們可以先獨立訓練RPN
,然後用這個RPN
的網絡權重對Fast-RCNN
網絡進行初始化並且用之前RPN
輸出proposal
作爲此時Fast-RCNN
的輸入訓練Fast R-CNN
。b) 用Fast R-CNN
的網絡參數去初始化RPN
。之後不斷迭代這個過程,即循環訓練RPN
、Fast-RCNN
。 -
Approximate joint training
:這裏與前一種方法不同,不再是串行訓練RPN
和Fast-RCNN
,而是嘗試把二者融入到一個網絡內,具體融合的網絡結構如下圖所示,可以看到,proposals
是由中間的RPN
層輸出的,而不是從網絡外部得到。需要注意的一點,名字中的"approximate"
是因爲反向傳播階段RPN
產生的cls score
能夠獲得梯度用以更新參數,但是proposal
的座標預測則直接把梯度捨棄了,這個設置可以使backward
時該網絡層能得到一個解析解(closed results
),並且相對於Alternating traing
減少了25-50%的訓練時間。(此處不太理解: 每次mini-batch
的RPN
輸出的proposal box
座標信息固定,讓Fast R-CNN
的regressor
去修正位置?) -
Non-approximate training
:上面的Approximate joint training
把proposal
的座標預測梯度直接捨棄,所以被稱作approximate
,那麼理論上如果不捨棄是不是能更好的提升RPN
部分網絡的性能呢?作者把這種訓練方式稱爲“ Non-approximate joint training”
,但是此方法在paper
中只是一筆帶過,表示“This is a nontrivial problem and a solution can be given by an “RoI warping” layer as developed in [15], which is beyond the scope of this paper”
,
上面說完了三種可能的訓練方法,可非常神奇的是作者發佈的源代碼裏卻用了另外一種叫做4-Step Alternating Training
的方法,思路和迭代的Alternating training
有點類似,但是細節有點差別:
- 第一步:用
ImageNet
模型初始化,獨立訓練一個RPN
網絡; - 第二步:仍然用
ImageNet
模型初始化,但是使用上一步RPN
網絡產生的proposal
作爲輸入,訓練一個Fast-RCNN
網絡,至此,兩個網絡每一層的參數完全不共享; - 第三步:使用第二步的
Fast-RCNN
網絡參數初始化一個新的RPN
網絡,但是把RPN
、Fast-RCNN
共享的那些卷積層的learning rate
設置爲0,也就是不更新,僅僅更新RPN
特有的那些網絡層,重新訓練,此時,兩個網絡已經共享了所有公共的卷積層; - 第四步:仍然固定共享的那些網絡層,把
Fast-RCNN
特有的網絡層也加入進來,形成一個unified network
,繼續訓練,fine tune Fast-RCNN
特有的網絡層,此時,該網絡已經實現我們設想的目標,即網絡內部預測proposal
並實現檢測的功能。