Faster R-CNN
針對Fast R-CNN的缺陷而提出。由於Fast R-CNN,採用的是Selective Search(SS),測試時的很大一部分時間要耗費在候選區域的提取上。Faster R-CNN正是爲解決這個問題而提出來的。
爲了更好地理解Faster R-CNN,我們先看一下其整體結構,如下圖:
更爲詳細的圖,如下:
通過上圖可以看出,Faster R-CNN主要由四部分組成:
1)卷積層(conv layer),用於提取圖像的特徵,輸入爲整張圖片,輸出爲提取得特徵圖feature maps;
2)RPN網絡(Region Proposal Network),用於生成候選框(region proposal),這個網絡代替了之前得Selective Search,輸入爲圖片(因爲這裏RPN網絡和Fast R-CNN共用同一個CNN,所以這裏輸入也可以認爲是featrue maps),輸出爲多個候選區域;
3)ROI pooling,和Fast R-CNN一樣,將不同大小得輸入轉換爲固定長度的輸出;
4)分類和迴歸,這一層的輸出是最終目的,輸出候選區域所屬的類,和候選區域在圖像中的精確位置。
訓練過程:
- 把整張圖像送入CNN中,進行feature map的提取;
- 用RPN生成Region Proposal,每張圖片生成300個;
- 將Region Proposal映射到最後一層feature map;
- 在ROI pooling層把每個ROI生成固定大小的feature map.
- 利用Softmax Loss和Smooth L1 Loss對分類概率和bounding box迴歸聯合訓練。
測試過程:
1至4同;
5、用softmax Loss探測分類概率;
6、用Smooth L1 Loss探測邊框迴歸;
7、用bounding box迴歸校正原來的Region Proposal,最終生成預測窗口的座標。
1、RPN
通過上述介紹可以知道,Faster R-CNN與Fast R-CNN最大的區別就是提出了一個叫RPN(Region Proposal Networks)的網絡,專門用來提取候選框,RPN可以理解爲一種全卷積網絡,該網絡可以進行end-to-end的訓練,最終目的是爲了候選框的提取,如下圖所示:
原文中RPN網絡爲CNN後面接一個3*3的卷積層,後面再接兩個1*1的卷積層,其中一個是用來給softmax層進行分類,另一個用於給候選區域精確定位。
通過CNN得到的feature map怎麼可以通過RPN得到與原圖對應的候選區域呢?換句話說,RPN輸出的候選區域和softmax的結構怎麼與原圖中的區域進行對應的?要解決這個疑問就得先理解anchor得概念。
2、Anchors
anchors可以理解爲一些預先定義好的框框,anchors的種類用k表示,原文中k=9,由3種面積(128*128,256*256,512*512)和3種長寬比(1:1,1:2,2:1)組成,這裏anchors的大小選取是根據檢測時的圖像定義,在檢測時會將最小邊縮放到600,最大邊不超過1000。生成的anchors如下:
1 [[ -84. -40. 99. 55.]
2 [-176. -88. 191. 103.]
3 [-360. -184. 375. 199.]
4 [ -56. -56. 71. 71.]
5 [-120. -120. 135. 135.]
6 [-248. -248. 263. 263.]
7 [ -36. -80. 51. 95.]
8 [ -80. -168. 95. 183.]
9 [-168. -344. 183. 359.]]
因爲提出的候選框區域是在原圖上的區域,所以要清楚anchors在原圖中的位置。假設CNN得到的featuremap大小爲w*h,那總的anchors個數爲9*w*h,9爲上述的9種anchors。假設原圖大小爲W∗H,由SPP-net文章詳細解讀知W=S⋅w,H=S⋅s,S爲之前所有層的stride size相乘,所以feature map上的點乘以S即爲anchors的原點位置,得到所有框的原點位置以及大小就可以得到原圖上的anchors區域了。
那麼RPN的輸出與anchors是什麼關係呢?通過下圖進行討論。
- 在原文中使用的是ZF 網絡,其中Conv layer中最後的conv5層num_output=256,對應生成256張特徵圖(feature map),所以相當於feature map每個點都是256-dimension;
- 在conv5之後,做了rpn_conv 3*3卷積且num_output=256,相當於每個點又融合了周圍3*3的空間信息,同時256-d不變;
- 假設在conv5 的feature map中每個點上有k個anchor(原文中k=9),而每個anchor要分foreground和background,所以每個點由256d feature轉化爲cls=2k scores;而每個anchor都有[x,y,w,h]對應4個偏移量,所以reg=4k coordinates(scores和coordinates爲RPN的最終輸出);
- 補充一點,全部anchors拿去訓練太多了,訓練程序會在合適的anchors中隨機選取128個postive anchors + 128個negative anchors進行訓練(至於什麼是合適的anchors,請看下面的RPN訓練)
3、RPN訓練
RPN訓練中對於正樣本文章中給出兩種定義。第一,與ground truth box有最大的IoU的anchors作爲正樣本;第二,與ground truth box的IoU大於0.7的作爲正樣本。文中採用的是第一種方式。文中定義的負樣本爲與ground truth box的IoU小於0.3的樣本。
訓練RPN的loss函數定義如下:
其中,i表示mini-batch中第i個anchor,Pi表示第i個anchor是前景的概率,當第i個anchor是前景時爲1,反之爲0,ti表示預測的bounding box的座標,爲ground truth的座標。
看過Fast R-CNN文章詳細解讀文章的會發現,這部分的loss函數和Fast R-CNN一樣,除了正負樣本的定義不一樣,其他表示時一樣的。
4、RPN網絡與Fast R-CNN網絡的權值共享
RPN最終的目的是得到候選區域,但在目標檢測的最終目的是爲了得到最終的物體的位置和相應的概率,這部分功能由Fast R-CNN做的。因爲RPN和Fast R-CNN都會要求利用CNN網絡提取特徵,所以文章的做法是使用RPN和Fast R-CNN共享同一個CNN部分。
一個是迭代的,先訓練RPN,然後使用得到的候選區域訓練Fast R-CNN,之後再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次訓練RPN(這裏不更新CNN,僅更新RPN特有的層),最後再次訓練Fast R-CNN(這裏不更新CNN,僅更新Fast R-CNN特有的層)。
還有一個更爲簡單的方法,就是end-to-end的訓練方法,將RPN和Fast R-CNN結合起來一起訓練,tf版本的代碼有這種方式的實現。