解答關于R-FCN的所有疑惑(原創)

論文鏈接:https://arxiv.org/pdf/1605.06409.pdf
Matlab源碼:https://github.com/daijifeng001/r-fcn

R-FCN是微軟亞洲研究院的代季峰在2016年提出的一種全新的目標檢測結構。它對傳統的Faster R-CNN結構進行了改造,將ROI層后的卷積都移到了ROI層前,并利用一種位置敏感的特征圖來評估各個類別的概率,使其在保持較高定位準確度的同時,大幅提高檢測速率。
網上很容易找到關于R-FCN的各種文章,所以不再重復介紹它的結構,只是選幾個容易引起誤解的點做深入解讀。

理解難點1:平移不變性和平移可變性

作者在論文中提到了兩個概念,平移不變性(translation invariance)和平移可變性(translation variance)。平移不變性比較好理解,在用基礎的分類結構比如ResNet、Inception給一只貓分類時,無論貓怎么扭曲、平移,最終識別出來的都是貓,輸入怎么變形輸出都不變這就是平移不變性,網絡的層次越深這個特性會越明顯。平移可變性則是針對目標檢測的,一只貓從圖片左側移到了右側,檢測出的貓的坐標會發生變化就稱為平移可變性。當卷積網絡變深后最后一層卷積輸出的feature map變小,物體在輸入上的小偏移,經過N多層pooling后在最后的小feature map上會感知不到,這就是為什么原文會說網絡變深平移可變性變差。

再來看個Faster R-CNN + ResNet-101結構的例子。如果在Faster R-CNN中沒有ROI層,直接對整個feature map進行分類和位置的回歸,由于ResNet的結構較深,平移可變性較差,檢測出來的坐標會極度不準確。如果在ResNet中間(圖1 conv4與conv5間)加個ROI層結果就不一樣了,ROI層提取出的proposal中,有的對應前景label,有的對應背景label,proposal位置的偏移就有可能造成label分類(前景和背景分類)的不同。偏移后原來的前景很有可能變成了背景,原來的背景很有可能變成了前景,換句話說分類loss對proposal的位置是敏感的,這種情況ROI層給深層網絡帶來了平移可變性。如果把ROI加到ResNet的最后一層(圖1 conv5后)結果又是怎樣呢?conv5的第一個卷積stride是2,造成conv5輸出的feature map更小,這時proposal的一個小偏移在conv5輸出上很有可能都感知不到,即proposal對應的label沒有改變,所以conv5后雖然有ROI也對平移可變性沒有什么幫助,識別出來的位置準確度會很差。


圖1:ResNet-101的結構

論文中作者給了測試的數據:ROI放在ResNet-101的conv5后,mAP是68.9%;ROI放到conv5前(就是標準的Faster R-CNN結構)的mAP是76.4%,差距是巨大的,這能證明平移可變性對目標檢測的重要性。

理解難點2:R-FCN結構的由來

R-FCN要解決的根本問題是Faster R-CNN檢測速度慢的問題,速度慢是因為ROI層后的結構對不同的proposal是不共享的,試想下如果有300個proposal,ROI后的全連接網絡就要計算300次,這個耗時就太嚇人了。所以作者把ROI后的結構往前挪來提升速度,但光是挪動下還不行,ROI在conv5后會引起上節提到的平移可變性問題,必須通過其他方法加強結構的可變性,所以作者就想出了通過添加Position-sensitive score map來達到這個目的。

理解難點3:Position-sensitive score map的結構

圖1的ResNet-101應用到R-FCN時會把最后的average pool和1000-d fc全連接層都去掉了,僅保留前100層,再新加一個1x1x1024的卷積層用來降維(從2048維降到1024維),和一個很特殊的卷積來生成k2 * (C+1)維的Position-sensitive score map。其中的C是要分類的類別數,比如PASCAL VOC類別就是20,加上1表示加上一個背景分類;k是之后的ROI Pooling中對ROI區域要劃分的小格數,比如論文中k=3就是對ROI在長寬方向各三等分形成9個小區域(如圖2)。Position-sensitive score map的值對小區域相對于ROI中的位置很敏感,為什么這么說后面會解釋。

圖2:Position-sensitive score map的結構

圖2中最后一個特殊卷積輸出Position-sensitive score map后,就要做ROI Pooling了,和Faster R-CNN中的ROI Pooling一樣要對9個小區域分別進行pooling,要注意的是R-FCN中9個小區域并不是在所有k2 * (C+1)維度上都做pooling,每個小區域只會在對應的(C+1)個維度上作pooling,比如ROI左上角的區域就在前C+1個維度上pooling,左中位置的區域就在C+2到2C+2間的維度上作pooling,以此類推。pooling后輸出的是C+1維度的k*k數據,每個維度上的k*k個數據再加到一起(圖2的vote過程)形成C+1個單點數據,就代表了C+1個類別的分類概率。
對于目標定位的輸出和上面的分類輸出過程類似,只是維度不再是k2 * (C+1),而是k2*4,表示9個小區域的[dx,dy,dw,dh]4個偏移坐標。

理解難點4:Position-sensitive score map為什么會帶來平移可變性

Position-sensitive score map的概念最早來自另一篇實例分割的論文Instance-sensitive Fully Convolutional Networks (https://arxiv.org/pdf/1603.08678.pdf)。圖3是示意圖,中間的9張圖對應Position-sensitive score map的9個維度的輸出。拿左上角的圖說明:它的每一個點代表該點正好出現在目標左上角的概率(更準確的說應該是得分,因為還沒做softmax),也可以理解是該點右下方正好是目標的概率。要注意的是:“目標左上角的概率”的概念并不局限于圖中畫的綠色框范圍,而是整張圖上的每一個點,這是新學習者很容易引起誤解的地方。同理其余8張圖各自對應了目標正上側、右上側、左中側、正中側、右中側、左下側、正下側、右下側的概率。在訓練時,一個ROI的9個小區域從每張圖的對應區域去Pooling出一個結果,組成新的圖(圖3右側的9宮格圖),如果ROI剛好覆蓋ground truth,這個新的區域就標記為前景(label=1)。
這里有個關鍵點要解釋,為什么每張圖都能攜帶相對位置信息?因為從圖3提取1~9號小方格時,每個小方格在每張圖上的位置并不相同,而是在上下左右方向上有偏移,當組合出來的9宮格對應ground truth時,小方格1就對應了 ground truth左上角的位置,小方格2對應了ground truth正上方的位置,依此類推,所以用這種9宮格訓練目標時就有了相對目標位置的信息在里面 。

圖3:Position-sensitive score map

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容