论文下载:https://arxiv.org/pdf/1703.06870.pdf
论文翻译:http://weixin.niurenqushi.com/article/2017-03-29/4805787.html
项目地址:https://github.com/TuSimple/mx-maskrcnn
iccv2017的PPT: https://download.csdn.net/download/julialove102123/10444703
一. Mask-RCNN 介绍
Mask-RCNN 来自于Kaiming 大神,通过在 Faster-RCNN 的基础上添加一个分支网络,在实现目标检测的同时,把目标像素分割(添加 Mask)出来。
网络分支:
每个候选 object 的 class label - Faster R-CNN每个候选 object 的 bounding-box offset —— Faster R-CNN每个候选 object 的 mask - added
Faster R-CNN 包括两个阶段:
1st Stage —— Region Proposal Network(RPN),得到候选 object 的 bounding-boxes;2st Stage —— 采用 RoIPool 从每个候选 box 提取特征,并进行分类和 bounding-box 回归.Mask-RCNN 的网络结构改动示意图:
其中 黑色部分为原来的 Faster-RCNN,红色部分为在 Faster网络上的修改:
1)将 Roi Pooling 层替换成了 RoiAlign;
2)添加并列的 FCN 层(mask 层);
Mask-RCNN 的特点:
1)在边框识别的基础上添加分支网络,用于语义Mask 识别;
2)训练简单,相对于 Faster 仅增加一个小的 Overhead,可以跑到 5FPS;
3)可以方便的扩展到其他任务,比如人的姿态估计等;
4)不借助 Trick,在每个任务上,效果优于目前所有的 single-model entries;
二. RCNN行人检测框架
基于最早的 Faster RCNN 框架,出现不少改进,主要有三篇需要看:
1)作者的推荐: Speed/accuracy trade-offs for modern convolutional object detectors 【arxiv】
2)Resnet:【arxiv】
3)FPN: Feature Pyramid Networks for Object Detection,通过特征金字塔来融合多层特征,实现CNN。【arxiv】
Resnet和FPN方法与 Mask 结合的示意图:
图中灰色部分是 原来的 RCNN 结合 ResNet or FPN 的网络,下面黑色部分为新添加的并联 Mask层,这个图说明作者所提出的Mask RCNN 方法的泛化适应能力 - 可以和多种 RCNN框架结合,表现都不错。
三. Mask-RCNN 技术要点
● 技术要点1 - 强化的基础网络
通过 ResNeXt-101+FPN 用作特征提取网络,达到 state-of-the-art 的效果。
● 技术要点2 - ROIAlign
采用 ROIAlign 替代 RoiPooling,引入了一个插值过程,先通过双线性插值到14*14,再 pooling到7*7,很大程度上解决了仅通过 Pooling 直接采样带来的 Misalignment 对齐问题。
PS: 虽然 Misalignment 在分类问题上影响并不大,但在 Pixel 级别的 Mask 上会存在较大误差。
RoIPool 用于从每个 RoI 中提取小的特征图(如7x7),RoIPool 选择的特征图区域,会与原图中的区域有轻微出入. 首先,对浮点数 RoI 进行量化,再提取分块的直方图,最后利用 max pooling 组合. 导致 RoI 和提取的特征间的 misalignments. 对于平移不变性的分类任务,这种影响不大,但对于精确的像素级 masks 预测具有较大的负影响.
RoIAlign 能够去除 RoIPool 引入的 misalignments,准确地对齐输入的提取特征. 即: 避免 RoI 边界或 bins 进行量化(如,采用x/16来替代round(x/16)四舍五入处理] );采用 bilinear interpolation 根据每个 RoI bin 的四个采样点来计算输入特征的精确值,并采用 max 或 average 来组合结果.
如,假设点 (x,y)(x,y),取其周围最近的四个采样点,在 Y 方向进行两次插值,再在 X 方向 进行两次插值,以得到新的插值. 这种处理方式不会影响 RoI 的空间布局.
假设有一个 128x128 的图像,25x25 的特征图,想要找出与原始图像左上角 15x15 位置对应的特征区域,怎么在特征图上选取像素?
原始图像的每一个像素与特征图上的 25/128 个像素对应. 为了在原始图像选取 15 个像素,在特征图上我们需要选择 15 * 25/128 ~= 2.93 个像素.
对于这种情形,RoIPool 会舍去零头选择两个像素,导致排列问题. 但在 RoIAlign,这种去掉小数点之后数字的方式被避免,而是使用双线性插值(bilinear interpolation)准确获得 2.93 像素位置的信息,避免了排列错误.
[From Face++]
● 技术要点3 - Loss Function
训练时,对每个采样的 RoI 的 multi-task loss 为:
L=Lcls+Lbox+Lmask
Lcls - 分类 lossLbox - bounding-box 回归 lossLmask - mask 分割 lossmask 网络分支采用 FCN 对每个 ROIAlign 的分割输出维数为 Km2,即 KS(输出 K 个mask)类别的 m×m (池化分辨率(7*7))的二值 mask. 采用像素级 Sigmoid,定义 Lmask 为平均二值交叉熵损失函数(average binary cross-entropy loss). 一个 RoI 仅与 ground-truth 类别 k 相关,Lmask 只与第 k 个 mask 相关,不受其它的 mask 输出的影响.
Lmask 使得网络能够输出每一类的 mask,且不会有不同类别 mask 间的竞争. 分类网络分支预测 object 类别标签,以选择输出 mask,解耦了 mask 和 class 预测间的关系.传统 FCNs 采用 per-pixel 的 softmax 和 multinomial cross-entropy loss,会造成不同类别的 mask 间的相互影响;
Lmask 采用 per-pixel sigmoid 和 binary loss,避免了不同类别的 mask 间的影响. 有效的提升了 instance segmentation 效果.
注: Lmask(Cls_k) = Sigmoid (Cls_k),平均二值交叉熵 (average binary cross-entropy)Loss,通过逐像素的 Sigmoid 计算得到。
为什么是 K个mask?通过对每个 Class 对应一个 Mask 可以有效避免类间竞争(其他 Class 不贡献 Loss )。
通过结果对比来看(Table2 b),也就是作者所说的 Decouple 解耦,要比多分类 的 Softmax 效果好很多。
四. 对比实验效果
另外,作者给出了很多实验分割效果,就不都列了,只贴一张 和 FCIS 的对比图(FCIS 出现了Overlap 的问题):
五. Mask-RCNN 扩展
Mask-RCNN 在姿态估计上的扩展,效果不错。