Mask R-CNN總結

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

文章內容:

  • 論文總覽

  • 算法要點

  • 雙線性插值

論文總覽:

Mask R-CNN是在Faster R-CNN基礎上加了一個分支,來預測ROI的分割mask,是與分類和迴歸分支並列的分支。主要的一個改進是將ROI Pooling改爲ROI Align,提升了mask的準確率。

算法要點:
在這裏插入圖片描述

Mask R-CNN分兩個階段:第一階段由RPN提出候選框,第二階段是做分類、迴歸、分割。

Loss:

多任務損失函數

前兩個損失函數與Faster R-CNN一樣,L(mask)是平均二值交叉熵,分割分支對每個ROI會產生K*m*m個維的輸出,在m*m分辨率上有K個二分類masks,每個像素點都應用了sigmoid,這樣的好處是爲每個類別都產生mask,不會在類別之間產生競爭,互不干涉。需要注意的是,計算loss的時候,並不是每個類別的sigmoid輸出都計算二值交叉熵損失,而是該像素屬於哪個類,哪個類的sigmoid輸出纔要計算損失。並且在測試的時候,是通過分類分支預測的類別來選擇相應的mask預測。這樣,mask預測和分類預測就徹底解耦了。


ROI Align:

Faster R-CNN存在的問題是:特徵圖與原始圖像是不對準的(mis-alignment),所以會影響檢測精度。而Mask R-CNN提出了RoIAlign的方法來取代ROI pooling,RoIAlign可以保留更精確的空間位置。

首先,我們爲什麼要用ROIAlign呢 ?
ROI Align 是在Mask-RCNN這篇論文裏提出的一種區域特徵聚集方式,很好地解決了ROI Pooling操作中兩次量化造成的區域不匹配(mis-alignment) 的問題。

這兩次量化分別爲:

region proposal的x,y,w,hx, y, w, hx,y,w,h通常是小數,但是爲了方便操作會把它整數化。
將整數化後的邊界區域平均分割成k×k個單元,對每一個單元的邊界進行整數化。
兩次整數化(量化)的過程如下圖所示:(圖片來自知乎文章)
在這裏插入圖片描述

事實上,經過上述兩次量化,此時的候選框已經和最開始迴歸出來的位置有一定的偏差,這個偏差會影響檢測或者分割的準確度。在論文裏,作者把它總結爲 “不匹配問題(mis-alignment)。

爲了解決這個問題,ROI Align方法取消整數化操作,保留了小數,使用雙線性插值的方法獲得座標爲浮點數的像素點的數值。但在實際操作中,ROI Align並不是簡單地補充出候選區域邊界上的座標點,然後進行池化,而是重新進行設計。 下面我們通過兩個例子來說明:

例子1
如下圖所示,虛線部分表示feature map,實線表示ROI,這裏將ROI切分成2x2的單元格。如果採樣點數是4,那我們首先將每個單元格子均分成四個小方格(如紅色線所示),每個小方格中心就是採樣點。這些採樣點的座標通常是浮點數,所以需要對採樣點像素進行雙線性插值(如四個箭頭所示),就可以得到該像素點的值了。然後對每個單元格內的四個採樣點進行maxpooling,就可以得到最終的ROIAlign的結果。
在這裏插入圖片描述

需要說明的是,在相關實驗中,作者發現將採樣點設爲4會獲得最佳性能,甚至直接設爲1在性能上也相差無幾。事實上,ROI Align 在遍歷取樣點的數量上沒有ROIPooling那麼多,但卻可以獲得更好的性能,這主要歸功於解決了misalignment的問題。

例子2
下面我們再通過一個更直觀的例子具體分析一下上述區域不匹配問題,如下圖所示:
在這裏插入圖片描述

如上圖所示,這是一個Faster-RCNN檢測框架。輸入一張800∗800的圖片,圖片上有一個665∗665的包圍框(框着一隻狗)。圖片經過主幹網絡提取特徵後,特徵圖縮放步長(stride)爲32。因此,圖像和包圍框的邊長都是輸入時的1/32。800正好可以被32整除變爲25。但665除以32以後得到20.78,帶有小數。於是ROI Pooling 直接將它量化成20。接下來需要把框內的特徵池化爲7∗7的大小,因此將上述包圍框平均分割成7∗7個矩形區域。顯然,每個矩形區域的邊長爲2.86,又含有小數。於是ROI Pooling 再次把它量化到2。經過這兩次量化,候選區域已經出現了較明顯的偏差(如圖中綠色部分所示)。更重要的是,該層特徵圖上0.1個像素的偏差,縮放到原圖就是3.2個像素。那麼0.8的偏差,在原圖上就是接近30個像素點的差別,這一差別不容小覷。

