【CV论文笔记】Mask R-CNN之RoIAlign理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【CV论文笔记】Mask R-CNN之RoIAlign理解相关的知识,希望对你有一定的参考价值。

参考技术A

本文主要用于介绍Kaiming He, rbg等大神于2017年提出的Mask R-CNN网络,该网络架构是在其前作Fast R-CNN上的升级改进版可以用于实例分割。本笔记主要为自我温习回顾,以备后用。

论文链接: https://arxiv.org/pdf/1703.06870.pdf
github主页: https://github.com/facebookresearch/Detectron
rbg大神个人主页: http://www.rossgirshick.info/#girshick2014rcnn
恺明大神的演讲视频: https://www.youtube.com/watch?v=g7z4mkfRjI4&t=601s

为更好的理解该论文,建议先行阅读Faster R-CNN网络的相关论文,这里也附上本菇之前写的1篇论文笔记供大家参考~
Faster R-CNN理解

基本目录如下:

------------------第一菇 - 摘要------------------

我们从概念上提出了一种简单,易变和通用的框架用于目标实例分割。我们的方法能够高效的在一张图片中检测出物体同时对于该物体生成高质量的分割蒙版(segmentation mask),我们称此方法为,“Mask R-CNN”,其本质也是由Faster R-CNN衍化而来的,就是在Faster R-CNN后面多加了一个分支用于预测目标的蒙版,跟预测目标的识别和位置的分支是平行的。Mask R-CNN也易于去训练,仅仅只比Faster R-CNN慢一点,运行效率达到5fps。另外,Mask R-CNN也能够十分简单的被转移去训练其他的任务,比如去预测人体的姿态关键点。我们在COCO数据集上运用该模型训练了多个任务,包括实例分割,目标框预测和人体关键点检测,均取得不错的成绩。我们希望Mask R-CNN能够成为业界新的标杆,并能被广泛运用于新领域的研究。

------------------第二菇 - 核心思想------------------

整体架构十分容易理解,就是在RPN之后新添了一个分支用于预测mask的。网上其他的讲解资料也很多,这里我只记录一下Mask R-CNN中的重点,RoIAlign。不过我们还是先来温习一下,什么是RoIPool的实现原理。

为了搞明白原理,我们先问一个问题,为什么需要RoIPool?
原因就是经过RPN生成的候选区域大小不一样,无法直接连接全连接层进行后续的分类及定位处理,因此需要RoIPool层将其转为固定维度大小的特征。当然这是很明确的一个原因,不过还有一个潜在的原因可以理解为特征的二次提取。因为在RPN中,特征只被共享卷积层提取过一次,而为了提升后续的定位及分类准确率,对于每一个候选区域进一步提取特征也是符合逻辑的,贴一张示意图,方便理解,

原理很简单,我们再来看具体的细节处理,会产生的像素偏差。

第一个就是从输入图上的RoI到特征图上的RoI Feature,

假如现在我们输入了一张 的图像,图像中有2个目标(狗和猫),其中狗的识别框为 ,经过VGG16网络后,图像得到对应的feature map为 (5次池化操作),而对应的狗的识别框就变为 了,因此这里就会有一个误差,于是这里就有了第一个量化操作,即取整,使其结果变为 ,如下所示(右图中未能重叠的部分就是误差了~)

第二个误差就是将每个特征转化为固定大小维度的时候所产生的。比如现在要将 的特征映射到 上,对应的大小就是 了,因此同上这里又会有一个误差,于是就有了第二个量化操作,也是取整。即原先由 大小生成的值,现在只由 的大小生成了~虽然看起来这是一个很小很小的误差,但是要知道,这时候我们的感受野已经是32倍了,相当于原图 的像素差了~

这里也贴一张网上流行的RoIPool的示意图,帮助理解,

因此以上两种取整的量化操作,对于分类问题来说可能影响不大,但是对于实例分割这种像素级别的,细微的像素误差可能就会导致最终结果的崩坏。因此,本文才会提出了RoIAlign,其主要目的就是为了消除这种误差的。

简单来讲,RoIAlign的作用就是用双线性插值的办法取代了之前的取整操作,从而使得每个RoI取得的特征能更好的对齐原图上的RoI区域。具体来讲,双线性插值是一种比较理想的图像缩放算法,他通过拟合一个虚拟的点(该点的值由其周围4个确定点的像素值决定),从而将那些浮点数的点的值给表达出来,如下图所示,

作者同时也强调了一件事情,即,

We note that the results are not sensitive to the exact sampling locations, or how many points are sampled, as long as no quantization is performed.

也就是说该方法对采样点的个数和位置并不是十分敏感在意的~而且采用了这种方法以后,准确率有了很大的提升~!

至此,整一个新的RoIAlign层的作用及原理算是讲明白了。

剩下的网络架构类的,实现细节等不再多记录了。

------------------第三菇 - 总结------------------

本文主要是记录了Mask R-CNN中的一个创新难点,ROIAlign的作用及实现方法,其他有关Mask R-CNN的相信不难理解。

参考文献:
【1】 https://blog.csdn.net/jiongnima/article/details/79094159

前沿 何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现

导读

何恺明大神的论文Mask R-CNN 获得ICCV最佳论文 ,而关于这篇论文的TensorFlow\Pytorch\Keras实现相继开源出来,让我们来看下。

摘要

我们提出了一个概念上简单、灵活和通用的用于目标实例分割(object instance segmentation)的框架。我们的方法能够有效地检测图像中的目标,同时还能为每个实例生成一个高质量的分割掩码(segmentation mask)。这个方面被称为 Mask R-CNN,是在 Faster R-CNN 上的扩展——在其已有的用于边界框识别的分支上添加了一个并行的用于预测目标掩码的分支。Mask R-CNN 的训练很简单,仅比 Faster R-CNN 多一点计算开销,运行速度为 5 fps。此外,Mask R-CNN 可以很容易泛化到其它任务,比如,让我们可以在同一个框架中估计人类的姿态。我们在 COCO 难题套件的所有 3 种任务(track)上都得到了最佳结果,其中包括实例分割、边界框目标检测和人物关键点检测(person keypoint detection)。没有使用其它的技巧,Mask R-CNN 的表现超越了在每个任务上所有已有的单个模型,包括 COCO 2016 挑战赛的获胜模型。我们希望我们的简单又有效的方法能成为一个坚实的基础,能帮助简化实例层面识别的未来研究。我们将会公开相关代码。

Mask_RCNN Keras

这是一个在Python 3,Keras和TensorFlow基础上的对Mask R-CNN的实现。这个模型为图像中的每个对象实例生成边界框和分割掩码。它是在 Feature Pyramid Network (FPN) 和 ResNet101基础上实现的.

【前沿】 何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现


这个项目包括包括: - 在FPN和ResNet101基础上构建的Mask R-CNN的源代码。 - MS COCO的训练代码 - 预训练的MS COCO 权重 - 使用Jupyter notebooks 来可视化检测过程的每一个步骤 - 用于多GPU训练的ParallelModel类 - MS COCO指标评估(AP) - 用于训练你自己数据集的例子

代码被整理和设计的很容易被扩展。 如果在你的研究中使用了这份代码,请考虑引用此项目。 如果您从事3D视觉的相关研究,你可能会发现我们最近发布的Matterport3D数据集同样很有用


开始

  • demo.ipynb 最简单的事从这里开始. 这里演示了怎么用一个MS COCO预训练的模型来分割你的图片。里面包含了对任意图片进行目标检测和实体分割的代码。

  • train_shapes.ipynb  演示怎么在你自己的数据集上训练Mask R-CNN。这个notebook通过一个简单的模拟数据来展示怎么用在新的数据集上。

  • (model.py, utils.py, config.py): 这几个文件是Mask RCNN 的主要实现部分

  • inspect_data.ipynb. 这个notebook对几个不同的数据处理步棸进行可视化。

  • inspect_model.ipynb  这个notebook深入代码演示物体检测和分割过程,还提供了对每一步的可视化。

  • inspect_weights.ipynb 这个notebook用来观察训练模型的权重以及检查一些特例。


一步一步的检测

为了方便理解和调试模型,我们提供了三个notebook (inspect_data.ipynb, inspect_model.ipynb, inspect_weights.ipynb),包含实验的可视化过程,还可以让你一步一步的观察每个点的输出过程。下面是一些例子。

1. 锚点排序和过滤

