天天看點

目标檢測——R-FCN

Paper:R-FCN: Object Detection via Region-based Fully Convolutional Networks

作者:

Jifeng Dai, Yi Li, Kaiming He, Jian Sun

目标檢測——R-FCN

Visual Computing Group / Microsoft Research Asia

1 提出架構

首先說一說為什麼提出了RFCN。作者分析此前的各種分類和檢測架構,發現了一個問題:很多網絡應用在分類問題的時候都能取得相當好的結果,準确率非常高,但是在應用到檢測問題上的時候結果似乎就沒那麼理想了,這是為啥呢?除去分類和檢測問題本身的複雜性,作者思考了一下這些架構的特點。

我們知道,在做分類問題的時候,從早期的AlexNet、VGGNet到之後的GoogleNet、ResNet使用的模式都是“卷積網絡提取特征+全連接配接層/GAP層做分類”,于是在處理檢測問題的時候,這種模式就被自然而然的遷移過來,比如我們之前說過的RCNN系列、SSD等等,也都是采取卷積網絡提取特征(加入ROI提取)+RoI Pooling的模式來做檢測。

于是作者就此分析了解決分類/檢測兩種問題的關鍵:

(1) 分類問題: 其本身要求具有平移不變性。也就是說當目标的位置發生變化時,分類網絡能夠自動适應位置的變化。

(2) 檢測問題: 對目标進行定位的需求要求其具有平移敏感性。由于檢測問題需要在圖像中對目标進行精确的定位,是以要求整個網絡對目标的位置變化更為敏感。

通過先前的學習我們了解到,分類問題中深度卷積網絡使得整個模型具有很好的平移不變性,而檢測問題中引入的RoI Pooling的操作引入了位置資訊。但是作者認為這種做法大大犧牲了訓練和測試的效率。

于是作者就此提出了一個新的操作:叫做位敏得分特征圖(position-sensitive score maps)。基于這個玩意做出了新的檢測架構:Region-based Fully Convolutional Network (R-FCN)。

2 R-FCN架構和細節

2.1 R-FCN整體的網絡結構

咱們先來看看整個R-FCN網絡的結構:

目标檢測——R-FCN

整個網絡沿用了Faster-RCNN(可以會看我們的部落格Faster RCNN)的架構:卷積網絡提取特征,由RPN生成候選框,RPN和特征提取共享卷積網絡。

(1) 特征提取部分采用ResNet-101的結構,去掉了最後的GAP層和fc層,并添加了一個1024維的1*1卷積用來降維(原輸出是2048維),總共101個卷積層。

(2) RPN部分與Faster-RCNN相同,基本沒有變化。

(3) 位敏得分特征圖(Position-sensitive score maps) 生成和位敏RoI Pooling(Position-sensitive RoI pooling, PSRoIPooling)部分。(劃重點!)

2.2 Position-sensitive score maps(位敏得分特征圖,PSSM)

顧名思義,位敏得分特征圖就是一個對位移敏感的特征圖(廢話,,為啥對位移敏感等會兒會說)。這一步的操作是在特征提取部分網絡輸出的feature map(1024個 w ∗ h w*h w∗h的feature map)後接一個 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)維的 1 ∗ 1 1*1 1∗1卷積層得到 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個大小為 w ∗ h w*h w∗h的Position-sensitive score maps,這個 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個score maps代表啥呢?看下圖:

目标檢測——R-FCN

假設将由RPN提取的ROI劃分為 k ∗ k k*k k∗k個bin,使用上述的 1 ∗ 1 1*1 1∗1卷積分别獲得針對每個bin的激活圖(feature map),那麼針對其中某一個類别就将獲得 k ∗ k k*k k∗k個激活圖(feature map),總共有C個類别,加上一個背景類,就将獲得 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個激活圖,也就是我們說的Position-sensitive score maps。

【舉個栗子】 假設針對“人”這個類别,如下圖所示,劃分為 k ∗ k k*k k∗k個bin(此處假設k=3),那麼每個bin的激活特征是不一樣的,得到的Position-sensitive score map當然也是不一樣的,比如top-left的bin激活的是人的一側肩和頭的部分,bottom-right的bin激活的是人的一條腿的部分。那麼對于一張輸入圖檔将得到 3 ∗ 3 = 9 3*3=9 3∗3=9個bin對應的部分的激活特征圖(9張),也就是對應“人”這個類别的Position-sensitive score maps 。
目标檢測——R-FCN
目标檢測——R-FCN

