Mask R-CNN --Faster RCNN 学习笔记

这是根据多篇文章整理的文件,仅供参考!

一)、整体框架

Mask R-CNN --Faster RCNN 学习笔记_第1张图片

Mask R-CNN --Faster RCNN 学习笔记_第2张图片

我们先整体的介绍下上图中各层主要的功能

1)Conv layers提取特征图:

作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取input imagefeature maps,feature maps会用于后续的RPN层和全连接层

2)RPN(Region Proposal Networks):

RPN网络主要用于生成region proposals,首先生成一堆Anchor box,对其进行裁剪过滤后通过softmax判断anchors属于前景(foreground)或者后景(background),即是物体or不是物体,所以这是一个二分类;同时,另一分支bounding box regression修正anchor box,形成较精确的proposal(注:这里的较精确是相对于后面全连接层的再一次box regression而言)

Region Proposal(候选区域),就是预先找出图中目标可能出现的位置,通过利用图像中的纹理、边缘、颜色等信息,保证在选取较少窗口(几千个甚至几百个)的情况下保持较高的召回率(IOU,Intersection-over-Union)。这一阶段的输出应该是一系列object可能位置的bounding box。这些通常称之为region proposals或者 regions of interest(ROI)。

RPN的工作原理:

Mask R-CNN --Faster RCNN 学习笔记_第3张图片

RPN网络把一个任意尺度的图片作为输入,输出一系列的矩形object proposals,每个object proposals都带一个objectness score。在滑动窗口的每个像素点对应的原图片上上设置9个矩形窗口(3种长宽比*3种尺度),称作锚点。 

RPN以滑动窗口的方式扫描图像并找到包含对象的区域。RPN扫描的区域称为锚点也就是分布在图像区域上的红框。

RPN不会直接扫描图像(即使我们在图像上绘制锚点以便说明)。相反,RPN扫描骨干网络生成的Feature map。这允许RPN有效地重用提取的特征并避免大量的重复计算。

针对每个锚点,RPN有两个输出:

1.锚点的种类:前景或背景。前景类意味着该框中可能有一个对象。

2.边界框细化:前景锚点(也称为正锚点)可能没有完全正对该对象。 因此,RPN会输出一个很小的微量变化(百分比):(x, y, width, heigh),以更好地适应物体。

使用RPN预测,我们选择可能包含对象并优化其位置和大小的顶部锚点。如果几个锚点重叠太多,我们会保留具有最高前景分数的锚点并丢弃其余的(称为非极大值抑制:Non-max Suppression)。在这之后我们会得到进入下一阶段的最终提案(感兴趣的区)。

RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框(文中叫做anchor)。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。示意图如下所示:

Mask R-CNN --Faster RCNN 学习笔记_第4张图片

 

由于共享特征图的大小约为40×60,RPN生成的初始anchor的总数约为20000个(40×60×9)。对于生成的anchor,RPN要做的事情有两个,第一个是判断anchor到底是前景还是背景,意思就是判断这个anchor到底有没有覆盖目标,第二个是为属于前景的anchor进行第一次坐标修正。对于前一个问题,Faster R-CNN的做法是使用SoftmaxLoss直接训练,在训练的时候排除掉了超越图像边界的anchor;对于后一个问题,采用SmoothL1Loss进行训练。那么,RPN怎么实现呢?这个问题通过RPN的本质很好求解,RPN的本质是一个树状结构,树干是一个3×3的卷积层,树枝是两个1×1的卷积层,第一个1×1的卷积层解决了前后景的输出,第二个1×1的卷积层解决了边框修正的输出。

对于RPN输出的特征图中的每一个点,一个1×1的卷积层输出了18个值,因为是每一个点对应9个anchor,每个anchor有一个前景分数和一个背景分数,所以9×2=18。另一个1×1的卷积层输出了36个值,因为是每一个点对应9个anchor,每个anchor对应了4个修正坐标的值,所以9×4=36。

那么,要得到这些值,RPN网络需要训练。在训练的时候,就需要对应的标签。那么,如何判定一个anchor是前景还是背景呢?文中做出了如下定义:如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。在作者进行RPN网络训练的时候,只使用了上述两类anchor,与ground truth的IoU介于0.3和0.7的anchor没有使用。在训练anchor属于前景与背景的时候,是在一张图中,随机抽取了128个前景anchor与128个背景anchor。

在上一段中描述了前景与背景分类的训练方法,本段描述anchor边框修正的训练方法。边框修正主要由4个值完成,tx,ty,th,tw。这四个值的意思是修正后的框在anchor的x和y方向上做出平移(由tx和ty决定),并且长宽各自放大一定的倍数(由th和ty决定)。那么,如何训练网络参数得到这四个值呢?Fast R-CNN给出了答案,采用SmoothL1loss进行训练,具体可以描述为:

Mask R-CNN --Faster RCNN 学习笔记_第5张图片

到这里有个问题,就是不是对于所有的anchor,都需要进行anchor包围框修正的参数训练,只是对positive的anchors有这一步。因此,在训练RPN的时候,只有对128个随机抽取的positive anchors有这一步训练。因此,训练RPN的损失函数可以写成:

Mask R-CNN --Faster RCNN 学习笔记_第6张图片

 

在这里Lreg就是上面的Lloc,λ被设置为10,Ncls为256,Nreg为2400。这样设置的话,RPN的两部分loss值能保持平衡。

到这里RPN就解析完毕了

ROI分类器和边界框回归(ROI Classifier & Bounding Box Regressor)

这个阶段运行在RPN提出的感兴趣区(ROI)上。就像RPN一样,对每个ROI生成两个输出:

1.具体的类别:ROI中对象的类。 与具有两个类别(前景/ 背景)的RPN不同,该网络更深并且具有将区域分类为特定类别(人,车,椅子等)的能力。并且它也可以生成背景类,这样可以让部分消极的ROI被丢弃。

2.边界框细化:与RPN中的完成方式非常相似,其目的是进一步细化边界框的位置和大小以包含对象。
 

ROI池化

在进行下一步之前,有一点问题需要解决:分类器不能很好地处理可变的输入大小。通常需要固定的输入大小。 但是,由于RPN中的边界框细化步骤,ROI框可能具有不同的大小。 这时就需要ROI Pooling。

ROI池化是指裁剪feature map的一部分并将其大小调整为固定大小。 原则上类似于裁剪图像的一部分,然后重新调整大小(但实现细节存在差异)。Mask R-CNN的作者提出了一种称为ROIAlign的方法,他们在不同的点对feature map进行采样并应用双线性插值。 在我们的实现中,为了简单起见,我们使用了TensorFlow的crop_and_resize函数,因为它对于大多数目的来说已经足够用了。
 

3)、Roi Pooling

为什么需要RoI Pooling?

答案是在Fast R-CNN中,特征被共享卷积层一次性提取。因此,对于每个RoI而言,需要从共享卷积层上摘取对应的特征,并且送入全连接层进行分类。因此,RoI Pooling主要做了两件事,第一件是为每个RoI选取对应的特征,第二件事是为了满足全连接层的输入需求,将每个RoI对应的特征的维度转化成某个定值。RoI Pooling示意图如下所示:

Mask R-CNN --Faster RCNN 学习笔记_第7张图片

 

如上图所示,对于每一个RoI,RoI Pooling Layer将其对应的特征从共享卷积层上拿出来,并转化成一样的大小(6×6)。

该层利用RPN生成的proposalsVGG16最后一层得到的feature map,得到固定大小的proposal feature map,进入到后面可利用全连接操作来进行目标识别和定位

ROI pooling具体操作如下:

根据输入image,将ROI映射到feature map对应位置;

将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);

对每个sections进行max pooling操作;

ROI Pooling 就是将大小不同的feature map 池化成大小相同的feature map,利于输出到下一层网络中。这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps。值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小。ROI pooling 最大的好处就在于极大地提高了处理速度。

4、Classifier

在RoI Pooling Layer之后,就是Fast R-CNN的分类器和RoI边框修正训练

分类器主要是分这个提取的RoI具体是什么类别(人,车,马等等),一共C+1类(包含一类背景)。RoI边框修正和RPN中的anchor边框修正原理一样,同样也是SmoothL1 Loss,值得注意的是,RoI边框修正也是对于非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。对于分类器和RoI边框修正的训练,可以公式描述如下: 

上式中u>=1表示RoI边框修正是对于非背景的RoI而言的,实验中,上式的λ取1。

   在训练分类器和RoI边框修正时,步骤如下所示:

   1) 首先通过RPN生成约20000个anchor(40×60×9)。

   2) 对20000个anchor进行第一次边框修正,得到修订边框后的proposal。

3) 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。

   4) 忽略掉长或者宽太小的proposal。

   5) 将所有proposal按照前景分数从高到低排序,选取前12000个proposal。

   6) 使用阈值为0.7的NMS算法排除掉重叠的proposal。

   7)针对上一步剩下的proposal,选取前2000个proposal进行分类和第二次边框修正。

总的来说,Faster R-CNN的loss分两大块,第一大块是训练RPN的loss(包含一个SoftmaxLoss和SmoothL1Loss),第二大块是训练Fast R-CNN中分类器的loss(包含一个SoftmaxLoss和SmoothL1Loss),Faster R-CNN的总的loss函数描述如下:

Faster R-CNN的测试流程和训练流程挺相似,描述如下

   1) 首先通过RPN生成约20000个anchor(40×60×9)通过RPN

   2) 对20000个anchor进行第一次边框修正,得到修订边框后的proposal。

   3) 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。

   4) 忽略掉长或者宽太小的proposal。

   5) 将所有proposal按照前景分数从高到低排序,选取前6000个proposal。

   6) 使用阈值为0.7的NMS算法排除掉重叠的proposal。

   7) 针对上一步剩下的proposal,选取前300个proposal进行分类和第二次边框修正。

   到这里,Faster R-CNN就介绍完毕了。

你可能感兴趣的:(目标检测,Faster,RCNN,RPN,Roi,Pooling,Classifier)