maskrcnn_benchmark 理解

转载与参考:

1,https://zhuanlan.zhihu.com/p/58101945

2,https://blog.csdn.net/linolzhang/article/details/71774168

3,https://zhuanlan.zhihu.com/p/432100214

maskrcnn 的结构图,这里以configs/e2e_mask_rcnn_R_50_FPN_1x.yaml为例子,

网络流程

粗略梳理一下网络结构,可以发现,整个流程大概可以用这个框图表示,红色部分表示训练过程,蓝色部分表示测试过程,黑色表示共用部分。

 原来作者的maskrcnn结构:

其中 黑色部分为原来的 Faster-RCNN,红色部分为在 Faster网络上的修改

首先给出maskrcnn的结构图:

Maskrcnn是属于实例分割的代表算法,可以说要想要开展实例分割的研究工作,就得先把maskrcnn了解透彻。

本次实验的代码是基于pytorch的框架,采用的是facebook的Maskrcnn Benchmark作为基础结构。

下面是对maskrcnn方法的详细介绍:

1.backbone

Backbone采用的是ResNet-50或者ResNet-101,作为特征提取器提取特征,我们将输入图像(大小为 [公式] )通过ResNet后,会得到五层特征图,其尺寸大小依次为:( [公式] )我们知道,低层特征往往含有较多的细节信息(颜色、轮廓、纹理),但包含许多的噪声以及无关信息。而高层特征包含有充分的语义信息(类别、属性等),但空间分辨率却很小,从而导致高层特征上信息丢失较为严重。因此maskrcnn采用了FPN(特征金字塔网络)的结构,来进行特征的融合。

我们首先介绍一下FPN的网络结构:

FPN可以同时利用低层特征图的空间信息和高层特征图的语义信息,他的原理很简单,就是把分辨率较小的高层特征首先通过1×1卷积降维(减少计算量),然后上采样至前一个特征图的相同尺寸,再进行逐元素相加,就能得到融合后的特征。

2.RPN(Region Proposal Network)

在得到增强后的特征后,下面要讲的就是我们的RPN(Region Proposal Network)。

首先我们得明白什么叫做RPN?顾名思义,RPN就是区域推荐的网络,用于帮助网络推荐感兴趣的区域。

在说这个之前,我们得清楚什么叫做锚点?其实锚点也就是框,我们知道实例分割是要完成对物体的检测、分类、分割三个任务,而检测需要定位,也就是要得到目标的位置。Maskrcnn与fasterrcnn一样都是先生成一系列锚点,然后通过一定的规则来筛选。

各个框的大小由scale和ratio这两个参数来确定的,比如scale =[64],ratio=[0.5,1,1.5] ,则每个像素点可以产生3个不同大小的框。这个三个框是由保持框的面积不变,来通过ratio的值来改变其长宽比,从而产生不同大小的框。

我们在前面通过backbone和fpn得到了增强后的特征,现在就需要在这个特征上来使用我们的RPN结构。

这里需要说明一点,我们要在这几层特征图之间根据region proposal切出ROI进行后续的分类和回归预测。选择哪个feature map来切出这些ROI区域:我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个特征图来切:

RPN其原理如下:

我们以最后一层特征为例,其特征图大小为 [公式] ,那么我们就在这个特征图的每一个点上都给上9个框。那么也就是 [公式] 这么多个点,每个点都要生成9个框,所以一共要 [公式] 个框。

对于所有的框,我们进行了一个分类任务和回归任务,分类任务很简单,就是判断框里有没有物体,有物体的概率和没物体的概率分别是多少,而回归任务就是把每个框的坐标生成(左上、右下)。

于是在得到每个框的得分和坐标以后(一共是 [公式] 框),我们将他们的得分情况进行排序,我们认为有物体的概率得分大于0.7的是正例,小于0.3的负例,同时将过小的框以及过大的框(超出特征图范围)筛选出来。

3.ROI Align