上面的示例中,針對“人”這一個類别生成了 k 2 ( k = 3 ) k^2(k=3) k2(k=3)張位敏特征圖,那麼擴充到具有C個類别(再加一個背景類)的資料集,就會生成 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)張位敏特征圖(Position-sensitive score maps),把每一個類的相同位置的bin對應的特征圖放在一起就會是下圖所示的樣子啦(比如說所有類的左上角的bin對應的激活圖都放在一起就得到了下圖中深黃色的 ( C + 1 ) (C+1) (C+1) 張Position-sensitive score maps):

目标檢測——R-FCN
2.3 Position-sensitive RoI pooling(PSROIPooling)

說完了得到Position-sensitive score maps的過程,咱們繼續來看看Position-sensitive RoI pooling。根據上面所說的過程,我們得到了 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)張位敏特征得分圖,還通過RPN得到了一系列ROI,很自然的想到,接下來做的就是把這些ROI映射到這一堆Position-sensitive score maps上,根據前面所說我們知道每一張 Position-sensitive score map對應着某一個類别的某一個bin,而Position-sensitive RoI pooling所做的就是把對應着相同類别的Position-sensitive score map在ROI映射區域中的相應的bin提取出來,重新拼成一個完整ROI的激活圖(說白了就是在每個位敏特征圖上提取ROI區域中對應位置bin然後做個重新排列)。這個部分好像說的有點抽象,咱們可以對應論文中的一個示例圖來做了解:

目标檢測——R-FCN

接着前面所說的例子,對于一張輸入圖檔的“人”這一類,我們将得到9張不同位置bin在feature map上的激活圖(位敏特征圖),把提取的ROI映射到這9張位敏特征圖上,然後分别提取對應位置bin在ROI中相應的那一塊,這樣一來就分别從9張圖中“摳”出了9個小塊,然後把這9個小塊分别作average pooling後按照對應位置重新拼成一個 3 ∗ 3 ( k ∗ k ) 3*3(k*k) 3∗3(k∗k)的輸出。那麼拓展到一個具有C個類别的資料集,結果将得到 ( C + 1 ) (C+1) (C+1)個 k ∗ k k*k k∗k的輸出。

2.4 PSSM(位敏得分特征圖)和PSROIPooling後的操作

那麼問題來了,得到了這個 k ∗ k k*k k∗k的輸出後該怎麼用于分類和定位呢?

首先對于分類: 最後這個輸出的每一個類的 k ∗ k ( 3 ∗ 3 ) k*k(3*3) k∗k(3∗3)的輸出直接進行voting得到最後的得分,文中說明的voting操作是将 k ∗ k k*k k∗k個值進行相加。那麼對于每一個ROI的 ( C + 1 ) (C+1) (C+1)個 k ∗ k k*k k∗k輸出,我們最後将得到一個 ( C + 1 ) (C+1) (C+1)維的輸出向量,再使用softmax進行分類。

對于包圍框回歸: 相似的,對于特征提取卷積層輸出的feature map加上一個 4 k 2 4k^2 4k2維的卷積層,得到 4 k 2 4k^2 4k2個用于包圍框回歸的位敏特征得分圖(類似于前面說的 k 2 ( C + 1 ) k^2 (C+1) k2(C+1)個用于分類的位敏得分圖)。然後采用同樣的PSROIPooling操作并進行voting,最後每個ROI得到一個4維的輸出用于包圍框回歸(這4個次元分别對應包圍框的 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h ) (tx​,ty​,tw​,th​))。

說到這裡我們就可以解釋一下為什麼這個又奇怪又抽象的操作可以引入位移敏感性了。如圖所示,我們得到的這9張位敏特征圖都分别真實還原了某一目标的某一部位在原圖中的激活位置,如果ROI的位置有偏差,那麼分别從9張位敏特征圖中摳出來的每一個小塊相對真實位置就都是有偏差的,也就是說最後重新拼接起來的3*3的輸出中的每一塊都是有偏差的,再經過最後的voting操作,這些偏差的累加自然就使得最終的結果對位移具有更高的敏感性了。
目标檢測——R-FCN

3 訓練和測試細節

3.1 訓練

要說訓練,當然先看損失函數啦:

