Mask R-CNN算法详解
Mask R-CNN算法詳解
- 論文背景
- 算法背景
- 算法詳解
- RoIAlign
- 神經網絡結構
- FPN
- 實驗
論文背景
論文名稱:Mask R-CNN
論文鏈接:https://arxiv.org/abs/1703.06870
論文日期:2018.1.24
算法背景
mask rcnn是用來進行instance segmentation,在檢測物體的同時,還進行了高質量的segmentation mask,是在faster rcnn的基礎上加了一個預測mask的分支,因此,最終會存在三個平行的分支,分別進行classify,location,mask,mask rcnn只是在faster rcnn的頂部加了一點小改進,運行5fps,但是可以完成更多的任務,例如識別人體的姿態。沒有附加條款,mask rcnn在所有任務的存在的單一模型中表現最為出色。在Instance segmentation,bounding box object detection,person keypoint detection中表現最為出色。
mask rcnn是一個instance segmentation算法,instance segmentation不僅能分類不同的類,而且能把同一類物體中的多個不同物體分別標記出來,與semantic segmentation不同,semantic segmentation只能分割不同類型的目標,但是同一類目標沒有被分別標記,是作為一個整體被檢測出來。
在faster rcnn的基礎上加了一個分支,可以在每一個RoI上預測segmentation masks,和classi?cation and bounding box regression分支平行存在, mask分支是一個應用到每一個RoI上的全卷積神經網絡(FCN)。
兩個改進方面(在后部分將詳細拓展):
-
RoIAlign
mask的分支是一個以像素到像素(pixel-to-pixel)的方式預測一個segmentation mask,而faster rcnn不是一個像素到像素的對齊,因為使用了RoIPooling,對于特征提取,表現了一個粗糙的空間量化。因此,在Mask rcnn中提出了一個新的池化方式,RoIAlign,會相對精確的保留空間定位。結果:RoIAlign對于實驗結果有一個很大的改進,將Mask的準確性提升到了10%到50%,在嚴格定位矩陣下準確性獲得了很大提升。
-
decouple mask and class prediction
=將mask和分類分離開來,分別獨立地對每一個類別預測一個二值化mask并不在類之間進行比較,依賴于神經網絡的RoI的分類分支來預測類別,矛盾的是,FCN經常在單像素多類別的分類問題的使用,而這會將分割問題與分類問題連接在一起,而在我們的instance segmentation的實驗中表現的很差。運行速度很快:在GPU上運行600 mspf,在COCO keypoint dataset上運行5fps。
早期的Instance segmentation求助于自下而上的分割方法來提取分割區域,然后再利用faster rcnn進行分類,但是運行速度慢且準確率低。而后來的 Instance-aware semantic segmentation via multi-task network cascades算法提出來了一個多階段的方法來從候選邊界框提取中預測分割候選,接著進行分類。而本文的方法是采取一個平行的預測,對mask和分類標簽進行平行的預測,有兩個平行的分支組成。
不同與其他許多的算法,都是用segmentation-?rst strategy,mask rcnn使用instance-?rst strategy。
mask rcnn是在faster rcnn上加了一個mask分支,因此最后損失函數由三個部分組成:
Mask分支對于每一個RoI都有一個Km*m-d的輸出,K指K個類別,對于每一個類別都做一個sigmoid,判斷是該物體,或者不是。而不是對所有類別一起做一個softmax。Lmask使用平均二值化交叉熵損失函數,對于每一個RoI與真實標簽的類別k結合起來。Lmask僅僅只定義在第k類的mask上,(其他類別的mask對損失沒有貢獻),只計算單一類別的損失。
mask分支去除全連接層,只使用全卷積結構,在卷積之間有一個像素到像素的聯系。不需要拉伸成為一個向量,這個會失去一些空間的特征。同時,FCN會需要更少的參數。
算法詳解
RoIAlign
RoIAlign是在RoIPool的基礎上進行了優化。
在原始的RoIPool算法中,當候選區域映射到feature map上時,與特征圖上的像素點不匹配時,會直接使用stride進行間隔取整,進行一個平移操作,最后得到的各個grid里面的值均為整數,但是這樣會導致feature map上的RoI映射回原圖上時,與原圖的RoI有stride有誤差,這樣經過max pooling后誤差更大。
但是在RoIAlign算法中,我們對于每一個grid都取一個float值,對每一個grid中的值都進行一個雙線性插值,對于feature map上的每一個RoI都會被分成m*m個grid,然后對每一個grid,在其中選取4個點,這4個點分別是這個格子中四個部分的中點,然后對于每一個點進行一次雙線性插值計算。
雙線性插值的原理:
對于RoIAlign的工作原理:
對于每個點,都取點所在的格子的四個頂點的坐標值做雙線性插值,雙線性插值的原理如上所示。然后進行max pooling。
神經網絡結構
候選區域的提取仍然使用RPN,但是對于各個層都是用了featrue map的提取。例如ResNet,可以根據卷積的深度進行分層,總共可以分為4層,然后分別對每一層使用不同的scale,但是相同的aspect radio進行候選區域的提取,不同于faster rcnn,mask rcnn不僅有一個自下而上的卷積的過程,還有一個自上而下的上采樣過程,這就是FPN的結構。
FPN
對每一層feature map分別進行候選區域的提取。
每一個自上而下的上采樣實現細節,由卷積之后的特征圖進行1*1的卷積然后與上一層的特征映射的使用因子為2的最近鄰上采樣結果進行求和。
實驗
準確率有了很大提升:
將分類與分割解耦:
使用RoIAlign:
使用全卷積神經網絡:
與Faster RCNN對比:
總結
以上是生活随笔為你收集整理的Mask R-CNN算法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之OS模块进程管理介绍--o
- 下一篇: RCF的优势--分布式应用