概述
-
Mask R-CNN的框架是对Faster R-CNN的扩展,与BBox识别并行的增加一个分支来预测每一个RoI的分割Mask
-
Mask分支是应用到每一个RoI上的一个小的FCN,以pix2pix的方式预测分割Mask。
对Mask预测和class预测去耦合。对每个类别独立的预测一个二值Mask,不依赖分类分支的预测结果。
网络结构
- 使用Resnet + FPN提取图片特征,可以有效提高精度和速度;
- RoI Align取代RoI Pooling,可以避免两次量化误差,获取更准确的RoI区域
- mask分支应用到每一个RoI上的一个小的FCN,以pix2pix的方式预测分割mask;解耦了mask预测和class预测。
整体流程
- 输入预处理后的原始图片。
- 将输入图片送入到特征提取网络得到特征图。
- 然后对特征图的每一个像素位置设定固定个数的ROI(也可以叫Anchor),然后将ROI区域送入RPN网络进行二分类(前景和背景)以及坐标回归,以获得精炼后的ROI区域。
- 对上个步骤中获得的ROI区域执行论文提出的ROIAlign操作,即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来。
- 最后对这些ROI区域进行多类别分类,候选框回归和引入FCN生成Mask,完成分割任务。
RoI Pooling
Faster R-CNN存在的问题是:特征图与原始图像是不对准的(mis-alignment),所以会影响检测精度。而Mask R-CNN提出了RoIAlign的方法来取代ROI pooling,RoIAlign可以保留大致的空间位置。
在Faster-RCNN中ROIPooling的过程如下图所示:
输入图片的大小为800x800,其中狗这个目标框的大小为665x665,经过VGG16网络之后获得的特征图尺寸为800/32 x 800/32 = 25 x 25,其中32代表VGG16中的5次下采样(步长为2)操作。同样,对于狗这个目标,我们将其对应到特征图上得到的结果是665/32 x 665/32 = 20.78 x 20.78 = 20 x 20,因为坐标要保留整数所以这里引入了第一个量化误差即舍弃了目标框在特征图上对应长宽的浮点数部分。
然后我们需要将这个20x20的ROI区域映射为7x7的ROI特征图,根据ROI Pooling的计算方式,其结果就是20/7 x 20/7 = 2.86 x 2.86,同样执行取整操作操作后ROI特征区域的尺寸为2 x 2,这里引入了第二次量化误差。
从上面的分析可以看出,这两次量化误差会导致原始图像中的像素和特征图中的像素进行对应时出现偏差,例如上面2.86将量化为2的时候就引入了0.86的偏差,这个偏差映射回原图就是0.86 x 32 = 27.52,可以看到这个像素偏差是很大的。
RoIAlign
为了缓解ROI Pooling量化误差过大的缺点,ROIAligin没有使用量化操作,而是使用了双线性插值。它充分的利用原图中的虚拟像素值如四周的四个真实存在的像素值来共同决定目标图中的一个像素值,即可以将和类似的非整数坐标值像素对应的输出像素值估计出来。这一过程如下图所示:
其中featmap就是VGG16或者其他Backbone网络获得的特征图,黑色实线表示的是ROI划分方式,最后输出的特征图大小为,然后就使用双线性插值的方式来估计这些蓝色点的像素值,最后得到输出,然后再在橘红色的区域中执行Pooling操作最后得到的输出特征图。可以看到,这个过程相比于ROI Pooling没有引入任何量化操作,即原图中的像素和特征图中的像素是完全对齐的,没有偏差,这不仅会提高检测的精度,同时也会有利于实例分割。
损失函数
- mask分支针对每个RoI区域产生一个Kxmxm的输出特征图,即K个mxm的二值掩膜图像,其中K表示目标种类数。
- 对于预测的二值掩膜输出,对每一个像素点应用sigmoid函数,整体损失定义为平均二值交叉损失熵。引入预测K个输出的机制,允许每个类都生成独立的掩膜,避免类间竞争。这样做解耦了掩膜和种类预测。
- 不像FCN的做法,在每个像素点上应用softmax函数,整体采用的多任务交叉熵,这样会导致类间竞争,最终导致分割效果差。












网友评论