L ( s , t x , y , w , h ) = L c l s ( s c ∗ ) + λ [ c ∗ > 0 ] L r e g ( t , t ∗ ) L_(s,t_{x,y,w,h}) = L_{cls}(s_{c^*}) + \lambda [c^*>0] L_{reg}(t,{t^*}) L(​s,tx,y,w,h​)=Lcls​(sc∗​)+λ[c∗>0]Lreg​(t,t∗)

其中 L c l s ( s c ∗ ) = − l o g ( s c ∗ ) L_{cls(s_{c^*})}= -log(s_{c^*}) Lcls(sc∗​)​=−log(sc∗​)是分類部分的交叉熵損失, L r e g L_{reg} Lreg​是包圍框回歸部分的損失,采用L1 Smooth。定義 :當對應ground truth的标簽為非背景類時 [ c ∗ > 0 ] = 1 [c^*>0]=1 [c∗>0]=1,當标簽訓示為背景類時 [ c ∗ > 0 ] = 0 [c^*>0]=0 [c∗>0]=0 。RPN産生的區域建議當ROI與ground truth的IOU大于0.5時樣本标為正例。

有意思的是,這篇文章裡邊再一次提到了難例挖掘(hard example mining,OHEM)。原文的描述是:假設對一張輸入圖像提取得到了N個proposals,經過前向運算計算所有N個proposals的損失,然後按損失将所有ROIs排序,選出損失最高的B個ROIs進行反向傳播。

【一些訓練小細節】

(1) 使用了0.0005的權重衰減系數和0.9的動量;

(2) 使用單一尺寸圖像進行訓練,把輸入圖像resize為短邊為600像素的統一尺寸;使用非極大值抑制,IOU門檻值設定為0.3;

(3) 本文還用了一個有意思的小tip:“Hole algorithm”. 作者試圖通過減小某些卷積層的步長來提升輸出的feature map的分辨率,按文中介紹:保持ResNet101的conv4以前(包括conv4)的步長(32)不變,把conv5中的第一個卷積(conv5_1)步長改為1,而conv5中之後的其他卷積将使用Hole算法用來彌補。本文中作者把這叫做 “à trous trick”

Hole 算法是個啥?

我們知道,将某個卷積層的步長減小會導緻感受野的減小,如何來彌補這一點呢?在論文 “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS” 中作者為了解決這一問題提出了Hole算法,當縮小了步長後,通過“skip”連接配接來保持感受野不變,如下圖所示:

(參考論文:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS.

參考部落格:https://blog.csdn.net/tangwei2014/article/details/50453334)

目标檢測——R-FCN
作者也對比了減小/不減小步長、使用/不使用Hole算法對結果的影響,結果如下表所示:
目标檢測——R-FCN

4 實驗結果

4.1 使用PASCAL VOC資料集

作者對比了目前幾種全卷積(或接近全卷積)檢測算法在PASCAL VOC資料集上的表現,結果如下表所示:

目标檢測——R-FCN

其中移除位移敏感特性的RFCN是通過設定k=1來實作的。表中所列的幾種架構都使用了à trous trick。

RFCN和Faster-RCNN的比較:

目标檢測——R-FCN

進一步的比較:

目标檢測——R-FCN

此處嘗試使用多尺度圖像訓練RFCN,包括{400,500,600,700,800}五種尺寸。

進一步使用VOC2007+VOC2012的訓練集訓練結果:

目标檢測——R-FCN

繼續嘗試使用不同深度的ResNet做對比實驗:

目标檢測——R-FCN

嘗試使用不同的候選框生成算法作對比試驗:

目标檢測——R-FCN
4.2 使用 MS COCO資料集

各種對比大合集:

目标檢測——R-FCN

5 總結(重點!!!)

從實驗結果來看RFCN還是一個非常優秀的算法的,總結一下:

(1) 提出相同網絡在檢測問題中的應用效果遠不如在分類問題中的效果,是因為檢測問題要求算法在一定程度上有較好的位移敏感性。

(2) 提出了位敏得分特征圖(Position-sensitive score maps)和對應的Position-sensitive ROI Pooling,有效的編碼了目标的位置資訊,增強了位移敏感性。

(3) 還使用了à trous trick,引入了Hole算法(不是創新點,算是一個小tips吧)

(4) 從最後的結果展示來看,為了全方位的展示RFCN的優秀,作者做的對比實驗可以說是非常多了,而且對比實驗的設定覆寫面也相當廣,這是一個值得學習的點,多做實驗還是很有必要的。

繼續閱讀