论文链接:https://arxiv.org/abs/1703.06870
mask RCNN是He Kaiming2017的力作,其在进行目标检测的同时进行实例分割,取得了出色的效果,取得了COCO 2016比赛的冠军
图像分割的方式:语义分割、实例分割、全景分割。如下图所示
Mask RCNN沿用了Faster RCNN的思想。Mask RCNN = (ResNet-FPN) + (Fast RCNN) + (Mask)
其中的ResNet-FPN,可以换成其他的基础网络,论文中也做了相应的实验进行效果对比。
faster rcnn是两个阶段的目标检测算法:阶段一的Region Proposal、阶段二的bounding box 的回归和分类。
Fast RCNN使用CNN提取图像特征,然后使用region proposal network(RPN) 去提取出 region of interest(ROI),然后使用ROI pooling 将这些ROI全部变换成固定尺寸,再喂给全连接层进行Bounding Box回归和分类检测。(这里只做前向传播的简述)
多尺度检测在目标检测中变得越来越重要,尤其是小目标的检测。Feature Pyramid Network(FPN)则是精心设计的多尺度检测办法。
FPN结构中包括自下而上、自上而下、横向连接三个部分,如下图所示。这种结构可以将各个层级的特征进行融合,将强语义信息和强空间信息的特征结合起来
FPN实际上是一种通用架构,可以结合各种架构网络使用(VGG、ResNet等)。Mask RCNN文章中使用了ResNet-FPN网络结构,如下图:
自下而上:传统的特征提取过程。将ResNet作为骨架网络,根据feature map的大小分为5个stage。stage2, stage3, stage4 stage5各自最后一层输出的特征图定义为C2,C3,C4,C5,他们相对于原始图片的stride为{4,8,16,32}。其中stage1没有使用是考虑到内存的原因
自上而下和横向连接
自上而下是从最高层开始进行上采样,这里上采样直接使用的是最邻近上采样,而不是反卷积操作,简单且减少了训练参数。
横向连接则是将上采样的结果和自下而上生成的相同大小的feature map进行融合。
具体操作:C2、C3、C4、C5中每一层经过一个conv1x1操作(1x1卷积用于降低通道数),无激活操作,输出通道全部设置为256,然后和上采样的feature map进行相加和操作。在融合之后在经过3x3的卷积核,对以融合特征进行处理,目的是消除上采样的混叠效应(aliasing effect)。
实际上,上图少绘制一个分支:M5经过步长为2的max pooling下采样得到P6,作者指出使用P6是想要得到更大的anchor尺度512x512。但P6是只用在RPN中来得到region proposal的,并不作为后续的Fast RCNN的输入。
总的来说,ResNet-FPN 作为RPN输入的feature map是[P2,P3,P4,P5,P6],而作为后续Fast RCNN的输入则是[P2,P3,P4,P5]
ResNet-FPN之后产生了特征金字塔[P2,P3,P4,P5,P6],而并非只是一个feature map。特征金字塔[P2,P3,P4,P5]这些特征图经过RPN之后会产生很多的region proposal。那么问题来了,我们应该选择哪个feature map来切出这些ROI区域呢?
实际上,会选择最合适的尺度的feature map来切ROI。具体来说,通过一个公式来决定宽w和高h的ROI从哪个Pk来切:
这里224表示预训练的ImageNet图片的大小,k0表示面积为w*h=224*224的ROI所应该在的层级。作者将k0设置为4,也就是说w*h=224*224的ROI应该从P4中切出来。假设ROI的scale小于224(例112*112),k=k0-1=4-1=3,这就意味着要从更高分辨率的P3中产生。也就是被切的feature map大小希望在28左右。另外,k值会做取整处理,防止结果不是整数。
这样做也合理。大尺度的ROI要从低分辨率的feature map上切,有利于检测大目标,小尺度的ROI要从高分辨率的feature map上切,有利于检测小目标。
mask rcnn中另外的重要改进:ROI Align。
Faster RCNN存在的问题:特征图像是不对准的,所以会影响检测精度。在Mask RCNN中提出的ROIAlign 的方法代替了ROIPooling,前者可以保留大致的空间位置。我们先介绍下两个知识:双线性插值、ROIpooling
线性插值:已知数据(x0,y0)与(x1,y1),要计算[x0,x1]区间内某一位置x在直线上y值,就是按照x距离x0、x1的距离比例作为权重,计算出y值
双线性插值:在两个方向上,以距离的比例作为权重,计算插值。如下图,根据Q12、Q22线性插值出R2,根据Q11、Q21线性插值出R1,然后根据R1、R2线性插值出P。
以例子说明。假设有一个8x8大小的feature map,要在这个feature map上得到ROI,ROI的bbox为[x1,x2,y1,y2]=[0,3,7,8],并且进行ROIpooling到2x2大小的输出。
然后得到结果为
在Faster RCNN中,有两次整数化的过程:
1. region proposal的xywh通常是小数,但是为了方便操作把它整数化。
2. 将整数化后的边界区域平均分成k*k个单元,对每一个单元的边界进行整数化
经过两次整数化,此时候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度,在论文中,作者把它总结为“不匹配问题”(misalignment)
为了解决这个问题,ROI Align方法取消了整数化操作,保留了小数,使用双线性插值的方法获得坐标为浮点数的像素点上的图像数值。
例子:如下图,虚线部分表示feature map,实线表示ROI,这里将ROI切分为2x2的单元格。假定选取采样点数是4,我们首先将每个单元格子分成4个小方格(如红色线所示),每个小方格中心就是采样点,这些采样点的坐标通常是浮点数,所以对采样点像素进行双线性插值(如四个箭头所示),就可以得到该像素点的值了,然后对每个单元格内的4个采样点进行maxpooling,就可以得到最终的ROIAlign的结果
在相关实验中,作者发现将采样点设置为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROIAlign在遍历取样点的数量上没有ROIpooling那么多,但却可以获得更好的性能,这要归功于解决了misalignment的问题。
在RPN之后添加mask任务,得到最终的Mask RCNN。这样做将整个任务简化成milti-stage pipeline,解耦了多个任务的关系
定义多任务损失:其中,Lcls 和 Lbox与 faster rcnn的定义没有区别。需要具体说明的是Lmask。
假设一共有K个类别,mask分支针对每个RoI产生一个K*m*m的输出,即k个分辨率为m*m的二值掩码。依据任务预测类别分支预测的输出,仅将第i个类别的输出登记,用于计算。
我们已知的FCN等实现语义分割,任务模块直接对每个像素进行分类,预测出属于k类中的哪一类,使用的是softmax。最终的到的是图像中目标的分割和分类。
我们可以把这个操作分为两步完成:任务模块1:预测图像中的目标属于哪一类。任务模块2:使用相应类别的提取掩码任务分支,进行图像分割,这样该任务模块中就会有k个掩码提取分支。一个掩码编码了一类输入对象的空间布局。对于预测的二值掩码,我们对每个像素点应用sigmoid函数,整体损失定义为平均二值交叉熵。
引入预测K个输出的机制,允许每个类都生成独立的掩码,避免类间竞争。这样做解耦了掩码和种类的预测。不同FCN的做法,在每个像素点上应用softmax函数,整体采用的多任务交叉熵,这样会导致类间竞争,最终导致分割效果差。
到这里再将Mask R-CNN和FCIS做个比较,首先两者的相同点是均继承了Faster R-CNN的RPN部分。不同点是对于FCIS,预测mask和分类是共享的参数。而Mask R-CNN则是各玩各的,两个任务各自有各自的可训练参数。对于这一点,Mask R-CNN论文里还专门作了比较,显示对于预测mask和分类如果使用共享的特征图对于某些重叠目标可能会出现问题。
为了证明ROI Align方法的普适性,我们构造了多种不同结构的Mask RCNN。具体:用于整个图像上的特征提取的下层卷积网络、用于检测框识别(分类和回归)和掩码预测的上层网络。
两种下层卷积网络:ResNet和ResNet-FPN。论文评估了深度为50和101层的ResNet和ResNeXt网络,使用ResNet的FasterRCNN从第四阶段的最终卷积层提取特征,称之为C4。例:使用ResNet-50的下层网络由ResNet-50-C4表示。论文还讨论了特征金字塔网络,也就是FPN。
两种下层卷积网络由各自对应的上层网络:
上图中,数字表示分辨率和通道数,箭头代表卷积、反卷积、全连接层。所有的卷积都是3*3的(除了输出层为1*1)。反卷积是2*2的,步进为2。
左边的ResNet-C4中,简单起见第一个箭头的操作,使用7*7,stride=1的“res5代替了14*14,stride=2的RoI。ResN的第五阶段。
右图的ResNet-FPN中,“x4”表示堆叠的4个连续的卷积
掩码分支是一个非常简单的结构。也许更复杂的设计有可能提高新能,但这不是这项工作的重点。
训练阶段,
测试:
在测试时,C4下层网络中候选数量为300,FPN为1000,我们在这些候选上执行检测框预测分支,然后执行非极大值抑制。然后将掩码分支应用于评分最高100个检测框。尽管这些训练中使用的并行计算不同,但它可以加速推理并提高精度(使用更少,更准确的ROI)。掩码分支可以预测每个ROI的K个掩码,但是我们只使用第k个掩码,其中k是分类分支预测的类别。然后将m*m浮点数掩码输出的大小调整为ROI大小,并使用阈值0.5将其二值化
面试考点:
论文将Mask RCNN与已有技术进行比较,优于当时的最先进的模型。并进行了综合的消融实验。
有一点像控制变量的感觉。因为作者提出了一种方案,同时改变了多个条件/参数,他在接下去的消融实验中,会一一控制一个条件/参数不变,来看看结果,到底是哪个条件/参数对结果的影响更大
论文在COCO数据集上将MaskRCNN与其他最先进的目标检测方法对比(目标检测结果,即目标边界框AP)。使用ResNet-101-FPN的MaskRCNN优于当时最先进的模型。MaskRCNN超过的增益来自于使用ROIAlign(+1.0 APbb),多任务训练(+0.9 APbb)和 ResNeXt-101(+1.6 APbb)
测试:我们训练一个ResNet-101-FPN模型,在RPN和Mask R-CNN阶段之间共享特征,遵循Faster R-CNN的四阶段训练2。该模型在Nvidia Tesla M40 GPU上处理每个图像需要195ms(加上15毫秒的CPU时间,用于将输出的大小调整到原始分辨率),并且达到了与非共享特征模型相同的掩码AP。我们还指出,ResNet-101-C4变体需要大约400ms,因为它的上层模型比较复杂(图3),所以我们不建议在实践中使用C4变体。
虽然Mask R-CNN很快,但我们注意到,我们的设计并没有针对速度进行优化,13可以实现更好的速度/精度平衡,例如,通过改变图像尺寸和候选数量,这超出了本文的范围。
训练:Mask R-CNN的训练也很快。在COCO trainval35k上使用ResNet-50-FPN进行训练,我们的同步8 GPU实现(每个批次耗时0.72秒,包含16个图像)需要32小时,而ResNet-101-FPN需要44小时。事实上,快速原型可以在不到一天的时间内在训练集上进行训练。我们希望这样快速的训练将会消除这一领域的重大障碍,并鼓励更多的人对这个具有挑战性的课题进行研究。
有任何问题欢迎指正讨论。
参考链接:
https://alvinzhu.xyz/2017/10/07/mask-r-cnn/#fn:34