Mask R-CNN 简介与论文笔记

本篇文章是面向Mask R-CNN的初学者,旨在梳理大体思路,认识框架基础概念。由于自己现在大四,也是刚刚入足深度学习领域,所以文章中免不了有错误之处,欢迎各位博友批评指正。

本博文所参考的论文和代码分别为:

★何恺明大神的:Mask R-CNN 

★综述文章:Deep Learning for Generic Object Detection: A Survey

★非配套代码:Mask_RCNN(论文的配套代码都整合到了Detectron中,FAIR都是使用的caffe框架,这个代码的可读性个人感觉比较低,所以先看了一个Keras框架版本代码)


目录

一、什么是Mask R-CNN?

二、Mask R-CNN是怎么来的?

三、Mask R-CNN的全局结构是什么?

四、Mask R-CNN的具体细节(论文中的Part3:Mask R-CNN)



一、什么是Mask R-CNN?

在目标检测(Object Detection)任务中,给定一张数字图像后,有以下子任务需要完成:

1.物体分类(Object Classification):是不是有狗?

2.通用物体检测(Generic Object Detection):有狗,狗在哪里?你给我框出来。

3.语义分割(Semantic Segmentation):框里哪些像素是狗,哪些是背景?用掩模抠出来。

从功能上来讲,Mask R-CNN可以完成这三个功能:可以识别出有狗,能够拿框把狗框出来,还能类似于抠图一样用掩模(以后直接用Mask)把狗抠出来。效果就类似于这样:其实还是很酷的。


二、Mask R-CNN是怎么来的?

在综述中,我们可以看到物体检测和识别界的里程碑图。2012年AlexNet的横空出世作为一个分界线,将研究界的关注焦点从手工特征转移到了基于深度框架的神经网络领域。下面的图展示了2012年之后更加细致的发展进程:RCNN、Fast/Faster RCNN、ResNet、Mask RCNN陆续被提出。Mask RCNN是由何凯明大神(大牛,自行百度)所在的FAIR提出的双步检测框架,框架提出后被整合在了Detectron项目中(caffe2框架)。

可以将RCNN视为一个大家族,Mask RCNN是其中的一个,是这个家族中目前进化程度最高的一个成员。其实,Mask RCNN是在前几个框架的基础上的改进版本,所以,想要深入了解Mask RCNN,就必须熟悉地掌握之前的框架。

 


三、Mask R-CNN的全局结构是什么?

综述中有一个贼长贼长的图阐述了Two-Stage方法的进化过程。我们在此只分析Mask RCNN的结构(注:此处的“步骤”与Two-Stage不同,仅仅是为方便分析结构之便):

第1步:数字图像首先由CONV Layers处理生成特征图,我们一般称CONV Layers为Backbone(脊梁骨/主干网络),在ResNet被提出后,FC被ResNet逐渐替代(ResNet网络内传播的是残差,区别于全连接网络中的传播实量,故可以将网络深度扩展到相当大的规模:50层、100层甚至1000层)。

第2步:得到特征图后,RPN网络会在特征图中生成候选区域,并且对每个候选区域进行框回归操作和得到类别可能性。

第3步:对每一个RPN得到的候选区域,进行RoI Align操作(这个操作是Mask RCNN的创新部分),得到所有RoI规整之后的特征图(比如说全部都是7*7的特征图)。

第4步:这些图随后被用于两个通路:一个是Cls&Reg通路,用于生成回归框和预测类别;另一路是Mask通路,用于生成Mask。


四、Mask R-CNN的具体细节(论文中的Part3:Mask R-CNN)

1.Faster R-CNN:大体上来讲,Mask R-CNN可以视为Faster R-CNN进化而来,进化的部分共有两个地方:

     ◆在Cls和Reg的基础上添加了一条Mask生成通路。

     ◆将RoI Pooling改进为RoI Align。

 

我们首先来回顾一下Faster R-CNN的结构:可以分为两大阶段,第一个阶段是Region Proposal Network (RPN,候选区域生成网络),用于生成目标回归框。第二个阶段的精华是一个Fast R-CNN,利用RoI Pooling来对每一个候选框进行分类和框回归。下面这幅图展示出了Faster R-CNN和Mask R-CNN之间的关系:

2.Mask R-CNN:论文在这里又重复了一次之前的论述,在Faster R-CNN的最后添加了Mask通道,构成显示RPN后是RoI Pool。之后介绍损失值由3部分组成——分类、回归框、Mask。框架对每一个RoI生成了K个m*m大小的掩模(K是类别数量)。此机制使得Mask生成与类别解耦

3.Mask 表示:分类标签和回归框的输出都很简单粗暴,只用输出一个短向量就行(用FC连接)。我们提出的全卷积表示能够对每个RoI预测出一个m*m的Mask,参数少,精确。Mask是对每个像素进行操作,但是RoIfeature太少了,会产生校准问题,于是我们提出了Mask R-CNN中的关键操作——RoIAlign。

4. RoIAlign:RoIPool会产生misalignments的问题(RoI和特征之间)。RoIAlign不做量化,而是做双线性插补。RoIWarp虽然也采用了双线性重采样,但是结果跟RoIpool差不多。(ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。两次量化过程:预选框边界量化为整数点坐标;将量化后的边界值分割为k*k个单元,对每一个单元的边界进行量化。)

这个东西要好好讲一下。首先我们来讲一下什么是RoI Pool。当图像经过backbone网络之后,我们得到了很厚的特征图,假设特征图张量维度为:[1,256,256,64],其中1代表batch_size,256*256代表特征图的高和宽,64就代表共有64个通道。现在特征图通过RPN之后,生成了很多的RoI(感兴趣区域)。要注意此时的RoI是在特征图上,并不是原照片上的。现在产生了一个问题:这些RoI奇形怪状,比如框人是个长方形,框狗是个正方形。所以我们要把RoI变成同样大小的特征图,用于Cls&Reg和Mask任务。论文上用7*7特征图来计算。总结一句话就是:要把大大小小的RoI进行下采样,使其变成一个7*7小图像,然后用于后续计算。

我们来看一下RoI Pool的计算过程:

◆原图像是800*800,经过backbone网络32倍缩放后,变成了25*25的特征图。

◆理论上这只665*665的狗应该被缩放到(665/32)*(665/32)=20.78*20.78大小,此时舍去小数点进行第一次量化,变成20*20。此时20*20的特征图狗已经比特征图上真实的狗小了一点。

◆现在进行pooling操作,将20*20的特征图狗池化为7*7的迷你特征狗。所采取的方法就是在20*20的特征图狗上画49个方格,然后在格点取值构成7*7迷你特征狗,但是问题又来了:(20/7)*(20/7)=2.86*2.86,不能够正好切分特征图狗。此时进行第二次量化,采用2*2为步长进行取值。上图中绿色小格子外白色部分为舍弃区域。

可以看到,这两次量化分别产生的特征图狗、迷你特征狗都产生了误差问题。最后这个7*7映射回原狗上面会有很大的偏差。我们称这个问题叫“Misalignments”(未对准问题)。这个问题对于Cls过程不会产生太大的影响,但是在小目标的识别上,由于特征区域的缩小,会产生一定的误差。

为了解决这个问题,我们使用RoI Align方案:不再使用量化,直接进行双线性内插

◆665*665的狗经过backbone网络特征提取之后获得了特征图,此时应该进行第一次量化,但是RoIAlign直接保留小数:20.78*20.78特征图狗。

◆再将特征图狗用7*7个小格子分开,仍然拒绝量化,每个格子大小:2.97*2.97。

◆此时会出现一个新的问题:格子对特征图上的像素点并不是完美的分割,而是有偏差的分割。所以要使每一个格子里面产生一个数值构成7*7的迷你特征狗。这个过程论文中给出了说明:

狗的例子中需要49个小格子,我们将这些小格子称为bins。在每个bin内部,取4个位置做为采样点(也可以采1个,那就是取中心值;实验证明取4个效果最好)。则一共有7*7*4个采样点。每个采样点根据位置,由临近的4个像素点进行插值。最终得到7*7的迷你特征图狗。

 

5. 网络结构:对网络结构做了很多示例操作——主干网络、网络头(框回归和Mask预测)。在主干网络里面我们用了“网络深度特征”命名法,对ResNet和ResNeXt网络50层或101层进行实验。以特征金字塔网络(FPN)为主干网络,在速度、精度上取得了最好的结果。在网络头方面,我们对两种Faster R-CNN头(主干为ResNet/FPN)进行了扩展:添加全连接的Mask预测支流。我们的Mask支流是直接结构,还有很多潜在提升准确度的方法,在此不再赘述。

 

 

 

 

 

 

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值