object detection[rfcn]



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選取,作者做過實驗的,效果不好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM