0 - 背景
從rcnn,spp,fast rcnn, faster rcnn,yolo,ssd,這里又有個新模型叫rfcn,即Region-based Fully Convolutional Networks,R-FCN。雖然其比yolo,ssd出來的晚,不過看模型結構,更多的是針對faster rcnn的一個改進。
一路走來,不同模型都是為了解決不同的痛點而提出的:
- rcnn證明了cnn提取的特征的有效性;
- 而spp解決了如何應對不同尺度feature map的問題;
- fast rcnn通過roi pooling將需要應用到多個候選框上的基CNN模型進行共享,加快了速度並且提升了准確度;
- 而faster rcnn為了更進一步的共享基CNN,將本來需要由SS算法提取候選框的任務一並放入基CNN中,從而提出了RPN子網絡;
那么問題來了,fast rcnn發明的ROI pooling中間是由全連接層存在,從而將前面的ROIpooling后的feature map 映射成兩個部分(對象分類,坐標回歸);而越來越多的基CNN,如googlenet,resnet等全卷積網絡證明了不要全鏈接層,效果不但更好,而且能適應不同尺度的圖片無壓力。本着解決下一個痛點的原則,rfcn應運而生。
1 - rfcn
我們可以說rfcn是基於faster rcnn的基礎上對roi pooling這部分進行了改進。那么我們為了消滅fast rcnn的roi pooling中的全連接層的最naive的想法自然就是丟棄全連接層(起到了融合特征和特征映射的作用),直接將roi pooling的生成的feature map 連接到最后的分類和回歸層即可。不過作者們通過做實驗發現,這樣的結果導致的對象檢測結果很差,並且受到《Deep residual learning for image recognition》的啟發,認為這主要是:基CNN本身是對圖像分類設計的,具有圖像移動不敏感性;而對象檢測領域卻是圖像移動敏感的,所以二者之間產生了矛盾。從而對roi pooling進行了很神奇的設計
圖1.1 rfcn結構圖
如圖1.1所示,網絡的第一印象,結構大體和faster rcnn很像,都是有個RPN子網絡用來訓練並生成一堆基於當前圖像的對象候選框,而ROI Pooling 就不一樣。
2 - 改進的ROI Pooling
圖2.1 rfcn中ROI Pooling結構圖
如圖2.1所示,假設圖像經過了基CNN,到達了最后一層feature maps,接下來就是如fast rcnn中一樣,提取當前feature map的ROI區域了,然而rfcn不是直接這么干。這里我們設計一個位置敏感的ROI Pooling:將fast rcnn中的ROI 划分成\(k*k\)大小,即圖片中本來獲取的ROI區域,將其分成\(k*k\)個區域(這里k=3,即分成9個部分)。假設該數據集一共由\(C\)類,那么再加個背景類,一共是\(C+1\)類。我們希望對每個類別都有各自的位置感應。
所以我們要設計的位置敏感得分map如圖2.1中position-sensitive score maps(即從之前基CNN的feature maps,假設有n個通道,通過一樣的卷積連接結構生成當前的相同大小map且有\(k^2(C+1)通道的位置敏感得分maps\))。就是幾個大色塊並列的部分:每個色塊表示對對象的特定位置進行敏感,而且每個色塊大小中有\(C+1\)個map,所以該區域一共有\(k^2(C+1)\)個map,其中每個map的大小和之前那個基CNN的feature map大小一致。
那么接下來就需要介紹具體的怎么從position-sensitive score maps得到圖2.1中右邊那個\(k*k\)大小,通道為\(C+1\)的map了。
這里就不貼論文公式了,我們以圖解釋
圖2.2,從位置敏感得分map到位置敏感ROI pooling
2.1 ROI區域的分類
圖2.2是在一個類別下而不是\(C+1\)個類別同時進行。假設我們圖2.1的位置敏感map中\(k=3\),那么當前一共有:
___________________ | ___________________ | ___________________ |
---|---|---|
\(cls_1\{1,2,3,...,C+1\}\) | \(cls_2\{1,2,3,...,C+1\}\) | \(cls_3\{1,2,3,...,C+1\}\) |
\(cls_4\{1,2,3,...,C+1\}\) | \(cls_5\{1,2,3,...,C+1\}\) | \(cls_6\{1,2,3,...,C+1\}\) |
\(cls_7\{1,2,3,...,C+1\}\) | \(cls_8\{1,2,3,...,C+1\}\) | \(cls_9\{1,2,3,...,C+1\}\) |
這么9個不同顏色的feature maps,其中每個feature maps中都有\(C+1\)個feature map。
_______ | _______ | _______ |
---|---|---|
左上 | 中上 | 右上 |
左中 | 中間 | 右中 |
左下 | 中下 | 右下 |
上述為划分成\(k*k\),且\(k=3\)情況下的位置對應關系
_______ | _______ | _______ |
---|---|---|
\(cls_1\{1\}\) | \(cls_2\{1\}\) | \(cls_3\{1\}\) |
\(cls_4\{1\}\) | \(cls_5\{1\}\) | \(cls_6\{1\}\) |
\(cls_7\{1\}\) | \(cls_8\{1\}\) | \(cls_9\{1\}\) |
- 1 - 首先處理類別為1的部分,即如上面表格所示:
- 2 - 如圖2.2中,就是這抽取出來的9個feature map,然后如圖2.2所示,對每個feature map按照各自敏感的區域,將其框出來:比如在這9個feature map中第一個表示左上位置,那么提取這個feature map的ROI區域,然后將其分成\(k*k\)的網格,提取其表示的左上位置,即第一個網格;同理第二個表示中上的feature map提取其\(k*k\)的網格中第二個網格,因為當前feature map表示的是中上位置,當前map的第二個網格也表示中上位置;
- 3 - 對抽取出來的部分進行求均值,然后按照位置組成一個\(k*k\),即\(3*3\)大小的矩陣;
- 4 - 對這個\(k*k\)大小的矩陣求和,得到一個值。
- 5 - 對類別\(2\sim (C+1)\)分別進行步驟1-4的操作,從而最終得到一個\(1*(C+1)\)這樣的向量(如圖2.1),將這個向量進行softmax,從而估計當前feature map對應的ROI區域是什么類別
2.2 ROI區域的回歸
上面說到了從基CNN的feature map得到ROI pooling直到softmax的分類,這里接着說如何微調ROI本身的區域,這部分與分類其實很相似:
______________ | ______________ | ______________ |
---|---|---|
\(reg_1\{x,y,w,h\}\) | \(reg_2\{x,y,w,h\}\) | \(reg_3\{x,y,w,h\}\) |
\(reg_4\{x,y,w,h\}\) | \(reg_5\{x,y,w,h\}\) | \(reg_6\{x,y,w,h\}\) |
\(reg_7\{x,y,w,h\}\) | \(reg_8\{x,y,w,h\}\) | \(reg_9\{x,y,w,h\}\) |
- 1 - 如圖2.1的位置敏感maps是有\(k^2(C+1)\)個通道的,我們依然從基CNN的feature map部分連接出一個\(4k^2\)通道的maps(與位置敏感maps並列),用來做候選框坐標微調,如上面表格所示;
- 2 - 如分類部分的步驟1-4一樣的操作,最后得到一個\(1*4\)的向量,即\(x,y,w,h\)
- 3 - 按照之前的那些模型一樣去計算目標函數即可
問題
問:為什么需要做如圖2.2這種特定map的特定區域的選取,而不是直接在特定map上將整個ROI區域都選取?
答:將k設為1就行了,就是整個ROI選取,作者做過實驗的,效果不好。