【目标检测 论文泛读】 Mask R-CNN

文章目录

  • 文章提出的背景
  • Faster R-CNN回顾
  • 作者的改进思路
    • Mask R-CNN整体结构:
    • RoIAlign
    • Mask
    • Mask R-CNN的两种模型
  • 小总结

R-CNN系列推演:

  • R-CNN 论文解读
  • SSPnet 论文解读
  • Fast R-CNN 论文解读
  • Faster R-CNN 论文解读
  • FPN 论文解读
  • Mask R-CNN 论文解读

每一篇都是上一篇或上几篇的改造版,按顺序看会比较好。

这篇论文是基于Faster R-CNN和FPN的改良版。
论文下载地址:https://arxiv.org/pdf/1703.06870.pdf

论文题目:Mask R-CNN

文章提出的背景

Mask R-CNN主要解决的是实例分割问题,看到部分视频或者博客将这里直接说成语义分割,不是很准确。

语义分割和实例分割的区别:

实例分割(Instance segmentation)和语义分割(Semantic segmentation)不是一个东西,实例分割是语义分割下属的一个小领域,
在网上找了一张图来看一下他俩的区别。
【目标检测 论文泛读】 Mask R-CNN_第1张图片
从左到右,目标检测,语义分割,实例分割,可以看出来 语义分割只是像素级层面区分不同的分类,比如人都是一个颜色的,而实例分割是要分开每个不同的实体,即使是同一个类别也要用不同的颜色分开。

作者为了完成高质量的分割任务,在Faster R-CNN 的基础上进行改造模型,提出了 Mask R-CNN。

Faster R-CNN回顾

整个模型是基于 Faster R-CNN的,所以先回顾一下这个模型。一张表格,清晰易懂。

Faster R-CNN
整张图片给CNN,提取出feature map
feature map送给RPN模块,RPN内部: 滑窗生成anchors,然后分类(背景还是物体)+回归修正 得到精准的候选框。
精准候选框+第一步整张图的feature map送给ROI池化,生成候选框的feature map,最后分类(物体的分类)+回归。

作者的改进思路

Mask R-CNN整体结构:

看一下作者在论文中给出的整体结构图:

【目标检测 论文泛读】 Mask R-CNN_第2张图片
说明一下这张图,左边图片进来之后 先走 Faster R-CNN那一套, 就是一个Backbone模型提取feature map,然后 RPN 然后再RoIAlign,之后分类+回归+mask。

这里相较于Faster R-CNN 只有两个变动,一个是改造了原来的ROI池化,一个是在最后多加了一个mask分支用于分割。

所以 Mask R-CNN = Backbone+RPN+RoIAlign+(分类+回归+mask)。

RoIAlign

RoIAlign是作者对于Faster R-CNN的改动之一,对于原来的ROI池化是存在一定问题的,比如下图:

【目标检测 论文泛读】 Mask R-CNN_第3张图片
这是原来ROI池化中的一步操作,将原图的ROI(候选框)映射到feature map上,可以看到比例的变换,这里就有可能出现浮点数,但换成整数了,也就是说特征图与原始图像是不对准的(mis-alignment),这就造成了精度的损失问题。

还有一个地方,ROI在刚提出的时候是用来代替SSPnet中的spp模型,他又一个重要作用就是固定输出大小供FC使用。而在任意尺寸变为固定大小的过程中,又发生了上述的尺寸变换产生浮点数却变成整数的精度损失问题。

mis-alignment问题对于分类影响不大,但对于分割任务影响较大。

作者为了解决这个问题,对ROI进行了改造,提出了ROIAlign模型。ROI Align方法取消整数化操作,保留了小数,使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值。但在实际操作中,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后进行池化,而是重新进行设计。

ROIAlign、ROIPling详细原理

Mask

这是作者相较于Faster R-CNN的第二个改动。

就是原模型在最后只有回归和分类两个分支,作者新加入了mask分支用于分割任务。
mask的损失函数就更新成: L 总 = L 分 类 + L 回 归 + L 分 割 L_总=L_{分类}+L_{回归}+L_{分割} L=L+L+L,或表达为: L = L c l s + L b o x + L m a s k L=L_{cls}+L_{box}+L_{mask} L=Lcls+Lbox+Lmask

其中分类和回归的定义和Faster R-CNN一样。

对于Mask的损失函数,假设一共有K个类别,则mask分割分支的输出维度是 K ∗ M ∗ M K * M * M KMM, 对于 M ∗ M M * M MM中的每个点,都会输出K个二值Mask(每个类别使用sigmoid输出),计算loss的时候,并不是每个类别的sigmoid输出都计算二值交叉熵损失,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失。并且在测试的时候,通过分类分支预测的类别来选择相应的mask预测。这样,mask预测和分类预测就彻底解耦了。

Mask R-CNN的两种模型

为了产生对应的Mask,文中提出了两种架构。
【目标检测 论文泛读】 Mask R-CNN_第4张图片
这两张图都只展示了RoI输出之后的结构。

左图:
使用了ResNet作为Backbone,后面一路进FC然后分类+回归,一路反卷积来提升分辨率,然后分割。
最后mask 的 14 * 14 * 80 其中 80个channel指80个class对应的mask,且每个mask是14 * 14的矩阵。每个格子都是binary。
res5指的是ResNet的第五个stage。

右图:

使用了ResNet-FPN作为Backbone,左图输入的时候是7 * 7 * 1024,而右图这里输入的是7 * 7 * 256,看样子应该是FPN提取的特征或者说语义信息比较多,所以输入的通道比较小。
后面就是和左图一样,一路回归+分类分支,一路反卷 加卷积 分割分支。

回归和分类前面都是FC,而分割前面都是反卷积和卷积层,因为卷积层比全连接层更能表达空间结构,参数少,且更精确。

小总结

  • 分析了ROI池化对于mask的不足,并提出了ROIAlign模型;
  • 改进了Faster R-CNN模型,加入了mask分支做分割任务;
  • mask与回归分类分成两个分支,使用Binary Loss代替Multinomial Loss,消除不同类别的mask之间的竞争,达到解耦的效果。

你可能感兴趣的:(论文精读+复现,个人笔记,深度学习,人工智能)