最近讀了這幾篇文章,做個總結,相關文章連結如下:
- R-CNN
- Fast R-CNN
- Faster R-CNN
- Mask R-CNN
R-CNN
文中主要有三個步驟:
- 找候選框:文中利用傳統方法( selective search)找出2000個可能是物體的候選框,然後将這些框縮放到同一尺寸,便于輸入CNN網絡。
- CNN提取特征:選用已有CNN架構(比如AlexNet)及其參數作為初始參數,然後再訓練過程中微調參數。(若選取網絡所有參數都随機初始化,由于訓練樣本少,會導緻跑不到最理想的參數)
- 訓練一個SVM分類器:計算所有區域的得分,使用非極大抑制選擇最合适的候選框,然後使用回歸器精修候選框的位置。
這篇文章的思路與後幾篇相比比較簡單,文章後半部分主要是做基于實驗的分析,感興趣的可以去看看。
Fast R-CNN
Fast R-CNN和R-CNN是同一個作者,是在R-CNN基礎上做的改進,在Fast R-CNN中,作者指出了R-CNN的幾個不足:
- 訓練是一個多階段的過程:文中訓練需要經過調參,建立SVM,邊界回歸幾個過程,使訓練時間顯得很長。
- 占用很大的時間和計算機空間:在訓練SVM和邊界回歸過程中,從圖檔的候選框中得到的特征都要寫入磁盤,非常占用記憶體和GPU。
- 對象檢測速度很慢:在測試時,需要從每個測試圖像候選框中提取特征。使用VGG16進行檢測平均每幅圖像需要47s。
針對這些不足,作者提出了一種新的Fast R-CNN架構:
從圖中可以看出,首先将輸入圖像和多個感興趣區域(RoI)輸入到完全卷積網絡中。 每個RoI經池化(RoI pooling layer)形成固定大小的特征圖,然後通過完全連接配接的層(FC)映射到特征向量。 網絡每個RoI具有兩個輸出向量:softmax機率和每類邊界框回歸偏移。
相比R-CNN,本文将整幅圖像作為輸入,消除了候選框之間的重疊和備援,特征提取的更快。将RoI feature vector作為兩個全連結層的輸入,不需要磁盤存儲特征,同時也更快。
Faster R-CNN
我們可以先看看Faster 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網絡是如何運作的:
該網絡的核心思想是滑動視窗,在最後一層卷積層的輸出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步)
- 先用ImageNet上的初始化參數訓練RPN,得到區域提案
- 用step 1中的區域提案訓練Fast R-CNN(目前兩個網絡相對獨立,沒有共享卷積層)
- 使用step 2中的Fast R-CNN網絡訓練RPN, 固定卷積層,微調RPN網絡
- 用step 3 中的區域提案訓練Fast R-CNN,此時兩個網絡共享了卷積層。
Mask R-CNN
本文主要貢獻是把用于檢測的Faster R-CNN拓展到了檢測+分割。還是先來看看他的架構:
可以看出在原有的Faster R-CNN的架構上,多了一個分支,用于對每個ROI區域預測分割mask,其結構實質上是一個FCN。
是以我們可以近似的認為:Mask R-CNN=Faster R-CNN + FCN,其中,Faster R-CNN用于提取候選框,對候選框進行分類和回歸,FCN則用于執行個體分割,也就是求掩膜mask。
總體而言,本文的貢獻主要在于以下兩點:
- 在Fast R-CNN架構上增加FCN分支,實作了目标分割
- 提出了一種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到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