Mask R-CNN论文阅读笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Maybemust/article/details/83594381

最近看了很多R-CNN系列卷积网络,看得有点迷,以至于今天天在看Mask R-CNN的时候一时没分清有什么区别,看了何大神的ppt才算有点明白。
R-CNN
这是第一个,最基本的R-CNN。就像之前一篇文章说的,因为先提取proposals再进行卷积提取特征,所以就会造成一些区域出现重复计算的情况。而且bounding-box回归和分类判断分开,也让模型变得很慢。
然后就有了第一个进化版:
Fast R-CNN
从这里开始,就把CNN网络下移,避免了重复计算。用RoI pooling将提取的特征重新投映到固定大小的特征层上,以此为基础,经过全连接层,分别,但是同时处理bounding-box和分类,使得速度有了很大的提升。但是,此时速度还不是特别快,于是又有了下面的算法:
在这里插入图片描述
唯一的一个区别是多了一个RPN层。关于RPN层的作用,可以参考faster-rcnn中,对RPN的理解
在Fast R-CNN中提到了独立的RoI的建议算法,所以 这里的 滑动窗口 + anchor的机制 的功能就 类似于 Fast R-CNN 的selective search 生成proposals 的作用。RPN网络用来生成proposals。用原文的话讲“we slide a small network over the conv feature map output by the last shared conv layer”

1.RPN是一个 卷积层(256维) + relu + 左右两个层的(clc layer 和 reg layer)的小网络应用在滑动窗口区域上的 , 所有的滑动窗口共享这个 RPN
这个卷积层 对比 普通的卷积层
i,它是一个将 n x n x channels的输入 通过256个 n x n 大小的卷积核 生成 1 * 1 * 256的feature map,即最后是256维的特征
ii,它的输入就是滑动窗口nxn对应的特征图区域,经过它卷积后 特征图变成1 x 1了
iii,由于此时输出的是 1 * 1 256,所有cls layer 和reg layer是用 1 x 1的卷积核进行进一步的特征提取,这里1 x 1卷积核卷积时,对各个通道都有不同的参数,因为输入又是1 x 1的图片,所以相当于全连接的功能,相当于把 1 * 1 * 256展平成 256,然后进行全连接
2.关于 anchor机制
anchor机制 就是 在n x n的滑动窗口上,进
一步生成k种不同大小的可能区域*
滑动窗口 加 anchor机制 基本把目标可能出现的区域都涵盖了
所以 滑动窗口 加 anchor 就替代了 滑动窗口加金字塔 的功能
3.RPN损失计算
RPN提取出的256d特征是被这k种区域共享的,输给clc layer和reg layer后,只要一次前向,就同时预测k个区域的前景、背景概率(1个区域2个scores,所以是2k个scores),以及bounding box(1个区域4个coordinates,所以是4k个coordinates),具体的说:
clc layer输出预测区域的2个参数,即预测为前景的概率pa和pb,损失用softmax loss(cross entropy loss)。需要的监督信息是Y=0,1,表示这个区域是否ground truth
*
reg layer输出预测区域的4个参数:x,y,w,h,用smooth L1 loss。需要的监督信息是anchor的区域坐标{xa,ya,wa,ha} 和 ground truth的区域坐标{x*,y*,w*,h*}
计算损失时,我们需要确定k个区域中的各个区域是不是有效的,是前景还是背景。有效的区域才计算损失。上面的监督信息:Y,{xa,ya,wa,ha}(k个),{x*,y*,w*,h*}(1个)是根据文章中的样本产生规则得到的:
1.对于这k个区域,分配正标签给满足以下规则的区域
1.1 与某个ground truth(GT)的IoU最大的区域
1.2 与任意GT的IoU大于0.7的区域
(使用规则2基本可以找到足够正样本,但对于所有区域与GT的IoU都不大于0.7,可以用规则1)
2 .分配负标签给与所有GT的IoU都小于0.3的区域。
非正非负的区域不算损失,对训练没有作用
RPN只对有标签的区域计算loss。
最后
参与训练RPN的区域都有参与最后rcnn的训练,只是只有RPN预测为前景的区域 在rcnn才有计算回归损失
在使用faster rcnn的时候,rpn预测为前景的区域才是proposal,然后按照softmax score从大到小排序选出前2000个区域,在用NMS进一步筛选出300个区域,然后输给后面的rcnn进行预测(注意此时rcnn的预测类别不包括背景,已经RPN输出的已经默认是前景了)

另外,大神也在文档中说明了RPN的技术细节:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后才是诞生了本文的主角——Mask R-CNN
Mask R-CNN
相比于Faster R-CNN,该模型比较明显的改进一个是ROIAlign layer层的应用,另一个是Mask branch;除此之外,还有对基础网络的强化和对损失函数的优化;

强化的基础网络

通过 ResNeXt-101+FPN 用作特征提取网络,达到 state-of-the-art 的效果。

RoIAlign layer

之前一直用的是RoI pooling进行处理,这里因为用的是像素级分辨,所以这种像素无法对齐的情况显然会对最后的结果产生不利影响。
下面一张图比较好的说明了两者的区别:
在这里插入图片描述
RoIAlign layer通过插值的方法消除了对不齐的问题。
先说一下RoI pooling的处理过程,以和这里的算法进行对比:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来是RoIAlign layer:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重点来了,完全无视格子的数量统一重新分配。
在这里插入图片描述
利用双线性插值重新赋值。
在这里插入图片描述
最后才是池化过程。

loss function

在这里插入图片描述
上述是分类和回归的损失函数,总的损失函数是:
在这里插入图片描述
原文中是这么表述的:

Formally, during training, we define a multi-task loss on each sampled RoI as L = Lcls + Lbox + Lmask. The classification loss Lcls and bounding-box loss Lbox are identical as those defined in [12]. The mask branch has a Km2-dimensional output for each RoI, which encodes K binary masks of resolution m  m, one for each of the K classes. To this we apply a per-pixel sigmoid, and define Lmask as the average binary cross-entropy loss. For an RoI associated with ground-truth class k, Lmask is only defined on the k-th mask (other mask outputs do not contribute to the loss).
Our definition of Lmask allows the network to generate masks for every class without competition among classes; we rely on the dedicated classification branch to predict the class label used to select the output mask. This decouples mask and class prediction. This is different from common practice when applying FCNs [29] to semantic segmentation, which typically uses a per-pixel softmax and a multinomial cross-entropy loss. In that case, masks across classes compete; in our case, with a per-pixel sigmoid and a binary loss, they do not. We show by experiments that this formulation is key for good instance segmentation results.

分类损失Lcls和检测框损失Lbox与1中定义的相同。掩码分支对于每个RoI的输出维度为Km^2,即K个分辨率为m×m的二进制掩码,每个类别一个,K表示类别数量。我们为每个像素应用Sigmoid,并将Lmask定义为平均二进制交叉熵损失。对于真实类别为k的RoI,仅在第k个掩码上计算Lmask(其他掩码输出不计入损失)。

我们对Lmask的定义允许网络为每个类独立地预测二进制掩码,这样不会跨类别竞争。我们依靠专用分类分支预测用于选择输出掩码的类标签。这将解耦掩码和类预测。这与通常将FCN 3应用于像素级Softmax和多重交叉熵损失的语义分段的做法不同。在这种情况下,掩码将在不同类别之间竞争。而我们的方法,使用了其它方法没有的像素级的Sigmod和二进制损失。我们通过实验发现,这种方法是改善目标分割效果的关键。

每个 ROIAlign 对应 K * m^2 维度的输出。K 对应类别个数,即输出 K 个mask,m对应 池化分辨率(7*7)。Loss 函数定义:

Lmask(Cls_k) = Sigmoid (Cls_k), 平均二值交叉熵 (average binary cross-entropy)Loss,通过逐像素的 Sigmoid 计算得到。

Why K个mask?通过对每个 Class 对应一个 Mask 可以有效避免类间竞争(其他 Class 不贡献 Loss )。

掩码分支

Mask R-CNN is conceptually simple: Faster R-CNN has two outputs for each candidate object, a class label and a bounding-box offset; to this we add a third branch that outputs the object mask. Mask R-CNN is thus a natural and intuitive idea. But the additional mask output is distinct from the class and box outputs, requiring extraction of much finer spatial layout of an object. Next, we introduce the key elements of Mask R-CNN, including pixel-to-pixel alignment, which is the main missing piece of Fast/Faster R-CNN.

Mask R-CNN在概念上是简单的:Faster R-CNN为每个候选目标输出类标签和边框偏移量。为此,我们添加了一个输出目标掩码的第三个分支。因此,Mask R-CNN是一种自然而直观的点子。但是,附加的掩码输出与类和框输出不同,需要提取对象的更精细的空间布局。接下来,我们介绍Mask R-CNN的关键特点,包括像素到像素对齐,这是Fast/Faster R-CNN的主要缺失。

Second, we found it essential to decouple mask and class prediction: we predict a binary mask for each class independently, without competition among classes, and rely on the network’s RoI classification branch to predict the category.

我们发现解耦掩码和分类至关重要:我们为每个类独立地预测二进制掩码,这样不会跨类别竞争,并且依赖于网络的RoI分类分支来预测类别。

简言之,这个掩码就是明确地表明了,某一个像素点的所属问题,并和回归、分类一同进行训练。

猜你喜欢

转载自blog.csdn.net/Maybemust/article/details/83594381