文章目录
- 小总结
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)不是一个东西,实例分割是语义分割下属的一个小领域,
在网上找了一张图来看一下他俩的区别。
从左到右,目标检测,语义分割,实例分割,可以看出来 语义分割只是像素级层面区分不同的分类,比如人都是一个颜色的,而实例分割是要分开每个不同的实体,即使是同一个类别也要用不同的颜色分开。
作者为了完成高质量的分割任务,在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整体结构:
看一下作者在论文中给出的整体结构图:
说明一下这张图,左边图片进来之后 先走 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池化是存在一定问题的,比如下图:
这是原来ROI池化中的一步操作,将原图的ROI(候选框)映射到feature map上,可以看到比例的变换,这里就有可能出现浮点数,但换成整数了,也就是说特征图与原始图像是不对准的(mis-alignment),这就造成了精度的损失问题。
还有一个地方,ROI在刚提出的时候是用来代替SSPnet中的spp模型,他又一个重要作用就是固定输出大小供FC使用。而在任意尺寸变为固定大小的过程中,又发生了上述的尺寸变换产生浮点数却变成整数的精度损失问题。
mis-alignment问题对于分类影响不大,但对于分割任务影响较大。
作者为了解决这个问题,对ROI进行了改造,提出了ROIAlign模型。ROI Align方法取消整数化操作,保留了小数,使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值。但在实际操作中,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后进行池化,而是重新进行设计。
Mask
这是作者相较于Faster R-CNN的第二个改动。
就是原模型在最后只有回归和分类两个分支,作者新加入了mask分支用于分割任务。
mask的损失函数就更新成:,或表达为:
其中分类和回归的定义和Faster R-CNN一样。
对于Mask的损失函数,假设一共有K个类别,则mask分割分支的输出维度是 , 对于 中的每个点,都会输出K个二值Mask(每个类别使用sigmoid输出),计算loss的时候,并不是每个类别的sigmoid输出都计算二值交叉熵损失,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失。并且在测试的时候,通过分类分支预测的类别来选择相应的mask预测。这样,mask预测和分类预测就彻底解耦了。
Mask R-CNN的两种模型
为了产生对应的Mask,文中提出了两种架构。
这两张图都只展示了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之间的竞争,达到解耦的效果。