論文鏈接:https://arxiv.org/pdf/1605.06409.pdf
Matlab源碼:https://github.com/daijifeng001/r-fcn
R-FCN是微軟亞洲研究院的代季峰在2016年提出的一種全新的目標檢測結構。它對傳統(tǒng)的Faster R-CNN結構進行了改造梗脾,將ROI層后的卷積都移到了ROI層前,并利用一種位置敏感的特征圖來評估各個類別的概率投储,使其在保持較高定位準確度的同時,大幅提高檢測速率阔馋。
網上很容易找到關于R-FCN的各種文章玛荞,所以不再重復介紹它的結構,只是選幾個容易引起誤解的點做深入解讀呕寝。
理解難點1:平移不變性和平移可變性
作者在論文中提到了兩個概念勋眯,平移不變性(translation invariance)和平移可變性(translation variance)。平移不變性比較好理解下梢,在用基礎的分類結構比如ResNet客蹋、Inception給一只貓分類時,無論貓怎么扭曲怔球、平移嚼酝,最終識別出來的都是貓浮还,輸入怎么變形輸出都不變這就是平移不變性竟坛,網絡的層次越深這個特性會越明顯。平移可變性則是針對目標檢測的,一只貓從圖片左側移到了右側担汤,檢測出的貓的坐標會發(fā)生變化就稱為平移可變性涎跨。當卷積網絡變深后最后一層卷積輸出的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中婴谱,有的對應前景l(fā)abel,有的對應背景l(fā)abel躯泰,proposal位置的偏移就有可能造成label分類(前景和背景分類)的不同谭羔。偏移后原來的前景很有可能變成了背景,原來的背景很有可能變成了前景麦向,換句話說分類loss對proposal的位置是敏感的瘟裸,這種情況ROI層給深層網絡帶來了平移可變性。如果把ROI加到ResNet的最后一層(圖1 conv5后)結果又是怎樣呢磕蛇?conv5的第一個卷積stride是2景描,造成conv5輸出的feature map更小,這時proposal的一個小偏移在conv5輸出上很有可能都感知不到秀撇,即proposal對應的label沒有改變超棺,所以conv5后雖然有ROI也對平移可變性沒有什么幫助,識別出來的位置準確度會很差呵燕。
論文中作者給了測試的數(shù)據(jù):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后會引起上節(jié)提到的平移可變性問題惭缰,必須通過其他方法加強結構的可變性浪南,所以作者就想出了通過添加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是要分類的類別數(shù)絮记,比如PASCAL VOC類別就是20,加上1表示加上一個背景分類虐先;k是之后的ROI Pooling中對ROI區(qū)域要劃分的小格數(shù)到千,比如論文中k=3就是對ROI在長寬方向各三等分形成9個小區(qū)域(如圖2)。Position-sensitive score map的值對小區(qū)域相對于ROI中的位置很敏感赴穗,為什么這么說后面會解釋憔四。
圖2中最后一個特殊卷積輸出Position-sensitive score map后,就要做ROI Pooling了般眉,和Faster R-CNN中的ROI Pooling一樣要對9個小區(qū)域分別進行pooling了赵,要注意的是R-FCN中9個小區(qū)域并不是在所有k2 * (C+1)維度上都做pooling,每個小區(qū)域只會在對應的(C+1)個維度上作pooling甸赃,比如ROI左上角的區(qū)域就在前C+1個維度上pooling柿汛,左中位置的區(qū)域就在C+2到2C+2間的維度上作pooling,以此類推埠对。pooling后輸出的是C+1維度的k*k數(shù)據(jù)络断,每個維度上的k*k個數(shù)據(jù)再加到一起(圖2的vote過程)形成C+1個單點數(shù)據(jù),就代表了C+1個類別的分類概率项玛。
對于目標定位的輸出和上面的分類輸出過程類似貌笨,只是維度不再是k2 * (C+1),而是k2*4襟沮,表示9個小區(qū)域的[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個維度的輸出膀跌。拿左上角的圖說明:它的每一個點代表該點正好出現(xiàn)在目標左上角的概率(更準確的說應該是得分,因為還沒做softmax)固灵,也可以理解是該點右下方正好是目標的概率捅伤。要注意的是:“目標左上角的概率”的概念并不局限于圖中畫的綠色框范圍,而是整張圖上的每一個點巫玻,這是新學習者很容易引起誤解的地方丛忆。同理其余8張圖各自對應了目標正上側困介、右上側、左中側蘸际、正中側、右中側徒扶、左下側粮彤、正下側、右下側的概率姜骡。在訓練時导坟,一個ROI的9個小區(qū)域從每張圖的對應區(qū)域去Pooling出一個結果,組成新的圖(圖3右側的9宮格圖)圈澈,如果ROI剛好覆蓋ground truth惫周,這個新的區(qū)域就標記為前景(label=1)。
這里有個關鍵點要解釋康栈,為什么每張圖都能攜帶相對位置信息递递?因為從圖3提取1~9號小方格時,每個小方格在每張圖上的位置并不相同啥么,而是在上下左右方向上有偏移登舞,當組合出來的9宮格對應ground truth時,小方格1就對應了 ground truth左上角的位置悬荣,小方格2對應了ground truth正上方的位置菠秒,依此類推,所以用這種9宮格訓練目標時就有了相對目標位置的信息在里面 氯迂。