3、Mask R-CNN
(1)Mask R-CNN:
Mask R-CNN采取和Faster R-CNN一样的两阶段结构,第一个阶段是同样的RPN。在第二个阶段,除了预测分类和box offset的两个平行结构之外,增加了第三个平行结构:对于ROIAlign之后的结构,每个分辨率输出一个mask。(这和其他的一些系统不同,他们的分类预测依赖于mask的结果,而在这里,这两个是独立的,互不影响)
Loss函数:L = Lcls + Lbox + Lmask,其中Lcls和Lbox与faster r-cnn中的一样。而mask分支的维度是km2(对于每一个ROIAlign的结果,分辨率是:m*m,共有k个类别)。对于每一个像素分别使用sigmoid函数,而且Lmask是使用平均交叉熵(在所有的像素上求平均)。其中,在每一个像素上,如果某个mask对应于某个ground_truth class k,那么就把Lmask定义在第k个mask上(其他的mask上不计算loss)。
我们定义的Lmask允许网络在每一个类上都能够产生mask,而不用进行类间竞争。我们用一个专门的分类分支来预测类别标签,并用这个标签来选择输出的mask。这样就解耦了mask和分类预测。这和FCNs不同,FCN在每个像素上使用softmax和多项交叉熵损失,这样会导致类间竞争。
(2)Mask Representation
对于每一个ROI,我们使用FCN去预测一个m*m的mask。这可以让mask分支的每一层都能够包含详细的m*m的空间布局信息。
(3) ROIAlign
① 先介绍ROIPool:ROIPool是一个标准操作,这个操作是为了从每一个ROI中提取一个小的feture map(e.g. 7*7)。ROIPool经过两个量化过程:
ⅰ)将ROI的坐标值(一般是小数)量化到特征图中(取整),量化的方法:除以stride就可以了,比如:[x/16]。
ⅱ) 将在特征图中得到的结果细分成K*K的格子(例如,7*7),当然,如果结果为小数,也进行取整操作,然后在每一个格子中进行最大池化操作。
可以看出,ROIPool两次的量化过程都进行了取整,这样必然会造成ROI和提取的特征出现偏差。虽然这种做法可能对分类的影响不大,因为这仅仅会造成一些小的平移,但是对于像素层面的mask来说,会造成很大的影响。(ps:ROIPool的做法还是很简单粗暴的。)
② 为了解决这个问题,我们提出了ROIAlign层,并去掉了粗糙的ROIPool,以便可以准确的调整提取的特征。我们提出的方法很简单:我们避免对于ROI边界和格子的量化操作(实际上是:取整操作)。例如,我们用x/16来代替[x/16]。
然后,我们在ROI分隔成的每个格子中进行如下操作:
ⅰ)将每个格子平均分成4份,并取得每份的中心点
ⅱ)对每个格子取得的4个中心点进行双线性插值
ⅲ)将每个格子中得到的4个插值结果进行池化操作(取最大值或者平均值)
另外, 我们得出了如下结论:只要我们没有进行取整操作,那么最终的结果对将每个格子分成几份并不敏感(我们这里是分成的4份,其实如果只分成1份,结果影响也不大),也对在每一份中所取的点的位置不敏感(我们这里取的是中心点)。
(4) Network Architecture
主网络: ResNet-50-C4,即使用 ResNet-50 的 con4_x 层来提取特征,然后将结果分成两个方向:RPN 和 ROIAlign。然后 ROIAlign 接 con5_x, 我们知道ResNet-50 的 con5_x 层的输出结果为: 7 *7 * 2048。接下来, 把 7 *7 * 2048的结果接两个平行的head: 一个是fast r-cnn,另一个是mask分支(两个卷积层,输出的维度分别为:14 *14 * 256 和 14 *14 * 80)。
(5) Training
① 如果某个ROI和ground_truth box 的 IOU 大于0.5, 则被认为是positive, 如果小于0.5, 则被认为是negative。
只定义在positive的ROIs上。
mask target : ROI 和 它对应的 ground_truth mask 的IOU
② 对于图片,首先进行中心化,然后缩放到800个像素。每一个mini-batch包含2张图片,每张图片有N个ROIs, 其中 N/4 个positives,3*N/4 个negatives。 对于ResNet-50-C4来说,N为64; 对于FPN网络来说,N为512。(这个设置和faster r-cnn中是一样的)
在8个GPU上训练160k代, 学习率0.2, 并且在120k代的时候缩小10倍。weight decay:0.0001, momentum:0.9。
③ 对于RPN anchor 来说, 有5种 scales 和3种 aspect ratios(也就是说有15种anchor)。
For convenient ablation,RPN 和 Mask R-CNN单独训练,不共享参数。
For every entry in this paper,RPN 和 Mask R-CNN有相同的主体网络,因此它们的参数是共享的。
⑹ Inference
测试的时候, 在 C4 backbone 的结果中选取300个proposals(对于FPN网络来说,选取1000个)。对于选取的300个proposals, 执行 box prediction branch(ps: 个人认为是,分类预测和 box offset 分支,即,fast r-cnn 分支),紧接着,根据分类的得分,执行NMS操作(和faster r-cnn的流程是一样的)。
然后,在得到的100个得分最高的 detection boxes 上执行mask分支。 虽然, 这和在训练中平行进行不同,但是这样可以加快 inference 的速度,并且可以提高准确率。
mask branch可以在每个ROI上预测 K 个 mask,但是我们只使用第 K 个 mask,其中 K 是分类branch预测得到的类别。然后将得到的 m * m 大小的mask resize到ROI的size,and binarized at a threshold at 0.5。
网友评论