在介紹Fast R-CNN之前我們先介紹一下SPP Net
一、SPP Net
SPP:Spatial Pyramid Pooling(空間金字塔池化)
眾所周知,CNN一般都含有卷積部分和全連接部分,其中,卷積層不需要固定尺寸的圖像,而全連接層是需要固定大小的輸入。
所以當全連接層面對各種尺寸的輸入數據時,就需要對輸入數據進行crop(crop就是從一個大圖扣出網絡輸入大小的patch,比如227×227),或warp(把一個邊界框bounding box的內容resize成227×227)等一系列操作以統一圖片的尺寸大小,比如224*224(ImageNet)、32*32(LenNet)、96*96等。
所以,在R-CNN中,才會將每個Region Proposal縮放成(wrap)成統一的227x227并輸入到CNN。
但warp/crop這種預處理,導致問題要么被拉伸變形,要么物體不全,限制了識別精確度。換句話說,一張16:9的圖片硬是被resize成1:1,你說圖片失真不?
二、SPP Net的特點
1. SPP不在限制輸入圖像的尺度,在最后一個卷積層,接入了金字塔池化,保證傳到下一層全連接層的輸入固定。
簡言之,CNN原本只能固定輸入,固定輸出,CNN加上SPP之后,便能任意輸入、固定輸出。
ROI池化層一般跟在卷積層后面,此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出是固定維數的向量,然后給到全連接FC層。
2. 只對原圖提取一次卷積特征,得到整張圖的卷積特征feature map,然后找到每個候選框在feature map上的映射patch,將次patch作為每個候選框的卷積特征輸入到SPP layer和之后的層,完成特征提取工作。節省了大量的時間,比R-CNN有100倍左右的提速
三、Fast R-CNN
Fast R-CNN就是在R-CNN的基礎上采納了SPP Net的方法,使得性能進一步提高。
與R-CNN相比,Fast R-CNN主要有兩點不同:一是最后一個卷積層加入了ROI pooling layer,二是損失函數使用了多任務損失函數(multi-task loss),將邊框回歸Bounding Box Regression直接加入到CNN網絡中訓練
(1)ROI pooling layer實際上是SPP Net的一個精簡版,SPP Net對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要采樣到一個7x7的特征圖。對于VGG16網絡conv5_3有512個特征圖,這樣所有region proposal對應了一個7*7*512維度的特征向量作為全連接層的輸入。也就是說,它可以把不同大小的輸入映射到一個固定尺度的特征向量。
(2)R-CNN訓練過程分為了三個階段,而Fast R-CNN直接使用了softmax替代SVM分類,同時利用多任務損失函數邊框回歸也加入到網絡中,整個訓練過程就是端到端的(region proposal提取除外)
也就是說,R-CNN的處理流程是先提proposal,然后CNN提取特征,之后用SVM分類器,最后再做box regression。而在Fast R-CNN中,把box regression與region分類合并成multi-task模型,實際實驗也證明,這兩個任務能夠共享卷積特征,并相互促進。
原來的方法:許多候選框(比如2k個)-->CNN-->得到每個候選框的特征-->分類 + 回歸
現在的方法:一張完整的圖片-->CNN-->得到每個候選框的特征-->分類 + 回歸
容易看出,提速的原因在于,不像R-CNN把每個候選區域給深度網絡提特征,而是整張圖提一次特征,再把候選框映射到conv5上,而SPP只需要計算一次特征,剩下的只需要在conv5層上操作就可以了。
性能上的提升也是明顯的:
參考地址:
https://cloud.tencent.com/developer/news/281788
?