天天看點

目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗

基于tensorflow實作的Mask RCNN源碼

對上面源碼的解讀

1 概述

目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗
  • Mask RCNN實際上是個執行個體分割算法(instance segmentation),這裡對它進行介紹的原因是Mask RCNN與faster RCNN算法密不可分,隻是在faster RCNN的分類支路、邊框回歸支路之外,增加了一個執行個體分割支路。改動雖然簡單,但是Mask RCNN執行個體分割的效果非常出衆,令人贊歎。
  • 個人認為Mask RCNN的核心貢獻有兩點:①證明faster RCNN架構不僅僅局限于目标檢測,對其稍加改進,就能應用于其它領域,并且可以取得非常不錯的效果;②提出了ROI Align,用于取代ROI pooling,解決ROI pooling存在的近似問題。

2 Mask RCNN

  • 相比faster RCNN,Mask RCNN隻是多了個Mask支路,是以這裡隻對Mask支路進行介紹,有關faster RCNN的内容此處不再贅述。

2.1 Mask支路(執行個體分割支路)

  • 特征提取網絡得到的feature maps經過RPN網絡後,得到ROI。對每個ROI,使用ROI Align pooling技術進行池化(下一小節會介紹)。再将池化後的特征進行若幹次的卷積或反卷積操作,最後得到 k*m2 次元的輸出。k為資料集的類别數,m2為每個mask的分辨率。
  • 訓練階段,Mask支路的損失如何定義呢?訓練時,對某個ROI,自然有個類别,該ROI得到k個分辨率為m2的mask,對每個mask的每個像素,都進行一次sigmoid變換,将像素值變換至0-1之間的值,然後選擇對應類别的mask與ROI對應ground truth的mask逐像素計算交叉熵損失,取平均值,作為該ROI的mask支路的loss,記為Lmask(有兩點值得注意:①隻有正類ROI才會計算Lmask,網絡總的loss值L=Lcls +Lbox +Lmask;②隻計算ROI與ground truth相交部分的Lmask)
  • Mask支路會為每個正類ROI得到k個二進制分割mask,每個mask分别是第k類的執行個體分割結果,計算Lmask時,隻計算該ROI分類支路得到的分類結果對應的mask。這不同于語義分割的典型做法:對得到的mask,逐點使用softmax,然後計算多分類交叉熵損失函數。實驗證明,Mask RCNN的這種做法,可以顯著提高執行個體分割效果。

2.2 ROI Align

  • 首先需要回答一個重要的問題:為什麼要提出ROI Align?回憶典型faster RCNN結構:RPN網絡在原圖上得到ROI,然後将ROI映射到feature maps上,再對映射後的ROI區域進行ROI pooling操作,最後對池化後的特征分别完成分類和邊框回歸。在這一過程中,實際上發生了兩次取整操作:①将原圖上的ROI映射到feature maps上時,發生了一次取整操作:以VGG16為例,特征提取網絡VGG16提取特征時進行了4次步長為2的池化操作,因而對一個ROI,最終在feature maps上映射出的尺寸是輸入的十六分之一,如果計算出的值不是整數,則進行取整操作②對feature maps上的ROI區域進行池化時,若ROI區域的尺寸不能被池化數整除,也會進行取整操作。例如,對feature maps上20x20的ROI區域,進行7x7的ROI pooling操作時,每個方格的大小為2.86x2.86,取整為2x2。這兩次取整操作的示意圖如下:
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗
上圖有點問題:VGG16經過4次池化操作會将輸入圖像的尺寸縮小至原來的十六分之一,而不是三十二分之一
  • faster RCNN的分類支路和邊框回歸支路都會對池化後的特征進行全連接配接操作,将池化後的特征進一步變換成一個一維向量,是以這兩條支路對于整個過程兩次取整帶來的誤差并不十分敏感。但是用于執行個體分割的Mask支路就不是這樣了。執行個體分割需要得到可以如實反映目标形狀的mask,上圖中這種進行兩次取整操作的方式顯然不适用于Mask支路。試想,對原圖上665x665的ROI,在feature maps上對應的ROI區域尺寸被取整為41x41,再經過7x7的ROI pooling池化時,每個方格的大小被池化為5x5。由5x5反推,對應的ROI區域為35x35,因而對應的輸入ROI的尺寸應該是560x560,與原始ROI比較,相差巨大。
  • ROI Align意在避免這兩次取整操作,如何避免呢?分為三步:①設輸入圖像上的ROI的左上角坐标、長、寬分别為X、Y、W、H,輸入圖像上的ROI縮小至原來的十六分之一時不取整,保留浮點數形式的坐标和長寬;②再進行7x7的池化操作,這時候計算出的每個方格的長寬也保留浮點數形式;③對每個方格,将其均分為4份,每份都利用雙線性插值取得中間位置的值,取四個值中的最大值作為該方格池化後的值。示意圖如下:
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗

點選這裡了解雙線性插值

2.3 網絡結構

  • 骨幹網絡結構(backbone):ResNet、ResNeXt、ResNet+FPN
  • Mask分支網絡結構(head):如下圖所示
    目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗

2.4 網絡實作細節

2.4.1 訓練

  • 與ground truth的IOU大于0.5的ROI視為正類樣本,其它視為負類樣本
  • 隻對正類樣本計算Lmass,隻計算正類樣本與ground truth重疊區域的Lmass
  • resize圖像,使其較短邊為800像素
  • 一個mini-batch中圖檔的數量為2 images per GPU,每張圖有N個ROI,正負樣本比例為1:3,對ResNet C4骨幹網絡,N=64,對ResNet+FPN骨幹網絡,N=512
  • 作者在實驗中采用8GPU進行訓練,共訓練160k個iteration,前120k個iteration學習率為0.02,後40k個iteration學習率為0.002,weight decay為0.0001,momentum為0.9
  • RPN網絡産生5種scales、3種ratios的anchor

2.4.2 推理

  • ResNet C4骨幹網絡對置信度最大的前300個anchor進行推理,FPN骨幹網絡對置信度最大的前1000個anchor進行推理,預測出bbox後,再應用NMS算法。Mask分支對預測出的前100個bbox進行處理,預測出分辨率為mxm的浮點數mask後,resize到對應ROI的大小,再以0.5的門檻值進行二值化

3 實驗

論文裡常常将所做的實驗稱為"ablation experiment",我對這個詞的了解是“控制變量的實驗”
  • 所有實驗均使用COCO資料集
  • 評價标準有:①AP(averaged over IOU thresholds);②AP50,AP75;③APS,APM,APL(AP at different scales)

3.1 Mask RCNN在COCO資料集上的表現

目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗

3.2 Ablation experiment

  • 不同骨幹網絡對性能的影響,得到的結論:更深的網絡帶來更好的性能;FPN技術和ResNeXt也會提升性能
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗
  • 将mask的預測和類别預測分離是否真的有效?結論:相比将二者結合起來,分離帶來了5.5AP的提升
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗
  • ROI Align的有效性,結論:相比ROI pooling,帶來3 AP的提高,在IOU75時提升最最大
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗
  • mask分支采用全卷積結構的有效性,與多層感覺機(MLP)對比
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗
  • Mask RCNN在目标檢測的表現
目标檢測(Object detection)—— Mask RCNN1 概述2 Mask RCNN3 實驗

繼續閱讀