ECCV2020(Instance Segmentation):BMask R-CNN-论文解读《Boundary-preserving Mask R-CNN》

原文地址

https://arxiv.org/pdf/1703.06870v3.pdf

论文阅读方法

三遍论文法

初识(Abstract & Introduction & Conclusion)

目前实例分割普遍为基于目标检测(为instance-level的分割提供box-level信息),例如Mask R-CNN就是在Faster RCNN上新增一条mask分支。但这些方法往往都忽略了目标的边界和形状信息,所以得到的mask是粗糙、模糊的,并且定位也不精确。

实例分割中mask的预测依赖于全卷积网络执行像素级分类,它平等地对待proposal内的每个像素,忽略了目标形状及边界信息。然而在边界附近的像素点是很难分类的,仅依赖像素级的分类器很难获得精准的结果。下图为实例分割示例:

在这里插入图片描述
为了解决这个问题,作者引入了实例边界信息来增强mask预测,构建了一个简单而有效的模型:Boundary-preserving Mask R-CNN(BMask R-CNN),这个网络结合了instance-level mask预测和边界预测。

实例边界其实是mask的一种对偶表示,可以引导mask预测网络的输出与groundtruth对齐。下图为引入边界信息后示例:

在这里插入图片描述
核心idea很简单:在Mask R-CNN的基础上,将原生的mask分支代替为boundary-perserving mask分支(包含两个子网络共同学习物体的mask和boundary)。但边界信息是很难学习的,① 直接从标注中提取出的边界存在噪声(标注并非十分精确);② 相比于mask分类,boundary的训练像素要少很多。为了解决这两个问题,boundary loss结合了binary cross-entropy loss和dice loss。

本文主要的共享有以下几点:

  1. BMask R-CNN是第一个在Mask R-CNN中引入边界信息来提高定位精度的网络;
  2. BMask R-CNN简单有效,相比于Mask R-CNN性能提高了不少,特别是在AP75这些高精度的指标上提升不少;
  3. 对BMask R-CNN进行了消融研究,有助于理解其工作原理。

相知(Body)

2. Related Work

这部分不过于赘述,有兴趣可以参见原文,只简单介绍一下。

Instance Segmentation

实例分割的方法主要分为两类:Detection-based和Segmentation-based。

Detection-based方法应用目标检测器来生成区域proposals,然后在RoI Pooling/Align层之后进行mask预测。这一类方法有FCIS、MNC、BAIS、Mask R-CNN以及基于Mask R-CNN改进的一系列方法

**Segmentation-based方法首先对整幅图像进行像素级分割,然后将同一个目标的像素组合在一起。**包括InstanceCut、SGN等方法。

Boundary, Edge and Segmentation

全卷积网络在边缘检测任务上也取得不错的成就,例如HED、CASENet等;在语义分割领域中DeepLabV1,V2用CRF来捕获空间细节信息来修正物体边界,也出现了一些引入边界/边缘来进行语义分割的方法;同时也出现了一些在实例分割中应用边界信息修正结果的网络。

与这些方法不一样,本文的BMask R-CNN是需要明确预测出instance-level边界的,与语义分割相比,实例分割中的边界与mask具有对偶关系。

3. Boundary-preserving Mask R-CNN

3.1 Motivation

下图为以ResNet-50-FPN作为backbone的Mask R-CNN预测结果与groundtruth对比(第一行为groundtruth,第二行为预测结果),可以看到mask非常粗糙并且不精确,因此很容易想到引入边界信息来改善定位准确度。
在这里插入图片描述

3.2 Boundary-preserving Mask Head

在这里插入图片描述
如上图所示,BMask R-CNN在Mask R-CNN的基础上将mask分支修改为Boundary-perserving分支,整个网络由两条分支构成,一条用于bounding-box的分类与偏移量回归(Box Head),一条用于Mask与Boundary的预测(Boundary-preserving Mask Head)。

与Mask R-CNN一致,仍为两阶段(two-stage)方法

阶段①:FPN捕获多尺度特征(RPN生成proposals,检测网络获取feature map);

阶段②:RPN生成proposals后,box head利用proposal提取RoI特征进行分类与回归;Bounding-preserving mask head执行RoIAlign获取RoI特征预测boundary与mask。

