[深度學習]Object detection物體檢測之Fast R-CNN(4)
目錄
3.Initializing from pre-trained networks
6.Truncated SVD for faster detection
論文全稱:《Fast R-CNN》
論文地址:https://arxiv.org/pdf/1504.08083.pdf
1.introduction
提出了兩個目前的難題:
首先,必須處理大量候選物件位置(通常稱為“proposal”)。其次,這些候選物件只提供了粗略的定位,必須進行refine以實現精確的定位。這些問題的解決方案通常會影響速度、準確性或簡易性。
本論文提出了一種single stage的訓練演算法,該演算法共同學習對目標proposal進行分類並refine其空間位置。
論文首先批鬥了R-CNN和SPPNet的缺點。
對於R-CNN:
- Training is a multi-stage pipeline 訓練是一個多級管道
- Training is expensive in space and time 訓練時間和空間的消耗都很大
- Object detection is slow 檢測速度很慢
這種慢是因為沒有共享計算資源,不斷的重複計算可能重疊的部分的卷積。雖然SPPNet解決了共享計算的問題,但也有缺點。
對於SPPNet:
- 與R-CNN一樣,訓練是一個多級管道
- 特性也寫入磁碟
- 與R-CNN不同,fine-tuning演算法不能更新spatial pyramid pooling之前的卷積層,固定的卷積層限制了深度網路的準確性。
對比起來Fast R-CNN的優勢在於:
- Higher detection quality (mAP) than R-CNN, SPPnet 更高的準確率
- Training is single-stage, using a multi-task loss 單級管道,多工loss
- Training can update all network layers 即fine-tuning過程也能更新卷積層引數
- 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。
- 首先,最後一個最大池化層被RoI池化層所取代。
- 第二,網路的最後一個fully connetion層和softmax(經過ImageNet1000個分類的訓練)被前面描述的兩個分支層替換(一個完全連線層和softmax超過K + 1類別和特定於類別的邊界框迴歸子層)。
- 第三,網路被修改為獲取兩個資料輸入: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
- State-of-the-art mAP on VOC07, 2010, and 2012
- Fast training and testing compared to R-CNN, SPPnet
- 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對於深層分類器並沒有幫助,甚至輕微地降低準確率。