Fast RCNN筆記

 

參考:

https://blog.csdn.net/u011501388/article/details/81031780

https://blog.csdn.net/forever__1234/article/details/79919994

https://www.cnblogs.com/CZiFan/p/9903518.html

 

背景

        經典的R-CNN存在以下幾個問題:

  • 訓練分多步驟(先在分類數據集上預訓練,再進行fine-tune訓練,然後再針對每個類別都訓練一個線性SVM分類器,最後再用regressors對bounding box進行迴歸,並且bounding box還需要通過selective search生成)
  • 時間和空間開銷大(在訓練SVM和迴歸的時候需要用網絡訓練的特徵作爲輸入,特徵保存在磁盤上再讀入的時間開銷較大)
  • 測試比較慢(每張圖片的每個region proposal都要做卷積,重複操作太多)

  在Fast RCNN之前提出過SPPnet來解決R-CNN中重複卷積問題,但SPPnet仍然存在與R-CNN類似的缺陷:

  • 訓練分多步驟(需要SVM分類器,額外的regressors)
  • 空間開銷大

  因此,該文提出的Fast RCNN便是解決上述不足,在保證效果的同時提高效率。基於VGG16的Fast RCNN模型在訓練速度上比R-CNN快大約9倍,比SPPnet快大約3倍;測試速度比R-CNN快大約213倍,比SPPnet快大約10倍,在VOC2012數據集上的mAP大約爲66%

 

 

 

Fast R-CNN是在R-CNN的基礎上進行的改進,大致框架是一致的。總體而言,Fast R-CNN相對於R-CNN而言,主要提出了三個改進策略:
1. 提出了RoIPooling,避免了對提取的region proposals進行縮放到224x224,然後經過pre-trained CNN進行檢測的步驟,加速了整個網絡的learning與inference過程,這個是巨大的改進,並且RoIPooling是可導的,因此使得整個網絡可以實現end-to-end learning,這個可以認爲是Fast R-CNN相對於R-CNN最大的改進之處。
2. 採用了Multi-task loss進行邊框迴歸,這個在R-CNN中也有這方面的實驗。

3. 利用了截斷的奇異值分解(Truncated SVD for faster detection)加速了網絡。
 

 

 

FCN全卷積

ROI Pooling的解釋見IOUnet筆記。

首先是讀入一張圖像,這裏有兩個分支,一路送入卷積層輸出 feature maps,另一路通過selective search提取region proposals(注意,Fast R-CNN論文中並沒有明確說明使用selective search提取region proposals,但是Fast R-CNN是基於R-CNN的,姑且默認採用selective search),提取的每個region proposal 都有一個對應的Ground-truth Bounding Box和Ground-truth class label。其中每個region proposals用四元數組進行定義,即(r, c, h, w),即窗口的左上行列座標與高和寬。注意,這裏的座標均是對應原圖像的,而不是輸出的feature maps。因此,還需要把原圖像的座標系映射到feature maps上。這一點也很簡單,比如採用的是pre-trained 網絡模型爲VGG16的話,RoIPooling替換掉最後一個max pooling層,則原圖像要經過4個max pooling層,輸出的feature maps是原圖像的1/16,因此,將原圖像對應的四元數組轉換到feature maps上就是每個值都除以16,並量化到最接近的整數。那麼將region proposal的四元組座標映射到feature maps上之後接下幹什麼呢?接下來就是把region proposal窗口框起來的那部分feature maps輸入到RoIPooling(R-CNN是將其縮放到224x224,然後送入經過Fine-tuning的網絡模型),得到固定大小的輸出maps。

  • 輸入是224×224224×224的固定大小圖片
  • 經過5個卷積層+2個降採樣層(分別跟在第一和第二個卷積層後面)(要暈了,到底是幾個降採樣層哦???)
  • 進入ROIPooling層(其輸入是conv5層的輸出和region proposal,region proposal個數大約爲2000個)
  • 再經過兩個output都爲4096維的全連接層
  • 分別經過output各爲21和84維的全連接層(並列的,前者是分類輸出,後者是迴歸輸出)
  • 最後接上兩個損失層(分類是softmax,迴歸是smoothL1,原RCNN是smoothL2)

ROIPooling

       由於region proposal的尺度各不相同,而期望提取出來的特徵向量維度相同,因此需要某種特殊的技術來做保證。ROIPooling的提出便是爲了解決這一問題的。其思路如下:

  • 將region proposal劃分爲H×W大小的網格
  • 對每一個網格做MaxPooling(即每一個網格對應一個輸出值)
  • 將所有輸出值組合起來便形成固定大小爲H×W的feature map

訓練樣本

  訓練過程中每個mini-batch包含2張圖像和128個region proposal(即ROI,64個ROI/張),其中大約25%的ROI和ground truth的IOU值大於0.5(即正樣本),且只通過隨機水平翻轉進行數據增強。

損失函數

改進全連接層

  由於卷積層計算針對的是一整張圖片,而全連接層需要對每一個region proposal都作用一次,所以全連接層的計算佔網絡計算的將近一半(如下圖)。作者採用SVD來簡化全連接層計算。

訓練整體架構總結

 測試整體架構總結

 

改進

  • 卷積不再是重複對每一個region proposal,而是對於整張圖像先提取了泛化特徵(feature maps),這樣子減少了大量的計算量(注意到,R-CNN中對於每一個region proposal做卷積會有很多重複計算)
  • ROIPooling的提出,巧妙的解決了尺度放縮的問題(將不同大小的ROI統一至一個尺寸)
  • 將regressor放進網絡一起訓練,同時用softmax代替SVM分類器,更加簡單高效

不足

  region proposal的提取仍然採用selective search,整個檢測流程時間大多消耗在這上面(生成region proposal大約2~3s,而特徵提取+分類只需要0.32s),之後的Faster RCNN的改進之一便是此點。

 

作者通過實驗發現的點:

  • 數據集更大而使得模型效果提高很多
  • 深度卷積網絡可以學習尺度不變性:多尺度表示輸入圖像採用多種尺度輸入,在測試的時候發現多尺度雖然能在mAP上得到些許提升但也增加了時間開銷。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章