Fast R-CNN整体把握
RCNN很好地解決了目標檢測分類和定位的問題。但是缺點是速度太慢。
原因1:2k個候選區域都要經過變形成統一的正方形才能依次輸入CNN進行特征提取。候選區域可能是互相包含的,這就導致原圖同一個特征的重復提取。
原因2:RCNN的分類和回歸是分開的,耗費時間和空間。每個候選區域都要經過相同的CNN和分類+回歸,復雜度與候選區域數量成正比。
如下圖所示,R-CNN先得到約2000個候選區域,對每個候選區域進行warp,特征提取,SVM分類與Bbox的位置回歸。
Ross Girshick在15年推出Fast RCNN。同樣使用最大規模的網絡,FastRCNN和RCNN相比,訓練時間從84小時減少為9.5小時,測試時間從47秒減少為0.32秒。我們看看Fast RCNN是如何解決最開始提到的兩個問題的。
針對問題1
原始做法是先得到原始圖像的ROI,再分別送CNN,改進思路是直接將原圖送入CNN得到feature map,然后再加入候選框的信息,在feature map上得到候選區域映射的patch。這樣就只對圖像進行了一次卷積特征的計算,比RCNN提速100倍。
這樣做又會引入兩個新問題,原始先得到ROI可以通過warp歸一化尺寸控制到全連接時的大小,那現在在特征圖上怎么進行尺寸的歸一化,總不能繼續warp吧?還有,既然是在特征圖上找ROI,那候選區域與特征圖的對應關系如何確定呢?
關于第一點尺寸歸一化的問題,何愷明研究員在2014的論文中將空間金字塔池化Spatial Pyramid Pooling(SPP)結構引入了CNN,使CNN可以處理任意size和scale的圖像。
如上圖所示,在卷積層和全連接層之間加入了SPP layer。此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整bin大小,從右到左三級bin的個數分別是1,4,16,這樣SPP的輸出尺度始終是固定的,是1+4+16維。提取候選區特征和構建金字塔的過程都在ROI Pooling中完成。
為什么bin的個數之和就是輸出的維度呢?因為這一層使用最大池化(max pooling)來將RoI區域轉化成固定大小為HW的特征圖。如下圖,我們可以設定每個候選區域的分塊數,但依然不能保證每一個bin內的大小是一樣的,最大池化就可以簡單理解成求塊內最大值的過程,這樣不管每一個bin是多大,最后都只輸出1個值:最大值。
Fast-RCNN就使用了SPPlayer的變種——RoI pooling層。SPP是金字塔結構,每層的最大池化結果拼接做輸出,但其實金字塔的每層都可以起到歸一化尺寸的目的。RoI pooling層就只使用了金字塔的一層,因為實驗表明多尺度學習只增加了一點點mAP,但是計算量成倍增加。
關于第二點特征圖位置與候選框位置對應關系的問題。這里要引入感受野Receptive Field的概念,表示特征圖中每個像素點源自哪部分原始像素點的加權和。由特征圖是可以倒推出特征圖中每個像素點的感受野的,計算過程受到卷積核填充因子和步長的影響,為了方便計算,設定卷積核尺寸為F時填充大小為F/2,那么映射關系就只與步長S有關:特征圖(0,0)位置對應的感受野中心坐標是(0,0);特征圖(x,y)位置對應的感受野中心坐標是(Sx,Sy)。但現在我們已知的是空域的候選框位置,怎么得到該候選框在特征圖中的位置呢,其實和感受野的顏色關系是差不多的,都是S倍的關系,只不過要根據取整的關系進行正負1的調整:
Given a window in the image domain, we project the left (top) boundary by: x 0 = bx/Sc + 1 and the right (bottom) boundary x 0 = dx/Se ? 1.
?
針對問題2
另外,之前RCNN的處理流程是先提proposal,然后CNN提取特征,之后用SVM分類器,最后再做bbox regression,而在Fast-RCNN中,作者巧妙的把bbox regression放進了神經網絡內部,與region分類和并成為了一個multi-task模型,損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網絡中訓練。實際實驗也證明,這兩個任務能夠共享卷積特征,并相互促進。
既然是多任務,那么損失函數就由兩項構成:一個是分類損失,一個是回歸損失。因為是多分類,理所當然地使用softmax得到該RoI屬于各個標簽的概率,。但是這里沒有使用交叉熵,對于真實標簽,
對于使用回歸來修正Bbox的定位,我們首先要以四元組的形式來表示方框的位置和大小:,回歸損失就是四個維度的損失和:
其中smooth函數:
函數曲線如下:
最終的損失函數:
其中用于平滑分類與回歸的權重,在實驗中取1。[]是艾弗森括號,滿足括號內內容時取1,否則取0(此時RoI類別是背景,沒有定位框,忽略回歸任務)。
Reference:
1.http://shartoo.github.io/RCNN-series/
2.https://blog.csdn.net/shenxiaolu1984/article/details/51036677
3.https://www.cnblogs.com/skyfsm/p/6806246.html
?
總結
以上是生活随笔為你收集整理的Fast R-CNN整体把握的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用ORB/AKAZE特征点进行图像配准
- 下一篇: ❤JavaScript系列6部曲:语法篇