(三)目标检测Faster R-CNN网络

在Fast R-CNN还存在着瓶颈问题:Selective Search(选择性搜索)。要找出所有的候选框,这个也非常耗时。那我们有没有一个更加高效的方法来求出这些候选框呢?

1、Faster R-CNN

在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。

 

 Faster R-CNN可以简单地看成是区域生成网络+Fast R-CNN的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的选择性搜索方法,结构如下:

 

          图1 Faster RCNN基本结构

  • 1、首先向CNN网络(VGG-16)输入任意大小图片
  • 2、Faster RCNN使用一组基础的conv+relu+pooling层提取feature map。该feature map被共享用于后续RPN层和RoI Pooling层。
  • 3、Region Proposal Networks。RPN网络用于生成region proposals该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的region proposals,输出其Top-N(默认为300)的区域给RoI pooling。
    • 生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成region proposals
  • 4、第2步得到的高维特征图和第3步输出的区域,合并(可以理解成候选区映射到特征图中,类似第(三)节SPPNet中1.1"映射")输入RoI池化层(类), 该输出到全连接层判定目标类别。
  • 5、利用proposal feature maps计算每个region proposal的不同类别概率,同时bounding box regression获得检测框最终的精确位置

 

                        图2 Faster RCNN基本结构

 

解释:

图2展示了python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构,可以清晰的看到该网络对于一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;

而Conv layers中包含了13个conv层+13个relu层+4个pooling层;RPN网络首先经过3x3卷积,再分别生成foreground anchors与bounding box regression偏移量,然后计算出region proposals

而Roi Pooling层则利用region proposals从feature maps中提取region proposal feature送入后续全连接和softmax网络作classification(即分类region proposal到底是什么object)。

 

  1. RPN(Region Proposal Networks)原理

2.1 边框的位置到底用什么表示?

         目标检测之所以难,是因为每一个物体的区域大小是不一样的,每一个区域框有着不同的大小size(也称之为scale)和不同的长宽比(aspect ratios)

         现在假设,已经知道图片中有两个 objects,首先想到的是,训练一个网络,输出 8 个值:两对元组 (xmin,ymin,xmax,ymax)、(xmin,ymin,xmax,ymax)分别定义了每个 object 的边界框.。这种方法存在一些基本问题. 例如,

(1)当图片的尺寸和长宽比不一致时,良好训练模型来预测,会非常复杂;

(2)另一个问题是无效预测:预测 xmin和xmax​ 时,需要保证 xmin​<xmax​;

       事实上,有一种更加简单的方法来预测 objects 的边界框,即,学习相对于参考boxes 的偏移量. 假设参考 box的位置由以下确定:(xcenter,ycenter,width,height),则需要预测量为:( Δxcenter,Δycenter,Δwidth,Δheight),它们的取值一般都是很小的值,以调整参考 box 更好的拟合所需要的。

2.2 RPN网络的基本结构

 

首先看到这幅图的时候我是一脸懵逼,看了半天又是一知半解,后面我会结合这幅图详细来说,这里暂且先放一副结构图。我们发现,其实整个RPN的网络很浅很简单,但是为什么要这样设计呢?这样设计能达到什么样的效果呢?

2.3 RPN的核心概念——anchor

       anchor,中文意思是锚点的意思,那到底什么是anchor?有很多不同的解释,其实不能说那种解释完全标准,主要是站在不同的角度进行解释的,都有道理,本文会将各种解释综合起来,尽量说得易懂一点。

2.3.1 知识回顾

       要理解什么是anchor,就要知道我们为什么搞出一个RPN这种东西,回顾一下前面三种目标检测架构RCNN、SPPNet、fast-RCNN,

(1)RCNN是在原始图像中使用select search方法选择大约2000个候选框,然后对每个候选框进行卷积运算;

(2)SPPNet和fast-RCNN是先让整个图片经过CNN,然后在得到的特征图上使用select search选择2000个左右的候选框,其实我们真正需要的还是在原始图像上的候选区域,那为什么在卷积之后的特征图上也可以这么做呢?这是因为卷积之后的特征图和原始图像之间存在的映射关系,在特征图上的候选区可以映射到原始图像上。

总而言之:我们要使用RPN的目的也就是要产生(原始图像上的)候选框。而且这里有一个重要的信息,就是卷积之后的feature map和原始图像之间是有一个映射关系的,如果我能够在feature map上面找到响应候选框,也就代表了在原始图像上找到了候选框。

2.3.2 RPN的输入与输出

输入:RPN是接在feature map之后的,因此它的输入是feature map;

输出:我希望得到的是候选区域,因此输出的是候选区域,这样说没错,但是在网络中其实流动的都是数据啊,这一个框框嗯么表示呢?当然也是通过数据的形式来表示了,还有一点就是这个框框里面有目标还是没有目标,这也是通过数据来表示的。

2.3.3 到底什么是anchor?

