CAFFE玩了也有段時間了,現在開始准備研究一下物體檢測,現在知道的有RCNN、spp-net、Fast-RCNN和Faster-RCNN,作為菜鳥我還是從頭學習,決定先看RCNN,因為有項目要做還要上課,可能得用一段時間才能看完,慢慢寫,開始以翻譯為主,以后有自己的想法了再慢慢更新,如果有理解錯誤的地方還希望各位博客園的大神指教--這也是我第一次用博客園,紀念一下,順便熟悉一下怎么用
論文全稱《Rich feature hierarchies for accurate object detection and semantic segmentation》
鏈接:http://www.cs.berkeley.edu/~rbg/papers/r-cnn-cvpr.pdf
源碼的地址:http://www.cs.berkeley.edu/˜rbg/rcnn
摘要:這個方法結合了兩個關鍵的見解,1:使用一個高容量的卷積神經網絡將region proposals自底而上的傳播,用來定位和分割目標,2:如果有標簽的訓練數據比較少,可以使用訓練好的參數作為輔助,進行fine-tuning,能夠得到非常好的識別效果提升。因為該方法是將region proposals和CNN相結合的,所以叫做RCNN。
引文:
不同於圖像分類,檢測需要在圖片中定位物體。一個方法是將幀定位視作一個回歸問題(Szegedy的工作表明這個方法不太好);另一個可替代的方法是使用滑動窗口探測器,通過這種方法使用CNNs至少已經有20年的時間了,通常用於一些特定的種類如人臉,行人等,為了保證較高的空間分辨率,這些CNNs通常只有兩個卷積層和池化層。作者也考慮過使用一個滑動窗口的方法,然而由於更深的網絡,更大的輸入圖片和滑動步長,使得使用滑動窗口來定位的方法充滿了挑戰。
作者通過在recongnition using regions操作的方法來解決CNN的定位問題,這個方法在目標檢測和語義分割中都取得了成功。測試階段,這個方法對每一個輸入的圖片產生近2000個不分種類的“region proposals,使用CNNs從每個region proposals”中提取一個固定長度的特征向量,然后對每個region proposal提取的特征向量使用特定種類的線性SVM進行分類。作者使用了仿射圖像變形的方法來對每個不同形狀的region proposals產生一個固定長度的CNN輸出的特征向量。具體的流程圖如下:
在檢測中面臨的第二個挑戰時目前可用的有標簽的數據是遠遠不夠來訓練一個大的CNN網絡的。對於這個問題,比較方便的解決辦法是先使用無監督的方式進行預訓練,再使用試用有標簽的數據進行fine-tuning。這篇文章貢獻的第二個原則是表明在一個大的數據集上(ILSVRC)進行有監督的預訓練,然后再在一個小的數據集(PASCAL)上進行特定場合的 fine-tunring是在數據比較小的時候訓練high-capacity CNNs的有效方法。在作者的實驗中,使用fine-tuning可以將准確率提高8個百分點。在提取完特征后使用SVM分類器對每個regin屬於某一類的可能性進行打分,再使用貪婪的非極大值抑制的方法去除多余的框框。
2. 使用RCNN進行目標檢測
整個系統分為三個部分:1.產生不依賴與特定類別的region proposals,這些region proposals定義了一個整個檢測器可以獲得的候選目標2.一個大的卷積神經網絡,對每個region產生一個固定長度的特征向量3.一系列特定類別的線性SVM分類器。
2.1模塊設計
- region proposals 作者指出近幾年有很多的產生region proposals的方法,而RCNN中使用的是【J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selectivesearch for object recognition. IJCV, 2013.】和【X. Wang, M. Yang, S. Zhu, and Y. Lin. Regionlets for generic objectdetection. In ICCV, 2013.】中的方法。
因為研究RCNN的需要,在這里看一下Selective Search的操作流程,其主要功能就是根據一些小的原則,在原圖像上快速自動的生成一些與類別無關的圖像區域
原文鏈接:http://koen.me/research/pub/uijlings-ijcv2013-draft.pdf
選擇性搜索遵循如下的原則:
- 圖片中目標的尺寸不一,邊緣清晰程度也不一樣,選擇性搜索應該能夠將所有的情況都考慮進去,如下圖,最好的辦法就是使用分層算法來實現
- 區域合並的算法應該多元化。初始的小的圖像區域(Graph-Based Image Segmentation得到)可能是根據顏色、紋理、部分封閉等原因得到的,一個單一的策略很難能適應所有的情況將小區域合並在一起,因此需要有一個多元化的策略集,能夠在不同場合都有效。
- 能夠快速計算。
- Feature extraction 對於region proposals的特征提取,作者使用的是caffe框架,所使用的模型是在Imagenet數據集上的Alexnet模型。因為卷積神經網絡要求輸入的圖片都是一樣尺寸的,所以在計算每個region proposals的特征前會對每個region都歸到一樣大227×227,最終每個region都會產生一個4096維的特征向量。關於圖像的縮放,作者使用的最直接的方法,首先將原始的框向周圍增加16的padding,在直接縮放。在附加文件中,作者還指出了其他2中縮放方式,1、是將包圍盒的短邊擴展為和長邊一樣大,使之成為正方形再縮放,這樣做的好處是能保證目標的比例不會變化,2、是將包圍盒兩邊加上圖像均值的padding,再縮放,同樣保證了目標的比例不會變化。
2.2測試階段的檢測
測試階段,使用selective search的方法在測試圖片上提取2000個region propasals ,將每個region proposals歸一化到227x227,然后再CNN中正向傳播,將最后一層得到的特征提取出來。然后對於每一個類別,使用為這一類訓練的SVM分類器對提取的特征向量進行打分,得到測試圖片中對於所有region proposals的對於這一類的分數,再使用貪心的非極大值抑制去除相交的多余的框。非極大值抑制(NMS)先計算出每一個bounding box的面積,然后根據score進行排序,把score最大的bounding box作為選定的框,計算其余bounding box與當前最大score與box的IoU,去除IoU大於設定的閾值的bounding box。然后重復上面的過程,直至候選bounding box為空,然后再將score小於一定閾值的選定框刪除得到一類的結果。作者提到花費在region propasals和提取特征的時間是13s/張-GPU和53s/張-CPU,可以看出時間還是很長的,不能夠達到及時性。
2.3訓練階段
- 有監督預訓練 作者使用caffe框架利用ILSVRC 2012的數據集(imagenet)對網絡模型進行了訓練,使網絡模型中的參數都是經過訓練過的參數,而不是剛開始那樣隨機初始化的參數
- 特定領域的fine-tuning 為了適應不同場合的識別需要,如VOC,對網絡繼續使用從VOC圖片集上對region proposals歸一化后的圖片進行訓練。網絡只需要將最后的1000類的分類層換成21類的分類層(20個VOC中的類別和1個背景類),其他都不需要變。為了保證訓練只是對網絡的微調而不是大幅度的變化,網絡的學習率只設置成了0.001。計算每個region proposal與人工標注的框的IoU,IoU重疊閾值設為0.5,大於這個閾值的作為正樣本,其他的作為負樣本,然后在訓練的每一次迭代中都使用32個正樣本(包括所有類別)和96個背景樣本組成的128張圖片的batch進行訓練(這么做的主要原因還是正樣本圖片太少了)
- 特定類別的分類器 對每個類都訓練一個線性的SVM分類器,訓練SVM需要正負樣本文件,這里的正樣本就是ground-truth框中的圖像作為正樣本,完全不包含的region proposal應該是負樣本,但是對於部分包含某一類物體的region proposal該如何訓練呢,作者同樣是使用IoU閾值的方法,這次的閾值為0.3,計算每一個region proposal與標准框的IoU,小於0.3的作為負樣本,其他的全都丟棄。由於訓練樣本比較大,作者使用了standard hard negative mining method(具體怎么弄的不清楚)來訓練分類器。作者在補充材料中討論了為什么fine-tuning和訓練SVM時所用的正負樣本標准不一樣,以及為什么不直接用卷積神經網絡的輸出來分類而要單獨訓練SVM來分類,作者提到,剛開始時只是用了ImageNet預訓練了CNN,並用提取的特征訓練了SVMs,此時用正負樣本標記方法就是前面所述的0.3,后來剛開始使用fine-tuning時,也使用了這個方法,但是發現結果很差,於是通過調試選擇了0.5這個方法,作者認為這樣可以加大樣本的數量,從而避免過擬合。然而,IoU大於0.5就作為正樣本會導致網絡定位准確度的下降,故使用了SVM來做檢測,全部使用ground-truth樣本作為正樣本,且使用非正樣本的,且IoU大於0.3的“hard negatives”,提高了定位的准確度。
3BoundingBox回歸
為了進一步提高定位的准確度,作者在對各個region proposal打分后,利用回歸的方法重新預測了一個新的矩形框。如上圖所示,通過selective search得到的region proposal可能與ground truth相差較大,盡管這個region proposal可能有很高的分類評分,但對於檢測來說,它依然是不合格的
boundingbox的工作方式借鑒博客http://blog.csdn.net/bixiwen_liu/article/details/53840913的描述
注意:只有當Proposal和Ground Truth比較接近時(線性問題),我們才能將其作為訓練樣本訓練我們的線性回歸模型,否則會導致訓練的回歸模型不work(當Proposal跟GT離得較遠,就是復雜的非線性問題了,此時用線性回歸建模顯然不合理)。這個也是G-CNN: an Iterative Grid Based Object Detector多次迭代實現目標准確定位的關鍵。
線性回歸就是給定輸入的特征向量X,學習一組參數W,使得經過線性回歸后的值跟真實值Y(Ground Truth)非常接近。即。那么Bounding-box中我們的輸入以及輸出分別是什么呢?
輸入:這個是什么?輸入就是這四個數值嗎?其實真正的輸入是這個窗口對應的CNN特征,也就是R-CNN中的Pool5feature(特征向量)。(注:訓練階段輸入還包括 Ground Truth,也就是下邊提到的
)
輸出:需要進行的平移變換和尺度縮放,或者說是
。我們的最終輸出不應該是Ground Truth嗎?是的,但是有了這四個變換我們就可以直接得到Ground Truth,這里還有個問題,根據上面4個公式我們可以知道,P經過
,得到的並不是真實值G,而是預測值
。
的確,這四個值應該是經過 Ground Truth 和Proposal計算得到的真正需要的平移量和尺度縮放
。
這也就是R-CNN中的:
那么目標函數可以表示為是輸入Proposal的特征向量,
是要學習的參數(*表示
,也就是每一個變換對應一個目標函數),
是得到的預測值。我們要讓預測值跟真實值
差距最小,得到損失函數為:
函數優化目標為:
利用梯度下降法或者最小二乘法就可以得到。