1.1 Mask-RCNN 的网络结构示意图
其中黑色部分为原来的Faster-RCNN,红色部分为在Faster网络上的修改:
1)将ROI Pooling层替换成了ROIAlign;
2)添加并列的FCN层(Mask层);
先来概述一下Mask-RCNN的几个特点(来自于PaperMask R-CNN的Abstract):
1)在边框识别的基础上添加分支网络,用于语义Mask识别;
2)训练简单,相对于Faster仅增加一个小的Overhead,可以跑到5FPS;
3)可以方便的扩展到其他任务,比如人的姿态估计等;
4)不借助Trick,在每个任务上,效果优于目前所有的 single-model entries;包括 COCO 2016 的Winners。
1.2 RCNN行人检测框架
来看下后面两种RCNN方法与Mask结合的示意图:
图中灰色部分是原来的RCNN结合ResNet or FPN的网络,下面黑色部分为新添加的并联Mask层,这个图本身与上面的图也没有什么区别,旨在说明作者所提出的Mask RCNN方法的泛化适应能力:可以和多种RCNN框架结合,表现都不错。
1.3 Mask-RCNN 技术要点
1.技术要点1 - 强化的基础网络
通过ResNeXt-101+FPN用作特征提取网络,达到state-of-the-art的效果。
2.技术要点2 - ROIAlign
采用ROIAlign替代RoiPooling(改进池化操作)。引入了一个插值过程,先通过双线性插值到1414,再pooling到77,很大程度上解决了仅通过Pooling直接采样带来的Misalignment对齐问题。
PS: 虽然 Misalignment 在分类问题上影响并不大,但在 Pixel 级别的 Mask 上会存在较大误差。
后面我们把结果对比贴出来(Table2 c & d),能够看到 ROIAlign 带来较大的改进,可以看到,Stride 越大改进越明显。
3.技术要点3 - Loss Function
每个ROIAlign对应K * m^2维度的输出。K对应类别个数,即输出K个mask,m对应池化分辨率(7 * 7)。Loss函数定义:
L m a s k ( C l s k ) = S i g m o i d ( C l s k ) Lmask(Cls_k)=Sigmoid(Cls_k) Lmask(Clsk)=Sigmoid(Clsk)
L m a s k ( C l s k ) = S i g m o i d ( C l s k ) Lmask(Cls_k) = Sigmoid (Cls_k) Lmask(Clsk)=Sigmoid(Clsk),平均二值交叉熵 (average binary cross-entropy)Loss,通过逐像素的 Sigmoid 计算得到。
Why K个mask?通过对每个 Class 对应一个Mask可以有效避免类间竞争(其他Class不贡献Loss)。
通过结果对比来看(Table2 b),也就是作者所说的 Decouple 解耦,要比多分类的Softmax效果好很多。
另外,作者给出了很多实验分割效果,就不都列了,只贴一张和FCIS的对比图(FCIS出现了Overlap的问题)