Mask R-CNN論文理解


摘要:

  • Mask RCNN可以看做是一個通用實例分割架構。
  • Mask RCNN以Faster RCNN原型,增加了一個分支用於分割任務。
  • Mask RCNN比Faster RCNN速度慢一些,達到了5fps。
  • 可用於人的姿態估計等其他任務;

 

1、Introduction

  • 實例分割不僅要正確的找到圖像中的objects,還要對其精確的分割。所以Instance Segmentation可以看做object dection和semantic segmentation的結合。
  • Mask RCNN是Faster RCNN的擴展,對於Faster RCNN的每個Proposal Box都要使用FCN進行語義分割,分割任務與定位、分類任務是同時進行的。
  • 引入了RoI Align代替Faster RCNN中的RoI Pooling。因為RoI Pooling並不是按照像素一一對齊的(pixel-to-pixel alignment),也許這對bbox的影響不是很大,但對於mask的精度卻有很大影響。使用RoI Align后mask的精度從10%顯著提高到50%,第3節將會仔細說明。
  • 引入語義分割分支,實現了mask和class預測的關系的解耦,mask分支只做語義分割,類型預測的任務交給另一個分支。這與原本的FCN網絡是不同的,原始的FCN在預測mask時還用同時預測mask所屬的種類。
  • 沒有使用什么花哨的方法,Mask RCNN就超過了當時所有的state-of-the-art模型。
  • 使用8-GPU的服務器訓練了兩天。

 

2、Related Work

相比於FCIS,FCIS使用全卷機網絡,同時預測物體classes、boxes、masks,速度更快,但是對於重疊物體的分割效果不好。

 

3、Mask R-CNN

MaskRCNN網絡結構泛化圖:

從上面可以知道,mask rcnn主要的貢獻在於如下:
1. 強化的基礎網絡
通過 ResNeXt-101+FPN 用作特征提取網絡,達到 state-of-the-art 的效果。
2. ROIAlign解決Misalignment 的問題
3. Loss Function

 

細節描述

1. resnet +FPN
作者替換了在faster rcnn中使用的vgg網絡,轉而使用特征表達能力更強的殘差網絡。

另外為了挖掘多尺度信息,作者還使用了FPN網絡。

stage1和stage2層次結構圖:

 結合MaskRCNN網絡結構圖,注重點出以下幾點:

1) 雖然事先將ResNet網絡分為5個stage,但是,並沒有利用其中的Stage1即P1的特征,官方的說法是因為P1對應的feature map比較大計算耗時所以棄用;相反,在Stage5即P5的基礎上進行了下采樣得到P6,故,利用了[P2 P3 P4 P5 P6]五個不同尺度的特征圖輸入到RPN網絡,分別生成RoI.

2)[P2 P3 P4 P5 P6]五個不同尺度的特征圖由RPN網絡生成若干個anchor box,經過NMS非最大值抑制操作后保留將近共2000個RoI(2000為可更改參數),由於步長stride的不同,分開分別對[P2 P3 P4 P5]四個不同尺度的feature map對應的stride進行RoIAlign操作,將經過此操作產生的RoI進行Concat連接,隨即網絡分為三部分:全連接預測類別class、全連接預測矩形框box、全卷積預測像素分割mask

2. ROIAlign

對於roi pooling,經歷了兩個量化的過程:
第一個:從roi proposal到feature map的映射過程。方法是[x/16],這里x是原始roi的坐標值,而方框代表四舍五入。
第二個:從feature map划分成7*7的bin,每個bin使用max pooling。

這兩種情況都會導致證輸入和輸出之間像素級別上不能一一對應(pixel-to-pixel alignment between network input and output)。

為了解決ROI Pooling的上述缺點,作者提出了ROI Align這一改進的方法。ROI Align的思路很簡單:取消量化操作,使用雙線性內插的方法獲得坐標為浮點數的像素點上的圖像數值,從而將整個特征聚集過程轉化為一個連續的操作。值得注意的是,在具體的算法操作上,ROI Align並不是簡單地補充出候選區域邊界上的坐標點,然后將這些坐標點進行池化,而是重新設計了一套比較優雅的流程:

  • 遍歷每一個候選區域,保持浮點數邊界不做量化。
  • 將候選區域分割成k x k個單元,每個單元的邊界也不做量化。
  • 在每個單元中計算固定四個坐標位置,用雙線性內插的方法計算出這四個位置的值,然后進行最大池化操作。

如上,roi映射到feature map后,不再進行四舍五入。然后將候選區域分割成k x k個單元, 在每個單元中計算固定四個坐標位置,用雙線性內插的方法計算出這四個位置的值,然后進行最大池化操作。

3、損失函數:分類誤差+檢測誤差+分割誤差,即L=Lcls+Lbox+Lmask

   Lcls、Lbox:利用全連接預測出每個RoI的所屬類別及其矩形框坐標值,可以參看FasterRCNN網絡中的介紹。

   Lmask:

 ① mask分支采用FCN對每個RoI的分割輸出維數為K*m*m(其中:m表示RoI Align特征圖的大小),即K個類別的m*m的二值mask;保持m*m的空間布局,pixel-to-pixel操作需要保證RoI特征 映射到原圖的對齊性,這也是使用RoIAlign解決對齊問題原因,減少像素級別對齊的誤差。

        K*m*m二值mask結構解釋:最終的FCN輸出一個K層的mask,每一層為一類,Log輸出,用0.5作為閾值進行二值化,產生背景和前景的分割Mask

這樣,Lmask 使得網絡能夠輸出每一類的 mask,且不會有不同類別 mask 間的競爭. 分類網絡分支預測 object 類別標簽,以選擇輸出 mask,對每一個ROI,如果檢測得到ROI屬於哪一個分 類,就只使用哪一個分支的相對熵誤差作為誤差值進行計算。(舉例說明:分類有3類(貓,狗,人),檢測得到當前ROI屬於“人”這一類,那么所使用的Lmask為“人”這一分支的mask,即,每個class類別對應一個mask可以有效避免類間競爭(其他class不貢獻Loss)

 ② 對每一個像素應用sigmoid,然后取RoI上所有像素的交叉熵的平均值作為Lmask。

 

每個 ROI 區域會生成一個 m*m*numclass 的特征層,特征層中的每個值為二進制掩碼,為 0 或者為 1。根據當前 ROI 區域預測的分類,假設為 k,選擇對應的第 k 個 m*m 的特征層,對每個像素點應用 sigmoid 函數,然后計算平均二值交叉損失熵,如下圖所示:

上圖中首先得到預測分類為 k 的 mask 特征,然后把原圖中 bounding box 包圍的 mask 區域映射成 m*m大小的 mask 區域特征,最后計算該 m*m 區域的平均二值交叉損失熵。

 

 訓練和預測細節:

 

 參考:

https://blog.csdn.net/wangdongwei0/article/details/83110305

https://blog.csdn.net/jiongnima/article/details/79094159

https://blog.csdn.net/xiamentingtao/article/details/78598511

http://blog.leanote.com/post/afanti.deng@gmail.com/b5f4f526490b

https://www.cnblogs.com/wangyong/p/9305347.html

https://cloud.tencent.com/developer/news/189753


免責聲明!

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



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