Mask Scoring R-CNN
作者 | 文永亮
研究方向 | 目标检测, GAN
推荐理由:
本文解读的是一篇发表于 CVPR2019 的 paper, 来自华科和地平线, 文章提出了 Mask Scoring R-CNN 的框架是对 Mask R-CNN 的改进, 简单地来说就是给 Mask R-CNN 添加一个新的分支来给 mask 打分从而预测出更准确的分数.
源码地址: https://github.com/zjhuang22/maskscoring_rcnn
研究动机:
Mask R-CNN 其实是何恺明大神在 Faster R-CNN 系列的延伸, Mask R-CNN 和 Faster R-CNN 都是 two stages 的, 第一阶段是 RPN(Region Proposal Network), 产生一些候选的目标边界框, 使用 RoIAlign 为每一个候选区域提取特征, 生成分类, bbox 回归还有 mask 的预测, 其实就是在 Faster R-CNN 的基础上添加一个新的分支预测 mask.
但是 Mask R-CNN 存在着一个问题, 就是在实例分割的任务中, 蒙版分割质量是由检测分支的分类置信度决定. 然而, mask 的质量 (我们这里用 instance mask 和 ground truth 之间的 IoU 做评判) 通常与分类置信度没有太强的关联.
相信大家都知道 IoU 是目标窗口和原来标记窗口的交叠率, 如果 Mask R-CNN 的分类置信度能够决定分割蒙版的质量的话, 也就是说其质量与分类分数呈现相关性, 但是从图二 (a) 中可以看出, 当分类分数高于 0.5 时 (横坐标), 甚至到达 1 时, MaskIoU 参差不齐, 可以说从 0.5 到 1 的质量分数都有, 从而证实了 Mask R-CNN 的 MaskIoU 与分类置信度没有太强的关联. 所以作者提出的 Mask Scoring R-CNN,MS R-CNN 中提出的框架其实很简单, 就是在原有的 Mask R-CNN 框架的基础上添加一个额外的分支 MaskIoU head 模块, 这个模块用来学习 MaskIoU. 这个框架得到的分数如图二(b)(c) 的所示, 可以明显看出分类分数高的同时蒙版质量也得到了提升.
- Mask Scoring R-CNN:
- .Mask Scoring:
既然我们发现了 Mask R-CNN 的问题, 那么我们现在就来解决它, 首先我们考虑蒙版的分数由什么决定?
从上面的动机中我们得知, MaskIoU 可以来评价蒙版的质量, 因为理想的 mask 应该是与 Ground Truth 完全重合的, 所以我们必须考虑 MaskIoU. 除此之外, 一个理想的评价 mask 的分数, 除了与 GT 的重合率之外, 这个实例分割只属于一个类, 对于其他类的分数都为 0. 所以学习 mask 的分数就分解成两个任务, 就是把 mask 分类到正确的类中以及把建议框的 MaskIoU 回归到目标前景中.
有如上公式,专注于对建议框进行分类,聚焦于回归 MaskIoU.
.MaskIoU head:
整个 MS R-CNN 的改进就在于这个 MaskIoU Head,MaskIoU Head 模块的输入由两部分组成, 一是 ROIAlign 得到的 RoI feature map, 二是 Mask Head 分支输出的 mask.Mask 经过 MaxPooling 之后与 RoI feature map 进行 concat, 然后经过 3 层卷积和 2 层全连接层, 输出的就是 MaskIoU. 以下是其完整的架构, 如图三:
.Training:
怎么训练 MaskIoU Head? 只把 mask 分支输出的 mask 与 GT 计算 IoU 作为 target 是不够的, 因为 mask 分支输出的 mask 有好有坏, 所以文章中做了阈值处理, 使用 RPN 生成的 proposals 与 GT 的 IoU 大于 0.5 的 mask 称为 binary mask, 这个 binary mask 与 GT 的 MaskIoU 就作为 MaskIoU 的 target.
.Inference:
RCNN Head 输出的 top-k(例如 top100)分数的框, 经过 SoftNMS 后, 送入 Mask Head, 得到 mask 与 ROI feature map 进行 concat 送入 MaskIoU Head 得到 MaskIOU, 然后与分类结果得到的分数相乘得到 mask score.
实验结果:
实验结果这里有很多种不同的 AP,表示在不同 scales 时的 AP,意思是使用了不同 IoU 阈值. 作者用的数据集是 COCO 2017val 集.
Table 1 表明了作者提出的 Mask Scoring R-CNN 对不同的 Backbone 网络并不敏感, 相比 Mask R-CNN 基本上 AP 有 1 点左右的提升.
Table 2 表明无论是否使用 FPN 和 DCN,MaskIoU head 都在 AP 上有提升.
Table 3 是跟目前的实例分割方法在 COCO 2017 test-dev 上做对比.
这是 MS R-CNN 和 Mask R-CNN 对比效果, 评分得到了修正.
MaskIoU head 的各种选择:
文章做了下面 4 种输入组合:
1.target mask 和 ROI feature concat
2.target mask 和 ROI feature 相乘
3. 所有 mask 和 ROI feature concat
4.target mask 和高分辨率的 ROI feature concat
还有一个问题就是, 我们知道 RoI 内可能有很多种目标类别, 我们应该让 MaskIoU 学习所有的类别, 还是学习 RoI 内的所有出现的类别, 抑或是选取 RoI 内分类得分高的类呢?
由此分成了三种情况:
只让 MaskIoU 学习 target 类别, target 类别其实就是分类得到的 top-k 类别, 其他类别的就直接忽略掉.
让 MaskIoU 学习所有类别.
让 MaskIoU 学习所有出现在 RoI 中的类别, 其他没出现的类别忽略.
发现第二种情况学习所有类别的情况是最差的, 甚至比原来 Mask R-CNN 的效果还差. 而第三种学习所有正类的情况比学习 target 类别差的原因是学习所有正类会增加 MaskIoU head 的负担, 所以文章选择了学习 target 类别的情况一.
点评:
作者认为分类置信度不能单纯的作为 mask 的得分, 所以很简单的想法就是另外创建了一个 MaskIoU 分支学习 MaskIoU, 最后与分类分数相乘的到 Mask Score. 感觉与 IoU.NET 类似. 但是这样就导致 mask 与检测分支相关, 使 mask 受限于 box.
来源: https://www.cnblogs.com/ManWingloeng/p/10717578.html