論文在此:https://arxiv.org/pdf/1703.06870.pdf
Mask RCNN是在Faster RCNN基礎上的改進算法。這裡之所以單獨成文是因為Mask RCNN不僅僅用於目標檢測,還用於實例分割。
目標檢測和實例分割的區別在於,實例分割不僅僅需要將目標識別,還需要將它的輪廓繪出。這意味著需要對每一個像素進行分類。
這麼說也不嚴謹,因為容易跟語義分割混淆。我們還是統一區別一下目標檢測,語義分割,實例分割這三者。
下圖從左往右分別是目標檢測,語義分割,實例分割。
目標分割是圈出圖中目標位置,並對目標分類; 語義分割是圈出目標準確輪廓,並對目標分類;實例分割是圈出目標輪廓,並對目標分類,且在同類別內部再次區分不同個體。
好,開始講解Mask RCNN。
Mask RCNN預測流程先看Mask RCNN的流程圖:
另一種表示:
Maks RCNN從Faster RCNN改進而來,主要的改進點是:
1)將ROI Pooling改進為ROI Align
2)設計出與圖像分類,位置回歸平行的第三個分支:基於FCN的mask層用於圖像分割
ROI Algin的引入是為了解決ROI Pooling精度上的缺陷
ROI Pooling在操作過程中,因為使用了量化,導致proposal框被「四捨五入」,與原框有了誤差:
誤差來自於兩個階段:
1) 當從feature map上去圈出原圖中的框映射過來的ROI時,因為不能保證原圖的框坐標正好可以整除縮小到當前feature map上,所以會有量化誤差(注意圖中黑線邊框):
2)接著,需要進行Max Pooling過程。在前文的章節講過,為了保持輸出結果的shape一致,可以通過高寬分別劃分來進行。
現在上圖為8*9,需要Max Pooling為3*3,很顯然寬可以劃分,高被劃分3段會出現浮點數。為了避免浮點數,需要將高量化為最近的6以便整除3,所以就是6*9:
這樣經過兩個誤差之後,ROI其實跟原圖所希望圈出的目標框有了不小的誤差。
為了避免這個誤差,ROI Align決定取消兩次量化過程,讓浮點數留下來。這樣的話,高被分為8/3的三段,寬是3的3段。一共9個區域,每個區域的大小為(8/3,3),如上上圖的紅線部分。
接下來,進行Max Pooling。此時發現9個區域中的每一個區域都有被「斬斷」的像素,我們不知道它的值,因此無法找出哪個才是Max的。怎麼辦?
此時ROI Align中提出的方法是採用雙線性插值來計算虛擬像素點的值,然後進行Max Pooling
如圖所示,將9個區域裡的每一個區域都等分成4份,並且取中心點值,該值由雙線性插值方法獲得。然後將這4個點進行Max Pooling,獲得代表該區域的值。
2)基於FCN的Mask層FCN即Fully Convolutional Networks,特點是輸出FCN的數據和輸入FCN的數據的shape是一致。它是Mask RCNN的核心,因為這個特性意味著一張圖片在經過FCN之後能保留每一個像素的一對一映射。保留每一個像素的信息,這使得對圖像輪廓的分割成為可能:
在網絡結構上是這樣的:
1)將常規CNN網絡的最後3個全連接層換成了3個卷積層,這3個層的卷積核大小分別為(1,1,4096),(1,1,4096)和(1,1,21)。意味著每個ROI經過這3個層之後,數據變成了一個21維向量,或者說通道數為21的1*1矩陣。21維向量的每一個數值可以理解為21種類別中某一個的概率值。
2)將21個通道的數據通過反卷積轉換為與原圖shape一致的特徵圖,實現像素級的分類。
下圖給出了每個ROI和全圖的概率轉換(種類為1000種)
上面使用了一個關鍵的技術:反卷積。下面附帶理解一下——
附:反卷積反卷積(Deconvolution)容易導致誤會,其實它不是卷積的逆過程,不如叫它「轉置卷積(Transposed Convolution)」更加合適。
卷積起到降維作用:
反卷積起到還原作用:
也可以使用padding進行反卷積:
這兩個卷積核之間的關係可以通過代數推導:
將矩陣扁平化成為向量X,它通過卷積之後得到向量Y,則有:
實際上C是下面的稀疏矩陣:
矩陣進行逆運算:
也就是說代表反卷積所用的卷積核。
以上。
參考https://blog.csdn.net/gusui7202/article/details/84799535
https://buptldy.github.io/2016/10/29/2016-10-29-deconv/