现在我们得到了图一所示的proposals后,我们需要清楚一个问题,那就是框的大小是不一样的,而不同大小的框代表了特征图上不同大小的区域,而全连接层的使用意味着我们得将框所代表的特征图区域统一为一个尺寸。这也就是ROI Align的作用。

我们需要把所有的ROI都pooling成相同大小的feature map后,才能将它reshape 成一个一维的向量,从而完成后面的分类与回归任务。

与Faster rcnn中的ROI pooling不同,使用ROI pooling会造成较大的量化误差,这对于分割任务来说会造成较大的误差,因此maskrcnn中对ROI pooling进行了改进,提出了ROI Align。

假如现在有一个8×8的feature map,如下图所示,现在希望得到2x2的输出,有一个bbox坐标为[0,3,7,8]。

这个bbox的w=7,h=5,如果要等分成四块是做不到的,因此在ROI Pooling中会进行取整。就有了上图看到的h被分割为2,3,w被分割成3,4。这样之后在每一块中做max pooling,可以得到下图的结果。

这样就可以将任意大小bbox转成2x2表示的feature。

但我们可以看见,ROI Pooling需要取整,这样的取整操作进行了两次,一次是得到bbox在feature map上的坐标时。

例如:原图上的bbox大小为665x665,经backbone后,spatial scale=1/32。因此bbox也相应应该缩小为665/32=20.78,但是这并不是一个真实的pixel所在的位置,因此这一步会取为20。0.78的差距反馈到原图就是0.78x32=25个像素的差距。如果是大目标这25的差距可能看不出来,但对于小目标而言差距就比较巨大了。

因此有人提出不需要进行取整操作,如果计算得到小数,也就是没有落到真实的pixel上,那么就用最近的pixel对这一点虚拟pixel进行双线性插值,得到这个“pixel”的值。

ROI Align操作步骤为:

1.将bbox区域按输出要求的size进行等分,很可能等分后各顶点落不到真实的像素点上

2.在每个块中再取固定的4个点,也就是图6右侧的蓝色点,针对每一个蓝点,距离它最近的4个真实像素点的值加权(双线性插值),求得这个蓝点的值

3.一个块内会算出4个新值,在这些新值中取max,作为这个块的输出值,最后就能得到2x2的输出。

根据maskrcnn论文所述,我们通过ROI Align可以把我们RPN生成并筛选后的框所对应的区域全部变成我们需要大小的特征图。而最后的任务就是对这些特征图来做进一步的分类、定位,分割了。

分类和定位和RPN里面的分类定位原理相同,这里主要说明一下分割。如图7所示,在得到ROI Align操作后的特征后,由于前面进行了多次卷积和池化,减小了对应的分辨率,mask分支开始利用反卷积进行分辨率的提升,同时减少通道的个数,maskrcnn使用到了FPN网络,通过输入单一尺度的图片,最后可以对应的特征金字塔,首先将ROI变化为14x14x256的feature,然后进行了5次相同的卷积操作,然后进行反卷积操作,最后输出28x28x80的mask,即输出了更大的mask。

4.损失函数

在讲完了maskrcnn的结构以后,我们最后需要说明的就是损失函数。因为maskrcnn是多任务,所以他的损失函数也是由回归、定位、分割三部分组成,但由于在RPN结构处也有回归和定位,所以maskrcnn一共是由五个损失构成。

这里主要说明一点,最后的mask损失函数的采用的是mask分支对于每个RoI有 [公式] 维度的输出。K个(类别数)分辨率为 [公式] 的二值mask。 Lmask为平均二值交叉熵损失(the average binary cross - entropy loss). 对于一个属于第k个类别的RoI, Lmask仅仅考虑第k个mask(其他的掩模输入不会贡献到损失函数中)。这样的定义会允许对每个类别都会生成掩模,并且不会存在类间竞争。

posted on 2019-08-29 00:13  Sanny.Liu-CV&&ML  阅读(1530)  评论(0编辑  收藏  举报

导航