讀論文系列Object Detection · 乾貨滿滿的RCNN

Object Detection,顧名思義就是從圖像中檢測出目標對象,具體而言是找到對象的位置,常見的數據集是PASCAL VOC系列。2010年-2012年,Object Detection進展緩慢,在DPM之後沒有大的進展,直到CVPR2014,RBG大神(Ross Girshick)把當時爆火的CNN結合到Detection中,將PASCAL VOC上的準確率提高到53.7%,本文為你解讀RBG的CVPR2014 paper:

Rich feature hierarchies for accurate object detection and semantic segmentation

Key insights

  • 可以用CNN對圖片局部區域做識別,從而判斷這個局部是不是目標對象
  • 在標記數據稀缺的情況下,可以用其他數據集預訓練,再對模型進行fine tune

RCNN Overview

讀論文系列Object Detection · 乾貨滿滿的RCNN

  1. 輸入圖片
  2. 通過selective search給出2k個推薦區域(region proposal)

檢測問題的一個特點是,我們不僅需要知道一張圖片中是否包含目標對象,而且需要知道目標對象所處位置,有幾種方式,一種是迴歸圖中檢測框的位置[38],但是準確率很低,一種是用滑動窗口的方法將圖片切割成很多小塊,再對小塊做分析,但是對於CNN來說,每經過一層pooling,感受野就會變小,RCNN採用了一個五層卷積的結構,要求輸入至少是195x195的尺寸,用滑窗不能保證這個輸入大小。

讀論文系列Object Detection · 乾貨滿滿的RCNN

Selective search是一種比較好的數據篩選方式,首先對圖像進行過分割切成很多很多小塊,然後根據小塊之間的顏色直方圖、梯度直方圖、面積和位置等基本特徵,把相近的相鄰對象進行拼接,從而選出畫面中有一定語義的區域。關於Selective Search的更多信息可以查閱這篇論文:Recognition using Regions(CVPR2009)

  1. 將每個推薦區域傳入CNN提取特徵
  2. 為每個類訓練一個SVM,用SVM判斷推薦區域屬於哪個類
  3. 用NMS對同個類的region proposals進行合併
  4. 用bounding box regressor對預測位置進行精細的修正,進一步提高精度

非極大值抑制(NMS)顧名思義就是抑制不是極大值的元素,搜索局部的極大值。這個局部代表的是一個鄰域,鄰域有兩個參數可變,一是鄰域的維數,二是鄰域的大小。這裡不討論通用的NMS算法,而是用於在目標檢測中用於提取分數最高的窗口的。例如在行人檢測中,滑動窗口經提取特徵,經分類器分類識別後,每個窗口都會得到一個分數。但是滑動窗口會導致很多窗口與其他窗口存在包含或者大部分交叉的情況。這時就需要用到NMS來選取那些鄰域裡分數最高(是行人的概率最大),並且抑制那些分數低的窗口。(轉自知乎專欄:曉雷的機器學習筆記)

訓練

從上面的Overview可以看出,需要訓練的主要有兩個部分,各個類共用的CNN和各個類單獨的SVM。

Network Structure

RCNN試了兩種CNN框架,一種是Hinton他們在NIPS2012上發表的AlexNet:ImageNet Classification with Deep Convolutional Neural Networks

讀論文系列Object Detection · 乾貨滿滿的RCNN

這是一個五層卷積+三層全連接的結構,輸入是224x224的圖片,輸出是1000維one-hot的類別,

一種是VGG16(Very Deep Convolu- tional Networks for Large-Scale Image Recognition)

讀論文系列Object Detection · 乾貨滿滿的RCNN

這是兩個網絡的檢測結果:

讀論文系列Object Detection · 乾貨滿滿的RCNN

VGG16精度更高一些,但是計算量比較大,實時性不如AlexNet,方便起見我們下面都以AlexNet為基礎進行分析。

Supervised Pretraining

首先用ImageNet預訓練,輸入圖片,輸出為這張圖片包含的目標對象的類別,而不涉及具體位置,因為ImageNet中沒有bounding box信息。訓練到AlexNet能夠在分類任務上達到Hinton他們的精度之後,開始用檢測數據做Fine tune。

Domain Specific Fine Tuning

直接用ImageNet預訓練得到的CNN在PASCAL VOC上表現肯定是不如人意的,接下來,用PASCAL VOC 的檢測數據進行fine tune。 因為VOC有20個分類,在ILSVR2013的檢測任務中,最後有200個分類,而ImageNet有1000個分類,首先要把最後的全連接分類層替換成目標任務輸出個數+1(加一個背景類)的全連接層。輸入數據用的是Selective Search得到的Region Proposals對應的bounding box,

在這裡的Fine tune中,需要判定Region Proposal屬於哪種目標分類,在VOC的訓練集中,有bounding box和對應的分類標註,RBG他們是檢查每個Region Proposal與訓練集中bounding box的重疊率,如果Region Proposal和bounding box重疊率大於閾值(經過實驗,選了0.5),則認為這個Region Proposal的分類為bounding box對應的分類,並且用這個對應的bounding box作為Fine tune的輸入。

但是這些輸入大小不一,需要調整到目標輸入尺寸224x224,在附錄A中討論了很多的預處理方法,

讀論文系列Object Detection · 乾貨滿滿的RCNN

A. 原圖 B. 等比例縮放,空缺部分用原圖填充 C. 等比例縮放,空缺部分填充bounding box均值 D. 不等比例縮放到224x224 實驗結果表明B的效果最好,但實際上還有很多的預處理方法可以用,比如空缺部分用區域重複。

訓練時,採用0.001的初始學習率(是上一步預訓練的1/10),採用mini-batch SGD,每個batch有32個正樣本(各種類混在一起),96個負樣本進行訓練。

Object category classifiers

每個類對應一個Linear SVM二分類器(恩,很簡單的一個SVM,沒有複雜的kernel),輸入是CNN倒數第二層的輸出,是一個長度為4096的向量,SVM根據這個特徵向量和標籤進行學習,調整權重,學習到特徵向量中哪些變量對當前這個類的區分最為有效。

訓練SVM的數據和Fine tuning訓練CNN的數據有所不同,直接使用將PASCAL VOC訓練集中的正樣本,將與bounding box重疊率小於0.3的Region Proposals作為背景(負樣本),這個重疊率也是調參比較出來的;另一方面,由於負樣本極多,論文采用了hard mining技術篩選出了難分類負樣本進行訓練。不過這樣的話,SVM和CNN的正負樣本定義就不同了,SVM的正樣本會少很多(那些重疊率大於0.5的bounding box就沒用上了)。

附錄B中解釋,其實一開始RBG他們是用SVM的正負樣本定義來Fine tune CNN的,發現效果很差。SVM可以在小樣本上就達到比較好的效果,但CNN不行,所以需要用上更多的數據來Fine tune,重疊率大於0.5的Region Proposals的數據作為正樣本,可以帶來30倍的數據,但是加入這些不精準的數據的代價是,檢測時位置不夠準確了(因為位置有些偏差的樣本也被當做了正樣本)。

於是會有一個很自然的想法,如果有很多的精確數據,是不是可以直接用CNN加softmax輸出21個分類,不用SVM做分類?RBG他們直接在這個分類方式上fine tune,發現這樣做的準確率也很高(50.9%),但是不如用SVM做分類的結果(54.2%),一方面是因為正樣本不夠精確,另一方面是因為負樣本沒有經過hard mining,但至少證明,是有可能直接通過訓練CNN來達到比較好的檢測效果的,可以加快訓練速度,並且也更加簡潔優雅。

Bounding-box regression

這部分是在附錄C展開闡述的(CVPR篇幅限制)。首先,為每個類訓練一個bounding box regressor,類似DPM中的bounding box regression,每個類的regressor可以為每個圖輸出一個響應圖,代表圖中各個部分對這個類的響應度。DPM中的Regressor則是用圖像的幾何特徵(HOG)計算的;不同於DPM,RCNN-BB中這種響應度(activation)是用CNN來計算的,輸入也有所不同,DPM輸入是原圖,輸出是響應圖(從而得到bbox的位置),RCNN-BB的Regressor輸入是Region Proposals的位置和原圖,輸出是bounding box的位置。

訓練得到四個映射關係後,測試時用這四個映射就能夠對預測的Region Proposals位置做精細的修正,提升檢測框的位置準確率了。

至此,整個訓練和測試過程就介紹完畢了。

玄學時間

在論文中還打開RCNN中卷積層分析它們的功能,在AlexNet的論文中,Hinton已經用可視化的方式為我們展示了第一層卷積描述的是對象的輪廓和顏色,但後面的層因為已經不能表示成圖像,所以不能直接可視化,RBG的方法是,輸入一張圖片的各個區域,看pool5(最後一層卷積層的max pooling輸出)中每個單元的響應度,將響應程度高的區域框出來:

讀論文系列Object Detection · 乾貨滿滿的RCNN

pool5的feature map大小為6x6x256,圖中每行的16張圖代表一個unit響應度最高的16張圖,將每張圖響應度較高的區域用白色框框出來了,這裡只挑了6個unit進行展示(所以只有6行)。一個unit是6x6x256的張量中的一個實數,這個數越大,意味著對輸入的響應越高。

可以看到不同的unit有不同的分工,第一行的unit對person響應度比較高,第二行的unit對dog和dot array(點陣)的響應度比較高,可以從這個角度出發,用每個unit充當單獨的一種object detector。

附錄D中還有更多的可視化結果

讀論文系列Object Detection · 乾貨滿滿的RCNN

之所以說是玄學是因為,雖然這種可視化一定程度上體現了CNN學習到的東西,但是仍然沒有說明白為什麼是這個單元學習到這種信息。

Summary

RCNN第一次把CNN結合Region proposal用到了detection任務中,取得了很好的效果,在這篇論文裡,還體現了很多視覺深度學習的流行技巧,比如Pretrain,Fine tune,傳統方法與深度學習結合(分割+檢測,CNN+SVM,Bounding box regression),可以說是相當值得一讀的好paper了。


分享到:


相關文章: