天天看點

R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN總結

最近讀了這幾篇文章,做個總結,相關文章連結如下:

- R-CNN

- Fast R-CNN

- Faster R-CNN

- Mask R-CNN

R-CNN

文中主要有三個步驟:

  1. 找候選框:文中利用傳統方法( selective search)找出2000個可能是物體的候選框,然後将這些框縮放到同一尺寸,便于輸入CNN網絡。
  2. CNN提取特征:選用已有CNN架構(比如AlexNet)及其參數作為初始參數,然後再訓練過程中微調參數。(若選取網絡所有參數都随機初始化,由于訓練樣本少,會導緻跑不到最理想的參數)
  3. 訓練一個SVM分類器:計算所有區域的得分,使用非極大抑制選擇最合适的候選框,然後使用回歸器精修候選框的位置。
R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN總結

這篇文章的思路與後幾篇相比比較簡單,文章後半部分主要是做基于實驗的分析,感興趣的可以去看看。

Fast R-CNN

Fast R-CNN和R-CNN是同一個作者,是在R-CNN基礎上做的改進,在Fast R-CNN中,作者指出了R-CNN的幾個不足:

  1. 訓練是一個多階段的過程:文中訓練需要經過調參,建立SVM,邊界回歸幾個過程,使訓練時間顯得很長。
  2. 占用很大的時間和計算機空間:在訓練SVM和邊界回歸過程中,從圖檔的候選框中得到的特征都要寫入磁盤,非常占用記憶體和GPU。
  3. 對象檢測速度很慢:在測試時,需要從每個測試圖像候選框中提取特征。使用VGG16進行檢測平均每幅圖像需要47s。

針對這些不足,作者提出了一種新的Fast R-CNN架構:

R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN總結

從圖中可以看出,首先将輸入圖像和多個感興趣區域(RoI)輸入到完全卷積網絡中。 每個RoI經池化(RoI pooling layer)形成固定大小的特征圖,然後通過完全連接配接的層(FC)映射到特征向量。 網絡每個RoI具有兩個輸出向量:softmax機率和每類邊界框回歸偏移。

相比R-CNN,本文将整幅圖像作為輸入,消除了候選框之間的重疊和備援,特征提取的更快。将RoI feature vector作為兩個全連結層的輸入,不需要磁盤存儲特征,同時也更快。

Faster R-CNN

我們可以先看看Faster R-CNN的結構架構:

R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN總結

與Fast R-CNN的結構相比,Faster R-CNN把區域提案(選擇候選框)放在了CNN網絡之後,相當于和後面的圖像檢測網絡共享了一個CNN網絡,那麼為什麼要這樣做?

原文作了如下解釋:在Fast R-CNN中,選取候選框的工作在CPU中進行,然後再GPU中進行CNN提取特征,這會拖慢整體的運作速度,是以能夠想到把區域提案工作也在GPU中完成,而把這一步驟放在CNN提特征之後,即能共享CNN提取的特征,也不會影響後續的檢測工作,使得産生區域提案的開銷達到最小。

到這,整個架構就很清楚了:RPN+Fast R-CNN

作者保留了Fast R-CNN的主體架構(提特征,檢測,分類,回歸),在CNN網絡和檢測網絡間并入了RPN網絡用來産生區域提案。

接下來,我們看看RPN網絡是如何運作的:

R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN總結

該網絡的核心思想是滑動視窗,在最後一層卷積層的輸出feature map(共有256個feature map,是以輸出256維向量) 上使用一個3×3的滑動視窗,在滑動視窗的中心位置,對應預測輸入圖像産生3種尺度,3種長寬比的區域提案(region proposal),這種映射的機制稱為錨點(anchor),于是,在每個3×3的區域,可以産生K=9個區域提案。是以對于這個40×60的feature map,總共有約20000(40×60×9)個anchor,也就是預測20000個區域提案。

然後把這些ragion proposal 輸入cls layer 和reg layer,選取前300個得分最高的作為目标候選輸入到Fast R-CNN的目标檢測單元。

訓練政策

大緻的思路是交替訓練( Alternating training,文中分4步)

  1. 先用ImageNet上的初始化參數訓練RPN,得到區域提案
  2. 用step 1中的區域提案訓練Fast R-CNN(目前兩個網絡相對獨立,沒有共享卷積層)
  3. 使用step 2中的Fast R-CNN網絡訓練RPN, 固定卷積層,微調RPN網絡
  4. 用step 3 中的區域提案訓練Fast R-CNN,此時兩個網絡共享了卷積層。

Mask R-CNN

本文主要貢獻是把用于檢測的Faster R-CNN拓展到了檢測+分割。還是先來看看他的架構:

R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN總結

可以看出在原有的Faster R-CNN的架構上,多了一個分支,用于對每個ROI區域預測分割mask,其結構實質上是一個FCN。

是以我們可以近似的認為:Mask R-CNN=Faster R-CNN + FCN,其中,Faster R-CNN用于提取候選框,對候選框進行分類和回歸,FCN則用于執行個體分割,也就是求掩膜mask。

總體而言,本文的貢獻主要在于以下兩點:

  1. 在Fast R-CNN架構上增加FCN分支,實作了目标分割
  2. 提出了一種ROIAlign,提升了算法在像素級分割時的精确性

接下來,我對這兩點進行簡要介紹

Mask

與以往的類别分類依賴于 mask 的預測(等于說要先求mask,然後再分類、回歸)不同,文中的FCN求mask是和Faster R-CNN中的分類和回歸同時進行的,如此一來将串行的流程化為并行的過程,簡化了流程同時使得計算開銷僅比Faster R-CNN多一點。

由于是并行的,是以損失函數表示為 L=Lcls+Lbox+Lmask ,其中 Lcls和Lbox 是Faster R-CNN中對應于分類和回歸的損失函數。在 mask 分支中對每個 RoI 的輸出有 K∗m∗m 維,其中K表示類别數, m∗m 表示mask的尺寸。對于屬于第k個類别的ROI, Lmask 函數隻定義對應類别的 mask損失,其他類别的mask輸出不會影響該類别的 loss。

ROIAlign

是對RoI Pooling的改進。RoI Pooling在 Pooling時可能會有不對齊的情況發生,這種不對齊在做分類時問題不大,可是當需要做像素級的分割時就會對分割的精确度産生很大影響。

解決方法:參考 Spatial Transformer Networks (NIPS2015), 使用雙線性插值,再做聚合。(比如8 * 7的資料原先使用ROI Pooling時要pooling到7 * 7,會有misalignment。當使用ROIAlign後,先雙線性插值到14 * 14,再pooling到7 * 7)

R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN總結

實驗的結果确實很驚人,值得好好學習一下。

總結

總體來講,由R-CNN到Mask R-CNN,前三篇都是用于物體檢測,Mask R-CNN用于物體檢測和分割。主要的算法思想有以下的關系:

R-CNN:選取候選框 → 提特征 → SVM分類器

Fast R-CNN: 輸入是整幅圖檔+ROI Projection,減少了備援

Faster R-CNN:等于 Fast R-CNN+RPN

Mask R-CNN : 等于Faster R-CNN + FCN

繼續閱讀