R-FCN簡介
CNN的舊形態
用於影象分類的基礎CNN模型,有一箇舊形態與新形態的區分,基於舊形態的CNN結構如AlexNet,VGG,Network-in-Network,ZF-Net等等,它們都有一個特點是卷積之後保留了幾層用於邏輯判斷的全連線網路。何凱明和RBG團隊的R-CNN系列在Faster R-CNN之前都是在這種舊形態的CNN模型上改出來了,又因為Faster R-CNN及其之前的網路一直在解決的問題就是如何充分的利用原有模型的卷積層作共享計算呢?所以才會有用卷積層完成整幅影象的特徵提取,區域建議的生成等等工作。
CNN的新形態
我們都知道基礎的CNN模型,一般情況下層數越深,特徵圖的厚度也就會越大,這樣一來,為了適應第一層的全連線的維度,往往會在最後一層特徵圖上做全尺寸的卷積,這層卷積的引數量是非常巨大的,比如AlexNet一共只有60M個引數,但是這一層卷積的引數量就會佔去一多半,所以新形態的CNN呈現全卷積化的趨勢,比如ResNet,GoogleNet,DenseNet等等,而且最後一層一般採用全域性池化而不是全尺寸卷積,這樣一來可以在儘量減少引數的情況下增加網路的深度。
R-CNN系列在新形態CNN下的問題
Faster R-CNN及其之前的結構都是基於舊形態CNN設計的,如果把新形態的CNN遷移到Faster R-CNN中就會出現問題,對於這個問題,作者給出瞭如下解釋:
圖片分類任務與目標檢測任務性質是有所差異的
分類任務想要的是對於變換的不變性(Translation invariance),也就是說不管這個類別的東西在圖片的那個位置,對分類的結果不應該產生影響。
檢測任務想要的是對於變換的敏感性(Translation variance),因為需要知道物體到底在哪裡。
但是卷積的層數越深,不變性就越強,敏感性就會變弱。所以Faster R-CNN的結構並不適合新形態的CNN。
在Faster R-CNN的時候,作者是用了ResNet-101作為基礎模型的,但是ResNet-101沒有分成98層+3層,而是分為91層+10層,這個實驗的結果相比於舊形態的CNN,mAP高了,但是時間也變長了,具體的值在最後的實驗結果中可以看到。通過這個實驗可以得出的結論是新形態的CNN模型,不適用於這種前幾層共享卷積計算,後幾層不共享的方式。為了解決這個問題,就有了R-FCN。
這裡需要說明一點:這些觀點大多來源於論文,其實在現在的很多工程實踐中,Faster R-CNN就是在用ResNet,在這裡之所以把論文的觀點說出來主要是為了理解作者是如何一步一步的改進,最後完成R-CNN整個系列,個人認為這個思路的理解要比理解單個模型或者跑一遍程式碼更為重要一些。
R-FCN
R-FCN是為了適應全卷積化的CNN結構,首先R-FCN在共享所有的卷積層的,其次為了解決上面提到的問題,R-FCN提出了:
位置敏感分值圖(Position-sensitive score maps) 它用來判斷某一個框到底屬於哪一個類別
位置敏感池化(Position-sensitive RoI pooling) 在位置敏感分值圖的基礎上提出的一種池化操作。
上面這張圖就是R-FCN的結構,在綠色框裡的內容就是ResNet-101模型,這部分卷積計算還是用來被RPN和Position-sensitive Net共享的,他就相當於Faster R-CNN裡面的前五層卷積一樣;藍色的框內是RPN,它在R-FCN中的作用和在Faster R-CNN中是一樣的,負責輸出建議區域與邊界框;最重要的部分,就是紅色框內的位置敏感卷積與池化,實際上,這部分的結構在Faster R-CNN中是RoI pooling+全連線+多工損失函式等等,在R-FCN中,這部分內容換成了對位置敏感卷積,並把RPN的建議框扣在在分值圖上做位置敏感池化。
R-FCN之所以起這個名字,是因為影象分割任務中出現了一個FCN(全卷積網路),而這種全卷積的說法和R-FCN想要表達的意思很契合,或許這就是為啥這一版的名字沒有叫Fastest R-CNN吧,哈哈。
位置敏感卷積:
上面圖中,feature maps後面那根線就是位置敏感卷積層,它的卷積核個數是K^2(C+1),其中K是超引數,在論文用的比較多的是k=3,K^2是Grid的個數,這個個數與位置敏感池化操作後的尺寸相關聯的。C是物體的類別數量,加1是因為還有一個背景類。
經過了這一層卷積之後的輸出就是位置敏感分值圖,分值圖的寬高尺寸是與feature maps的寬高一致的,分值圖的通道數就是K^2(C+1),即每一個類別都有K^2個通道。
雖然這一層卷積操作叫位置敏感卷積,並輸出了位置敏感分值圖,但是它本質上只是一個常規的卷積,不同的地方其實在於配合它一起使用的位置敏感池化。
位置敏感卷池化:
位置敏感池化是在分值圖上的一種池化操作,它是RoI池化的變種,之前說分值圖的通道是K^2(C+1),每一個類別有K^2個通道,換句話說,分值圖上就有k^2個C+1個通道的組合。那麼假設k=3的話,這種情況就像上面圖示的那樣,每一個顏色都有C+1個通道,RPN的區域建議扣在分值圖上後,位置敏感池化會把這個區域在每一個通道上平均分為K^2份,然後在每一個bin內做Max pooling,但是關鍵在K格子的位置是和通道對應的,如上圖中深黃色的通道數有C+1個,那麼位置敏感池化操作的時候,只要深黃色通道為左上角的bin內的值,作為K格子的左上角位置的值,所以K格子的左上角位置也是深黃色的。
這種對應關係就是從左到右,從上到下。這樣的話,會得到一個K*K的格子,厚度是C+1,也就是每一個通道代表一個類別。
下面這張圖可以更直觀的說明位置敏感池化:
紅色的箭頭就說明了這種對應關係。
得到K格子之後,再做一步全域性平均池化,就得到了1*1(C+1)的特徵,剛好是C+1個,這樣一來,維度固定了,同樣實現了將不同的輸入整理成相同維度的輸出,同時維度剛好與分類數相等。
R-FCN損失函式
這個損失函式,和之前的沒啥區別,同樣是一個分類+迴歸的多工損失,最後在一個batch加和計算loss。
用於分類的是還是負的概率log值; 用於迴歸的是smooth L1。
關鍵的地方是,R-FCN把什麼特徵送到了Bounding box迴歸模型裡面,在Fast R-CNN裡是conv5特徵經過RoI pooling之後的特徵,在RPN裡是用一個卷積分支專門生產的特徵,在R-FCN裡面也是用一個單獨的卷積分支生成的,特徵的通道數是4K^2,方法和位置敏感卷積時一樣的,只是C+1改成了4。
R-FCN訓練
R-FCN訓練的步驟與Faster R-CNN相同,同樣是分步訓練法,只是把Fast R-CNN換成了R-FCN。
此外,文章提出了一個叫做OHEM(Online Hard Example Mining)的訓練技巧:
當一個圖片生成N個區域建議後,會使用當前的網路一次計算所有N個區域的loss,並根據loss從大到小排序建議區域,並從這N個排序後的區域中取前Batch-size個。
這是因為,如何某區域的loss更大,那麼說明網路中的引數並沒有照顧到這種特徵,而這種特徵應該是被學習到的,如果把本來loss就很小的特徵在送入網路中參與訓練,對引數的更新也沒啥影響。
R-FCN效能評價
上面這張圖說明了超引數k對最後的mAP的影響:
初始的Faster R-CNN RoI pooling的k選擇為1時,mAP為61.7%,選擇為7時,mAP為68.9%; R-FCN RoI pooling的k選擇為1時是沒有位置敏感資訊的,直接fail,k選擇為3和7時,mAP分別為75.5%與76.6%。
上面這張圖從多個角度對比了Faster R-CNN與R-FCN,其中Faster R-CNN用的是Resnet101,把前91層做共享卷積計算,後10層代替原來的3層全連線,所以這個Faster R-CNN的測試時間不是之前說的0.18s,而是mAP也不是66.9%。
關注中間一行,在使用OHEM的情況下,以ResNet-101為初始模型的兩個結構,單張訓練時間,R-FCN比Faster R-CNN快3倍多,單張測試時間R-FCN比Faster R-CNN快2.5倍左右。而0.17s這個時間,和Faster R-CNN使用舊形態的CNN模型時間是差不多的,但是mAP確實79.5%,優於原來的69.9%。