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. bootstrap完善按钮组bug

    .btn.active { border: 1px solid #ff9400 !important; color: #ff9400 !important; } <div class=" ...

  2. C. Banh-mi

    链接 [http://codeforces.com/contest/1062/problem/C] 题意 给你有n个字符(0 or 1)的串,当去某个位置时所有的剩下的位置都加上这个位置的数字,q次查 ...

  3. 个人阅读作业2:结合《No Silver Bullet》谈谈我在软件开发过程的遇到的困难与体会

    英文捉急,只能挑一段看得比较懂的,而且正好和我们现在编程任务联系比较紧密的内容来谈一谈体会. 在<No Silver Bullet>中,作者描述了造成软件本质性困难(essence)的四个 ...

  4. 《Linux内核设计与实现》读书笔记 4 进程调度

    第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的 ...

  5. Oracle系列(三): 情景查询一 a表中有个fid字段,逗号分隔开来,b表中有id字段及其他信息,如何关联a表的fid和和b表的id字段查询

    现在有两个表,表a中 DOC FID 1 a,b,c 2 a,c,d 表b中 ID KEY a A b B c C d D 怎么联合查询出 DOC FID KEY 1 a,b,c A,B,C 2 a, ...

  6. Failed while installing JAX-RS (REST Web Services) 1.1. org.osgi.service.prefs.BackingStoreException: Resource '/.settings' does not exist.

    https://issues.jboss.org/browse/JBIDE-10039?_sscc=t https://stackoverflow.com/questions/16836832/fai ...

  7. Using Android Phone to recover SD card formatted with DD command under linux

    Using Android Phone to recover SD card formatted with DD command under linux 1. Formatted a sd card ...

  8. js获取属性

    js获取属性的方法: document.getElementById(); document.getElementsByTagname(); document.getElementsByClassna ...

  9. .NET Framework 版本和依赖关系[微软官方文档]

    .NET Framework 版本和依赖关系 微软官方文档: https://docs.microsoft.com/zh-cn/dotnet/framework/migration-guide/ver ...

  10. [读书笔记]SQLSERVER企业级平台管理实践读书笔记01

    1. SQLSERVER信息收集 SQLDIAG 使用界面 C:\Users\Administrator>sqldiag2018/01/02 08:13:26.10 SQLDIAG Collec ...