Fast-RCNN論文總結整理


此篇博客寫作思路是一邊翻譯英文原文一邊總結博主在閱讀過程中遇到的問題及一些思考,因為博主本人閱讀英文論文水平不高,所以還請大家在看此篇博客的過程中帶着批判的眼神閱讀!小墨鏡帶好,有什么不對的地方請在留言指出,大家一起討論,快樂的搞事情!

 

Fast R-CNN

Ross Girshick

Microsoft Research

 

 

摘要:

本文提出了一種可用於目標檢測的基於區域的快速卷積神經網絡方法,Fast-RCNN 是對以前使用深度卷積網絡進行目標檢測工作的一種有效增強!Fast-RCNN有幾處牛逼的創新點,可以在大大減少訓練和測試時間的同時增加訓練精確度,Fast-RCNN訓練非常深VGG16的網絡,速度比RCNN快9倍,測試速度更是達到了驚人的213倍,在PASCAL VOC2012上實現了比較高的准確度!和SPPnet做比較,我們的Fast-RCNN訓練速度達3倍,測試速度達10倍!簡直是偉大的突破!

 

1 介紹

最近,深度卷積神經網絡在圖像分類任務和目標檢測任務上的精確度有了重大提高,相比於圖像分類任務,目標檢測是一個更具有挑戰性的任務!更復雜也更難做,因為復雜的原因,當前多級級聯的方法十分慢而且不夠機智。

目標檢測的復雜性來源於需要精確的確定目標的位置,這就產生了兩個極具挑戰性的工作,首先,大量的待檢測目標需要被處理(后文中統稱proposal),其次,待檢測目標的位置必須被精確的確定出來,這兩個問題的解決常常伴隨着速度,精確度或者簡化的問題!

本文,我們精簡了當前目標檢測所用的卷積神經網絡!我們提出了單級訓練算法將分類和重新確定位置這兩個任務級聯了起來。

總而言之,我們訓練了非常深的目標檢測網絡(VGG16)它比RCNN快9倍,比SPPnet快3倍,在運行時,檢測網絡處理圖像僅僅需要0.3秒你敢信??哦,其實是不算圖片生成待檢測proposal目標的時間的啊!

最終我們取得了可喜可賀的成果,在PASCAL VOC2012上大了66%的精確度!比小弟RCNN的62%還精准還快你就說你怕不怕!

 

1.1R-CNN和SPPnet(常規套路先總結先人不足)

RCNN利用深度卷積網絡實現了激動人心的准確率,當然了,它必須存在一些不足:

1 訓練是一個多級級聯過程

RCNN 微調了ConvNet 在目標檢測上使用了log對數損失,然后它使用SVM來分類ConvNet的特征,這樣SVM取代了softmax分類器而扮演着目標檢測的角色,然后第三級,學習目標所在位置的框框!

2訓練在空間和時間上的花費都是昂貴的

對SVM和邊界框的訓練來說,每一個圖片的每一個待檢測目標框框都需要提取特征並且寫入到硬盤里嗎,對於非常深得硬盤來說,這波操作是致命的!

3目標檢測太慢了

就像上面說的,每個圖片的每個proposal都要被提取特征,這就是RCNN最為致命的地方!所以其實Fast-RCNN的改進主要就是在這個地方借鑒了SPPnet,然后大大節省了時間

 

綜上,目標檢測之所以慢,就是因為卷積網絡的前向運算對於每個proposal都會計算一次(一張圖片可能會產生1k個proposal你想下多逆天!),沒有共享計算啊親,所以SPPnet(空間金字塔池化網絡)提出了一個利用共享計算加速RCNN的方法。它只在整張圖上利用卷積神經網絡進行特征提取,得到關於整張圖的特征圖!然后利用proposal在圖片的區域,進行一次映射,映射到特征圖上然后進行proposal特征向量的生成,再送入后續網絡,這樣的方法省略了大量的重復提取特征的時間,你說能不節省嗎!

可能會有同學質疑這種映射操作的可行性!我上圖證明一下,(圖來自其他博主):

特征圖以一種密集的方式表征空間特征!也就是說原圖image和特征圖確實是相互對應的,用映射的方式來從特征圖中選取proposal是可行的!

原文中說SPPNet在測試階段加速RCNN從10到100X的提升,在訓練階段葉至少提升了3倍之多

不過當然了,SPPNet必然也有它的缺點,(不然作者干嘛要寫Fast—RCNN呢) ,比如說,它仍然是一個多級訓練過程,包括提取特征,用log的損失函數微調,以及訓練SVM分類器和bounding-box的回歸問題,就是獨立訓練這幾部分,然后組成一個大的網絡,而且它的特征也是存儲在硬盤上的,大量浪費空間了,和RCNN不同的是,這種空間金字塔池化層因為加入了池化的關系,它不能夠很好的更新池化層之前的卷積神經網絡的參數了,這樣前面的網絡得不到生長,准確性必然會受影響!

 1.2貢獻部分:

所以總結一下,Fast-RCNN提出了一種新的訓練算法有效的修補了RCNN和SPPnet的不足之處,在速度和准確性上面都有所提高,我們之所以稱之為Fast-RCNN是因為它相比較而言不論是訓練還是測試都更快速,Fast-

RCNN有以下幾個優點:

1更高的檢測准確率(mAP)

2訓練是單級的或者說單通道的,並且使用了多級任務損失

3訓練可以更新到整個網絡!

4 沒有硬盤存儲大量特征的需求

 

接下來的文章自然是主要強調以上四個優點啦!

2 Fast-RCNN的結構以及訓練方法

 

上圖介紹了Fast-RCNN的網絡結構,它接收整副圖像和一系列的proposal作為輸入,網絡首先做的就是用一些卷積神經網絡以及最大值池化層等對圖片進行特征提取,然后對每一個proposal,利用感興趣區域池化層從特征圖

中提取出一個特征向量,每一個特征向量會被送進后續的全連接層,這個全連接層在末尾會產生兩個分支,一個產生softmax來估計K個類別以及背景的概率(K+1個類別的softmax概率),另外一個層對每一個類別輸出四個

實值數據,這四個值會重新確定邊界框的位置K,其實這里的四個點就是(x,y,w,h)參考點的位置以及長和寬,這四個參數足夠確定一個邊界框了!

 

2.1 The ROI pooling layer

ROI pooling layer 使用最大值池化轉換任意的感興趣區域的特征圖到某個固定的大小HxW(比如說7x7),這里的H和W就是傳說中的超參數,其實超參數是很容易理解的,在訓練之前你就得固定好它,你選取超參數的方法

可能就是你不斷的在驗證集上做實驗,挑表現最好的固定下來,再開始訓練優化,本文中,ROI是一個矩形窗口,而且每一個Roi都是由上文中所說的四個參數決定的(x,y,w,h),其中(x,y)是定義在左上角的參照點而這個(h,w)是

對應的矩形框長度和寬度。

Roi max pooling層之所以能夠將任意的proposal轉化乘固定的HxW區域,其原理是這樣的,比如說proposal是h×w這樣的,然后你可以按照h/H的高度,w/W的寬度進行切割,那么得到的自然是固定的H×W的參數結果啦~

2.2預訓練網絡的初始化


本文的作者使用了三個預訓練的ImageNet進行實驗,每一個都有五個最大池化層和五到十三個的卷積層組成,當這些預訓練的網絡轉化成ImageNet的時候,通常都經歷一下三方面的轉化:

 1首先,最后一層的池化層被Roi池化層取代,而且Roi池化的參數固定為H×W,目的就是為了和后續的全連接層進行匹配

 2 網絡最后的全連接層和softmax層(原網絡訓練的是1000類的分類)被替代為兩個不同的全連接網絡,一個是能夠對K+1個種類進行分類的softmax的全連接層,另外是種類對應的邊界框(bounding-box)的回歸網絡

 3最后,網絡被修改為接收兩個輸入,分別是整副圖像和圖像對應的全部的proposal

2.3網絡微調

對於Fast-RCNN來說,對整個網絡的權重參數進行反向傳播訓練是Fast-RCNN網絡獨有的能力!SPPnet網絡就不能夠更新金字塔池化層前面的卷積網絡的參數哦!

為啥呢?為啥SPPnet金字塔池化層之前的網絡參數就不能夠有效的更新?原文中說了因為反向傳播走到金字塔池化層的時候層的效率非常的低當proposal來自於不同的圖片的時候,PS:好像在我的感覺里池化這種操作

確實不是很容易能夠用函數式進行表示,就算表示出來了,那也肯定不是連續函數吧,也會很難求導,但這都不是主要的,主要原因是來自於不同的圖片的proposal就會讓反向求導操作的效率十分低下!

因為每一個Roi都有可能從圖像的不同地方獲取,這樣它就對應着一個十分大的接收場(我把它理解為定義域),甚至有可能是來自於整副圖像,所以前向傳輸計算過程中,必須要處理整副圖像,這個訓練輸入是十分大的!

      那作者是怎么解決這個問題的呢? 作者充分利用訓練過程中的特征圖共享的有點,在Fast-RCNN的訓練過程中,SGD的mini-batch是分層次的采樣,假設一共尋要R個proposal,那么我們首先采樣N張圖片,然后再

每張圖片采樣R/N個proposal,然后讓來自於同一張圖片的的proposal共享計算和內存在前向和后向傳播過程中!作者舉了個例子,當使用N=2,R=128的時候,利用這種方法訓練速度是采樣來自128張不同圖片的Roi的速度

的128倍!,真的是快的一逼啊!

   但是這樣也可能會有一些小問題,比如說,來自於同一張圖片的Roi可能具有很大的相關性,會嚴重托慢訓練速度,但是這個問題在作者的訓練過程中沒有造成什么嚴重的后果,然后作者使用更少的SGD迭代次數也

得到了比RCNN更好的訓練結果。

  除了分層采樣之外,作者還有一個小trick,那就是將網絡全連接層后面的兩個網絡進行了聯合優化,也就是將sotfmax分類器和邊界框回歸網絡進行聯合優化,而不是分開來softmax Classficaiton ,SVM,邊界框回歸器

一個個的挨個優化!

多任務損失

一個Fast-RCNN的網絡有兩個不同的輸出層,一個輸出離散概率分布,Ρ=(p0,......pk),overK+1個類別,和其他的網絡類似,也是通過softmax來計算k+1個輸出種類的概率,第二個輸出的是邊界框的回歸偏置Tk=(tx,ty,tw,th),對

k個種類中的每一個類別都是如此,而且tk指定了空間尺度不變性的轉換和對數空間的寬高的平移,對每一個proposal都是如此

  每一個用於訓練的Roi都有一個真實的類標記u和一個確切可靠的邊界回歸框v,我們使用多任務損失L來對分類和邊界框進行聯合優化訓練:

    

 

在這個公式中 :代表的是真實類別的對數損失,很可靠,如果pu越小,那么logpu就會越趨向於負無窮,添加負號之后,就對應的越大!概率越小,懲罰越大,是損失函數的常規套路,

至於回歸任務的損失函數就比較麻煩,介紹之前先說一個超參數λ,這個是訓練之前指定的,表明分類和回歸的重要性程度,本文中都是設置為1,損失函數肯定是有目標target和預測它們分別是:

 邊界框通過神經網絡算出的參數:

人為標定的真實邊界框的參數:  

這樣,邊界框的的損失函數可以定義為:

而這個smoothL1函數的定義如下:  

這樣這個多級任務損失函數就定義完了,我知道你們肯定想看圖像,我用wolframAlpha畫出來了,好像其實和2次函數的圖像沒什么區別嘛,大家可以仔細考慮一下作者這樣定義的意圖。

作者說這樣是一個穩健的L1損失,相對於L2損失而言它對離群的值並不敏感在RCNN和SPPnet中,因為回歸訓練是沒有邊界的,所以你必須要小心的設置學習率避免梯度爆炸,哈哈哈哈

 

Mini-batch sampling

在微調過程中,作者將mini-batch中N的大小設置為2,也就是一個小批量數據采樣選擇兩幅圖像,選擇均勻隨機分布,然后設置mini-batch自身的大小是128,每幅圖像采樣64個Roi。然后作者從那些和真實邊界框標記重疊

至少0.5的Roi中選擇了25%,然后給這些Roi一個前景標記,也就是訓練過程中的正例,此時u肯定是大於等於1的,剩下那些和真實邊界框重疊率在[0.1,0.5)的,我們將它的標記設置為背景,此時u=0(因為不需要進行標定)

在訓練過程中圖像被反轉的概率是0.5,沒有其他的數據進行填充(這一段標記了正例反例,而且加入了圖像反轉增加網絡的魯棒性,是在訓練網絡對目標的辨識程度,這個地方和前面的損失函數部分好像讓人不知所雲??)

 

Back-propagation through Roi pooling layers

在Roi池化層的反向傳播的計算,在解釋說明反向傳播的過程中,作者僅僅將N設置為1,也就是只取一個圖片,但是作者說這樣僅僅是方便說明,而且實際上N為幾對這個解釋都沒影響,因為都很直覺。

在說明過程中,用Xi表示Roi池化層第i個激活輸入,然后讓Yrj表示第r個Roi區域的第j個輸出,,然后Roi的池化層的計算公式是:y_{rj}=x_{i*(r,j)}​​​​​​​,然后這個 i*(r,j)=\arg max_{{i}'\in R(r,j)}​​​​​​​,R(r,j)其實就是輸入划分的子窗口

好像這樣說明讀者讀了肯定是一頭霧水??拜托你這都寫了些什么呢,我用我自己的理解給大家解釋下

 

xi可能就是輸入到Roi池化層的輸入,這個沒問題,沒什么疑問,然后這個后面的一大串其實就是在解釋最后輸出的yi,一定是對應本子區域里面的最大的一個!舉個例子:

就是這個池化過程的公式表示!看完大家應該可以對應起來,介紹完了公式部分,說一下如何在這個Roi池化層進行求導:

這個公式其實我也思索了良久,大家可以這么考慮,反向傳播嘛,大家都知道從后往前,也就是說左邊對x的偏導是越過了這個池化層的結果,那肯定要往前找對y的偏導和池化層的偏導數,而最難懂的就是這個池化層

的導數部分,按照公式的直觀理解,拿上面的圖舉例子就是池化后的四個結果3,3,3,2和它對應的來自后面一層的導數加權求和,再對所有的Roi圖像求和,就是最終我們要求得的結果!作者這里為什么要說這個Roi池化

層的求導部分,是因為作者說了這個網絡結構是一個單級聯的,反向求導可以貫穿整個網絡,所以必須在這個地方定義出它的導數求導規則才行!

SGD hyper-parameters

隨機梯度下降相關的超參數,用於softmax分類和邊界回歸的參數作者是用零均值,標准差是0.01到0.001的高斯分布進行初始化,偏置初始化為0,每一層的初始權值學習率為1,偏置學習率為2,然后全局的學習率設置為0.01

,而且學習率在前30k為0.01,后10k為0.001,,當遇到大的訓練數據集的時候,SGD可能會迭代更多次,動量設置為0.9然后衰減參數設置為0.005

2.4尺度不變性

作者研究了兩個實現尺度不變性的辦法:

1 暴力法強制實現尺度不變性

2 通過使用圖像金字塔實現尺度不變性

在暴力法實現中,不論是訓練還是測試階段,每一個圖像被直接處理成預定義的的像素大小,網絡必須從訓練數據中直接學習尺度不變性的目標檢測,而在多尺度方法中,它通過圖像金字塔近似的為網絡實現了尺度不變性,

在測試階段,圖像金字塔用來對每個proposal近似實現縮放標准化,而在多尺度訓練階段,作者隨機的從縮放金字塔中采樣一幅圖像進行訓練,這也可以算是一種數據擴充形式,作者本人只在小規模網絡下實現了多尺度

金字塔放縮訓練,因為GPU的顯存限制。

3Fast-RCNN的網絡檢測

一旦Fast-RCNN網絡微調完成,那么檢測就會比前向計算耗時少很多了,網絡接收一張圖像或者圖像金字塔(圖像金字塔會把一系列的圖片進行編碼)和R個感興趣的proposal作為輸入,從而進行打分,對每一個用於測試的ROi

前向傳輸會輸出該類別的先驗概率分布和邊界框的回歸參數,而且作者通過估計概率給每一個類別k設置了檢測置信率!

3.1 Truncated SVD for faster detection(截斷奇異值分解)
 可能Truncated翻譯成截斷有點奇怪,但是考慮下作者這個SVD分解的思想好像確實有那么點截斷的意思

對於整副圖像的分類,用在計算全連接層的時間和卷積層相比是很小的,但是,如果對於ROi的數量檢測和處理來說,全連接層幾乎又占據了整個前向傳播接近一半的時間,所以,作者針對比較大的全連接層的網絡設計了

一種加速的辦法,那就是截斷奇異值分解!

  如果不是很了解奇異值分解的建議閱讀奇異值分解的相關資料,這里只介紹作者加速的思想,其實一開始我也弄不懂這個加速到底是怎么做到的,作者說了,利用下述公式:,可以將計算的復雜度

從從u×v變成t(u+v),可能會有讀者和我有一樣的疑問,如果將u×v的矩陣分解成u×t,t×t和t×v,那最后乘起來不還是u×v嗎?你這樣有什么用呢,直到我后來自己動手畫了一下:

 

  

可以看到網絡的參數確實是發生了變化,如果此時t的值會遠遠小於min(u,v)的最小值的話,那么這時候用這種奇異值分解的辦法便可以特別好的簡化計算過程,節省很多的前向計算的時間!

 

寫到這里作者的主要思想基本上已經都翻譯完了,Fast-RCNN的進步之處在於:

1 取消了每一個proposal都要計算一遍的繁瑣過程,直接只計算一次特征圖,然后利用映射關系直接在特征圖里找proposal的特征向量,這樣在避免重復計算的同時,節省了大量的硬盤存儲

特征的時間,是一個從SPPnet得到的靈感的關於RCNN的改進,很棒!

2作者針對SPPnet的多級聯多個網絡模塊分開訓練的方法提出了改進,將這個網絡組成一個單級聯的網絡,利用反向傳播可以直接優化到整個網絡,所以它在提出最大值proposal池化層的同時,

給出了網絡反向傳播經過池化層時候導數的計算方法!

3作者還借鑒SPPnet的空間金字塔池化模型,這樣就不會限定網絡的輸入結構,不管特征圖的大小如何,進入到空間金字塔池化層一樣給你弄成固定大小的值,這種方法保證了和后續全連接層的無縫銜接!

4作者最后在全連接層繼續提出優化,使用了SVD奇異值分解的辦法,降低了全連接層需要學習的參數的數目,當全連接層網絡結構很大的時候,可以大大降低參數數目,節省計算時間!

 

 

這就是我閱讀Fast-RCNN的心得體會,如果有什么不對的地方,希望留言指出來我及時改正!下面我將繼續向Faster-RCNN進發啦!謝謝~

 

 

 

 


免責聲明!

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



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