Faster R-CNN
Mask R-CNN是在Faster R-CNN基础上稍作修改得来的,如果理解了Faster R-CNN,那么对Mask R-CNN理解也很容易。
强烈推荐这篇Faster R-CNN解读文章,讲解得很详细:一文读懂Faster R-CNN
Mask R-CNN用于实例分割任务,其网络结构与Faster R-CNN基本相同,通过Convnets提取特征,Region Proposal Networks生成候选框(Region of Interest)。区别在于算法的最后一部分,除了需要对候选框对象进行分类和bbx回归,还需要为每一个候选框生成一个binary mask。
在Faster R-CNN基础之上的改进
mask branch
- 图1是基于两种backbone的Mask R-CNN对ROI进行分类、bb回归和生成mask的过程。阴影部分正好对应图2的Faster R-CNN中最后一部分过程。分支部分是生成mask的过程。
- 具体地,对每个ROI,生成K(类别数)个m×m大小的mask。也就是说,将分类和生成mask过程分离(decouple)(从图中就可以看到,分类和生成mask时两个不同分支)。"…generate masks for every class without competition among classes…";在Fully convolutional networks for semantic segmentation一文中,生成mask的方式是对每个像素点进行softmax分类判断该像素点所属类别,计算loss时则是对每个像素点计算多类别交叉熵后求和平均。这种方式没有充分考虑像素和像素之间的关系,效果较Mask R-CNN这种方式差。
- 在Mask R-CNN中,当计算Lmask时,如果预测分支输出预测结果为第k类,那么只取mask分支中的第k个mask来计算Lmask.(other mask outputs do not contribute to the loss),Lmask计算方式:average binary cross-entropy loss,即对mask的每个点算二分类交叉熵,求和再求平均。
- 在Faster R-CNN中,损失函数可以简单表示成L = Lcls + Lbox,那么在Mask R-CNN中,只需要在最后再加上Lmask即可。
RoIAlign
这一部分可以参考这篇文章:RoIPooling、RoIAlign笔记
简而言之,RoIAlign取代的是Faster R-CNN中的RoIPool过程。RoIPool会导致原来的feature map和RoIPool后的feature map不对齐(misalignment),因为feature map大小除16(卷积网络总的池化倍数)和除7(论文中RoIPool使用的格子数)有除不尽的情况。对于除不尽的情况,RolPool直接取整,导致不对齐(对分类没影响,但是会导致mask对不上原图);而RoIAlign不取整,使用双线性插值方式获取当前格子内Pool后的值。如下图所示。