Object Detection系列(三) Fast R-CNN

作者:張   旭

編輯:黃俊嘉

640?wx_fmt=png&wxfrom=5&wx_lazy=1

該內容是目標檢測系列的第三篇,系列前部分內容如下,點擊可查看:

Object Detection系列(一) R-CNN 
Object Detection系列(二) SPP-Net 


Fast R-CNN簡介

在之前的兩個文章中,我們分別介紹了R-CNN與SPP-Net,於是在2015年RBG(Ross B. Girshick)等結合了SPP-Net的共享卷積計算思想,對R-CNN做出改進,於是就有了Fast R-CNN。首先簡單介紹下Fast R-CNN。 

相比於之前兩種算法,Fast R-CNN提出了: 

多任務損失函數(Multi-task loss)   
感興趣區域池化(RoI pooling layer)

它由以下幾個部分組成:                               

 ss算法                                                 

CNN網絡                                           
SoftMax                                              
bounding box                                     


首先在SPP-Net與R-CCN一直使用的SVM分類器被換成了SoftMax,SPP-Net中的SPP換成了

RoI pooling,多任務損失函數的引入整合了分類網絡的損失函數與bounding box迴歸模型的損失函數,使任務不需要分階段訓練,區域建議依然使用ss算法生成,並在卷積後的特徵圖上提取(充分共享卷積計算),初始模型從AlexNet換成了VGG16。 

0?wx_fmt=png


感興趣區域池化

0?wx_fmt=png

上面這張圖說明了SPP與RoI pooling的區別,其實RoI pooling是SPP的一種簡化,原本SPP是一種多尺度的池化操作,最後將三個尺度的特徵做串接作爲全連接層的輸入,而RoI pooling只選擇了其中一種尺度,將ss算法的建議框做座標變化後的尺寸的長和寬,平均分爲w份和h份,在每一份中使用最大池化,最後產生w*h個bin,這樣做有下面幾個好處: 
1.統一輸出維度,這個是必須的。 
2.相比於SPP-Net,RoI pooling的維度更少,假設RoI pooling選擇了4*4的話,那麼維度就可以從21個bin降低爲16個,雖然這樣看來降低的並不多,但是不要忘了特徵還有厚度,如果厚度是256的話,那麼降維就比較可觀了。 
3.RoI pooling不再是多尺度的池化,這樣一來梯度回傳就會更方便,有利於Fast R-CNN實現end-to-end的訓練。


感興趣區域池化的梯度回傳

在上說提到了,RoI pooling是單層的SPP,也就是隻用一層金字塔並在區域內做Max pooling,所以如何說在卷積層上提取特徵的時候,特徵的位置沒有出現重疊,RoI pooling就是一個Max pooling,梯度回傳也是一樣的,而出現位置重疊的時候,梯度回傳纔會發生變化。 

那麼先解釋一下什麼是重疊: 
我們知道Fast R-CNN的區域建議同樣是ss算法生成的,那麼一幅圖片在生成多個建議框時(假設是2個)可能會出現一些像素重疊的情況,就像下面這樣:

0?wx_fmt=png

而這種情況就沒有重疊:

0?wx_fmt=png

顯然,重疊的區域經過相同的座標變換之後在卷積特徵圖上同樣是有重疊的,那麼這部分重疊的像素梯度應該如何讓計算呢? 
是多個區域的偏導之和: 

0?wx_fmt=png

上圖中有r0與r1兩個區域,每個區域都通過RoI pooling之後生成4個bin,x23的意思是第23個像素,那麼計算x23位置的梯度就可以根據上圖中左側的公式,其中r是包含有這一點的區域,j是某個區域內的所有位置。 
但是x23的梯度計算顯然不需要r0,r1內的所有位置的梯度信息,它只需要包含x23這一點的,或者說是x23這一點有貢獻的點的梯度,所以這裏需要一個閾值函數—i*(r,j),它的作用就是如果需要RoI pooling後的這一點的梯度,那麼i*(r,j)=1,否則i*(r,j)=0。


這樣一來,RoI pooling層的梯度回傳只需要在Max pooling上簡單修改即可。


多任務損失函數

Multi-task loss是Fast R-CNN最重要的改進了,它將分類模型的損失函數與bounding box模型的損失函數加到了一起,這樣一來就不再需要分階段的訓練了,而是實現了end-to-end。 

首先分類模型的loss:                 

0?wx_fmt=png

其中p是每個RoI的概率分佈:

0?wx_fmt=png

而u是Ground truth的類別,顯然u的範圍爲(0,…,k) 
顯然,這就是損失函數一個交叉熵,只是它簡寫了,或者說換了一種形式。

Bounding box迴歸模型的loss: 

這個loss和R-CNN中的Bounding box的loss沒啥區別,都是在用實際的邊界框信息與ss算法給出的邊界框信息構建一個L1距離。如下: 

0?wx_fmt=png

其中平滑方程的具體形式如下: 

0?wx_fmt=png

而平滑方程裏面的東西,就和R-CNN一樣了。最後,組合的多任務損失函數爲:

0?wx_fmt=png

其中

0?wx_fmt=png

是一個指示函數,作用就是背景類不需要bounding box修正,也就沒有迴歸loss。


Fast R-CNN訓練與測試

0?wx_fmt=png


上面這張圖解釋了Fast R-CNN的訓練與測試過程,前面兩部分說明了RoI pooling層的梯度回傳與多任務損失函數的構建,所以Fast R-CNN的梯度可以一直傳到卷積層,實現end-to-end的訓練。 
此外,爲了在訓練事得到更好的效果,作者提出了一種分級抽樣法,如果batch-size爲128的話,那麼這128個RoI由2張圖片,各生產64個區域。 

0?wx_fmt=png

而Fast R-CNN的測試過程和之前沒啥區別。


Fast R-CNN性能評價

0?wx_fmt=png

上面這張圖對比了R-CNN,SPP-Net與Fast R-CNN的訓練時間,單張圖片的測試時間與mAP,可以看到由於Fast R-CNN可以end-to-end的訓練,它的mAP比R-CNN還要高一些,這樣就不會出現像SPP-Net那樣mAP降低的情況,而在訓練時間與測試時間上,又一次有了較大進步。 
那麼爲什麼Fast R-CNN比SPP-Net更快呢,最重要的原因就是end-to-end的訓練,這樣訓練不再是分階段的。


Fast R-CNN的問題

雖然上面那張圖上寫的,Fast R-CNN的單圖測試時間爲0.32s,但是其實這樣說並不準確,0.32爲了和R-CNN的47.0s做對比。是的Fast R-CNN依然沒有脫離ss算法,但是ss算法跑一張圖的時間,大概是2s,所以講道理的話,Fast R-CNN依然是達不到實時檢測的要求的,好在ss算法在Faster R-CNN中被換成RPN(區域建議網絡),這個我們後面再說。

0?wx_fmt=png

該內容是目標檢測系列的第三篇,

後續還有系列連載,

~敬請期待~

0?wx_fmt=png




1.Object Detection系列(一) R-CNN 

2.Object Detection系列(二) SPP-Net 

3.[視頻講解]史上最全面的正則化技術總結與分析



掃描個人微信號,

拉你進機器學習大牛羣。

福利滿滿,名額已不多…

640.jpeg?

80%的AI從業者已關注我們微信公衆號

0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif

0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif 0?wx_fmt=gif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章