(四)目標檢測算法之Fast R-CNN


 

系列博客鏈接:

(一)目標檢測概述 https://www.cnblogs.com/kongweisi/p/10894415.html

(二)目標檢測算法之R-CNN https://www.cnblogs.com/kongweisi/p/10895055.html

(三)目標檢測算法之SPPNet https://www.cnblogs.com/kongweisi/p/10899771.html

 

本文概述:

1、Fast R-CNN

  1.1 RoI pooling

  1.2 End-to-End model

2、多任務損失-Multi-task loss

3、R-CNN、SPPNet、Fast R-CNN效果對比

4、Fast R-CNN總結

 

引言:

SPPNet的性能已經得到很大的改善,但是由於網絡之間不統一訓練,造成很大的麻煩,所以接下來的Fast R-CNN就是為了解決這樣的問題。

1、Fast R-CNN

改進的地方:

  • 提出一個RoI pooling(region of interest即候選區),然后整合整個模型,把CNN、SPP變換層、分類器、bbox回歸幾個模塊一起訓練。

 

步驟

  • 首先將整個圖片輸入到一個基礎卷積網絡,得到整張圖的feature map
  • 將region proposal(RoI)映射到feature map中
  • RoI pooling layer提取一個固定長度的特征向量,每個特征會輸入到一系列全連接層,得到一個RoI特征向量(此步驟是對每一個候選區域都會進行同樣的操作
    • 其中一個是傳統softmax層進行分類,輸出類別有K個類別加上”背景”類(最終得到是N+1類)
    • 另一個是bounding box regressor(邊框回歸)

1.1 RoI pooling

 首先RoI pooling只是一個簡單版本的SPP層,目的是為了減少計算時間並且得出固定長度的向量。

  • RoI池層使用最大池化將任何有效的RoI區域內的特征轉換成具有H×W的固定空間范圍的小feature map,其中H和W是超參數 它們獨立於任何特定的RoI。

 

例如:VGG16 的第一個 FC 層的輸入是 7 x 7 x 512,其中 512 表示 feature map 的層數。在經過 pooling 操作后,其特征輸出維度滿足 H x W。

假設輸出的結果與FC層要求大小不一致,對原本 max pooling 的單位網格進行調整,使得 pooling 的每個網格大小動態調整為 h/H,w/W,

最終得到的特征維度都是 HxWxD。

它要求 Pooling 后的特征為 7 x 7 x512(即要求輸入到 FC 層的特征維度是7 x 7),如果碰巧 ROI 區域只有 6 x 6 大小怎么辦?每個網格的大小取 6/7=0.85 , 6/7=0.85,以長寬為例,

按照這樣的間隔取網格:[0, 0.85, 1.7, 2.55, 3.4, 4.25, 5.1, 5.95],取整后,每個網格對應的起始坐標為:[0, 1, 2, 3, 4, 5, 6]

 

 下面是一整套RoI pooling流程圖:

  • 首先經過卷積層得到的特征圖:

  • 得到候選區:

 因為每個候選區大小不固定,需要提取一個固定長度的特征向量:

  • 這里是用4 x 4的RoI池層(相當於之前說的SPP層的一部分):

  •  最后進行池化:

為什么要設計單個尺度呢?這要涉及到single scale與multi scale兩者的優缺點

 

  • single scale,直接將image定為某種scale,直接輸入網絡來訓練即可。(Fast R-CNN)
  • multi scale,也就是要生成一個金字塔,然后對於object,在金字塔上找到一個大小比較接近227x227的投影版本

 

后者比前者更加准確些,不過沒有突出很多。但是第一種時間要省很多,所以實際采用的是第一個策略,因此Fast R-CNN要比SPPNet快很多也是因為這里的原因。

 

 

1.2 End-to-End model ( 端對端模型 )

從輸入端到輸出端直接用一個神經網絡相連,整體優化目標函數。

接着我們來看為什么后面的整個網絡能進行統一訓練?

特征提取CNN的訓練和SVM分類器的訓練在時間上是先后順序,兩者的訓練方式獨立,因此SVMs的訓練Loss無法更新SPP-Layer之前的卷積層參數,去掉了SVM分類這一過程,所有特征都存儲在內存中,不占用硬盤空間,形成了End-to-End模型(生成Region proposal除外,end-to-end在Faster-RCNN中得以完善)

  • 使用了softmax分類
  • RoI pooling能進行反向傳播,SPP層不適合(這里的原因本人也不是很清楚,可以百度感受野相關的知識進一步了解)

 

2、 多任務損失-Multi-task loss

兩個loss,分別是:

  • 對於分類loss,是一個N+1維的softmax輸出,其中的N是類別個數,1是背景,使用交叉熵損失

    之所以要N+1類,是因為region proposal 會被標記為0,什么都沒有,會什么類別都不是,因此最后一層神經元要 N+1 個。

 

 

  • 對於回歸loss,是一個4xN維輸出的regressor,也就是說對於每個類別都會訓練一個單獨的regressor,使用平均絕對誤差(MAE)損失即L1損失

    這里訓練的就是邊框對應的4個坐標,左上角一對坐標,右下角一對坐標

 

 

3、R-CNN、SPPNet、Fast R-CNN效果對比

參數 R-CNN SPPNet Fast R-CNN
訓練時間(h) 84 25 9.5
測試時間/圖片 47.0s 2.3s 0.32s
mAP 66.0 63.1 66.9

 

 

 

 

 

 

 

 

 

其中有一項指標為mAP,這是一個對算法評估准確率的指標,mAP衡量的是學出的模型在所有類別上的好壞。

 

4、Fast R-CNN總結

缺點:

  • 使用Selective Search提取Region Proposals,沒有實現真正意義上的端對端,操作也十分耗時(下一節Faster R-CNN會改善)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM