Mask R-CNN

Mask R-CNN是何凯明大神最近的新作。Mask R-CNN是一种在有效检测目标的同时输出高质量的实例分割mask。是对faster r-cnn的扩展,与bbox识别并行的增加一个预测分割mask的分支。Mask R-CNN 可以应用到人体姿势识别。并且在实例分割、目标检测、人体关键点检测三个任务都取得了现在最好的效果。

效果图

上图是Mask R-CNN的框架。是对faster r-cnn的扩展,与bbox识别并行的增加一个预测每一个ROI的分割mask的分支。mask分支是应用到每一个ROI上的一个小的FCN(Fully Convolutional Network),以pix2pix的方式预测分割mask。

如何正确的设计mask分支是结果好坏的关键。主要的要点有以下几点:

1、最重要的一点是Faster R-CNN没有设计网络输入与输出的pixel to pixel的对齐机制。特别明显的是ROIpooling对特征提取执行非常粗糙的空间量化(空间量化指什么还没搞懂)。为了改进未对齐的缺点,本文提出了quantization-free layer叫作RoIAlign,它准确的保存空间位置。尽管是很小的变化,但是作用很明显。提高相对mask准确率10%~50%。

2、非常必要的对mask和class prediction 去耦合。本文对每个类别独立的预测一个二值mask,不依赖分类分支的预测结果。

整个算法的细节如下:

Loss fuction

多任务损失函数对于每一个ROI,L=L_cls+L_box+L_mask.其中L_cls和L_box与Faster R-CNN一样。mask分支对每一个ROI有Km^2维输出。表示分辨率为m*m的K个二值mask。K是类别数,每一类一个。对每个像素实行一个sigmoid,定义L_mask是平均二值cross-entropy loss。对于一个ROI的ground truth 是第k类,L_mask只定义在第k个mask上(其他mask输出对于损失没有贡献)。

Mask Representation

mask覆盖输入目标的空间位置,所以不能像类标和bbox一样通过全连接层坍塌到很短的向量。提取空间结构很自然的想到利用卷积的pixel to pixel 对应的特性。

具体的对每一个ROI预测一个mm大小的mask用FCN。这能保证mask 分支的每一层都明确的保持mm目标的空间布局,不会坍塌成缺少空间维度的向量。与前人工作使用全连接层预测mask相比,本文的FCN需要更少的参数,得到更好的效果 。pixel to pixel 的任务需要ROI特征与原始输入图像有很好对齐来保持每个像素的空间对应。这就是提出RoIAlign层的动机。

RolAlign

ROIpool是对ROI提取小的特征映射(e.g. 7*7)标准的操作符。 量化导致了ROI和特征层的不对齐。这对分类任务没什么影响,但是对pixel to pixel的任务就有很大的负面影响。

为了解决这个问题,本文提出了RoIAlign层,移除ROIPool粗糙的量化,正确的对齐特征和输入。提出的改变非常简单:避免任何ROI边界或者bins的量化,即用x/16代替[x/16]。用双向性插值法输入特征在每个ROI bin的四个采样点的精确值。(这一段不能理解说的什么意思)。

Network Architecture

将整个网络分成两部分,1)卷积主干结构用来提取整幅图像的特征。2)网络头用来对ROI进行bbox识别和mask预测。

分别考察50层和101层Resnet和ResNeXt网络作为卷积主干结构。还探索另一种有效的主干结构,叫作FPN( Feature Pyramid Network)。更多关于FPN的结构细节请参考文章(T.-Y. Lin, P. Dollar, R. Girshick, K. He, B. Hariharan, and´S. Belongie. Feature pyramid networks for object detection.)

网络头结构如下图:

网络头结构

Implementation Details

Training

和Faster R-CNN一样,IOU超过0.5的ROI被视为正例反之视为负例。mask loss只在正例上定义。mask target 是ROI和GT mask的交集。图像被resize到短边800。每个mini-batch 2幅图像,每幅图像采样N个ROI,正负样本比例1:3。N是64对于Resnet主干,512对于FPN主干。

160k iterations, with a learning rate of 0.02 which is decreased by 10 at the 120k iteration. We use a weight decay of 0.0001 and a momentum of 0.9. RPN anchors span 5 scales and 3 aspect ratios, following [21].

Inference

At test time, the number of proposals is 300 for the C4 backbone (as in [28]) and 1000 for FPN (as in [21]).

先在proposals上进行box识别,然后进行非最大值抑制。mask预测在得分最高的100个box上进行。mask分支对每个ROI预测K个mask,但是只取第k个,k是classification分支输出结果。

m*m的mask resize到ROI的大小,然后以阈值0.5二值化。

Experiments:Instance Segmentation

所有的实验采用Coco数据集。

Instance segmentation mask AP on COCO test-dev

MNC [7] and FCIS [20] are the winners of the COCO 2015 and 2016 segmentation challenges, respectively. Without bells and whistles, Mask R-CNN outperforms the more complex FCIS+++, which includesmulti-scale train/test, horizontal flip test, and OHEM [29]. All entries are single-model results.

Ablation Experiments

Paste_Image.png

(a)说明网络越深越好(并不是所有都对),FPN和ResneXt对结果有提升。 (b)说明对分类和mask去耦合效果好。 (c)和(d)说明对齐效果好。 (e)mask分支说明用FCN效果比MLP好。

Bounding Box Detection Results

Object detection single-model results (bounding box AP), vs. state-of-the-art on test-dev.

主意第五行和第六行对比说明加入mask分支对检测任务也有提升效果。

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏alexqdjay

HashMap 多线程下死循环分析及JDK8修复

1.1K4
来自专栏刘君君

JDK8的HashMap源码学习笔记

3068
来自专栏xingoo, 一个梦想做发明家的程序员

20120918-向量实现《数据结构与算法分析》

#include <iostream> #include <list> #include <string> #include <vector> #include...

1736
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

19210
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3477
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4519
来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

672
来自专栏赵俊的Java专栏

从源码上分析 ArrayList

1181
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

462
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

1772

扫码关注云+社区