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

arxiv: http://arxiv.org/abs/1506.01497
github(official, Matlab): https://github.com/ShaoqingRen/faster_rcnn
github: https://github.com/rbgirshick/py-faster-rcnn
github(MXNet): https://github.com/msracver/Deformable-ConvNets/tree/master/faster_rcnn
github: https://github.com//jwyang/faster-rcnn.pytorch
github: https://github.com/mitmul/chainer-faster-rcnn

Faster R-CNN (Caffe版) 的运行可以参照 Faster RCNN安装以及Demo运行。


目标检测(六)——Faster R-CNN_第1张图片
  为了解决Fast R-CNN算法缺陷,使得算法实现two stage的全网络结构,2015年微软研究院的任少庆、何恺明以及Ross B Girshick等人又提出了Faster R-CNN算法。设计辅助生成样本的RPN(Region Proposal Networks)网络,将算法结构分为两个部分,先由RPN网络判断候选框是否为目标,再经分类定位的多任务损失判断目标类型,整个网络流程都能共享卷积神经网络提取的的特征信息,节约计算成本,且解决Fast R-CNN算法生成正负样本候选框速度慢的问题,同时避免候选框提取过多导致算法准确率下降。

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

算法流程

  1. 把整张图片送入CNN,进行特征提取;
  2. 在最后一层卷积feature map上生成region proposal(通过RPN),每张图片大约300个建议窗口;
  3. 通过RoI pooling层(其实是单层的SPP layer)使得每个建议窗口生成固定大小的feature map;
  4. 继续经过两个全连接层(FC)得到特征向量。特征向量经由各自的FC层,得到两个输出向量。第一个是分类,使用softmax,第二个是每一类的bounding box回归。利用SoftMax Loss和Smooth L1 Loss对分类概率和边框回归(Bounding Box Regression)联合训练。

创新点

  1. 采用RPN(Region Proposal Network)代替选择性搜索(Selective Search),利用GPU进行计算大幅度缩减提取region proposal的速度。
  2. 产生建议窗口的CNN和目标检测的CNN共享。

Faster RCNN其实可以分为4个主要内容:

  1. Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals。
  3. Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

Region Proposal Networks

  Region Proposal Networks是Faster RCNN出新提出来的proposal生成网络。其替代了之前RCNN和Fast RCNN中的selective search方法,将所有内容整合在一个网络中,大大提高了检测速度。
目标检测(六)——Faster R-CNN_第3张图片
RPN网络结构:
生成anchors -> softmax判定foreground与background-> bbox reg回归fg anchors -> Proposal Layer生成proposals

生成anchors
  anchors就是一组由rpn/generate_anchors.py生成的矩形。直接运行generate_anchors.py得到以下输出:

[[ -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个值[x1,y1,x2,y2]代表矩形左上和右下角点坐标。9个矩形共有3种形状,长宽比为大约为:width:height = [1:1, 1:2, 2:1]三种。

目标检测(六)——Faster R-CNN_第4张图片

  实际上通过anchors就引入了检测中常用到的多尺度方法。关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即上文中提到的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。这9个anchors遍历Conv layers计算获得的feature maps,为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,不用担心,后面还有2次bounding box regression可以修正检测框位置。
目标检测(六)——Faster R-CNN_第5张图片
  在conv5之后,做了rpn_conv/3x3卷积,num_output=256,相当于每个点使用了周围3x3的空间信息,同时256-d不变,同时红框中的3x3卷积,假设一共有k个anchor,而每个anhcor要分foreground和background,所以cls=2k scores;而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates。

softmax判定foreground与background
目标检测(六)——Faster R-CNN_第6张图片
  通过1*1卷及以后输出为18,刚好对应了feature maps每一个点都有9个anchors,同时每个anchors又有可能是foreground和background,所有这些信息都保存WxHx(9x2)大小的矩阵。后面接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。
  在softmax前后都接一个reshape layer为了便于softmax分类。在caffe基本数据结构blob中以如下形式保存数据:blob=[batch_size, channel,height,width],对应至上面的保存bg/fg anchors的矩阵,其在caffe blob中的存储形式为[1, 18, H, W]。而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9*H, W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。

bbox reg回归fg anchors

目标检测(六)——Faster R-CNN_第7张图片

  如上图所示绿色框为飞机的Ground Truth(GT),红色为提取的foreground anchors,那么即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得foreground anchors和GT更加接近。
目标检测(六)——Faster R-CNN_第8张图片
目标检测(六)——Faster R-CNN_第9张图片

  对于窗口一般使用四维向量(x, y, w, h)表示,分别表示窗口的中心点坐标和宽高。对于上图,红色的框A代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:给定A=(Ax, Ay, Aw, Ah),寻找一种映射f,使得f(Ax, Ay, Aw, Ah)=(G’x, G’y, G’w, G’h),其中(G’x, G’y, G’w, G’h)≈(Gx, Gy, Gw, Gh),具体细节可以查看论文。

Proposal Layer生成proposals
  在主干网络中增加了RPN (Region Proposal Network)网络,通过一定规则设置不同尺度的锚点(Anchor)在RPN的卷积特征层提取候选框来代替Selective Search等传统的候选框生成方法,实现了网络的端到端训练。候选区域生成、候选区域特征提取、框回归和分类全过程一气呵成,在训练过程中模型各部分不仅学习如何完成自己的任务,还自主学习如何相互配合。这也是第一个真正意义上的深度学习目标检测算法。

参考

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Faster R-CNN基于代码实现的细节
Object Detection - handong1587

你可能感兴趣的:(目标检测)