mask rcnn簡介
mask rcnn是何凱明基于以往的faster rcnn架構提出的新的卷積網絡,一舉完成了object instance segmentation. 該方法在有效地目標的同時完成了高質量的語義分割。 文章的主要思路就是把原有的Faster-RCNN進行擴展,添加一個分支使用現有的檢測對目標進行并行預測。同時,這個網絡結構比較容易實現和訓練,速度5fps也算比較快點,可以很方便的應用到其他的領域,像目標檢測,分割,和人物關鍵點檢測等。并且比著現有的算法效果都要好,在后面的實驗結果部分有展示出來。
場景理解
Mask R-CNN: overview
從上面可以知道,mask rcnn主要的貢獻在于如下:
1. 強化的基礎網絡
通過 ResNeXt-101+FPN 用作特征提取網絡,達到 state-of-the-art 的效果。
2. ROIAlign解決Misalignment 的問題
3. Loss Function
細節描述
1. resnet +FPN
作者替換了在faster rcnn中使用的vgg網絡,轉而使用特征表達能力更強的殘差網絡。
另外為了挖掘多尺度信息,作者還使用了FPN網絡。
2. ROIAlign
說到這里,自然要與roi pooling對比。
我們先看看roi pooling的原理,這里我們可以看https://github.com/deepsense-ai/roi-pooling 的動圖,一目了然。
對于roi pooling,經歷了兩個量化的過程:
第一個:從roi proposal到feature map的映射過程。方法是[x/16],這里x是原始roi的坐標值,而方框代表四舍五入。
第二個:從feature map劃分成7*7的bin,每個bin使用max pooling。
這兩種情況都會導致證輸入和輸出之間像素級別上的一一對應(pixel-to-pixel alignment between network input and output)。
因此作者設計了ROI Align layer。
作者的ROI Align layer想法很簡單,就是去掉ROI Pooling過程中所有的量化過程,包括從原圖proposal到最后一層feature map映射,以及把feature map劃分成m*m的bin過程中的量化。
我們使用何凱明在iccv2017的ppt來說明。可以在百度云盤下載。鏈接: https://pan.baidu.com/s/1jHRubfK 密碼: jh5c
如上,roi映射到feature map后,不再進行四舍五入。然后將候選區域分割成k x k個單元, 在每個單元中計算固定四個坐標位置,用雙線性內插的方法計算出這四個位置的值,然后進行最大池化操作。
這里對上述步驟的第三點作一些說明:這個固定位置是指在每一個矩形單元(bin)中按照比例確定的相對位置。比如,如果采樣點數是1,那么就是這個單元的中心點。如果采樣點數是4,那么就是把這個單元平均分割成四個小方塊以后它們分別的中心點。顯然這些采樣點的坐標通常是浮點數,所以需要使用插值的方法得到它的像素值。在相關實驗中,作者發現將采樣點設為4會獲得最佳性能,甚至直接設為1在性能上也相差無幾。事實上,ROI Align 在遍歷取樣點的數量上沒有ROIPooling那么多,但卻可以獲得更好的性能,這主要歸功于解決了misalignment的問題。值得一提的是,在做實驗的時候發現,ROI Align在VOC2007數據集上的提升效果并不如在COCO上明顯。經過分析為造成這種區別的原因是COCO上小目標的數量更多,而小目標對misalignment問題的影響更為明顯(比如,同樣是0.5個像素點的偏差,對于較大的目標而言顯得微不足道,但是對于小目標,誤差的影響就要高很多)
下面摘取上面百度云盤里的一個ppt的插圖,更加細致地描述roialign。
也可以參考:http://blog.leanote.com/post/afanti.deng@gmail.com/b5f4f526490b
上面這篇文章還介紹了ROI Align的反向傳播算法。
roi pooling的求導可以參考:http://ow680yzep.bkt.clouddn.com/iccv15_tutorial_training_rbg.pdf
下圖對比了三種方法的不同,其中roiwarp來自:J. Dai, K. He, and J. Sun. Instance-aware semantic segmentation via multi-task network cascades
3. loss function
損失函數就是分類,回歸加mask預測的損失之和。
其中,對于mask分支和其他的分類分支一樣,使用全卷積網絡輸出,輸出了k類的mask。注意這里mask的輸出使用了sigmoid函數。最后可以通過與閾值0.5作比較輸出二值mask。這樣避免了類間的競爭,將分類的任務交給專業的classification分支。
而Lmask對于每一個像素使用二值的sigmoid交叉熵損失。
參考theano的文檔,二值的交叉熵定義如下: 這里的o就是sigmoid輸出。
4. 整個網絡結構
這里實際上有兩個網絡結構,一個就是:Mask R-CNN: overview的那副圖(或者如上左邊)。使用resnet-c4作為前面的卷積網絡,將rpn生成的roi映射到C4的輸出,并進行roi pooling,最后進行分叉預測三個目標。
另一個網絡就是這里的faster rcnn with fpn。
上述圖像同樣來自何凱明的ICCV2017 ppt
如上,使用fpn網絡,每一個階層連接一個三分支網絡。考慮了多尺度信息,因此可以檢測更加小的目標。
至于是否像之前的FPN在各階層共享三分支網絡,不太清楚。
總結
mask rcnn的主要貢獻其實就是roi align以及加了一個mask分支。
目前開源代碼有:
https://github.com/TuSimple/mx-maskrcnn
https://github.com/CharlesShang/FastMaskRCNN
CAFFE :https://github.com/jasjeetIM/Mask-RCNN
期待官方的源碼放出~~
參考文獻
- Mask R-CNN論文導讀
- 如何評價 Kaiming He 最新的 Mask R-CNN?
- Mask-RCNN技術解析 [重點推薦]
- ROI Align 原理解析和實現細節 [重點推薦]
- 論文閱讀-《Mask R-CNN》
- Mask R-CNN - Notes
- Notes: From Faster R-CNN to Mask R-CNN
- Implementing Mask R-CNN[重點推薦]
- Instance segmentation with Mask R-CNN