1. 程式人生 > >Fast R-CNN論文筆記

Fast R-CNN論文筆記

本文分兩個部分,第一個部分是論文的筆記,第二個部分是結合程式碼來看fast-RCNN。

論文部分:

主要是為了對RCNN,SPPnet的效果上的改進,下面簡述了一些RCNN的缺點:

  • Training is a multi-stage pipeline
  • Training is expensive in space and time
  • object detection is slow

對於RCNN(SPPnet也差不多)來說,訓練包括很多個階段:提取特徵、調整CNN網路、訓練SVMs和對bbox做迴歸修整,而且,CNN得到的feature會被寫入到磁碟,會佔用很大的磁碟。

所以,在這裡fast RCNN的主要貢獻:

  • 相比於RCNN和SPPnet,fast RCNN有更高的目標檢測質量(mAP)
  • 訓練是一個單階段的過程,使用了multi-task loss(多工損失)
  • 訓練時可以更新所有網路層
  • 無需磁碟儲存feature的快取

下面是fast RCNN的網路結構:它的輸入有兩部分,一是the entire image,二是a set of object proposals(即候選框的資訊),通過卷積網路,從entire image中提取出feature map,然後,對於每一個object proposal,RoI pooling layer就從feature提取出對應的且fixed-length feature vector,然後這樣得到的每一個feature vector送入到後面的FCs層。

 

網路的細節:

  • RoI pooling layer:RoI pooling layer是將hxw的RoI window平分為HxW個子視窗,然後在子窗口裡最大池化,即取其中的最大值,這樣的操作,會使不論輸入多大的尺寸,輸出都會是一樣的尺寸。paper中使用的是7x7。
  • Initializing from pre-trained networks:一個預訓練的網路來初始化一個fast RCNN需要三個轉換:1、最後一層最大池化被一個RoI層代替和第一個全連線層相容;2、最後一個全連線層和softmax層被前文所述的兄弟層【即上圖所示的softmax層和regressor層】替代;3、網路需要被修改成採用兩個輸入:一個影象列表和這些影象中的RoIs列表。
  • Fine-tuning for detection:在fast RCNN訓練的時候,SGD mini-batches是分層抽樣的,首先採用N張圖片,然後採用對每一張圖片取樣R/N個RoIs。關鍵是在前向和反向計算時,來自同一張圖片的RoIs共享計算和記憶體,這將大大減少一個mini-batch的計算。例如,當N=2,R=128時,這種方法比從128個不同的影象中提取一個RoI的方法要快64倍。這種策略的缺點是可能會減慢訓練的收斂,因為來自同一張圖片的RoIs是相關的。但是在實踐中這種擔憂沒有出現,當N=2,R=128時,比RCNN使用更少的SGD迭代次數得到了更好的效果。
    • Multi-task loss:fast RCNN有兩個輸出,一個是對於每一個RoI類別判斷的離散的概率分佈p=(p_0, p_1, ...,p_k)【k個類別,再加上一個背景】,另一個輸出就是bbox的迴歸偏移 t^k=(t_x^k, t_y^k, t_w^k, t_h^k),下圖是用於多分類任務的損失函式,u是ground-truth class,而v是ground-truth bbox regression target。這裡的L_{cls}應該是log損失函式。

    •  
    • Mini-batch sampling:每個mini-batch來自N=2張圖片,mini-batch size取R=128,也就是每張圖片裡取64個RoIs。25%的RoIs和ground-truth的IoU有至少0.5,剩下的75%RoIs取自最大IoU在[0.1, 0.5)之間的候選區域,代表u=0的背景樣例。訓練時,圖片以0.5的概率採用水平翻轉,不採用其他的資料增強技術。
    • Back-propagation through RoI pooling layers:這一部分推導ROI層前向和反向傳播函式
    • SGD hyper-parameters:分類和迴歸的全連線層分別被初始化為0均值的高斯分佈,標準差分別是0.01和0.001,偏置項初始化為0,learning rate=0.001,30k次迭代後,lr降至0.0001,再訓練10k次。但是訓練大資料時,迭代更多次數,momentum=0.9,weight_decay=0.0005【權重衰減用在正則項】。
  • Scale Invariance:尺度不變性的目標檢測方法 1、蠻力學習法;2、影象金字塔的方法

 

Fast R-CNN detection

  • 對於整張圖片的分類,花在全連線層的時間要遠小於卷積層。而對於檢測任務,當RoIs的數量較大的時候,大約一半的時間都用在計算全連線層。這時,可以對全連線層採用SVD(奇異值分解)的方法, 減少其引數,從而加快運算速度。
  • 一些實驗結果

設計的評估

  • 多工訓練確實對提高performance有幫助
  • 對於尺度不變性,蠻力方法(single)更好,image pyramid(multi-scale)只能帶來少量的mAP的提升,但是卻讓計算時間增加。也驗證了SPPnet中的結果:深度卷積網路善於直接學習尺度不變性。
  • SVMs並不是比softmax更好。

參考:https://zhuanlan.zhihu.com/p/22757861

 

程式碼部分:

GitHub上的fast-RCNN原始碼:https://github.com/rbgirshick/fast-rcnn

可以使用caffe程式碼視覺化工具:http://ethereon.github.io/netscope/#/editor

這裡視覺化的是models檔案下的caffenet【分別還有VGG16中型模型、VGG_CNN_M_1024大型模型】來視覺化,caffenet是Alexnet的一個變體,網路結構的變動主要是調整了pool和norm的位置。