物体的boundary和mask之间关系很密切,可以相互转换(对偶关系)。mask子网提取的特征可以为boundary的学习提供高级语义信息;在得到boundary后,Boundary特征中蕴含的形状与位置信息又可以反过来促进mask预测得更精准。

RoI Feature Extraction

Rm 和Rb 分别代表用于mask预测boundary预测的RoI特征

Rm:根据proposal的尺寸(由RPN生成)选取不同级别的特征(FPN提供4个级别的特征(P2~P5,具有不同分辨率)),经过RoIAlign得到的RoI特征作为Rm

Rb:直接从FPN提供的P2-level(分辨率最高,包含最多空间细节)特征图,经过RoIAlign获取得到的RoI特征作为Rm

上图可以看到,经过RoIAlign之后,Rb 的分辨率大于Rm (Rb需保持空间特征);Rb经过3x3的卷积进行下采样得到Rb^(与Rm分辨率相同);Rm 经过4个连续的3x3卷积得到Fm

BMask R-CNN中的特征融合机制如下,包含两个部分:

Mask → Boundary (M2B) Fusion: Fm中包含着丰富的高级语义(eg. pixel-wise目标分类信息),这有助于物体边界的预测,以下公式用作融合:

在这里插入图片描述
其中,F表示最后得到的边界特征,f操作表示1x1卷积+ReLU

Boundary → Mask (B2M) Fusion:得到的边界特征又能反过来丰富mask特征以及促进mask预测得更精确,模块与①中一致。

Predictor:Predictor由2x2转置卷积 + 1x1卷积构成,从而得到最终输出。其与Mask R-CNN一致,得到的mask和boundary都是image-specific (也就是意味着会为每个类别生成1个mask + boundary)

3.3 Learning and Optimization

与mask预测一样,将Boundary预测视为pixel-level的分类问题

Boundary Groundtruths: 使用Laplacian检测器(边缘检测)来捕捉binary mask groundtruth中的边界,然后转化为binary map来作为边界的groundtruth。

Laplacian是一种基于二阶梯度的边缘检测方法,能生成细长的边界

Boundary Loss:使用dice loss和binary cross-entropy loss来优化边界学习任务,Loss如下所示:
在这里插入图片描述
其中,Dice loss如下所示:
在这里插入图片描述
其中,i表示第i个像素,ε为平滑项,避免分母为0(ε=1)。

Dice loss可以衡量prediction与groundtruth之间的重叠程度,并且其对像素数量是不敏感的,所以能在一定程度上缓解类别不平衡问题(其实就是计算prediction和groundtruth之间IoU,并以此来衡量loss).

Multi-Task Learning:多任务学习所需的Loss如下:
在这里插入图片描述
其中Lb为式(2),其他的几个部分与Mask R-CNN一致。

4. Experiments

实验部分同样不多赘述,只简单过一下,有兴趣可以参见原文相应段落。这些实验结果都是在没有使用任何tricks的条件下达到的效果,这样在同等条件的比较下,BMask R-CNN取得了不错的结果。

学到了,直接把自己的baseline和别人的baseline来对比,这样就可以少做很多调参工作了(不用multi-scale train/test, horizontal flip test, and OHEM这些tricks)。

Implementation Details

ResNet-50-FPN作为Backbone,使用Image-Net预训练模型,最短边800(最长不超过1333)。

4GPUs, mini-batch=16, 9000 iterations, SGD(lr=0.02,6000iter后x0.1,8000次后x0.01)

在这里插入图片描述
上表为在COCO数据集上与Mask R-CNN的对比结果
在这里插入图片描述
上表为在COCO数据集上与SOTA模型的对比结果
在这里插入图片描述
上图为展示了BMask R-CNN与Mask R-CNN在不同IoU阈值下的AP曲线
在这里插入图片描述
上表为Mask R-CNN在COCO数据集上进行的消融实验
在这里插入图片描述
上表为探索Boundary分支对mask影响的结果
在这里插入图片描述
上表与上图探索了FPN的不同层级特征提取与分辨率大小对Boundary-preserving Mask Head的影响
在这里插入图片描述
上表为特征融合模块的消融实验结果
在这里插入图片描述
上表与上图为Loss Function的探索结果
在这里插入图片描述
上表介绍了BMask R-CNN相比于Mask R-CNN增加了多少计算开销
在这里插入图片描述
上表为在CityScapes数据集的实验结果,与各大SOTA进行对比

5. Discussions

Coarse boundary annotation vs. precise boundary prediction

由于mask的标注工作量大,所以COCO数据集中的mask标注其实上是非常粗糙的,这限制了BMask R-CNN的性能。尽管如此,在引入了Boundary监督之后,BMask RCNN仍能输出较为精准的结果并减少实例间的重叠程度。

下图为示例,图左为Annotation,右图为Prediction。

在这里插入图片描述
c Sobel mask head

除了使用额外的boundary分支来预测边界,本文实验了直接在mask后接Sobel操作来预测boundary,结构如下图所示,它能在Mask R-CNN的基础上提高了0.8AP(但比我们本文主要提出的方法效果差,低了0.7AP),结构如下图所示:
在这里插入图片描述

Sobel是用于图像梯度检测的一种方法,可求得x和y方向的梯度,并以此来进行梯度检测:https://blog.csdn.net/qq_36560894/article/details/107767281

Qualitative Results

在这里插入图片描述
上图为Mask R-CNN与BMask R-CNN的方法对比
在这里插入图片描述
上图为原始边界和mask结果,可以看到BMask R-CNN得到的结果更加清晰并且边界很光滑。此外,使用预测得到的边界去修正mask也可以带来一些性能上的提升,但是这很容易受到噪声的干扰。

回顾(Review)

Boundary-preserving Mask R-CNNMask R-CNN的基础上引入Boundary预测分支,从而引导mask的预测更加精确与光滑。我个人觉得,本文的主要特点是使用了相互融合的思想:在boundary分支中引入mask支路的高级语义特征,在mask分支融入boundary支路的边界与形状特征

代码

先贴上一份官方代码(click me),有空再复现一下。


以上为个人的浅见,水平有限,如有不对,望大佬们指点。

未经本人同意,请勿转载,谢谢。

SDL2 中的 `SDL_ConvertSurface` 函数可以转换表面的像素格式,但是不是所有的像素格式都可以转换成 ARGB1555 格式。如果你尝试将一个 BMP 图像转换成 ARGB1555 格式,可能会失败。 原因是 BMP 图像格式不支持 ARGB1555 格式。BMP 图像格式只支持 BGR24、BGR555、BGR565、BGR888 和 BGRA8888 等像素格式。因此,如果你将 BMP 图像加载到 SDL2 中,它的像素格式可能是其中的一种。 如果你需要将一个表面转换成 ARGB1555 格式,可以使用 `SDL_CreateRGBSurface` 函数手动创建一个 ARGB1555 格式的表面。以下是一个创建 ARGB1555 表面的示例: ```c int width = 640, height = 480; Uint32 rmask, gmask, bmask, amask; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0x7C00; gmask = 0x03E0; bmask = 0x001F; amask = 0x8000; #else rmask = 0x001F; gmask = 0x03E0; bmask = 0x7C00; amask = 0x8000; #endif SDL_Surface* surface = SDL_CreateRGBSurface(0, width, height, 16, rmask, gmask, bmask, amask); ``` 在此示例中,我们手动指定了每个像素通道所占用的位数,并使用掩码来指定每个通道的位移和位数。如果你需要设置不同的位数或不同的掩码,请根据需要进行更改。 创建表面后,你可以使用 `SDL_BlitSurface` 函数将其他表面的像素复制到 ARGB1555 格式的表面上。在复制像素时,SDL2 会自动将像素格式转换为 ARGB1555 格式。 ```c SDL_Surface* src_surface = ...; // 其他表面 SDL_Rect src_rect = {0, 0, width, height}; SDL_Rect dst_rect = {0, 0, width, height}; SDL_BlitSurface(src_surface, &src_rect, surface, &dst_rect); ``` 这样,你就可以将其他表面中的像素复制到 ARGB1555 格式的表面上了。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值