1. 程式人生 > >mask rcnn解讀

mask rcnn解讀

整體框架

這裡寫圖片描述

RoIAlign

問題

  1. 做segment是pixel級別的,但是faster rcnn中roi pooling有2次量化操作導致了沒有對齊
    這裡寫圖片描述

  2. 兩次量化,第一次roi對映feature時,第二次roi pooling時(這個圖參考了youtube的視訊,但是感覺第二次量化它畫錯了,根據上一講ross的原始碼,不是縮小了,而是部分bin大小和步長髮生變化)
    這裡寫圖片描述

  3. RoIWarp,第一次量化了,第二次沒有,RoIAlign兩次都沒有量化
    這裡寫圖片描述

解決方案

和上一講faster rcnn舉的例子一樣,輸出7*7

  1. 劃分7*7的bin(我們可以直接精確的對映到feature map來劃分bin,不用第一次量化)
    這裡寫圖片描述

  2. 每個bin中取樣4個點,雙線性插值
    這裡寫圖片描述

  3. 對每個bin4個點做max或average pool

# pytorch
# 這是pytorch做法先採樣到14*14,然後max pooling到7*7
pre_pool_size = cfg.POOLING_SIZE * 2
grid = F.affine_grid(theta, torch.Size((rois.size(0), 1, pre_pool_size, pre_pool_size)))
crops = F.grid_sample(bottom.expand(rois.size(0), bottom.size(1), bottom.size(2
), bottom.size(3)), grid, mode=mode) crops = F.max_pool2d(crops, 2, 2) # tensorflow pooled.append(tf.image.crop_and_resize( feature_maps[i], level_boxes, box_indices, self.pool_shape, method="bilinear"))

sigmoid代替softmax

利用分類的結果,在mask之路,只取對應類別的channel然後做sigmoid,減少類間競爭,避免出現一些洞之類(個人理解)

FPN

詳見我的另一篇部落格FPN解讀

更多

前面我們介紹RoI Align是在每個bin中取樣4個點,雙線性插值,但也是一定程度上解讀了mismatch問題,而曠視科技PLACES instance segmentation比賽中所用的是更精確的解決這個問題,對於每個bin,RoIAlign只用了4個值求平均,而曠視則直接利用積分(把bin中所有位置都插值出來)求和出這一塊的畫素值和然後求平均,這樣更精確了但是很費時。

這裡寫圖片描述

這裡寫圖片描述

來源曠視科技peng chao分享的videoslides

Detectron部分程式碼細節點

  1. 無bn,因為batch太小了,使用affine channel
  2. mask分支,只使用fg_rois,只用前景的rois
  3. faster rcnn的rpn部分,是生成9*2=18個channel,然後每個格子對應9個anchor,2是前景和背景,使用softmax loss而Detectron中rpn是9個channel,使用sigmoid loss
  4. 所有的gt box都預設送到後面的fast rcnn和mask等分支中
  5. 準備gt_masks時,不是用gt_boxes去全圖mask上扣,然後resize到28*28,而是用預測出來的fg_rois去全圖的mask上扣然後resize到28*28,這樣才能正常訓練的mask分支,不然gt_masks的位置根本不對。這和我們採用gt_classes去抽取對應channel的score map做sigmoid一樣,目的都是為了能讓mask分支受到正常的監督,因為我們自己預測的類別可能是錯的,這樣抽取錯誤的channel去做sigmoid然後與gt_masks做loss,是錯誤的監督。