【目标检测】【语义分割】—Mask-R-CNN详解

一、mask rcnn简介

论文链接:论文链接

论文代码:Facebook代码链接;Tensorflow版本代码链接; Keras and TensorFlow版本代码链接;MxNet版本代码链接

mask rcnn是基于faster rcnn架构提出的卷积网络,一举完成了object instance segmentation. 该方法在进行目标检测的同时完成了高质量的语义分割。文章的主要思路是把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。同时,将 Roi Pooling 层替换成了 RoiAlign;网络结构比较容易实现和训练,速度为5fps,可以很方便的应用到其他的领域,像目标检测,分割,和人物关键点检测等。并且比着现有的算法效果都要好,在后面的实验结果部分有展示出来。

二、Mask R-CNN是什么,可以做哪些任务?

图1 Mask R-CNN整体架构

Mask R-CNN是一个实例分割(Instance segmentation)算法,可以用来做“目标检测”、“目标实例分割”、“目标关键点检测”

实例分割(Instance segmentation)和语义分割(Semantic segmentation)的区别与联系

联系:语义分割和实例分割都是目标分割中的两个小的领域,都是用来对输入的图片做分割处理;

区别:

图2 实例分割与语义分割区别

1.  通常意义上的目标分割指的是语义分割,语义分割已经有很长的发展历史,已经取得了很好地进展,目前有很多的学者在做这方面的研究;然而实例分割是一个从目标分割领域独立出来的一个小领域,是最近几年才发展起来的,与前者相比,后者更加复杂,当前研究的学者也比较少,是一个有研究空间的热门领域,如图1所示,这是一个正在探索中的领域;

标图3 实例分割与语义分割区别题

2.  观察图3中的c和d图,c图是对a图进行语义分割的结果,d图是对a图进行实例分割的结果。两者最大的区别就是图中的"cube对象",在语义分割中给了它们相同的颜色,而在实例分割中却给了不同的颜色。即实例分割需要在语义分割的基础上对同类物体进行更精细的分割。

三、Mask R-CNN: overview

【目标检测】【语义分割】—Mask-R-CNN详解_第1张图片 图4 Mask R-CNN整体构架

从整体构架可以知道,Mask R-CNN主要的贡献在于如下: 
1. 强化的基础网络,用ResNet-101+FPN作为特征提取网络,达到 state-of-the-art 的效果。 
2. ROIAlign解决Misalignment 的问题 
3. 增加了_{L}mask的Loss Function

本文业主要是针对这几个问题来解析Mask-R-CNN。

四、细节描述

1. Head Architecture 

图5 Head Architecture

如上图所示,为了产生对应的Mask,文中提出了两种架构,即左边的Faster R-CNN/ResNet和右边的Faster R-CNN/FPN。对于左边的架构,我们的backbone使用的是预训练好的ResNet,使用了ResNet倒数第4层的网络。输入的ROI首先获得7x7x1024的ROI feature,然后将其升维到2048个通道(这里修改了原始的ResNet网络架构),然后有两个分支,上面的分支负责分类和回归,下面的分支负责生成对应的mask。由于前面进行了多次卷积和池化,减小了对应的分辨率,mask分支开始利用反卷积进行分辨率的提升,同时减少通道的个数,变为14x14x256,最后输出了14x14x80的mask模板。而右边使用到的backbone是FPN网络,这是一个新的网络,通过输入单一尺度的图片,最后可以对应的特征金字塔,如果想要了解它的细节,请参考我前边的博客。得到证实的是,该网络可以在一定程度上面提高检测的精度,当前很多的方法都用到了它。由于FPN网络已经包含了res5,可以更加高效的使用特征,因此这里使用了较少的filters。该架构也分为两个分支,作用于前者相同,但是分类分支和mask分支和前者相比有很大的区别。可能是因为FPN网络可以在不同尺度的特征上面获得许多有用信息,因此分类时使用了更少的滤波器。而mask分支中进行了多次卷积操作,首先将ROI变化为14x14x256的feature,然后进行了5次相同的操作,然后进行反卷积操作,最后输出28x28x80的mask。即输出了更大的mask,与前者相比可以获得更细致的mask。

图6 BB输出的mask结果

如上图所示,图像中红色的BB表示检测到的目标,我们可以用肉眼可以观察到检测结果并不是很好,即整个BB稍微偏右,左边的一部分像素并没有包括在BB之内,但是右边显示的最终结果却很完美。

1.2 RoIAlign详解

ROI Align 是在Mask-RCNN论文里提出的一种新的区域特征聚集方式, 很好地解决了Faster-R-CNN中ROI Pooling操作时两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在目标检测时将ROI Pooling替换为ROI Align 可以提升检测模型的准确性。

1. ROI Pooling 的局限性分析

在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。

  • 将候选框边界量化为整数点坐标值。
  • 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。

事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题(misalignment)。

