Mask R-CNN

论文Mask R-CNN(ICCV 2017, Kaiming He,Georgia Gkioxari,Piotr Dollár,Ross Girshick, arXiv:1703.06870)
这篇论文提出了一个概念简单,灵活,通用的目标实例分割框架,能够同时检测目标并进行实例分割.在原Faster R-CNN基础上添加了object mask分支与原目标检测任务分支并列.速度大约5 fps.另外,Mask R-CNN也很容易扩展到其它的任务,比如人体姿态评估.

原Faster R-CNN输出两类值:class label和bounding-box offset.Mask R-CNN加入一路object mask分支输出.object mask要求比前两个具有更精细的空间布局特征.mask分支作用于Fast R-CNN,而RPN保持不变.
多任务损失定义为: L = Lcls+ Lbox+ Lmask.
Lcls+ Lbox保持不变,mask分支输出K个二值mask矩阵(每个像素经过sigmoid,限制到(0,1)区间,使用阈值0.5二值化),Lmask定义为平均交叉熵损失(average binary cross-entropy loss).这种Lmask定义方式与FCN等语义分割网络的损失定义有所不同.FCN使用per-pixel softmax 和 multinomial cross-entropy loss,会在类间产生竞争.

与FCN一样,采用转置卷积产生和原图中ROI大小相同的mask图.由于是像素到像素的映射,所以原来的fc层的特征向量的形式不能够被使用,并且RoIPool层缺失一些特征空间对应关系.因此作者提出了RoIPool层的改进版RoIAlign层.

RoIAlign

RoIPooling将大小不同的RoI对应的特征图划分为7×7的bins,每个bin采用max pooling,这样每个RoI都得到了相同尺度的特征.由于RoI对应到特征图上的区域时对坐标值做除法并取整([x/16]),并且划分7x7网格时也有除法操作.如果不能整除,带来不对齐的问题. 比如由于量化操作将2.4量化为2,那么这0.4的偏差放大到输入原图大小, 如放大32倍,那么偏差变为12.8像素. 偏差较大,对小目标的检测不利.
论文提出的RoIAlign避免了对RoI边界的处理,采用了双线性差值(采用Spatial transformer networks中的方法)计算每个RoI bin中若干个采样点(相比于RoIPooling,这里的采样点是浮点型)的特征值. 浮点型的采样点像素值的计算通过与该点最近邻的四个整数点的像素值差值得到.距离越近的值贡献越高,如下图所示:

线性差值与双线性差值

线性差值: 已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的 y 值:

\[
\begin{equation}
\frac{y - y_0}{x - x_0} = \frac{y_1 - y_0}{x_1 - x_0} \\
y = \frac{x_1 - x}{x_1 - x_0}y_0 +\frac{x - x_0}{x_1 - x_0}y_1
\end{equation}
\]

双线性插值: 相继在x和y两个方向上做线性差值. 如下图所示, 先在x方向上插值得到R1, R2, 再由R1, R2在y方向上插值得到点P的结果:

如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

\({\displaystyle f(x,y)\approx f(0,0)\,(1-x)(1-y)+f(1,0)\,x(1-y)+f(0,1)\,(1-x)y+f(1,1)xy}\)

实验结果也表明RoIAlign可以提高COCO数据集上的准确率,而在VOC上提升不明显,而COCO包含较多的小目标. 因此 RoIAlign 在COCO数据集上的提升比较明显,见下表:

作者与之前采用的RoIWarp方法(Instance-aware semantic segmen-
tation via multi-task network cascades. CVPR2016)做了对比.
RoIWarp是在RoIPool基础上用双线性差值,与RoIPool同样存在不对齐的问题,与RoIAlign的结果对比表明align在其中起到关键作用.

ROI Align 反向传播:

反向传播: ROI Pooling与max pooling类似,只在选择的点上进行梯度回传.

\[
\frac{\partial L}{\partial x_i}=\sum_r\sum_j [i=i^*(r,j)]\frac{\partial L}{\partial y_{rj}}
\]

\(x_i\) 代表池化前特征图上的像素点; \(y_{rj}\) 代表池化后的第r个候选区域的第j个点; \(i^*(r,j)\) 代表点 \(y_{rj}\) 像素值的来源.

ROI Align 中特征图上的像素点 \(i^*(r,j)\)被选择作为池化结果的计算时用到了相邻的若干个点(论文取4个点),因此梯度反向传播如下:

\[
{\partial L\over \partial x_i}=\sum_r\sum_j [d(i,i^*(r,j))<1](1-\Delta h)(1-\Delta w){\partial L\over \partial y_{rj}}
\]

Inference测试阶段

测试时只计算top-100的目标框对应的mask,每个目标框对应K个类别的mask.将目标框的分类类别(置信度最大的)对应的mask作为最终的结果. mask分支仅加重了原网络~20%的计算量.

在COCO数据集上的检测结果对比:

可以看出,仅替换RoIPool就在FPN的结果上提高了1%,使用Mask分支后又提高了约1%,加入Mask分支使检测任务的结果得以提升的原因可能是因为分割任务的训练使特征提取更好,毕竟数据集标签中多了mask这种更加详细的像素类别信息.

应用分析

制作mask标记可能比较费时费力,如果不需要实例分割功能的话,我们可以不使用mask分支,仅使用其提出的RoIAlign方法对原网络进行提升.

参考:

目标检测网络之 Mask R-CNN的更多相关文章

  1. 目标检测网络之 R-FCN

    R-FCN 原理 R-FCN作者指出在图片分类网络中具有平移不变性(translation invariance),而目标在图片中的位置也并不影响分类结果;但是检测网络对目标的位置比较敏感.因此Fas ...

  2. 目标检测网络之 YOLOv2

    YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体. 每个格子预测B个bounding b ...

  3. 目标检测网络之 YOLOv3

    本文逐步介绍YOLO v1~v3的设计历程. YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这 ...

  4. 使用Caffe完成图像目标检测 和 caffe 全卷积网络

    一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...

  5. CVPR2020:三维实例分割与目标检测

    CVPR2020:三维实例分割与目标检测 Joint 3D Instance Segmentation and Object Detection for Autonomous Driving 论文地址 ...

  6. 目标检测之R-CNN系列

    Object Detection,在给定的图像中,找到目标图像的位置,并标注出来. 或者是,图像中有那些目标,目标的位置在那.这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫. ...

  7. AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

  8. 目标检测-Faster R-CNN

    [目标检测]Faster RCNN算法详解 Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with r ...

  9. 深度学习笔记之目标检测算法系列(包括RCNN、Fast RCNN、Faster RCNN和SSD)

    不多说,直接上干货! 本文一系列目标检测算法:RCNN, Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码. •   RCNN RCN ...

随机推荐

  1. Docker环境编译时的错误记录

    1)报错一docker-compose -f compose/app.yaml -f compose/backend.yaml -f compose/proxy.yaml build peatio b ...

  2. python基础学习笔记(十二)

    模块 前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用: >>> import math >>> math.sin(0) #sin为正弦函数 ...

  3. Web系统页面打印技术实现与分析

    1 Web页面打印概述应用WEB化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于WEB的应用,客户端的规则很简单,容易学习,容易维护,容易发布.在WEB系统中,打印的确是个烦人的问题 ...

  4. 趟坑:使用pip安装TensorFlow

    这几天在安装TensorFlow,看了很多教程,方法也试了几种. 最后还是用pip安装成功的,过程如下. 1.安装ubuntu后在  系统设置-软件与更新-附加驱动 里,更新N卡驱动. (N卡官网下载 ...

  5. Android Studio中的Gradle是干什么的

    作者:ghui链接:https://www.zhihu.com/question/30432152/answer/48239946来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  6. 去掉UITabBar和NavigationBar上的黑线

    在UITabBarViewController界面设置 self.tabBar.barStyle = UIBarStyleBlack; 在NavigationController界面设置 self.n ...

  7. C#改变图片大小

    今天一女同事要做一个改变图片大小的功能,然后我就手写了几行代码,以后可能用得上 byte[] buffer = new byte[1]; //Byte转为Image对象 MemoryStream ms ...

  8. MYSQL使用中字符编码一坑

    AJAX提交的字符出错,还以为是AJAX配置的错误呢!幸亏检查了一下MYSQL连接的字符集,发现开发库与本地库配置的字符集是也不一样的.

  9. Java 线程内 递归 Bug 一例

    一个线程的run方法里使用递归方法,出了Bug. private boolean ispass(String creationId){ List<Map> maps =creationSe ...

  10. MES架构

    FlexWeaver作为速威公司全新一代MES的技术平台,提供MES所需的全系列平台服务,针对工业大数据提供分布式计算环境.统一数据库引擎.大数据及云计算支撑等等. ● 同时适应企业内网服务器及云部署 ...