第三十節,目標檢測算法之Fast R-CNN算法詳解


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/Hw/W個網格,每個網格大小為H*W,對每個網格做max pooling,這樣得到pooling以后的大小就是HW(在文章中,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.5u1),剩下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。

 

參考文章

[1]目標檢測:Fast R-CNN

[2]Fast RCNN算法詳解

[3]Fast RCNN算法詳解

[4]目標檢測:SPP-net

[5]Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

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

[7]目標檢測(3)-SPPNet

[8]目標檢測(4)-Fast R-CNN


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM