目标检测:Faster R-CNN

Faster R-CNN = RPN + Fast R-CNN

创新点:将找候选框的工作也交给神经网络来做。Faster R-CNN使用了提取候选框区域的RPN网络(区域生成网络),找出所有的候选框anchor boxes,从此一个网络模型即可完成end-to-end的检测任务而不需要我们在前面手动先执行一遍proposal的搜索算法选择性搜索),完全把proposal部分从网络外边嵌入到网络里边,使得检测速度大幅提高。

具体做法:将RPN放在最后一个卷积层的后面,可以直接得到候选区域。

github地址:rbgirshick/py-faster-rcnn

论文地址:Towards Real-Time Object Detection with Region Proposal Networks

之前的Fast RCNN提到如果去除区域建议(region proposal)算法的话,网络能够接近实时,而selective search方法进行区域建议的时间一般在秒级。产生差异的原因在于卷积神经网络部分运行在GPU上,而selective search运行在CPU上,所以效率自然是不可同日而语。一种可以想到的解决策略是将selective search通过GPU实现一遍,但是这种实现方式忽略了接下来的检测网络可以与区域建议方法共享计算的问题。因此Faster RCNN从提高区域建议的速度出发提出了region proposal network(RPN)用以通过GPU实现快速的区域建议。通过共享卷积,RPN在测试时的速度约为10ms,相比于selective search的秒级简直可以忽略不计。

Faster RCNN整体结构为RPN网络产生区域建议,然后直接传递给Fast RCNN。当然重点就是这个RPN网络咯,下图是Faster RCNN的整体网络结构:

对于一幅图片的处理流程为:图片->卷积特征提取->RPN产生proposals->Fast RCNN分类proposals

Faster RCNN 将selective search这样的算法整合到深度网络中,这样不光解决了selective search这样的算法在cpu实现速度慢的问题,而且与深度网络相结合,共享前面的卷积计算,这样做计算效率更高。而其他部分则与Fast RCNN差异不大。这里主要讲Region Proposal Networks的设计和训练思路(RPN如何产生区域候选)

上图是RPN的网络流程图,RPN对于feature map的每个位置进行滑窗,通过不同尺度以及不同比例的K个anchor产生K个256维的向量,然后分类每一个region是否包含目标以及通过回归得到目标的具体位置。这里使用的滑窗大小为3*3,感觉很小,但是其相对于原图片的感受野约为200左右个像素。

anchor box的作用是产生不同比例及尺度的region proposal,通过将anchor中心点与滑窗中心点对齐,然后以一定的比例及大小裁剪滑窗。比如裁剪一个512*512的大小,比例为1:2的滑窗实现就是对于滑窗中心点向外扩充像素使得对应原图包含的像素点个数为512*512,比例为1:2。然后对于这一块进行卷积提取固定维度的特征(这个思想也用在SSD中)。

RPN是一个全卷积神经网络的结构,也就是将全连接层通过卷积层去替换。因此可以接受任意大小的输入,同时输出所有的anchors对应的特征。由于采用的是滑窗的方式,因此全连接层(上图获得256-d向量的位置)是共享权重的,每个滑窗的权重都是相同的。其实现方式是通过3*3的卷积层。

RPN也是利用了SPP的映射机制,从conv5上进行滑窗来替代从原图滑窗。不过,要如何训练出一个网络来替代selective search相类似的功能呢?

实际上思路很简单,就是先通过SPP根据一一对应的点从conv5映射回原图,根据设计不同的固定初始尺度训练一个网络,就是给它大小不同(但设计固定)的region图,然后根据与ground truth的覆盖率给它正负标签,让它学习里面是否有object即可。这就又变成我介绍RCNN之前提出的方法,训练出一个能检测物体的网络,然后对整张图片进行滑窗判断,不过这样子的话由于无法判断region的尺度和scale ratio,故需要多次放缩,这样子测试,估计判断一张图片是否有物体就需要n久。如何降低这一部分的复杂度??要知道我们只需要找出大致的地方,无论是精确定位位置还是尺寸,后面的工作都可以完成,这样子的话,与其说用小网络简单的学习(这样子估计和蒙差不多了,反正有无物体也就50%的概率),还不如用深的网络,固定尺度变化,固定scale ratio变化,固定采样方式(反正后面的工作能进行调整,更何况它本身就可以对box的位置进行调整)这样子来降低任务复杂度呢。这里有个很不错的地方就是在前面可以共享卷积计算结果,这也算是用深度网络的另一个原因吧。而这三个固定,我估计也就是为什么文章叫这些proposal为anchor的原因了。这个网络的结果就是卷积层的每个点都有关于k个achor boxes的输出,包括是不是物体,调整box相应的位置。这相当于给了比较死的初始位置(三个固定),然后来大致判断是否是物体以及所对应的位置,这样子的话RPN所要做的也就完成了,这个网络也就完成了它应该完成的使命,剩下的交给其他部分完成就好了。

多尺度样本的产生