ROI Align的思路很簡單:取消量化操作,使用雙線性內插的方法獲得座標爲浮點數的像素點上的圖像數值,從而將整個特徵聚集過程轉化爲一個連續的操作。如下:

ROI Align操作如下:

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

這裏對上述步驟的第三點作一些說明:這個固定位置是指在每一個矩形單元(bin)中按照固定規則確定的位置。比如,如果採樣點數是1,那麼就是這個單元的中心點。如果採樣點數是4,那麼就是把這個單元平均分割成四個小方塊以後它們分別的中心點。顯然這些採樣點的座標通常是浮點數,所以需要使用插值的方法得到它的像素值。在相關實驗中,作者發現將採樣點設爲4會獲得最佳性能,甚至直接設爲1在性能上也相差無幾。事實上,ROI Align 在遍歷取樣點的數量上沒有ROIPooling那麼多,但卻可以獲得更好的性能,這主要歸功於解決了misalignment的問題

ROI Align 的反向傳播

常規的ROI Pooling的反向傳播公式如下:

 

這裏,xi代表池化前特徵圖上的像素點;yrj代表池化後的第r個候選區域的第j個點;i*(r,j)代表點yrj像素值的來源(最大池化的時候選出的最大像素值所在點的座標)。由上式可以看出,只有當池化後某一個點的像素值在池化過程中採用了當前點Xi的像素值(即滿足i=i*(r,j)),纔在xi處回傳梯度。

類比於ROIPooling,ROIAlign的反向傳播需要作出稍許修改:首先,在ROIAlign中,xi*(r,j)是一個浮點數的座標位置(前向傳播時計算出來的採樣點),在池化前的特徵圖中,每一個與 xi*(r,j) 橫縱座標均小於1的點都應該接受與此對應的點yrj回傳的梯度,故ROI Align 的反向傳播公式如下: 
   

上式中,d(.)表示兩點之間的距離,Δh和Δw表示 xi 與 xi*(r,j) 橫縱座標的差值,這裏作爲雙線性內插的係數乘在原始的梯度上。

雙線性插值:

爲什麼要用雙線性插值法

在圖像的放大和縮小的過程中,需要計算新圖像像素點在原圖的位置,如果計算的位置不是整數,就需要用到圖像的內插,我們需要尋找在原圖中最近得像素點賦值給新的像素點,這種方法很簡單是最近鄰插法,這種方法好理解、簡單,但是不實用,會產生是真現象,產生棋盤格效應,更實用的方法就是雙線性插值法。

一維線性插值

我們已經知道(x0,y0)與(x1, y1)的值,並且已知 x 的值,要求 y 的值。根據初中的知識:

我們可以得到:.     

令:

則:

 

雙線性插值法的推導過程

雙線性插值是做了二次一維的線性插值,我們用四個最近鄰估計給定的灰度。

計算方法

這裏寫圖片描述
 首先,在X方向上進行兩次線性插值計算,然後在Y方向上進行一次插值計算。
 這裏寫圖片描述
在圖像處理的時候,我們先根據
  srcX=dstX* (srcWidth/dstWidth),
  srcY = dstY * (srcHeight/dstHeight)
來計算目標像素在源圖像中的位置,這裏計算的srcX和srcY一般都是浮點數,比如f(1.2, 3.4)這個像素點是虛擬存在的,先找到與它臨近的四個實際存在的像素點
  (1,3) (2,3)
  (1,4) (2,4)
寫成f(i+u,j+v)的形式,則u=0.2,v=0.4, i=1, j=3
在沿着X方向差插值時,f(R1)=u(f(Q21)-f(Q11))+f(Q11)
沿着Y方向同理計算。
或者,直接整理一步計算,
f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)


參考文章:https://blog.csdn.net/ft_sunshine/article/details/98890935?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/u011918382/article/details/79455407

https://blog.csdn.net/qq_37577735/article/details/80041586(雙線性插值法)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章