Mask R-CNN 论文总结

目录

论文摘要

前言

Mask R-CNN

RoI Align

RoI Pooling

RoI Align

Mask Brach(FCN)

Mask R-CNN损失


论文摘要

我们提出了一种概念上简单、灵活且通用的对象实例分割框架。我们的方法可以高效地检测图像中的对象,同时为每个实例生成高质量的分割掩码。该方法称为Mask R-CNN,它通过在现有的边界框识别分支之外,增加一个用于预测对象掩码的分支,从而扩展了Faster R-CNN。Mask R-CNN的训练过程简单,只对Faster R-CNN增加了很小的开销,运行速度为每秒5帧。此外,Mask R-CNN容易推广到其他任务,例如,使我们能够在相同框架下估计人体姿态。我们在COCO挑战赛的三个赛道中都取得了最佳结果,包括实例分割、边界框目标检测和人体关键点检测。在没有额外改进的情况下,Mask R-CNN在所有任务上都优于所有现有的单模型条目,包括COCO 2016挑战赛的获胜者。我们希望我们简单而有效的方法能作为一个坚实的基线,并帮助简化未来实例级识别的研究。代码已在以下网址发布: https://github.com/facebookresearch/Detectron

论文标题:Mask R-CNN

论文链接:[1703.06870] Mask R-CNN (arxiv.org)

前言

Mask R-CNN由Kaiming He等人提出,并发表于2017年的IEEE国际计算机视觉会议(ICCV)

Mask R-CNN在Faster R-CNN的基础上增加了一个Mask分支,使得该模型在做示例分隔任务时取得了出色的表现,并且具有易拓展的性质,同样可以用于人体姿态估计(Human Pose Estimation)、全景分割(Panoptic Segmentation)等任务中。

Mask R-CNN

Mask R-CNN在原来的Faster R-CNN上做的改进就是将原来的RoIPool改成了RoIAlign,这样保证了图像不偏移,使得可以在像素层面对目标进行分隔。并且还增加了一个Mask并行分支,这个分支的作用就是分割图像。Loss函数当然也做了相应改变。

在原文中,作者给出了两种含Mask分支的结构,见下图

左图是不含FPN结构的分支,可以看到这三个分支公用一个 7×7 的RoIAlign,到了mask分支时原来的图像被反卷积,扩充到 14×14 的大小,使他带有更细致的特征,以适应分隔任务。

右图可以看出,class分支和box分支公用一个 7×7 的RoIAlign,mask分支单独一个 14×14 的RoIAlign。

RoI Align

在分割任务中,从上面的架构图中可以看到作者没有采用原来的RoI Pooling,而是设计了一个RoI Align代替。想了解为什么我们首先需要回顾一下RoI Pooling具体的是怎么操作的。

RoI Pooling

在Faster R-CNN中,RoI Pooling以前面经过RPN操作得到的Region Proposal作为输入,将这些特征图像处理成统一的 7×7 大小。在这个过程中就发生了两次取整操作,使得图像的定位不准确,可想而知,如果现在再进行像素级的分割操作准确度一定会大受影响。

下面是RoI Pooling操作具体的实现过程


情景:假设我现在输入一张左上角坐标为(0.5 ,0.5)右下角坐标为(4.5 ,4.5)候选区域,现在这个候选区域要经过一个RoI Pooling最后输出一个固定的 2 × 2 大小的特征图。

步骤一:划分网格并取整

水平划分:

        第一个网格:int(0 + 4/2 )= 2

        第二个网格:int(2 + 4/2 )=  4

垂直划分:

        第一个网格:int(0 + 4/2 )=  2

        第二个网格:int(2 + 4/2)=  4

经过这一次划分之后,这块候选区域被划分为四块

网格1:从 (0, 0) 到 (2, 2)

网格2:从 (2, 0) 到 (4, 2)

网格3:从 (0, 2) 到 (2, 4)

网格4:从 (2, 2) 到 (4, 4)

步骤二:池化操作

对于每个网格,从原始特征图中提取像素,然后执行最大池化操作。

假设这个候选区域的的值为下面这样:

 

 按照前面的操作,候选区域就被分成这样

网格1的最大值为:7

网格2的最大值为:9

网格3的最大值为:17

网格4的最大值为:19

最终得到的特征图如下所示:

 

 第一次取整用于确定网格的宽度和高度,第二次取整则用于计算每个网格的起始和结束位置。通过这个过程,我们可以将任意大小的候选区域映射到固定大小的输出网格上,并且确保每个网格内的最大值能够正确提取。

RoI Align

对于RoI Align我同样举例演算说明计算过程

情景:我们有一个 4x4 的特征图和一个 RoI。这个 RoI 在特征图中的坐标是(1,1,3,3),也就是左上角坐标为(1,1)右下角坐标为(2,2)。

假设特征图为:

1  2  3  4
5  6  7  8
9 10 11 12
13 14 15 16

第一步:网格划分

对于每个网格,计算其在特征图上的浮点坐标。

第一个网格的范围为 (1,1) 到 (2,2)。

第二个网格的范围为 (1,2) 到 (2,3)。

第三个网格的范围为 (2,1) 到 (3,2)。

第四个网格的范围为 (2,2) 到 (3,3)。

步骤二:双线性插值

对每个网格进行双线性插值计算,得到特征图上对应的值。

以第一个网格为例,它对应的区域为 (1,1)到 (2, 2),我们会使用这一区域的四个像素 (6,7,10,11) 进行双线性插值。

计算如下:

设定四个角的值为 Q11=6, Q12=7, Q21=10, Q22=11

根据插值公式,计算中心点的值。假设中心点在 1.5, 1.5 位置,插值公式如下:

R = Q11*(1-a)*(1-b) + Q12*a*(1-b) + Q21*(1-a)*b + Q22*a*b

其中 a 和 b 是横纵方向上的偏移。对于中心点 1.5, 1.5a = 0.5, b = 0.5

R = 6*(1-0.5)*(1-0.5) + 7*0.5*(1-0.5) + 10*(1-0.5)*0.5 + 11*0.5*0.5
  = 6*0.25 + 7*0.25 + 10*0.25 + 11*0.25
  = 1.5 + 1.75 + 2.5 + 2.75
  = 8.5

对每个网格进行类似的计算,得到输出特征图:

8.5  9.5
12.5 13.5

ROI Align 通过双线性插值保留了空间信息,使得在特征图上更精确地提取 RoI 的特征。这避免了传统 RoI pooling 中的量化误差,从而提高了目标检测和分割的精度。

Mask Brach(FCN)

经过上一步的RoIAlign层后形成了一个14×14×C的特征,然后接下来会进行几次卷积操作,卷积核为3,stride为1,padding为1,每次卷积操作后都会经过ReLU激活函数,最后会得到一个28×28×NUMcls,这样每一个像素都会做出分类,哪个类别的概率高就把这个像素分配给谁。

Mask R-CNN损失

 L_mask (Mask Loss):

这是Mask分支的损失函数,用于生成像素级的物体分割掩码。具体来说,这是一个像素级的二元交叉熵损失函数,用于衡量预测的二进制掩码与真实掩码之间的差异。

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值