目标检测(四)——Faster R-CNN

简介

Faster R-CNN是Fast R-CNN的进一步升级,不使用Selective Search(费时,难以用GPU优化),而是将候选框的选取部分通过一个RPN(Region Rroposal Network)整合进一个深度网络(RNP与后面分类的部分可以共享前面的卷积),使其更快更准。


原理

Faster R-CNN整体结构

在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,边框调整)终于被统一到一个深度网络框架之内。
目标检测(四)——Faster R-CNN_第1张图片
Faster R-CNN可以简单地看成是区域生成网络+Fast R-CNN的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的选择性搜索方法,结构如下:

  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。
  4. 第2步得到的高维特征图和第3步输出的区域,通过Rol pooling,产生固定尺寸的输出,该输出到全连接层判定目标类别。
  5. 利用proposal feature maps计算每个region proposal的不同类别概率,同时bounding box regression获得检测框最终的精确位置

目标检测(四)——Faster R-CNN_第2张图片


RPN(Region Proposal Networks)原理

RPN网络的主要作用是得出比较准确的候选区域。整个过程分为两步

  • 用n×n(默认3×3=9)的大小窗口去扫描特征图,每个滑窗位置映射到一个低维的向量(默认256维),并为每个滑窗位置考虑k种(在论文设计中k=9)可能的参考窗口(论文中称为anchors锚框)
  • 低维特征向量输入两个并行连接的1 x 1卷积层然后得出两个部分:reg窗口回归层(用于修正位置)和cls窗口分类层(是否为前景或背景概率)

目标检测(四)——Faster R-CNN_第3张图片
上图3展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground)

下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,

同时剔除太小和超出边界的proposals(有一些分类实在太烂的区域,我们直接丢掉,否则计算量会非常大)。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位(相当于完成了选择性搜索(SS)生成候选区)的功能。

anchors

目标检测(四)——Faster R-CNN_第4张图片
举个例子:

  • 3*3卷积核的中心点对应原图上的位置,将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors, 三种尺度{ 128,256,512 }, 三种长宽比{1:1,1:2,2:1}

解释:
所谓anchors,实际上就是一组的矩形

[[ -84.  -40.   99.   55.]
 [-176.  -88.  191.  103.]
 [-360. -184.  375.  199.]
 [ -56.  -56.   71.   71.]
 [-120. -120.  135.  135.]
 [-248. -248.  263.  263.]
 [ -36.  -80.   51.   95.]
 [ -80. -168.   95.  183.]
 [-168. -344.  183.  359.]]

其中每行的4个值 (x_1, y_1, x_2, y_2) 表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为{1:1, 1:2, 2:1} 三种,如图4。实际上通过anchors就引入了检测中常用到的多尺度方法。
目标检测(四)——Faster R-CNN_第5张图片
注:关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即图2中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。

**那么这9个anchors是做什么的呢?**借用Faster RCNN论文中的原图,如图5,遍历Conv layers计算获得的feature maps,为每一个点(每一个像素的中心)都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。

目标检测(四)——Faster R-CNN_第6张图片
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!

anchor的个数也是我们关心的一个问题,如下图经过CNN后得到的特征是51 x 39(通道数忽略),那么对于9种形状的anchor,一共有51 x 39 x 9 = 17901个anchor从RPN层输出,对于更高维度的图像,输出的特征会更大,带来训练参数过大的问题。
目标检测(四)——Faster R-CNN_第7张图片

候选区域的训练

  • 训练样本anchor标记
  1. 每个ground-truth box有着最高的IoU的anchor标记为正样本
  2. 剩下的anchor/anchors与任何ground-truth box的IoU大于0.7记为正样本,IoU小于0.3,记为负样本
  3. 剩下的样本全部忽略
    正负样本比例为1:3
  • 训练损失
  1. RPN classification (anchor good / bad) ,二分类,是否有物体,是、否
  2. RPN regression (anchor -> proposal) ,回归
  3. 注:这里使用的损失函数和Fast R-CNN内的损失函数原理类似,同时最小化两种代价

候选区域的训练是为了让得出来的正确的候选区域, 并且候选区域经过了回归微调。

在这基础之上做Fast RCNN训练是得到特征向量(不要anchor越过边界的以及太小的,剩下默认挑300个)做分类预测和回归预测。

Faster R-CNN的训练

Faster R-CNN的训练分为两部分(也有一部分的,不过论文所有实验用的是两部分),即两个网络的训练,并分为四个步骤。
目标检测(四)——Faster R-CNN_第8张图片

  • 第一阶段,按照上面候选区域的训练方法训练RPN(网络初始化为ImageNet的预训练模型,然后在训练RPN时fine-tune)。
  • 第二阶段,单独训练检测网络,使用RPN层的产生的候选区域(也初始化为ImageNet的预训练模型)。
  • 第三阶段,使用检测器的网络去初始化RPN的训练,训练过程中保持共享的卷积层不变,只 fine-tune RPN。
  • 第四阶段,保持共享卷积层固定,微调Fast R-CNN独有的层。

这样的话,整个网络共享相同的卷积层,并且形成了一个统一的网络。像这样相似的交替训练可以迭代更多的次数,但是这样做只能获得微不足道的提升。


总结

效果对比

R-CNN Fast R-CNN Faster R-CNN
Test time/image 50.0s 2.0s 0.2s
mAP(VOC2007) 66.0 66.9 66.9

优点

  • 提出RPN网络
  • 端到端网络模型(可以将VGG替换为ResNet,mAP进一步提升)

缺点

  • 训练参数过大
  • 对于真实训练使用来说还是过于耗时

可以改进的地方

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

你可能感兴趣的:(目标检测,cnn,目标检测,r语言,Faster,R-CNN)