Mask R-CNN

 Mask R-CNN在Faster R-CNN的bbox识别分支基础上,加入了预测Mask的分支,两分支是平行的,解决的是图像语义分割的任务。其创新点具体而言:

  • 1 Mask分支的加入:Mask R-CNN在Faster R-CNN基础上加入的预测分割Mask的分支,用于对每一个RoI进行分割Mask的预测。这个mask分支实际上是一个小型的FCN在RoI上进行预测,使得的达到像素级别的分割效果。有了Faster R-CNN,Mask R-CNN会十分简单地就可以实现,而且只会添加很小的计算成本。如何构建mask分支会很大程度上影响预测结果。
  • 2 RoIAlign改善空间对齐问题:Faster R-CNN并没有设计网络的输入像素到输出像素的对齐,这一点可以从RoIPool在空间上的特征提取的粗糙性可以看出。为了解决这一对齐问题,Mask R-CNN提出了一种简单、免量化的网络层,称为RoIAlign(虽然变化不大但却成效显著)。
  • 3 每个类别单独预测Mask:每个类别都单独进行Mask预测学习,使每个类的输出为目标和背景的二值Mask,而分类任务让分类分支进行类别预测,而不是进行多个类别和分类任务同时预测(实验说明这样效果糟糕)

回顾:

Faster-RCNN包含两个阶段:

  • 1 Region Proposal Network(RPN),提供候选的目标BBox;
  • 2 RoIPool处理每一个候选区,提取特征,分类和BBox回归。
    上面所述这两个阶段使用了相同的特征图,以达到加速处理速度的目的。

方法

损失函数

 和Faster R-CNN相同,分两阶段:

  • 1 Region Proposal Network(RPN),提供候选的目标BBox;
  • 2 RoIPool处理每一个候选区,提取特征,有两个并行分支进行分类和BBox回归;加入第三个并行分支,每一个RoI输出一个二值化的mask。(在效果上比同期将分类任务依赖于mask要好)。

这样的多任务下,对于每一个处理的RoI的损失函数为:Mask RCNN 部署手机 mask rcnn改进_深度学习
其中

  • 1 Mask RCNN 部署手机 mask rcnn改进_Mask_02分类任务损失(u为真实类别,p为softmanx输出):
    Mask RCNN 部署手机 mask rcnn改进_损失函数_03
  • 2 Mask RCNN 部署手机 mask rcnn改进_Network_04BBox回归损失:
    Mask RCNN 部署手机 mask rcnn改进_深度学习_05
    其中
    Mask RCNN 部署手机 mask rcnn改进_Mask_06
  • 3 mask预测分支输出为Mask RCNN 部署手机 mask rcnn改进_Mask_07维,其中Mask RCNN 部署手机 mask rcnn改进_Mask_08为类别个数,每一个类别mask预测输出图片分辨率为Mask RCNN 部署手机 mask rcnn改进_Network_09,mask上每个像素都使用Mask RCNN 部署手机 mask rcnn改进_Mask RCNN 部署手机_10函数处理,并定义Mask RCNN 部署手机 mask rcnn改进_Network_11为平均二值交叉熵损失。对于第i个mask的损失函数Mask RCNN 部署手机 mask rcnn改进_Mask_12(设mask每个像素的真实标注为Mask RCNN 部署手机 mask rcnn改进_Network_13)可以表示为:Mask RCNN 部署手机 mask rcnn改进_Mask_14
    对于某个RoI已知真实类别Mask RCNN 部署手机 mask rcnn改进_Mask RCNN 部署手机_15Mask RCNN 部署手机 mask rcnn改进_Network_11定义只在第Mask RCNN 部署手机 mask rcnn改进_Mask RCNN 部署手机_15类别上,换言之,其他非真实类别的mask输出并不会参与到到Mask RCNN 部署手机 mask rcnn改进_Network_11上。这也就意味着将会依赖于分类器的输出来确定将要使用的mask,从而计算Mask RCNN 部署手机 mask rcnn改进_Mask_12,而且每一个mask之间的预测都是独立的,这要有利于输出更好的结果(其他使用混合交叉熵的就没有那么好的效果)。

Mask表示

 由于mask的输出不像是类别和BBox预测那样,最后需要坍缩到一个短向量形式,所以自然地就采用卷积的形式保留空间信息,其中mask预测分支使用的是FCN(Fully Convolutional Network)的模型,对于每一个RoI都进行处理,但是由于RoI都是从原图上进行的采样的小图形式,所以为了对齐,加入了RoIAlign的网络层来让Mask对齐到原图上。

RoIAlign层

 RoIAlign是为了解决由RoIPool中量化取整的操作带来的位置对齐偏差问题,所以为了更好第解释RoIAlign的原理,把RoIPool和RoIAlign同时进行说明。
无论是RoIAlign和RoIPool的作用都是为了让RoI图片映射为特定大小的feature map。

RoIPool

Mask RCNN 部署手机 mask rcnn改进_深度学习_20


上图中,步骤:

  • 1 输入图像800*800,通过VGG16卷积层网络(feat_stride=32)后,输出800/32=25,25*25的feature map。
  • 2 假设原图中有一个region proposal大小后为665*665,经过VGG16后,映射到feature map上大小为655/32=20.78,即20.78*20.78大小,此时计算中取整,也就是在feature map上该region proposal的映射大小变为20*20(这一过程为量化取整)。
  • 3 进行pooling操作,设经过RoIPool以后输出的feature map大小为7*7,那么可以求得pooling的核大小为20/7=2.86,此时在计算中取整,那么可以得到pooling核大小为2*2(这一过程为量化取整)。RoIPool中使用了MaxPooling(kernel size=2*2,stride=2),即在每2*2(no overlapping)的区域内选取最大值像素作为输出。
  • 4 最后得到多个7*7大小的feature map,输出到后续网络中。
RoIAlign

Mask RCNN 部署手机 mask rcnn改进_损失函数_21

  • 1 输入图像800*800,通过VGG16卷积层网络(feat_stride=32)后,输出800/32=25,25*25的feature map。
  • 2 假设原图中有一个region proposal大小为665*665,经过VGG16后,映射到feature map上大小为655/32=20.78,即20.78*20.78大小,也就是在feature map上该region proposal的映射后大小变为20.78*20.78,注意此时RoIAlign没有进行取整操作。
  • 3 设经过RoIAlign以后输出的feature map大小为7*7,也就是将map分为了49个bin,那么可以求得bin的核大小为20.78/7=2.97,此时在计算中取整,那么可以得到bin大小为2.97*2.97(同样在量化过程中不进行取整操作)。
  • 4 设采样点数为4,即对于每一个bin大小2.97*2.97,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算像素值,最后得到四个点的像素值。在得到这四个像素值基础上选取最大值作为该bin输出。
  • 5 最后得到多个7*7大小的feature map,输出到后续网络中。

可以看出,RoIAlign其实是在RoIPool上,完全去掉了量化取整的操作,从而避免了由于这个操作所造成的的空间精度下降问题。

如有理解错误,请多多包涵