有很多文献中这样说道:Anchor是大小和尺寸固定的候选框,个人感觉这种说法是很不准确的,只是一个表象而已。在回答什么           是anchor之前,我们先看一下RPN网络的一个第一步运算,RPN的第一步运算实际上就是一个3*3*256的卷积运算,我们称3*3为一个滑动窗口(sliding window)。假设RPN的输入是13*13*256的特征图,然后使用3*3*256的卷积核进行卷积运算,最后依然会得到一个a*a*256的特征图,这里的a与卷积的步幅有关。

         在原始论文中,我们选定了3种不同scale、3种不同长宽比(aspect ratios)的矩形框作为“基本候选框(这是我起的名字)”,

三种scale/size是{128,256,512}

三种比例{1:1 , 1:2 , 2:1}

故而一共是3x3=9种,有很多文献说这就是9个anchors,之所以我觉得不准确是因为下面的两个方面

(1)anchor顾名思义为锚点,这这是一个矩形框,与锚点本身的含义是不符合的;

(2)很明显,这9个基本候选框的长宽远远大于特征图的长宽,所以这9个指的应该是原始图像,结合论文中要对原始图像进行缩放到600*1000左右的大小,更加确定了这一点,有的人说锚点是特征图上的某一个点或者是候选框,既然这9个根本就不是特征图上的候选框,那自然不存在锚点之说了。

2.3.4 anchor锚点的本质

锚点的真实含义:应该是特征图的某一个像素与对应在原始图像的某一个像素,即它本质上指的是特征图上当前滑窗的中心在原像素空间的映射点称为anchor,即anchor是在原始图像上的

然后以这个锚点为中心,配上规定的9个基本候选框,这就正确了,所以在原始图像上的图像大致如下:

 

其中每一个黑色的点是anchor锚点,以及画出的以这些锚点为中心的9个基本候选框。

2.3.5 为什么这样子设计可行?

依然以上面的例子进行说明,假定输出特征图为13*13*256,然后在该特征图上进行3*3*256的卷积,默认进行了边界填充

那么每一个特征图上一共有13*13=169个像素点,由于采用了边界填充,所以在进行3*3卷积的时候,每一个像素点都可以做一次3*3卷积核的中心点,那么整个卷积下来相当于是有169个卷积中心,这169个卷积中心在原始图像上会有169个对应的锚点,然后每个锚点会有9个默认大小的基本候选框,这样相当于原始图像中一共有169*9=1521个候选框,这1521个候选框有9种不同的尺度,中心又到处都分布,所以足以覆盖了整个原始图像上所有的区域,甚至还有大量的重复区域。

这个映射过程如下所示:

 

补充:

关于特征图和原始图像的映射关系,这里有一点需要补充,假定原始的图像长宽分别是W*H,特征图的长宽是w*h,则有如下关系:

w=W/r

h=W/r

这里的r称之为下采样率,即各个卷积层和池化层步幅的乘积,在VGG中,r=19.

但是我们说了,网络学习的是数据,这里的候选框是抽象的结果,数据到底是怎样的呢?

其实我们需要的并不是这个候选框本身,我们需要的数据是每一个候选框的位置信息(x,y,w,h)和目标信息(有,没有),我们可以这样理解,每一个候选框都包含这6个信息,也可以说成是是6个特征,特征图上的每一个像素都对应于原始图像上的一个“锚点anchor”,而每一个anchor又包含了9个尺寸比例各不相同的标准候选框,每一个候选框又包含着这6个基本信息,所以现在相当于是对每一个特征像素进行学习,也就间接的学习到了原始图像上大量的锚点以及大量的候选框的信息,这样理解不就更好了吗(个人理解,有错误请大佬纠正!)

总结归纳:

当前滑窗的中心在原像素空间的映射点称为anchor,以此anchor为中心,生成k(paper中default k=9, 3 scales and 3 aspect ratios)个proposals。虽然 anchors 是基于卷积特征图定义的,但最终的 anchos 是相对于原始图片的.

RPN的本质是 “ 基于滑窗的无类别obejct检测器 ” 

2.4 生成anchor的作用和目的
        要知道,训练RPN网络是有监督训练,需要有数据、还要有相应的类标签,输入小网络的是512个通道的3*3滑窗,类标签没有给定,没有类标签就无法计算Loss损失函数,无法训练网络。以3*3滑窗中心对应原图的位置作为中心点,在原图生成9个不同尺度长宽比的anchor,然后每个anchor都会被分配到相应的类标签,有正样本(1)、负样本(0),也有不参与训练的框(not used),对正样本计算,就是回归的类标签,负样本不计算回归loss。0,1是二分类的标签。所以在原图生成anchor的目的之一是得到类标签。这里只得到了分类的标签(0,1),还有正样本的回归标签需要确定,该正样本的回归标签是其对应的ground truth计算出来的。负样本不计算回归损失没有回归标签。   
 

2.5 RPN的训练过程

上面只讨论了RPN的第一步运算——实际上就是卷积运算,接下来考虑后面的运算步骤,如下:

 

上面的用黑色圈出来的部分是第一步运算,用红色圈圈圈出来的是第二步运算,我们将第二步运算单独拿出来看。

 

        RPN 是全卷积(full conv) 网络,其采用基础网络输出的卷积特征图作为输入. 首先,采用 512 channel,3×3 kernel 的卷积层(上面的例子采用的是256个channel,但是不影响理解),然后是两个并行的 1×1 kernel 的卷积层,该卷积层的 channels 数量取决每个点(每个anchor)所对应的的 标准候选框K 的数量,在这两个并行的1x1卷积中,左侧的是进行分类的,这里的分类只是分有和无两类,即候选框中有目标还是没有目标,至于目标到底是什么先不管,由于每一个anchor对应k个候选框,每一个候选框有两个取值(即有和无,用概率大小表示)所以每一个anchor对应的输出应该为一个2K维度的向量,故而左侧的分类卷积使用2K个channel;

        同样的道理,右侧是获取边框位置信息的卷积网络,由于每一个anchor对应k个候选框,每一个候选框有4个位置取值(x,y,w,h)所以每一个anchor对应的输出应该为一个4K维度的向量,故而右侧的卷积使用4K个channel;

这里的理解是很重要的。

那究竟RPN网络是如何进行训练的呢?
RPN训练中对于正样本文章中给出两种定义。第一,与ground truth box有最大的IoU的anchors作为正样本;第二,与ground truth box的IoU大于0.7的作为正样本。文中采取的是第一种方式。文中定义的负样本为与ground truth box的IoU小于0.3的样本。 
训练RPN的loss函数定义如下: 

其中,i表示mini-batch中第i个anchor,pi表示第i个anchor是前景的概率,当第i个anchor是前景时pi为1反之为0,ti表示预测的bounding box的坐标,ti∗为ground truth的坐标。 
看过Fast R-CNN文章详细解读文章的会发现,这部分的loss函数和Fast R-CNN一样,除了正负样本的定义不一样,其他表示时一样的。一个是交叉熵损失,一个是smooth_L1损失函数。

2.6 RPN是如何产生ROI的?

      RPN在自身训练的同时,还会提供RoIs(region of interests)给Fast RCNN(RoIHead)作为训练样本。RPN生成RoIs的过程(ProposalCreator)如下:

(1)对于每张图片,利用它的feature map, 计算 (H/16)× (W/16)×9(大概20000)个anchor属于前景的概率,以及对应的位置参数。(这里的W、H表示原始图像的宽和高,前面已经有说过了)

(2)选取概率较大的12000个anchor,利用回归的位置参数,修正这12000个anchor的位置,得到RoIs,利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的2000个RoIs

注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300.

注意:这部分的操作不需要进行反向传播,因此可以利用numpy/tensor实现。

RPN的输出:RoIs(形如2000×4或者300×4的tensor)

2.7 RPN网络与Fast R-CNN网络的权值共享 
        RPN最终目的是得到候选区域,但在目标检测的最终目的是为了得到最终的物体的位置和相应的概率,这部分功能由Fast R-CNN做的。因为RPN和Fast R-CNN都会要求利用CNN网络提取特征,所以文章的做法是使RPN和Fast R-CNN共享同一个CNN部分。 
      Faster R-CNN的训练方法主要分为两个,目的都是使得RPN和Fast R-CNN共享CNN部分,如下图所示 :

 

         一个是迭代的,先训练RPN,然后使用得到的候选区域训练Fast R-CNN,之后再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次训练RPN(这里不更新CNN,仅更新RPN特有的层),最后再次训练Fast R-CNN(这里不更新CNN,仅更新Fast R-CNN特有的层)。 
        还有一个更为简单的方法,就是end-to-end的训练方法,将RPN和Fast R-CNN结合起来一起训练,tf版本的代码有这种方式的实现。

 

3、Faster R-CNN的训练

Faster R-CNN的训练分为两部分,即两个网络的训练。前面已经说明了RPN的训练损失,这里输出结果部分的的损失(这两个网络的损失合并一起训练):

  •  

Fast R-CNN classification (over classes) ,所有类别分类N+1

Fast R-CNN regression (bbox regression)

 

4、效果对比

 

 

5、Faster R-CNN总结

  • 优点
    • 提出RPN网络
    • 端到端网络模型
  • 缺点
    • 训练参数过大
    • 对于真实训练使用来说还是依然过于耗时

可以改进的需求:

  • RPN(Region Proposal Networks) 改进 对于小目标选择利用多尺度特征信息进行RPN
  • 速度提升 如YOLO系列算法,删去了RPN,直接对Region Proposal(候选区)进行分类回归,极大的提升了网络的速度

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值