第一步候选区域(Region Proposal)网络的可视化以及沿着anchor box refinement 的正锚点和负锚点。

2. boundingbox 精简

这是一个最终的检测区域(虚线)以及改善后的结果(实线)例子。

3. 掩码生成

生成的掩码例子。这些掩码随后会被缩放放置在图片的合适区域。

4. 每一层激活值的可视化

通常观察不同层激活对于解决检测中遇到的一些问题很有帮助。(全零值,或者随机噪声)

5. 权重直方图

另外一个调试技巧就是观察权重的直方图。这里是inspect_weights.ipynb notebook.给出的演示效果。

6.TensorBoard 可视化

还有一个非常重要的调试和可视化工具是TensorBoard. 这个模型被配置为记录loss值的变化,并在每个epoch后保存权值。

7. 组合得到最终结果

在MS COCO上训练

我们提供预训练的权值让你更简单的上手。 你还可以用这些权重为七点训练自己的模型。训练和验证的代码在coco.py中。你可以在notebook中引入这个模块或者直接从命令行运行。

Train a new model starting from pre-trained COCO weights python3 coco.py train --dataset=/path/to/coco/ --model=coco

Train a new model starting from ImageNet weights python3 coco.py train --dataset=/path/to/coco/ --model=imagenet

Continue training a model that you had trained earlier python3 coco.py train --dataset=/path/to/coco/ --model=/path/to/weights.h5

Continue training the last model you trained. This will find the last trained weights in the model directory. python3 coco.py train --dataset=/path/to/coco/ --model=last

你也可以像这样运行COCO的验证代码:

训练优化方法,学习率以及其他参数都是在coco.py 中设置。

Python安装依赖包

• Python 3.4+ • TensorFlow 1.3+ • Keras 2.0.8+ • Jupyter Notebook • Numpy, skimage, scipy, Pillow

MS COCO 要求:

为了训练MS COCO,你需要以下:

  • pycocotools (installation instructions below)

  • MS COCO Dataset

  • Download the 5K minival and the 35K validation-minus-minival subsets. More details in the original Faster R-CNN implementation. 如果你使用Docker,代码已经在 Docker container中验证通过。


安装

  • Clone this repository

  • Download pre-trained COCO weights (mask_rcnn_coco.h5) from the releases page.

  • (可选) To train or test on MS COCO install pycocotools from one of these repos. They are forks of the original pycocotools with fixes for Python3 and Windows (the official repo doesn't seem to be active anymore).

  • Linux: https://github.com/waleedka/coco

  • Windows: https://github.com/philferriere/cocoapi. You must have the Visual C++ 2015 build tools on your path (see the repo for additional details)


更多例子

  1. Keras [https://github.com/matterport/Mask_RCNN\]

  2. TensorFlow [https://github.com/CharlesShang/FastMaskRCNN]

  3. Pytorch [https://github.com/felixgwu/mask_rcnn_pytorch\]

  4. caffe [https://github.com/jasjeetIM/Mask-RCNN]

  5. MXNet [https://github.com/TuSimple/mx-maskrcnn]





专知荟萃知识资料全集获取,请查看:












请扫描小助手,加入专知人工智能群,交流分享~


【前沿】 何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现

获取更多关于机器学习以及人工智能知识资料,请访问www.zhuanzhi.ai,  或者点击阅读原文,即可得到!

-END-

欢迎使用专知

专知,一个新的认知方式!目前聚焦在人工智能领域为AI从业者提供专业可信的知识分发服务, 包括主题定制、主题链路、搜索发现等服务,帮你又好又快找到所需知识。


使用方法>>访问www.zhuanzhi.ai, 或点击文章下方“阅读原文”即可访问专知


中国科学院自动化研究所专知团队

@2017 专知

专 · 知


点击“阅读原文”,使用专知!


以上是关于【CV论文笔记】Mask R-CNN之RoIAlign理解的主要内容,如果未能解决你的问题,请参考以下文章

CVPR2019 | Mask Scoring R-CNN 论文解读

目标检测论文解读11——Mask R-CNN

何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现

前沿 何恺明大神ICCV2017最佳论文Mask R-CNN的Keras/TensorFlow/Pytorch 代码实现

Mask R-CNN

R-CNN论文翻译——用于精确物体定位和语义分割的丰富特征层次结构