Faster R-CNN

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(三種面積left{ 128^2, 256^2, 521^2  right}),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 輸出用以表示其是一個物體的概率與不是一個物體的概率 (p_i),然後再接上一個bounding box的regressor 輸出代表這個anchor的4個坐標位置(t_i),因此RPN的總體Loss函數可以定義為 :

    • i表示第i個anchor,當anchor是正樣本時 p_i^* =1 ,是負樣本則=0 。  t_i^* 表示 一個與正樣本anchor 相關的ground true box 坐標 (每個正樣本anchor 只可能對應一個ground true box: 一個正樣本anchor 與某個grand true box對應,那麼該anchor與ground true box 的IOU要麼是所有anchor中最大,要麼大於0.7)

    • x,y,w,h分別表示box的中心坐標和寬高,x,x_a,x^* 分別表示 predicted box, anchor box, and ground truth box (y,w,h同理)t_i 表示predict box相對於anchor box的偏移,t_i^* 表示ground true box相對於anchor box的偏移,學習目標自然就是讓前者接近後者的值。

    • 其中 L_{reg} 是:

    • p_i^* 表示這些regressor的loss指針對正樣本而言,因為負樣本時p_i^*=0該項被消去。
    •  L_{cls} 是關於兩種類別 (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×33×3 9個矩形中,每個矩形窗框都是可以感知到很大範圍的。

Sharing Features for RPN and Fast R-CNN

前面已經討論如何訓練提取proposal的RPN,分類採用Fast R-CNN。如何把這兩者放在同一個網路結構中訓練出一個共享卷積的Multi-task網路模型。

我們知道,如果是分別訓練兩種不同任務的網路模型,即使它們的結構、參數完全一致,但各自的卷積層內的卷積核也會向著不同的方向改變,導致無法共享網路權重,論文作者提出了三種可能的方式:

  1. 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。

  2. 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去修正位置?)

  3. 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有點類似,但是細節有點差別:

  1. 第一步:用ImageNet模型初始化,獨立訓練一個RPN網路;
  2. 第二步:仍然用ImageNet模型初始化,但是使用上一步RPN網路產生的proposal作為輸入,訓練一個Fast-RCNN網路,至此,兩個網路每一層的參數完全不共享;
  3. 第三步:使用第二步的Fast-RCNN網路參數初始化一個新的RPN網路,但是把RPN、Fast-RCNN共享的那些卷積層的learning rate設置為0,也就是不更新,僅僅更新RPN特有的那些網路層,重新訓練,此時,兩個網路已經共享了所有公共的卷積層;
  4. 第四步:仍然固定共享的那些網路層,把Fast-RCNN特有的網路層也加入進來,形成一個unified network,繼續訓練,fine tune Fast-RCNN特有的網路層,此時,該網路已經實現我們設想的目標,即網路內部預測proposal並實現檢測的功能。

參考:

  • RCNN, Fast-RCNN, Faster-RCNN的一些事

  • 目標檢測--從RCNN到Faster RCNN 串燒

  • Focusing on your own Mind :) -> 站在巨人的肩膀上

推薦閱讀:

簡單易懂的自動編碼器
人工智慧vs人類智能小傳——再議阿爾法狗
TensorFlow實現神經網路入門篇
Deep Residual Network 深度殘差網路
深度學習(Deep Learning)基礎概念1:神經網路基礎介紹及一層神經網路的python實現

TAG:神经网络 | 深度学习DeepLearning | 目标检测 |