1. 程式人生 > 其它 >mask-rcnn notes

mask-rcnn notes

mask-rcnn知識總結

論文地址:https://arxiv.org/abs/1703.06870

比較好的論文解讀文章:https://zhuanlan.zhihu.com/p/102331538(例項分割演算法之Mask R-CNN論文解讀)

https://zhuanlan.zhihu.com/p/37998710(令人拍案稱奇的Mask RCNN)

b站上一個不錯的解讀視訊:https://www.bilibili.com/video/BV1b441127cs?from=search&seid=1006590812775591497

tensorflow版程式碼地址:https://github.com/matterport/Mask_RCNN

https://zhuanlan.zhihu.com/p/40314107(tf版原始碼講解文章)

總體結構

mask-rcnn網路主要包括以下幾個部分:

1、FPN網路

2、anchors生成部分

3、RPN網路

4、三個預測分支(class、box、mask)

一、FPN網路

特徵金字塔,輸入一張圖片,通過FPN來提取圖片的多層次特徵(feature map)。論文中使用的是ResNet作為骨架,結構如下:

最後得到的P2-P6是圖片特徵,其中P2-P6用於RPN網路,P2-P5用於分支的訓練或預測。

二、anchors生成部分

對應著rpn_feature_map中的五個特徵層,每一個對應一種scale的錨框。每種錨框會設定三種長寬比,即上圖中ratio中的三個比值。這樣每個特徵層中的每個畫素點就對應產生三個錨框,最終輸出261888個錨框。

三、RPN網路

rpn_feature_maps輸入到構建好的rpn_model中,會生成每個錨框(每個畫素點對應三個)的分類結果,分類結果表徵該畫素點屬於前景(即屬於某個物體)或者屬於背景,還會生成每個錨框的邊界bbx。因為前面生成的261888個anchors太多了,所以下一步將根據這些資料來篩選anchors。

PS:這裡可能有個疑問,rpn model為什麼能計算出這些分類結果以及邊界框。這屬於rpn網路的訓練部分,在訓練階段,整個mask-rcnn網路的輸入除了圖片之外還有圖片對應的labels,在訓練時rpn model的輸出會與輸入的label進行對比計算loss。整個rpn網路的作用,就是生成並精煉出一部分anchors以及對應的標籤,以供後面分支網路進行預測。在訓練階段訓練這種能力才可以在預測階段,在沒有label只有image的情況下進行anchors的生成和精煉。

根據前面rpn model生成的錨框的標籤,在proposallayer中對anchors進行篩選,根據圖片中的步驟,最終篩選出2000個anchors,我們稱之為roi(region of interest)。在測試階段只篩選出1000個即可。

PS:這裡補充說明下NMS(非極大抑制)的機制

由於錨點經常重疊,因此建議最終也會在同一個目標上重疊。為了解決重複建議的問題,我們使用一個簡單的演算法,稱為非極大抑制(NMS)。NMS 獲取按照分數排序的建議列表並對已排序的列表進行迭代,丟棄那些 IoU 值大於某個預定義閾值的建議,並提出一個具有更高分數的建議。總之,抑制的過程是一個迭代-遍歷-消除的過程。如圖所示

將所有候選框的得分進行排序,選中最高分及其所對應的BB;

遍歷其餘的框,如果它和當前最高得分框的重疊面積大於一定的閾值,我們將其刪除;

從沒有處理的框中繼續選擇一個得分最高的,重複上述過程。

下面部分的篩選只在訓練階段才有:

target_rois是第二部分ProposalLayer篩選提供的2000個區域建議框,在訓練時,2000個顯得太多,所以會進一步篩選為200個做為target。最終生成的200個roi以及對應的標籤資料將送入三個分支網路中。

在篩選過程中,首先將2000個roi的邊界框與輸入的groundtruth計算IOU(可以理解為重疊面積的多少),IOU大於0.5的標記為正樣本,小於0.5的標記為負樣本。按照網路的引數設定,每張圖片的正負樣本比例為1:3,每張圖片的總樣本數目為200,按照上述數量要求從正負樣本中隨機選取指定數目樣本,再根據輸入的gt值計算出每個roi的標籤(class, delte, mask)。這裡注意一點,我從程式碼中看,只有正樣本才進行這些標籤的計算,負樣本直接進行了零填充,但這一點我也不是太肯定就是這樣...

四、三個預測分支(class、box、mask)

PyramidROIAlign這一步,輸入detectionlayer匯出 的200個roi和p2-p5四個feature_map,按照公式計算當前roi需要從哪一個feature_map上進行切割,然後進行切割,對切下來的特徵進行align變換,使得其形狀變為7×7或14×14。

整體FPN heads分為三個分支,分別用於分類、迴歸目標框偏移、畫素分割,都是將rois在對應mrcnn_feature_maps特徵層進行roialign特徵提取,然後再經過各自的卷積操作預測最終結果。mask分支的輸出有80個通道,對應著網路要求的80個類對於其中一個畫素點,其對應一個長度為80的向量,其中只有一個為1,其餘為0。

在訓練階段,三個分支進行平行計算。

關於訓練階段的損失計算,mask分支的損失計算,需要使用class分支的輸出,知道roi屬於哪個種類後,在mrcnn_mask的80個通道中選擇該種類對應的那一個通道(其他通道在計算損失時不考慮,論文中指出這樣做可以降低其他種類的影響)。對於另外兩個分支,將他們的輸出結果與前面detectiontargetlayer層得到的每一個roi的標籤進行比較計算,得到loss。最終三個分支的損失加上前面rpn網路計算的損失,作為該網路的總損失。

關於損失計算,可參見下圖:

五、預測階段

在預測階段,即論文中提到的inference階段,與訓練階段的區別在於:

1、rpn階段不需要計算損失值,因為輸入的只有圖片,沒有標籤了。

2、在proposallayer層,會篩選出1000個roi,而不是2000個

3、訓練階段的detectiontargetlayer部分去掉,不再對1000個roi進行第二次篩選,而是1000個直接作為class分支和bbox分支的輸入

4、mask分支不再與class分支和bbox分支進行平行計算,而是先計算class分支和bbox分支,再將得到的邊界框和類別輸入到mask分支中,選取輸出中對應類別的mask