Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.
繼2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,構思精巧,流程更為緊湊,大幅提升了目標檢測的速度。在Github上提供了源碼。
之所以提出Fast R-CNN,主要是因為R-CNN存在以下幾個問題:
- 訓練分多步。通過上一篇博文我們知道R-CNN的訓練先要fine tuning一個預訓練的網絡,然后針對每個類別都訓練一個SVM分類器,最后還要用regressors對bounding-box進行回歸,另外region proposal也要單獨用selective search的方式獲得,步驟比較繁瑣。
- 時間和內存消耗比較大。在訓練SVM和回歸的時候需要用網絡訓練的特征作為輸入,特征保存在磁盤上再讀入的時間消耗還是比較大的。
- 測試的時候也比較慢,每張圖片的每個region proposal都要做卷積,重復操作太多。
雖然在Fast RCNN之前有提出過SPPnet算法來解決RCNN中重復卷積的問題,但是SPPnet依然存在和RCNN一樣的一些缺點比如:訓練步驟過多,需要訓練SVM分類器,需要額外的回歸器,特征也是保存在磁盤上。因此Fast RCNN相當於全面改進了原有的這兩個算法,不僅訓練步驟減少了,也不需要額外將特征保存在磁盤上。
基於VGG16的Fast RCNN算法在訓練速度上比RCNN快了將近9倍,比SPPnet快大概3倍;測試速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。
一 Fast R-CNN思想
Fast RCNN方法解決了RCNN方法三個問題:
問題一:測試時速度慢
RCNN一張圖像內候選框之間大量重疊,提取特征操作冗余。
本文將整張圖像歸一化后直接送入深度網絡。在鄰接時,才加入候選框信息,在末尾的少數幾層處理每個候選框。
問題二:訓練時速度慢
原因同上。
在訓練時,本文先將一張圖像送入網絡,緊接着送入從這幅圖像上提取出的候選區域。這些候選區域的前幾層特征不需要再重復計算。
問題三:訓練所需空間大
RCNN中獨立的分類器和回歸器需要大量特征作為訓練樣本。
本文把類別判斷和位置精調統一用深度網絡實現,不再需要額外存儲。
二 算法簡述
算法的主網絡是VGG16

以下是訓練的步驟:
- 輸入是224*224,經過5個卷積層和2個降采樣層(這兩個降采樣層分別跟在第一和第二個卷積層后面)
- 進入RoI Pooling層,該層的輸入是conv5層的輸出和P個候選區域region proposal。
- 然后再經過兩個都是output是4096的全連接層。
- 最后分別經過output個數是21和84的兩個全連接層(這兩個全連接層是並列的,不是前后關系),前者是分類的輸出,代表每個region proposal屬於每個類別(21類)的得分,后者是回歸的輸出,代表每個region proposal的四個坐標。
- 最后是兩個損失層,分類的是softmaxWithLoss,輸入是label和分類層輸出的得分;回歸的是SmoothL1Loss,輸入是回歸層的輸出和target坐標及weight。
測試的過程:
與訓練基本相同,最后兩個loss層要改成一個softmax層,輸入是分類的score,輸出概率。最后對每個類別采用NMS(non-maximun suppression)。
三 算法詳解
Fast R-CNN的流程圖如下,這個網絡的輸入是原始圖片和候選區域,輸出是分類類別和bbox回歸值。對於原始圖片中的候選框區域,和SPPNet中做法一樣,都是將它映射到卷積特征的對應區域(即圖中的RoI projection),然后輸入到RoI pooling layer,可以得到一個固定大小的特征圖。將這個特征圖經過2個全連接層以后得到RoI的特征,然后將特征經過全連接層,使用softmax得到分類,使用回歸得到邊框回歸。CNN的主體結構可以來自於AlexNet,也可以來自於VGGNet。

1、ROI池化層
這里唯一需要解釋的就是RoI pooling layer。如果特征圖(feature map)上的RoI 大小是h∗w(這里忽略了通道數),將這個特征圖划分為h/H∗w/W個網格,每個網格大小為H*W,對每個網格做max pooling,這樣得到pooling以后的大小就是H∗W(在文章中,VGG16網絡使用H=W=7的參數,上圖中繪制的是6x6的)。無論原始的RoI多大,最后都轉化為7*7大小的特征圖。本文將RoI池化為7*7的輸出,其實這一層就是SPP的特例,SPP金字塔只有一層就是這樣的。
因此可以看出Fast RCNN主要有3個改進:
- 卷積不再是對每個region proposal進行,而是直接對整張圖像,這樣減少了很多重復計算。
- 原來RCNN是對每個region proposal分別做卷積,因為一張圖像中有2000左右的region proposal,肯定相互之間的重疊率很高,因此產生重復計算。用ROI pooling進行特征的尺寸變換,因為全連接層的輸入要求尺寸大小一樣,因此不能直接把region proposal作為輸入。
- 將regressor放進網絡一起訓練,每個類別對應一個regressor,同時用softmax代替原來的SVM分類器。
2、訓練
網絡的訓練需要從下面幾個方向考慮:1、訓練樣本是什么;2、損失函數是什么;3、如果提出了新的網絡結構,網絡結構的反向傳播怎么做。此外,還可以關注一下超參數的選取方法,看看作者在超參數選取上有什么好的思路可以借鑒。
3、訓練樣本
從網絡的前向傳播可以看到,網絡需要的輸入是圖片和region proposal,輸出是類別和bbox,那么訓練的圖片每個候選區需要提前標注好類別和bbox。
作者使用層次抽樣來選取訓練圖片。對應每個mini-batch而言,大小為128個region proposal(或者叫RoI)。先從訓練圖片中選取2張圖片,每個圖片的RoI中選取64個RoI,形成這128個RoI。這樣網絡前面的卷積計算是可以共享的,降低了訓練的復雜度。64個RoI中,25%是有類別的(IoU>0.5,u≥1),剩下75%是背景(IoU∈[0.1,0.5),u=0)。數據增強使用了水平翻轉。測試的時候則每張圖像大約2000個RoI。
4、損失函數

將分類的loss和回歸的loss整合在一起,其中分類采用log loss,即對真實分類(下圖中的pu)的概率取負log,而回歸的loss和R-CNN基本一樣。分類層輸出K+1維,表示K個類和1個背景類。

這是回歸的loss,其中tu表示預測的結果,u表示類別。v表示真實的結果,即bounding box regression target。

參考文章
[4]目標檢測:SPP-net
[6]基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN(強烈推薦)
