深度學習目標檢測(object detection)系列(三) Fast R-CNN
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。

感興趣區域池化

上面這張圖說明了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個)可能會出現一些畫素重疊的情況,就像下面這樣:

而這種情況就沒有重疊:

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

上圖中有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:

其中p是每個RoI的概率分佈:
而u是Ground truth的類別,顯然u的範圍為(0,…,k)
顯然,這就是損失函式一個交叉熵,只是它簡寫了,或者說換了一種形式。
**Bounding box迴歸模型的loss: ** 這個loss和R-CNN中的Bounding box的loss沒啥區別,都是在用實際的邊界框資訊與ss演算法給出的邊界框資訊構建一個L1距離。如下:

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

而平滑方程裡面的東西,就和R-CNN一樣了。最後,組合的多工損失函式為:

這裡有一個

,它是一個指示函式,作用就是背景類不需要bounding box修正,也就沒有迴歸loss。
Fast R-CNN訓練與測試

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

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

上面這張圖對比了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(區域建議網路),這個我們後面再說。
原文連結: quant.la/Article/Vie…