Mask R-CNN
論文Mask R-CNN(ICCV 2017, Kaiming He,Georgia Gkioxari,Piotr Dollár,Ross Girshick, arXiv:1703.06870)
這篇論文提出了一個概念簡單,靈活,通用的目標實例分割框架,能夠同時檢測目標並進行實例分割.在原Faster R-CNN基礎上添加了object mask分支與原目標檢測任務分支並列.速度大約5 fps.另外,Mask R-CNN也很容易擴展到其它的任務,比如人體姿態評估.
原Faster R-CNN輸出兩類值:class label和bounding-box offset.Mask R-CNN加入一路object mask分支輸出.object mask要求比前兩個具有更精細的空間布局特征.mask分支作用於Fast R-CNN,而RPN保持不變.
多任務損失定義為: L = Lcls+ Lbox+ Lmask.
Lcls+ Lbox保持不變,mask分支輸出K個二值mask矩陣(每個像素經過sigmoid,限制到(0,1)區間,使用閾值0.5二值化),Lmask定義為平均交叉熵損失(average binary cross-entropy loss).這種Lmask定義方式與FCN等語義分割網絡的損失定義有所不同.FCN使用per-pixel softmax 和 multinomial cross-entropy loss,會在類間產生競爭.
與FCN一樣,采用轉置卷積產生和原圖中ROI大小相同的mask圖.由於是像素到像素的映射,所以原來的fc層的特征向量的形式不能夠被使用,並且RoIPool層缺失一些特征空間對應關系.因此作者提出了RoIPool層的改進版RoIAlign層.
RoIAlign
RoIPooling將大小不同的RoI對應的特征圖划分為7×7的bins,每個bin采用max pooling,這樣每個RoI都得到了相同尺度的特征.由於RoI對應到特征圖上的區域時對坐標值做除法並取整([x/16]),並且划分7x7網格時也有除法操作.如果不能整除,帶來不對齊的問題. 比如由於量化操作將2.4量化為2,那么這0.4的偏差放大到輸入原圖大小, 如放大32倍,那么偏差變為12.8像素. 偏差較大,對小目標的檢測不利.
論文提出的RoIAlign避免了對RoI邊界的處理,采用了雙線性差值(采用Spatial transformer networks中的方法)計算每個RoI bin中若干個采樣點(相比於RoIPooling,這里的采樣點是浮點型)的特征值. 浮點型的采樣點像素值的計算通過與該點最近鄰的四個整數點的像素值差值得到.距離越近的值貢獻越高,如下圖所示:
線性差值與雙線性差值
線性差值: 已知數據 (x0, y0) 與 (x1, y1),要計算 [x0, x1] 區間內某一位置 x 在直線上的 y 值:
雙線性插值: 相繼在x和y兩個方向上做線性差值. 如下圖所示, 先在x方向上插值得到R1, R2, 再由R1, R2在y方向上插值得到點P的結果:
如果選擇一個坐標系統使得 f 的四個已知點坐標分別為 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化簡為
\({\displaystyle f(x,y)\approx f(0,0)\,(1-x)(1-y)+f(1,0)\,x(1-y)+f(0,1)\,(1-x)y+f(1,1)xy}\)
實驗結果也表明RoIAlign可以提高COCO數據集上的准確率,而在VOC上提升不明顯,而COCO包含較多的小目標. 因此 RoIAlign 在COCO數據集上的提升比較明顯,見下表:
作者與之前采用的RoIWarp方法(Instance-aware semantic segmen-
tation via multi-task network cascades. CVPR2016)做了對比.
RoIWarp是在RoIPool基礎上用雙線性差值,與RoIPool同樣存在不對齊的問題,與RoIAlign的結果對比表明align在其中起到關鍵作用.
ROI Align 反向傳播:
反向傳播: ROI Pooling與max pooling類似,只在選擇的點上進行梯度回傳.
\(x_i\) 代表池化前特征圖上的像素點; \(y_{rj}\) 代表池化后的第r個候選區域的第j個點; \(i^*(r,j)\) 代表點 \(y_{rj}\) 像素值的來源.
ROI Align 中特征圖上的像素點 \(i^*(r,j)\)被選擇作為池化結果的計算時用到了相鄰的若干個點(論文取4個點),因此梯度反向傳播如下:
Inference測試階段
測試時只計算top-100的目標框對應的mask,每個目標框對應K個類別的mask.將目標框的分類類別(置信度最大的)對應的mask作為最終的結果. mask分支僅加重了原網絡~20%的計算量.
在COCO數據集上的檢測結果對比:
可以看出,僅替換RoIPool就在FPN的結果上提高了1%,使用Mask分支后又提高了約1%,加入Mask分支使檢測任務的結果得以提升的原因可能是因為分割任務的訓練使特征提取更好,畢竟數據集標簽中多了mask這種更加詳細的像素類別信息.
應用分析
制作mask標記可能比較費時費力,如果不需要實例分割功能的話,我們可以不使用mask分支,僅使用其提出的RoIAlign方法對原網絡進行提升.
參考:
- PSROI-Pooling 源碼
- 詳解 ROI Align 的基本原理和實現細節: http://blog.leanote.com/post/afanti/b5f4f526490b
- 雙線性插值: https://zh.wikipedia.org/wiki/雙線性插值