由于目标检测的目标尺度可能相差很大,因此我们需要尽可能产生不同尺寸的region proposals,常见的有两种方法,加上本文的一共三种方法:

  • 图像金字塔:通过将图像放缩到不同的尺寸,然后提取特征去做。有点类似于RCNN中的实现方式,显然这样需要为每一个尺寸重复提取卷积特征,成本很高。
  • 卷积特征金字塔:先对于图像提取卷积特征,然后将卷积特征放缩到不同的尺寸。类似于SPP的实现方式。在SPP中我们也看到,这里面的图像也需要放缩到几种尺寸,产生多尺度结果。
  • anchor金字塔:通过不同尺度的anchor在卷积特征上滑窗相当于是anchor金字塔,不需要图像有多个尺寸,仅需要有多个尺寸的anchor就好了。文章使用了3种尺度以及3种比例。

感觉区域大小很重要,3尺寸的1比例与3比例相差很小,因为比例准不准没关系,后面还有回归层去微调呢,但是如果尺寸不够那回归层就无能为力了。

损失函数的设计

RPN包含两个网络分支,分类层以及回归层。分类层给出一个二分类label,也就是这个region是否包含目标,回归层产生目标的位置。其中与任意ground-truth box的IOU大于0.7即认为是包含目标,而对于任意ground-truth box的IOU都小于0.3则认为是负样本。对于回归采用的与Fast RCNN一致。

在划分为 n×n 个窗口后,我们把每个矩形窗口的中心点当成一个基准点,然后围绕这个基准点选取k(k=9)个不同scale、aspect ratio的anchor(论文中3个scale和3个aspect ratio),对于每个anchor,首先在后面接上一个二分类softmax,有2个score输出用以表示其是一个物体的概率与不是一个物体的概率,然后再接上一个bounding box的regressor,以及4个坐标输出代表这个anchor的坐标位置,因此RPN的总体Loss函数可以定义为:

通过Ncls,Nreg,权衡分类以及回归的重要性程度。这里面一切都与Fast RCNN类似,那我们就只用看不同的地方就好了。

  • 分类损失一个是二分类,Fast RCNN是类别相关的分类。
  • 回归损失一个是非类别相关的,Fast RCNN是类别相关的。
  • Fast RCNN ROI pooling后面跟着两个FC然后再到相应的分类或是回归,RPN则是一个全卷积的过程,包括对于后续的向量全连接操作都是通过1*1卷积实现的。而且无论回归还是分类从256-d向量到后面都只有一个卷积层。
  • 9个anchor的参数不共享,但是每个滑窗位置的参数是共享的。

另外在RPN训练中有一个需要注意的地方是正负样本的选择,文中提到如果对每幅图的所有anchor都去优化loss function,那么最终会因为负样本过多导致最终得到的模型对正样本预测准确率很低

RPN的训练过程

  • RPN可以通过BP算法端到端训练,为了防止类似样本向负样本倾斜,我们在每一个批次中采样256个anchors,然后这些anchors中正负样本比例为1:1。
  • RPN与Fast RCNN权重共享训练

文章使用的四步交替训练的方法:(4-Step Alternating Training

1.用ImageNet模型初始化,独立训练一个RPN网络;

2.仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;

3.使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新(Fast RCNN仅初始化RPN中与其共有的网络层),仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;

4.固定Fast RCNN中的共有层,通过RPN训练Fast RCNN:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。

实验细节

文章对于图像的预处理是放缩使得短边为600个像素,以VGG为例,经过四次的池化操作,每个卷积层像素的感受野对应于原图为16个像素。对于1000*600的图片,其卷积特征层尺寸为60*40,所以anchors数量为60*40*9,而去除在边缘的不完整的anchors,最后能得到6000个anchors,而这些anchors的特征是同时计算出来的。比如针对一个图像尺寸128*128,其对应于卷积层特征尺寸为9*9,然后对于所有的9*9小块进行卷积得到的feature map就是所有的anchor对应的特征。RPN产生的region proposal重叠较多,通过NMS去除重叠后大约剩余2K个proposal,在测试时仅选用前300个proposal,效果也是相当的好。

不同尺度的anchors对应的真实的proposal大小:

可以看到,尺寸和比例还是起到了作用的,相应尺寸和比例的proposal也基本符合要求的。

proposal个数:

可以看到300个proposal其实并没有降低识别准确率,而且NMS对结果也没啥影响,所以测试时取前300个proposal,这样可以大幅提高速度。

分阶段权重共享的优点:

权重共享大约能够提升个1.5个百分点,还是很有效果的。同时我们也看到数据集扩充对于识别结果影响最大,通过COCO+07+12训练然后再07上测试能够达到78.8%,提高10个点。

时间性能:

通过ZF基本可以实现实时的,所以文章标题也是朝着实时目标检测迈进。

备注:ZF表示ZF Net

 

问题:RPN网络的训练数据是什么?它是怎么训练的?

在第一个RPN训练阶段,其训练数据是什么?是初始的6000(20000去除边界变为6000)个proposals吗?

嗯嗯,从损失函数看来是这样。

那对于第3步,就是第2次训练RPN时,训练数据还是这些anchors吧

RPN新产生的anchors

存在的疑问:第一个RPN训练阶段使用的数据中那20000个预选框是怎么来的?在一般的网络训练中应该是有标签文件的标定框。

 

参考文章:

参考文章:https://zhuanlan.zhihu.com/p/27988828
         https://blog.csdn.net/xyy19920105/article/details/50817725
         https://blog.csdn.net/qq_41828351/article/details/97614901
         http://closure11.com/rcnn-fast-rcnn-faster-rcnn%E7%9A%84%E4%B8%80%E4%BA%9B%E4%BA%8B/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值