下面我们用直观的例子具体分析一下上述区域不匹配问题。如 图1 所示,这是一个Faster-RCNN检测框架。输入一张800*800的图片,图片上有一个665*665的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是ROI Pooling 直接将它量化成20。接下来需要把框内的特征池化7*7的大小,因此将上述包围框平均分割成7*7个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。

图片标题 图 7 ROI Pooling构架

2. ROI Align 的主要思想和具体方法

为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法(如图2)。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作,。值得注意的是,在具体的算法操作上,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如 图3 所示:

  • 遍历每一个候选区域,保持浮点数边界不做量化。
  • 将候选区域分割成k x k个单元,每个单元的边界也不做量化。
  • 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。

这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。值得一提的是,我在实验时发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析,造成这种区别的原因是COCO上小目标的数量更多,而小目标受misalignment问题的影响更大(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)。

å¾çæ é¢ 图8 RoIAlign构架
å¾çæ é¢ 图9 双线性插值

3. ROI Align 的反向传播

常规的ROI Pooling的反向传播公式如下:

图片标题

这里,xi代表池化前特征图上的像素点;yrj代表池化后的第r个候选区域的第j个点;i*(r,j)代表点yrj像素值的来源(最大池化的时候选出的最大像素值所在点的坐标)。由上式可以看出,只有当池化后某一个点的像素值在池化过程中采用了当前点Xi的像素值(即满足i=i*(r,j)),才在xi处回传梯度。

类比于ROIPooling,ROIAlign的反向传播需要作出稍许修改:首先,在ROIAlign中,xi*(r,j)是一个浮点数的坐标位置(前向传播时计算出来的采样点),在池化前的特征图中,每一个与 xi*(r,j) 横纵坐标均小于1的点都应该接受与此对应的点yrj回传的梯度,故ROI Align 的反向传播公式如下: 

å¾çæ é¢

上式中,d(.)表示两点之间的距离,Δh和Δw表示 xi 与 xi*(r,j) 横纵坐标的差值,这里作为双线性内插的系数乘在原始的梯度上。

1.3 Loss 函数

训练时,对每个采样的 RoI 的 multi-task loss 为:

L=Lcls+Lbox+LmaskL=Lcls+Lbox+Lmask

  • LclsLcls - 分类 loss
  • LboxLbox - bounding-box 回归 loss
  • LmaskLmask - mask 分割 loss

mask 网络分支采用 FCN 对每个 RoI 的分割输出维数为 Km2Km2,即 KK 个类别的 m×mm×m 的二值 mask. 采用像素级 Sigmoid,定义 LmaskLmask 为平均二值交叉熵损失函数(average binary cross-entropy loss). 一个 RoI 仅与 ground-truth 类别 kk 相关,LmaskLmask 只与第 k​k​ 个 mask 相关,不受其它的 mask 输出的影响.

LmaskLmask 使得网络能够输出每一类的 mask,且不会有不同类别 mask 间的竞争. 分类网络分支预测 object 类别标签,以选择输出 mask,解耦了 mask 和 class 预测间的关系.

传统 FCNs 采用 per-pixel 的 softmax 和 multinomial cross-entropy loss,会造成不同类别的 mask 间的相互影响;

Lmask 采用 per-pixel sigmoid 和 binary loss,避免了不同类别的 mask 间的影响. 有效的提升了 instance segmentation 效果.

五、对比实验效果

图10 实验效果对比

       另外,作者给出了很多实验分割效果,就不都列了,只贴一张 和 FCIS 的对比图(FCIS 出现了Overlap 的问题) 

图11 FCIS 的对比图

六、Mask-RCNN 扩展

1、人体姿态估计 Human Pose Estimation

说明 Mask R-CNN 的扩展性.

将 keypoint 的位置表示为 one-shot mask,采用 Mask R-CNN 来预测 KK 个 masks,每个 mask 分别对应一个 keypoint.

对于一个实例的 KK 个 keypoints 中的每一个,训练目标是得到 one-hot m×mm×m 的二值mask,其中只有一种像素被标记为前景,其它为背景.

训练时,对于每个可见的 groundtruth keypoint,最小化 m2m2 -way softmax 输出的 cross-entropy loss(检测单个 keypoint). 这里类似与 instance segmentation,KK 个 keypoints 也是被独立处理的.

基于 ResNet-FPN, keypoint 的 head 网络结构类似于 Figure3(右),如下: 

这里写图片描述

主要由 8 个 3×33×3 512-d 卷积层,其后接 1 个 deconv 层和 1 个 2×2× bilinear upscaling,最终输出一个分辨率为 56×5656×56 的特征图.

Mask R-CNN 发现,关键点定位的精确度需要相对高的分辨率输出.

训练数据集 COCO trainval 35k 标注的 keypoints 数据

训练是图像的尺度随机的从 [640, 800] 中采样;

测试时图像采用单一尺度 800 像素;

训练 90k 次迭代, learning_rate=0.02,在 60k 和 80k 次迭代时降低 10 倍;

NMS 处理 bounding-box 的阈值 threshold=0.5.

2、实验结果: 

这里写图片描述

你可能感兴趣的:(语义分割,目标检测与识别,深度学习)