1. 程式人生 > >[深度學習]Object detection物體檢測之Fast R-CNN(4)

[深度學習]Object detection物體檢測之Fast R-CNN(4)

目錄

1.introduction

2.The RoI pooling layer

3.Initializing from pre-trained networks

4.Fine-tuning for detection

5.Multi-task loss

6.Truncated SVD for faster detection

7.Result

8.Design evaluation


論文全稱:《Fast R-CNN》

論文地址:https://arxiv.org/pdf/1504.08083.pdf

1.introduction

提出了兩個目前的難題:

首先,必須處理大量候選物件位置(通常稱為“proposal”)。其次,這些候選物件只提供了粗略的定位,必須進行refine以實現精確的定位。這些問題的解決方案通常會影響速度、準確性或簡易性。

本論文提出了一種single stage的訓練演算法,該演算法共同學習對目標proposal進行分類並refine其空間位置。

論文首先批鬥了R-CNN和SPPNet的缺點。

對於R-CNN:

  1. Training is a multi-stage pipeline 訓練是一個多級管道
  2. Training is expensive in space and time 訓練時間和空間的消耗都很大
  3. Object detection is slow 檢測速度很慢

這種慢是因為沒有共享計算資源,不斷的重複計算可能重疊的部分的卷積。雖然SPPNet解決了共享計算的問題,但也有缺點。

對於SPPNet:

  1. 與R-CNN一樣,訓練是一個多級管道
  2. 特性也寫入磁碟
  3. 與R-CNN不同,fine-tuning演算法不能更新spatial pyramid pooling之前的卷積層,固定的卷積層限制了深度網路的準確性。

對比起來Fast  R-CNN的優勢在於:

  1.  Higher detection quality (mAP) than R-CNN, SPPnet 更高的準確率
  2.  Training is single-stage, using a multi-task loss 單級管道,多工loss
  3.  Training can update all network layers 即fine-tuning過程也能更新卷積層引數
  4. No disk storage is required for feature caching 不需要額外的儲存空間來存放feature

那麼Fast R-CNN的結構就是下圖這樣:

首先將整張圖片作為卷積網路的輸入得到feature map,根據regions of interest 的對映關係在卷積後的feature map上針對每一個region的feature map進行RoI pooling,得到一個固定大小的feature vector,再把它作為fully connetion的輸入。網路最後有兩個分支輸出,一個關於是softmax的分類概率輸出(包括K+1類,其中+1代表背景類),一個是關於bounding-box的定位輸出(為了定位的refine)。值得注意的是,這裡所有的候選框依然是由selective search方法生成。

2.The RoI pooling layer

其實跟SPPNet裡面的spatial pyramid pooling layer大同小異。他們都是對於輸入的size沒有要求,可以是任意大小,但是輸出是固定了(例如7**7)。RoI pooling layer和spatial pyramid pooling layer區別在於前者是多個pyramid level後者只有一個。

3.Initializing from pre-trained networks

使用ImageNet的pre-trained networks需要經過三個變換才能作為Fast R-CNN的networks。

  1. 首先,最後一個最大池化層被RoI池化層所取代。
  2. 第二,網路的最後一個fully connetion層和softmax(經過ImageNet1000個分類的訓練)被前面描述的兩個分支層替換(一個完全連線層和softmax超過K + 1類別和特定於類別的邊界框迴歸子層)。
  3. 第三,網路被修改為獲取兩個資料輸入:image列表和這些image中的RoIs列表。

4.Fine-tuning for detection

這裡解釋了為什麼SPPnet無法更新空間金字塔池層以上(卷積層)的權重。其根本原因是SPPNet的反向傳播效率非常低,因為這些RoI都是來自不同的影象。這也是SPPNet和R-CNN所訓練的方式。舉例來說就是,從多張圖片抽取一個RoI訓練,那麼這些RoI是來自不同的image的。同時這也是因為每個RoI都可能有一個非常大的接受域,通常橫跨整個輸入影象。由於前進通道必須處理整個接受域,所以訓練輸入很大(通常是整個影象)。簡單點說就是輸入太大了,根本沒有達到分類某一個類別的要求,很多輸入都是一整張的輸入訓練出來的networks效果可想而知。

而論文提出了一個feature sharing共享特徵的訓練方法。他們使用sampled hierarchically分層取樣的SGD訓練方式,先採樣image,再取樣image相關的RoIs。關鍵是,同一影象的RoIs在前後傳遞中共享計算和記憶體。與SPPNet和R-CNN從多張圖片抽取一個RoI訓練,Fast R-CNN是從同一張圖片抽取不同的RoI訓練。

但是這麼做可能會導致收斂很慢,因為同一張image裡的RoI是關聯的,論文裡說在實驗裡沒有表現出收斂慢。

除了使用層級取樣,還使用一個流線型的訓練過程和一個fine-tuning階段,聯合優化softmax分類器和邊界框迴歸器,而不是在三個單獨的階段訓練softmax分類器、SVMs和邊界框迴歸器。

5.Multi-task loss

左半部分是分類的loss,右半部分是邊界框的loss。λ是平衡兩個loss哪個更重要的因子,但本論文實驗都是設為1.u>=1的含義是隻計算不包括背景的分類的邊界框的loss,u =0是背景類。

具體左半部分:跟以前的分類問題一樣。

具體右半部分:t和v分別是預測框和真實框的(左上定點x座標,左上定點y座標,寬度,長度),smooth函式就是一個更魯棒的L1損失函式,沒有L2那麼敏感(SPPNet和R-CNN使用L2損失函式

6.Truncated SVD for faster detection

在detection的時候由於有很多個region proposals,大部分的時間都浪費在了最後的全連線層,通過使用截斷的SVD壓縮大型完全連線層,可以很容易地加快它們的速度。這一部分可以參考https://blog.csdn.net/zhongkejingwang/article/details/43053513

主要思想是對全連線的W降維,減少計算量。

7.Result

  1. State-of-the-art mAP on VOC07, 2010, and 2012 
  2. Fast training and testing compared to R-CNN, SPPnet
  3. Fine-tuning conv layers in VGG16 improves mAP

結果就不貼出來了,具體可以檢視論文。

8.Design evaluation

論文最後探討了一些問題,包括:

Does multi-task training help?多工訓練有效果嗎?

實驗結果表明多工效果更好。

Scale invariance: to brute force or finesse?縮放不變性:是使用單一尺度法還是多尺度?

實驗結果表明對於很深的model單尺度會更好(他們的gpu在Largemodel下記憶體不夠了),多尺度方法只提供了少量mAP的增加,而成本很高。綜合考慮時間和算力還是決定使用單尺度。

Do SVMs outperform softmax?使用SVMs還是softmax?

與one-vs-rest SVMs不同,softmax在評價RoI時引入了類之間的競爭。但是這種提高很小。

Are more proposals always better?更多的候選框會更好嗎?

以下實驗表明,用更多的proposals對於深層分類器並沒有幫助,甚至輕微地降低準確率。