MaskRCNN-ICCV2017 论文解读

news/2024/7/10 2:52:35 标签: 目标检测, MaskRCNN, RCNN

文章: RCNN.html" title=MaskRCNN>MaskRCNN
作者: Kaiming He, Georgia Gkioxari, Piotr Dollar, Ross Girshick
备注: FAIR, ICCV best paper

核心亮点

1) 提出了一个简单,灵活,通用的实例分割模型框架
RCNN.html" title=MaskRCNN>MaskRCNN 在 FasterRCNN 的基础上进行改进, 在模型的head部分引入了一个新的mask预测分支, 在训练阶段, 该分支会与其他分支并行执行, 在测试阶段, 虽然不是并行执行, 但是利用 NMS 减少了需要计算的候选框个数, 因此 RCNN.html" title=MaskRCNN>MaskRCNN 模型整体增加的额外开销较小.

2) 提出了RoI Align来解决 RoI 与 pooling后的特征图谱之间的不对齐问题
Fast/FasterRCNN 原始的 RoIPool 操作在进行池化时, 会进行两次粗糙的量化操作, 这使得池化后的特征图谱与 RoI 中的信息不能很好的对其, 对于像素级任务实例分割来说, 这种非对齐会使得模型性能大大降低, 因此 RCNN.html" title=MaskRCNN>MaskRCNN 提出用基于双线性插值法的 RoI Align 代替 RoI Pool, 以此来解决非对齐问题.

论文细节

摘要

本文提出了一个简单, 灵活, 通用的目标实例分割框架. 本文的方法可以有效的检测图片中的物体, 同时为每个实例生成一个高质量的掩膜, 我们将其称为 Mask RCNN, 它是从 Faster RCNN扩展而来的, 添加了一个新的分支来并行预测物体掩膜. RCNN.html" title=MaskRCNN>MaskRCNN可以轻易的进行训练, 并且相对于FasterRCNN只增加了很少的开销, 可以在5fps下运行. 不仅如此, RCNN.html" title=MaskRCNN>MaskRCNN可以轻易的泛化到其他任务中, 如人体姿态识别. 本文的模型在COCO的三个系列任务都, 都取得了最好的效果.

背景介绍

本文意在提出一种通用的实例分割模型框架-MarkRCNN, 该模型扩展自FasterRCNN, 在FasterRCNN模型中的每一个RoI上, 添加一个与检测分支平行运行的掩膜预测分支, 如图1所示. 掩膜分支(mask branch) 是一个小型的FCN网络, 它应用在每一个RoI上, 以pixel-to-pixel的方式来预测一个分割掩膜. Mask RCNN易于实现, 且增加的额外开销很小, 并且具有很大的灵活性, 是一个通用的实例分割模型框架. 在FasterRCNN中使用的RoI pooling是一种针对目标检测任务的粗糙的pooling方法, 会造成一定程度上的不对齐结果, 为了克服这一点, 本文提出了RoIAlign, 用于保留准确的空间位置, RoIAlign可以将掩膜的精确度才提高10%~50%. 另外, 本文发现, 将二值掩膜预测和类别预测任务分开独立进行是非常重要的一步, 因此, 我们为每一个类别都会单独进行mask预测, 避免了不同类别之间的冲突. 这一点与FCN不同, FCN会对一个像素点进行多类别的分类.
我们的模型在GPU上的运行速度大约为200ms/frame, 在8-GPU的单机上训练时, 需要1到2天的时间.

RCNN_26">Mask RCNN

Mask RCNN在概念上来说非常简单: FasterRCNN对于每个候选框来说都有两个输出分支, 一个class label和一个bounding-box offset, 对此在RCNN.html" title=MaskRCNN>MaskRCNN中我们添加了第三个分支用于输出掩膜. 虽然这是一个看起来很自然的想法, 但是额外增加的掩膜分支和class, box分支并不相同, 它需要物体更加精确的空间位置. 因此, 我们还引入了一个在RCNN.html" title=MaskRCNN>MaskRCNN中非常关键的元素:RoIAlign, 用于进行像素对其. 来弥补FasterRCNN RoI pooling的粗糙映射造成的位置偏移问题.

Faster RCNN: 简单回顾一下Faster RCNN, 它包含两个阶段, 第一个阶段, 是RPN结构, 用于生成候选框集合. 第二个阶段, 本质上就是一个Fast RCNN, 利用RoI pooling从RoI中提出固定尺寸的特征, 然后进行分类任务和边框回归任务. 这两个阶段使用的特征图谱是共享的, 都来自backbone网络.

Mask RCNN: RCNN.html" title=MaskRCNN>MaskRCNN使用了相同的two-stage结构, 第一阶段使用了相同的RPN网络, 第二阶段, 在执行class分类的box回归任务的 同时(并行), RCNN.html" title=MaskRCNN>MaskRCNN会为每一个RoI生成一个二值掩膜. 这一点与许多现有系统不同, 它们都是在mask预测结果的基础上进行分类任务的. 我们的灵感来自于Fast RCNN中class任务和box任务的并行执行.
Formally, 在训练阶段, 我们在每一个采样的RoI上定义一个multi-task loss如: L = L c l s + L b o x + L m a s k L = L_{cls}+L_{box}+L_{mask} L=Lcls+Lbox+Lmask. 前两个loss和Fast RCNN相同, 第三个分支对于每一个RoI的输出维度为 K m 2 Km^2 Km2, 代表这分辨率 m × m m\times m m×m 下的 K K K 个二值掩膜, 每一个掩膜对应了一个类别(共 K K K 个类别). 为此, 我们使用了 per-pixed sigmoid, 并且将 L m a s k L_{mask} Lmask 定义为平均二值交叉熵. 对于一个与真实类别 k k k 相关联的RoI, L m a s k L_mask Lmask 只在第 k k k 个mask上有定义(其他mask不计入loss).
我们对 L m a s k L_{mask} Lmask 的定义使得网络模型可以为每个class生成mask, 避免了不同类别之间的竞争冲突. 并且利用分类分支的结果标签来选择对应的mask进行计算. 这样做可以使得mask预测任务和class预测任务decouple.(与现有FCNs模型不同).

Mask Representation: 一个mask代表了一个物体的空间布局. 因此, 和 class labels 或者 box offsets 不同(输出维度较小), 提取mask的空间结构时可以通过像素到像素卷积的方式解决.
具体来说, 我们使用一个FCN从每个RoI中预测 m × m m\times m m×m 的mask. 这使得mask分支中的每一层都维护着 m × m m\times m m×m 的物体空间布局矩阵, 而不用将其转换成向量形式(缺少空间信息). 和之前的工作(依赖于fc层预测mask)不同的是, 本文的全卷积表征需要的参数更少, 同时通过实验证明, 更加精确. 这种 pixel to pixel 的机制需要我们的RoI feature能够精确与真实物体对齐, 保持其空间位置和结构信息. 为此, 本文提出了RoIAlign来代替RoiPool.(这个替换很重要)

RoIAlign: RoIPool可以从每个RoI中提取到一个较小的固定的feature map(如, 7×7). RoIPool首先会将浮点型的feature map坐标离散化成输出size对应的整数, 然后根据每个bin内的像素数值进行pooling操作. 但是这种pooling方式会引入RoI与提取后的feature map之间的misalignments, 这种misalignments对于分类任务来说或许影响不大, 但是对于predicting pixel-accurate mask任务来说就会造成很大的负面影响.
为了解决这个问题, 我们提出了RoIAlign层, 移除了RoIPool粗糙的量化计算, 将输出的feature map与输入的RoI对齐. RoIAlign的原理很简单: 避免在RoI边界或者bins上执行任何量化计算(即, 我们使用 x / 16 x/16 x/16, 而不是 [ x / 16 ] [x/16] [x/16]). 我们利用双线性插值法来计算每个位置上具体的像素值, 并且对计算结果整合(max或者average). 具体计算细节如图3所示. 我们注意到, 在不使用任何量化计算以后, 计算结果对于具体的采样点和采样数量的多少都不再那么敏感了.

RoI Pooling存在两次量化过程:

  • 将候选框边界量化为整数坐标值
  • 将量化后的边界区域分割成 k × k k\times k k×k 个bins, 并对每一个单元的边界量化

可以看出, 上面的量化操作是一种很粗糙的Pooling方式, 由于feature map可以看做是对原图特征的高度概括信息, 所以feature map上的细微差别映射回原图时, 往往会导致产生很大的像素位移差. 故此, 提出了RoI Align的解决思路: 取消量化操作, 使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值, 从而将整个特征聚集过程转换为一个连续的操作. 其具体流程如下:

  • 遍历每一个候选区域, 保持浮点数边界不做量化
  • 将候选区域分割成 k × k k\times k k×k 个bins, 每个bins的边界也不做量化
  • 在每个bins中计算固定四个坐标的位置, 使用双线性插值的方法计算出这四个位置的值, 然后进行最大化操作.

Network Architecture: 为了说明本文方法的通用性, 我们利用多个模型结构初始化Mask RCNN. For clarity, we differentiate between: 1) 用于提取整个图片特征的backbone卷积结构, 2) 用于执行bounding-box recognition(cls,reg)任务和 mask prediction 任务的 network head.
我们将backbone architecture 命名为术语: network-depth-features. 我们测试了 50和101层的 ResNet, ResNeXt 网络. 原始的 FasterRCNN 在使用ReNets时, 利用的是第4段卷积块的最后一层卷积层的输出, 我们称为 C4. 这个backbone, 即 ResNet-50-C4 是很多模型中的一个常用的选择.
我们同时还使用了另一个更有效backbone—Feature Pyramid Network(FPN). FasterRCNN和FPN在提取RoI feature的level上有所区别, 但是其余部分基本和ResNet相同. 使用 ResNet-FPN backbone 用于特征提取可以获得极大的性能提升(both acc and speed).
对于 network head, 我们根据之前的工作添加了一个全卷积的mask prediction 分支. Specifically, 我们将基于ResNet和FPN的 FasterRCNN 的 box heads进行扩展, 具体细节如图4所示. ResNet-C4 的 head 包含 ResNet 的第5个卷积块(即 9层的res5, 计算密集型). 对于FPN来说, 它的backbone就已经包含了res5, 因此可以具有效率更高的head(filers更少).
我们注意到本文的mask分支具有一个很简单的结构. 其他更加复杂设计将会在以后的工作的进一步提高模型的性能.

Implementation Details

我们使用Faster RCNN原文提供的超参数.(无需调参也说明了RCNN.html" title=MaskRCNN>MaskRCNN的鲁棒性很高)

Training: 和FastRCNN一样, 如果RoI与真实框的IOU大于0.5, 就会被认为是正样本, 否则认为是负样本(这里与FasterRCNN不同). L m a s k L_{mask} Lmask 只会计算正样本上的掩膜损失. mask target 是 RoI 和 真实mask之间的交集(注意不是直接根据真实mask计算损失). 我们使用 image-cengric (FastRCNN), 图片会被resized成scale(shorter edge) 为800 像素. minibatch为 2 img/GPU, 每个img含有N个sampled RoIs. 正负样本比例为 1:3. 对于 C4 backbone来说, N为 64, 对于FPN来说, N为512.(因为FPN效率更高, 所以可以在一张图片上计算更多的RoIs). 在8PGUs上训练(即有效minibatch为16). lr为0.02, 每120k 迭代(iteration)会缩小10倍. weight decay为0.0001, momentum为0.9. 在使用ResNeXt时, one img/GPU, lr初始为0.02, 其他相同.
FPN的anchor具有 5 scales 和 3 aspect ratios. 为了方便进行消融实验, RPN是被单独训练的, 并且没有与Mask RCNN共享了卷积特征(可共享, 只是为了方便没有共享). 对于本文中的每一项, RPN和RCNN.html" title=MaskRCNN>MaskRCNN都具有相同的backbones.

Inference: 在测试阶段, proposal的数量为300 for C4 backbone, 1000 for FPN. 使用NMS选择了最高score的100个boxes, 对其应用mask branch, 虽然这里没有采用训练时的并行侧率, 但是它可以加速预测速度, 同时能够提高精度(因为只对更少的100个box使用了mask branch, 而训练阶段虽然是并行的, 但是进行mask branch的box更多一些). mask branch 可以对每个RoI预测出 K K K 个maks, 但是我们只会使用第 k k k 个mask来计算损失. 我们会将 m × m m\times m m×m 的浮点类型的mask放缩到RoI的尺寸大小, 然后依据一个阈值(0.5)对mask的像素值进行二值化操作. 由于我们只对100个top score box执行mask branch , 因此在模型预测时, RCNN.html" title=MaskRCNN>MaskRCNN相比于FasterRCNN, 只增加了很小的开销.

Experiments: Instance Segmentation

使用了 COCO 数据集, 采用 AP(averaged over IoU thresholds) 评价标准, AP 50 \text{AP}_{50} AP50, AP 75 \text{AP}_{75} AP75, AP S \text{AP}_{S} APS, AP M \text{AP}_{M} APM, AP L \text{AP}_{L} APL.

如表1所示, MarkRCNN 的性能超过 COCO2015 和 COCO2016的实例分割冠军 MNC 和 FCIS.(并且 RCNN.html" title=MaskRCNN>MaskRCNN 没有使用 multi-scale train/test, horizontal flip test, OHEM 等 trick, 言外之意 RCNN.html" title=MaskRCNN>MaskRCNN 的性能可以进一步利用这些 trick 提高)

Table2 显示了对 RCNN.html" title=MaskRCNN>MaskRCNN 的消融实验分析结果.

Table3 显示了 RCNN.html" title=MaskRCNN>MaskRCNN 与当前的 state of art 的目标检测方法在 COCO 数据集上的表现.

RCNN.html" title=MaskRCNN>MaskRCNN for Human Pose Estimation:

Appendix A: Experiments on Cityscapes

Appendix B: Enhanced Results on COCO

下表显示了 MarkRCNN 被各种 trick 增益后的性能表现


http://www.niftyadmin.cn/n/1016545.html

相关文章

【计算机系统结构】堆栈型替换算法

堆栈型替换算法 定义:对任意一个程序的页地址流作两次主存页面数分配,分别分配 m 个主存页面和 n 个主存页面,并且有 m≤n。如果在任何时刻 t,主存页面数集合 Bt 都满足关系: Bt(m) Bt&#xff…

【计算机系统结构】流水机器对全局性相关处理

全局性相关的处理 • 定义:已进入流水线的转移指令(尤其是条件转移指令)和其 后续指令之间的相关。 • 处理方法: • 猜测法 • 加快和提前形成条件码 • 采用延迟转移------采用软件进行静态指令调度 • 加快短循环程序的处理…

Speed Accuracy TradeOffs (CVPR, 2017)

文章: Speed/accuracy trade-offs for modern convolutional object detectors 作者: Jonathan Huang, Vivek Rathod, Chen Sun, Menglong Zhu, Anoop Korattikara, Alireza Fathi, Ian Fischer, Zbigniew Wojna, Yang Song, Sergio Guadarrama, Kevin Murphy 备注: Google 核…

【计算机系统结构】堆栈、累加、通用寄存器型机器对比

第二章 计算机指令集结构设计 2.1 名词解释 堆栈型机器——CPU中存储操作数的单元是堆栈的机器。累加型机器——CPU中存储操作数的单元是累加器的机器。通用寄存器型机器——CPU中存储操作数的单元是通用寄存器的机器。CISC——复杂指令集计算机。RISC——精简指令集计算机…

【计算机系统结构】第一章

1.1 计算机系统的层次结构 从使用语言的角度,一台由软、硬件组成的通用计算机系统可以被看成是按功能划分的多层机器级组成的层次结构。具体的计算机系统,其层次数的多少可以有所不同。 说明: M0用硬件实现,M1用微程序(固件)实现…

【转】学术论文写作方法

论文对于硕士,尤其博士,是必须的一种技能,也是一道难关。所谓大道无形,小道可走。下面给出一些博士期间的写作心得,希望能有所裨益。论文可以有三个境界:毕业、科研、贡献。 现在只说第一个,为…

写论文经常用到的网站、工具、技巧汇总【持续更新】

学习需要,非商业转载,如有侵权请及时联系,立删,十分抱歉 工具汇总一-论文资料获取: 获取全文利器:Sci-Hub: removing barriers in the way of science【这个网址经常会变,能科学上网的可以直接…

用Numpy实现一个简单的神经网络

本示例来自于PyTorch的官网上的一个warm-up小示例, 觉得很有代表性, 所有这里单独记录一下. 对于numpy来说, 它对计算图, 深度学习, 梯度等等概念几乎是不知道的, 但是, 如果我们了解简单神经网络的具体结构, 那么我们就可以很轻易的用numpy来实现这个简单网络, 对此, 我们通常…