Mask R-CNN论文:Mask R-CNN
Fast R-CNN 和 Faster R-CNN 试图解决目标检测的问题,而 Mask R-CNN 则是在 Faster R-CNN的基础上,试图解决包含目标检测的像素级实例分割问题。简单而言,Mask R-CNN 就是在 Faster R-CNN的基础上,添加了一条并联的 Mask 预测网络。
前人的工作
Faster R-CNN:
R-CNN 系列网络已经经过了很成熟的发展,它为 Mask R-CNN的网络结构提供了很好的支持。在此基础上, Mask R-CNN 很容易地被实现和训练。
FCN:
全卷积网络可以实现像素到像素的 heatmap 预测,由于 Mask R-CNN 的边界框尺寸不定,应用像素到像素的预测技术是必要的,Mask R-CNN 的 Mask 预测支路实际上就是一个小型的 FCN 网络。
FCN 提出的理念很有建设性,但它本身在实例分割上却并没有出色的表现。Mask R-CNN 作者所言,基于他们的经验,在实例分割领域,将分类和实例分割解耦是必要的,而 FCN 采用的策略是同时预测 Mask 和类别,这个高度耦合的过程使得网络训练时,类别的预测和 Mask 的预测相竞争,网络难以具有鲁棒性。
而 Mask R-CNN 就将分类和 Mask 分成了两个任务。Mask 预测网络会对每个类别分别预测一个 Mask ,置于取哪个 Mask 作为最终输出,则由分类网络的输出决定。
DeepMask:
Mask R-CNN列出来批判的对象,因为它以及相似的网络都将掩码预测先于分类进行,事实证明这种 pipeline 又慢又不是很精确。
Mask R-CNN 的贡献
Mask R-CNN 在实例分割领域超过了当时所有最先进的方法。此外,在继承了 Faster R-CNN 的框架之下,Mask R-CNN 在速度上依然不逊于大多数实例分割模型。Mask R-CNN 还表现出了很高的可拓展性,作者在微调网络结构后,将 Mask R-CNN 应用到人体姿态预测中,也在预测速度相同的情况下击败了 2016 年的冠军。 而 Mask R-CNN 所做的调整只是将每个人体关键点作为一个 one-hot 的 Mask。Mask R-CNN 的结构可以被适用于各种实例级别的应用上。
Mask R-CNN 的网络设计
Faster R-CNN 部分的 pipeline 都没变化,只是有些模块做了修改。
Mask的表示
对每一个RoI,Mask 预测支路输出一个m×m的二进制图像,表示 RoI 中的目标掩码。
RoI Align
Faster R-CNN部分的最大不同点在于,Mask R-CNN 采用 RoI Align 代替了 RoI Pooling。
不采用 RoI Pooling 的原因是,RoI Pooling 在映射 RoI 到特征图上时,以及将特征图上的 RoI 映射到池化输出上时,都进行了图像尺寸的取整操作。比如一个500×600的 RoI,映射到卷积后的特征图上会缩小16倍,变成31×37(取整),为了适应一个7×7的池化输出大小,又需要每个池化窗口的大小为4×5(取整)。取整的过程无法回溯,所以基于 RoI Pooling 得到的特征预测出来的 Mask,不能精确地覆盖原始图像上的像素。
RoI Align 做了一个很简单的改进,采用了亚像素的思想,每次映射 RoI 时,直接保留浮点数的尺寸。一个500×600的 RoI,映射到到特征图变成31.25×37.5(不取整),为了适应一个7×7的池化输出大小,又需要每个池化窗口的大小为4.46×5.36。
那么在做最大池化的时候,既然像素点的数量不是整数,怎么找到特征值最大的像素点?在这里,每个池化窗格中都取了整数个区域(论文中为2×2),每个区域的特征值通过双线性插值得到,然后这些区域再通过最大池化输出它们中的最大值。
网络结构:Backbone
作者尝试了几种 backbone: ResNet,从50层的 ResNet 的第4个阶段的最后一个卷积层后截断,取前面的部分作为特征提取网络,记为 ResNet-50-C4,这是一种常见的 backbone 选取方式; FPN,目的是从不同的尺度上提取特征图上的特征。
网络结构:Head
基于 ResNet 的网络 head 如左下图所示,在 RoI Align后,分支前还加入了 ResNet 的第 5 阶段,但是输入调整为7×7的池化结果,取消了stride,保持输出也是7×7。然后再进行分支,其一和 Faster R-CNN 一样,预测类别和边界框回归;其二是预测 Mask 的全卷积网络,可以看到这里不仅用了卷积层,还用了反卷积层。
基于 FPN 的网络 head 如右下图所示,在 PoI Align 后直接分支,一条全连接(也加了一层卷积,可能是想更深度地提取特征吧)支路预测类别和边界框回归,一条全卷积支路预测 Mask 。
关于为什么这些网络结构设计会有细节上的不同,作者并没有说明,想必也是实验了多种结构后得到的结果。
训练
损失函数
Mask R-CNN 定义的多任务损失函数:
其中,是多分类交叉熵损失函数,
是用
计算的边框回归参数损失函数,这两者在之前的论文里都已经提到过了。
是 Mask 预测的损失函数。因为 Mask 的输出是一个具有固定尺寸的二值方阵,所以
简单地定义为每个像素的二分类损失之和。Mask 的预测目标是正样本的 ROI 和它的 object 的 Mask 的交集。
不过在训练时并不采用多任务损失函数来进行端到端的模型训练,而是分别训练分类支路和 Mask 预测支路。
超参数
超参数的设置和 Fast/Faster R-CNN 中相同,尽管这些网络的原本目的是目标检测,但 Mask R-CNN 体现了对这些超参数的鲁棒性。
样本
选取与 Ground Truth 具有至少 50% 的 IoU 的 RoI 作为正样本,其余的为负样本。
每个 GPU 在每个批次选择两张图片中的 N 个 RoI 作为 mini-batch ,正负样本比例为1:3。N 在 ResNet backbone 下取64,在 FPN backbone 下取512。在八核 GPU 上训练 160K 个批次。
学习率0.02(在120K个批次后缩减为0.002),weight decay 0.0001,momentum 0.9。
测试
在测试时,提出 N 个 Region Proposal(在 ResNet backbone 下取300,在 FPN backbone 下取1000),在边框预测后,用非极大值抑制选取前100个边界框,对每个边界框而言,Mask 预测支路为每个类别预测一个二值的m×m 大小的 Mask,但最后只取用和分类支路预测到的类别相符的 Mask,这个 Mask 被放大到原始 RoI 的尺寸。
相较于 Faster R-CNN,Mask 预测支路会让整个网络的前向传播时间增加大约 20% 。
其它
独立预测 Mask VS 类别和 Mask 一起预测
除了单独训练 Mask 预测支路,另一种方式是采用的损失函数,一起训练分类支路和 Mask 预测支路,也就是不将两者解耦。但实验证明,这样会导致模型性能变差。所以在 Mask R-CNN的结构下,还是解耦地预测更符合期望。
每一类预测一个 Mask VS 总共只预测一个 Mask
除了对每一个类别预测一个 Mask,最后取类别符合者,也可以直接预测一个与类别无关的 Mask。这种思想也很直观:人在看到一个东西时,就算不认识它是什么,也能够很容易地分辨出它的边界。实验证明,总共只预测一个 Mask 确实也不会让模型表现得太差。
Mask R-CNN 在人体位姿估计上的应用
Mask R-CNN 只要做一点小修改就可以作为人体位姿的估计器:在 Mask 预测支路中,对于每个人体关键点,分别预测一个 one-hot 的 Mask。
甚至,在做这种修改时,几乎不需要任何人体位姿估计领域的知识——因为本来这就是为了验证 Mask R-CNN 在各个领域上的通用性。