MASK RCNN论文解读

目录

MASK RCNN具体简介

MASK RCNN网络结构

FPN发挥的重要作用

FPN解决了什么问题?

FPN具体实现

ROIAlign的分析 

Loss计算与分析


MASK RCNN具体简介

MASK RCNN是大神何凯明基于faster-rcnn架构提出的新的卷积网络,该方法在有效地目标的同时完成了高质量的语义分割。 文章的主要思路就是把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。同时,这个网络结构比较容易实现和训练,速度5fps也算比较快点,可以很方便的应用到其他的领域,像目标检测,分割,和人物关键点检测等。

MASK RCNN网络结构

Mask R-CNN算法步骤:

  1. 输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;
  2. 将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;
  3. 对这个feature map中的每一点设定预定个的ROI,从而获得多个候选ROI;
  4. 将这些候选的ROI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;
  5. 对这些剩下的ROI进行ROIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);
     

 从上面可以知道,mask rcnn主要的贡献在于如下: 

  1. 强化的基础网络 :通过 ResNet+FPN 用作特征提取网络,达到 state-of-the-art 的效果。 
  2. ROIAlign解决Misalignment 的问题 
  3. Loss Function

FPN发挥的重要作用

FPN解决了什么问题?

在以往的faster-rcnn进行目标检测时,无论是rpn还是fast rcnn,ROI的作用都在最后一层,这对于大目标检测没有什么问题,但是对于小目标的检测,精度系数不够。因为对于小目标而言, 当进行卷积池化到最后一层的时候,实际上的语义信息已经没有了,因为ROI映射到某个feature map的方法就是将底层坐标除以stride,显然可以理解,映射到feature map后就很小甚至没有。所以为了解决多尺度检测问题,引入了特征金字塔网络。

不同的特征金字塔网络对比

(a)是比较常见的一种多尺度方法,称为称为featurized image pyramid,对input iamge进行multi scale,通过设置不同的缩放比例实现。这种可以解决多尺度,但是相当于训练了多个模型(假设要求输入大小固定),即便允许输入大小不固定,但是也增加了存储不同scale图像的内存空间。

(b)是CNN,一种能够自己学习到更高级的语义特征,仅采用网络最后一层特征,像SPP net,Fast RCNN,Faster RCNN是采用这种方式。

(c)如果对SSD算法比较了解的大神,对这种结构应该是很熟悉,采用这种多尺度特征融合的方式,没有上采样过程,即从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。

(d)是FPN的结构,FPN是为了自然地利用CNN层级特征的金字塔形式,同时生成在所有尺度上都具有强语义信息的特征金字塔。FPN的结构设计了top-down结构和横向连接,以此融合具有高分辨率的浅层layer和具有丰富语义信息的深层layer。这样就实现了从单尺度的单张输入图像,快速构建在所有尺度上都具有强语义信息的特征金字塔,同时不产生明显的代价。

FPN具体实现

一个自底向上的线路,一个自顶向下的线路,横向连接

下图显示细节。自底向上是其实就是网络的前向过程,即将输入的图像通过卷积层和pooling层提取特征和下采样操作,自顶向下的过程就是把高层特征上采样(最邻近上采样法),而横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合(merge),融合的方式就是做像素间的加法。图中放大的区域就是横向连接,这里1*1的卷积核的主要作用是减少卷积核的个数,也就是减少了feature map的个数,并不改变feature map的尺寸大小。在融合之后还会再采用3*3的卷积核对每个融合结果进行卷积,目的是消除上采样的混叠效应(aliasing effect)。

ROIAlign的分析 

这个是在Mask RCNN中使用以便使生成的候选框region proposal映射产生固定大小的feature map时提出的。

  1. Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800*800,最后一层特征图feature map大小:25*25
  2. 假定原图中有一region proposal,大小为665*665,这样,映射到特征图中的大小:665/32=20.78,即20.78*20.78,此时,没有像RoiPooling那样就行取整操作,保留浮点数
  3. 假定pooled_w=7,pooled_h=7,即pooling后固定成7*7大小的特征图,所以,将在 feature map上映射的20.78*20.78的region proposal 划分成49个同等大小的小区域,每个小区域的大小20.78/7=2.97,即2.97*2.97
  4. 假定采样点数为4,即表示,对于每个2.97*2.97的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样,就会得到四个点的像素值,如下图:

上图中,四个红色叉叉‘×’的像素值是通过双线性插值算法计算得到的

       最后,取四个像素值中最大值作为这个小区域(即:2.97*2.97大小的区域)的像素值,如此类推,同样是49个小区域得到49个像素值,组成7*7大小的feature map。

 

Loss计算与分析

由于增加了mask分支,每个ROI的Loss函数如下所示:

其中Lcls和Lbox和Faster r-cnn中定义的相同。对于每一个ROI,mask分支有Km*m维度的输出,其对K个大小为m*m的mask进行编码,每一个mask有K个类别。我们使用了per-pixel sigmoid,并且将Lmask定义为the average binary cross-entropy loss 。对应一个属于GT中的第k类的ROI,Lmask仅仅在第k个mask上面有定义(其它的k-1个mask输出对整个Loss没有贡献)。我们定义的Lmask允许网络为每一类生成一个mask,而不用和其它类进行竞争;我们依赖于分类分支所预测的类别标签来选择输出的mask。这样将分类和mask生成分解开来。这与利用FCN进行语义分割的有所不同,它通常使用一个per-pixel sigmoid和一个multinomial cross-entropy loss ,在这种情况下mask之间存在竞争关系;而由于我们使用了一个per-pixel sigmoid 和一个binary loss ,不同的mask之间不存在竞争关系。经验表明,这可以提高实例分割的效果。

Mask-RCNN 代码实现

代码中training的流程图

代码中predict的流程图

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值