1. 程式人生 > >Mask-RCNN論文閱讀筆記

Mask-RCNN論文閱讀筆記

一、摘要

mask-rcnn本質上在fasterrcnn的基礎上加了一個預測每個二值掩膜mask的分支,相當於在之前fasterrcnn的基礎上,fasterrcnn將目標框出,maskrcnn在目標框內對目標做一個例項分割。整理思路如下:
這裡寫圖片描述
在faster的基礎上預測出了每個目標框,maskrcnn在框內對每個畫素再進行預測,預測每個畫素是否屬於這個框所屬的類別。eg:上圖上,最大的那個框預測為人這一類別,那麼mask相當於對這個框內每個畫素是不是人做了一個二分類,最後生成了一個二值的掩膜。

2、介紹

在fasterrcnn的基礎上新增一個mask的分支,對rpn之後的每個roi區域,預測一個二值的mask掩膜。提出了一種roialign的層,roialign層在roipooling層的基礎上做了改進。在roipooling層計算時,是將RPN的輸出的結果即roi區域(注意這時的roi區域資訊是對應原圖的座標資訊),對映到feature map上,再對feature map上對應的區域劃分成7*7的區域,再對每個區域進行maxpooling最終得到了7*7的feature,給後面的網路進行預測。這麼做在做分類的時候影響不大,但是在做畫素級的例項分割有很大的問題,即7*7
的圖和原圖上對應的區域沒有很好的空間位置對應關係,出現了misalignment的問題。因此,提出了roialign層,roialign層對提高分割精度有很大的作用,大約提高了10%到50%的精度。

3、roialign層

最核心的點。相對roipooling會造成最後的7*7和原始的roi區域對不齊的情況,首先roi的座標是對應的原圖的,從原圖到feature map有一個stride的對應關係, 比如原始roi是100*100的,在原圖的(15,15)的位置,考慮stride=16,那麼對應到feature map上會是 100/16和100/16的區域,座標是(15/16, 15/16)的點,再對該區域做7*7 劃分,7*7的圖上,橫座標1的距離對應到feature上就是100/112的距離,那麼7*7的圖上第一個點(0,0)的點對應到feature map上對應的座標是(15/16, 15/16),那麼怎麼得到7*7的圖上的(0,0)處的值呢,很明顯,根據(15/16, 15/16)在feature map上對這個座標周圍的4個整點的座標進行雙線性插值,即得到了7的圖上的(0,0)處的值。同理,得到7*7的圖上的座標為(x,y)處對應到feature map上的座標為(15/16+x

100/112, 15/16+y* 100/112),這個座標是是一個小數,即在feature map上對該座標點周圍的4個整點座標進行插值即可。這也就對應了文中的:

這裡寫圖片描述

4、mask分支

經過roialign後後每個roi區域對應的就是m*m的圖(在上面的例子上m=7),mask分支就是對每個roi產生的K+1個m*m的二值掩膜,如果目標由20種,那麼這裡會預測20個m*m的二值掩膜,這裡為啥這麼需要遇到21個呢,一方面20種目標還有一種是背景,所以是21;另一方面,在計算loss的時候,21個二值mask只有一個有作用,比如這個roi區域的fastrcnn的部分預測為類別1,吧麼這21個mask只有第2個參與loss的計算,這樣相當於將roi的類別預測和這裡的二值分割分開了,也就是論文說的解耦了。每個mask都是二值的0或者1,對應的就是該值是否就是roi對應的類別,最後計算的也是一個二進位制損失,最後在roi上的整體損失是: cls分類損失+box座標迴歸損失+mask掩膜損失。對應論文中的:
這裡寫圖片描述


注意的就是:最後m*m的mask是resize到roi的大小和原圖做的損失。
這裡寫圖片描述

5、拓展

在論文的最後指出,該方法不僅可以用於畫素級的例項分割,還可以用於人體姿態估計等。下面是論文的結果:
這裡寫圖片描述
以及在人體姿態估計上的結果:
這裡寫圖片描述

後記

以上也是自己的一些理解,因為官方的程式碼一直沒有出來,所以還是有些不確定。感覺整個文章核心的點就是RoiAlign層的理解。(https://github.com/zuokai/roialign/blob/master/roi_align_layer.cpp)這是網上的一個基於caffe的roialign層的實現原始碼,可以對比caffe的roi_pooling層的原始碼進行對比,可以發現兩者的區別。