【Deep Learning】Faster R-CNN

来源:互联网 发布:淘宝培训机构靠谱吗 编辑:程序博客网 时间:2024/06/05 13:28

  这篇是 RCNN 系列的最后一篇,论文的内容主要就是对之前的 Fast R-CNN 进一步的提升检测速率,主要的贡献则是将之前网络中的 region proposal 过程也加入到了整个网络过程中,根据 FCN(全卷积网络)提出了 RPN 方法用来选出图片中的候选框。使得原来检测过程中的最耗时的部分也一并加入到了网络这个整体中,并采取特殊的训练策略。总之, Faster R-CNN 网络做到了在保证检测率不下降的同时,极大地减小了检测时间。


1.综述

  首先我们来总结对比一下之前提到的网络的目标检测步骤,大致步骤都有四步,也就是“候选区域的生成 -> 特征提取 -> 分类 ->位置精修”,然而在之前的网络中,一直到 Fast R-CNN,只是做到了将后面的三个部分放在了同一个网络内,也就是在训练的过程中做到了 end-to-end。然而在第一步,也就是候选区域的生成过程,仍然使用的是传统的 SS 方法,使得在这个过程中极大地占用了检测时间。
  而 Faster R-CNN 的提出,通过引入 RPN 网络,成功的将这一部分也放入一整个流程中,使得从候选区域生成到最后的分类与回归做到了真正的 end-to-end。我们可以用下面的图来表示这几个网络的关系。
这里写图片描述
  所以说,这篇文章的终点主要有两个,也就是

  • 提出了使用 RPN 来代替 SS 产生 region proposal
  • 通过交替训练,使得 RPN 能够和 Fast R-CNN 共享网络参数

实际上,Faster R-CNN 与之前的 Fast R-CNN 的最大不同也就是使用 RPN 来代替 SS 了。
下面分别进行介绍。


2. 整体框架

  首先给出论文中的图像:
这里写图片描述
  整个网络的大致框架如上图所示,同样说明了对于使用 Fast R-CNN 来说,处理一张图像的流程为

原图像 -> 卷积提取特征 -> RPN 产生 region proposals -> 利用 Fast R-CNN 分类 ->位置精修(b-box 回归过程)

  此外,还需要说明,在整个 Fast R-CNN 中,有三种尺度:

  1. 原始尺度:原始输入的大小。且不受其余的限制,不影响性能;
  2. 归一化尺度:输入特征提取网络的大小,在测试时设置,源码中 opts.test_scale=600。此外,anchor 在这个尺度上设定。这个参数和 anchor 的相对大小决定了想要检测的目标范围;
  3. 网络的输入尺度:输入特征检测网络的大小,在训练时设置,源码中为 224*224、

  这部分的最后说明,在 Faster R-CNN 这个整体网络中,一共有四个损失函数,可以用下图来表示,具体内容会在下文中进行介绍。
这里写图片描述
  上图中可以看出,这四种损失函数分别为:

  • RPN 的 分类损失
  • RPN 的 b-box 回归损失
  • Fast R-CNN 的分类损失
  • Fast R-CNN 的b-box 回归损失

3. 具体细节

  下面分别具体介绍 Faster R-CNN 中的各个模块。

3.1 Region Proposal Networks

首先给出论文中的 RPN 网络的示意图:
这里写图片描述

  RPN 的输入时任意大小的图像,输出是一组打过分的候选框(object proposals)。在卷积的最后一层 feature map 上使用固定大小的窗口进行滑动(上图中使用的事3*3),每个窗口会输出固定大小维度的特征(上图中给出的例子是256维),而每个窗口对候选的 9 个 box 进行回归坐标和分类,需要注意的是,在 RPN 中,分类指的是候选框中是不是有目标物体,而不是对其内部的具体类别进行分类。
  下面对上图进行详细的讲解
  首先看一段论文中的原话:

We use n=3 in this paper, noting that the effective receptive field on the input image is large (171 and 228 pixels for ZF and VGG, respectively).

  上面这段话是说,虽然这里使用的滑窗的窗口大小只有 3,但是需要注意的是它所对应的 receptive field 是很大的,也就是说它在原图中的对应区域是很大的,对于 ZF 网络来说,有171 像素,对于 VGG 网络有228像素。(个人猜测具体计算方法和之前的 SPP-Net 与 Fast R-CNN 的feature map 和 原图找对应点的方法相同或者类似)。

3.1.1 Anchor

  在 RPN 中,对 Anchor 的理解十分重要,这里还是首先给出原文:

An anchor is centered at the sliding window in question, and is associated with a scale and aspect ratio (Figure 3, left). By default we use 3 scales and 3 aspect ratios, yielding k = 9 anchors at each sliding position. For a convolutional feature map of a size W×H (typically ~2,400), there are WHk anchors in total.

  上面这段话是说,每一个 anchor 指的是每一个滑窗的中心位置,同时,每个 anchor 对应着 3 中尺度和三种 宽高比,因此在每个滑窗的位置会产生 k=9 个不同的 anchors,具体情况和上图右面的情况相同。
  anchor box 的作用是产生不同比例以及尺度的 region proposlas,通过将 anchor 中心点与滑窗中心点进行对其,然后按照一定的比例和大小对滑窗所对应的原图进行剪裁。也就是说,在 feature map 上每个点,在原图上都对应了 9 个anchors,下图能够很好的说明这一点:
anchors示意图
  可以看出,论文中所谓的 anchors,并不是在特征图级别上的,而是在所对应的原图上的。而至于 anchor size,其实是根据检测图像而进行设置的。
  而这 9 个 anchors 的作用,就是用来遍历 Conv layers 获得的 feature map,为每一个点都配备这9中 anchors 作为初始的检测框。当然,这样获得的检测框不会很准确,但是我们从整个网络来看,后面还会涉及到两次的 b-box regression,这两次回归处理都会对这个位置进行修正。
  我们会发现利用这种 anchors 机制选出来的框的数量会很多,如果全都输入网络内会造成很大的负担,因此我们可以选出得分靠前的一些框作为网络的输入,至于怎么评价得分的高低在后面会进行介绍。

3.1.2 Translation-Invariant Anchors

还是首先给出原文:

An important property of our approach is that it is translation invariant, both in terms of the anchors and the functions that compute proposals relative to the anchors. If one translates an object in an image, the proposal should translate and the same function should be able to predict the proposal in either location. This translation-invariant property is guaranteed by our method.

  上面这段话是说,本文提出的这种方法是具有“平移不变性(Translation-Invariant )”的。而平移不变性也正是计算机视觉任务中的一个挑战,也就是说,如果平移了图像中的目标,则建议框也应该进行平移,且应该可以用同样的函数预测该建议框。

3.1.3 Multi-Scale Anchors

  首先给出原文:

Our design of anchors presents a novel scheme for addressing multiple scales (and aspect ratios). As shown in Figure 1.
Figure1

  上面这段话是说,本文提出的方法是能够解决多尺度问题的,多尺度问题具体是指,比如说在一个人脸检测的任务中,小的人脸(例:24*24)和大的人脸(例:640x480)如何在同一个训练好权值的网络中都能进行正确的检测。
  文中说之前常见的多尺度方法主要有两种,再加上文中的 anchors 机制,一共是三种,这里来进行一下简单的总结:根据目标检测(5)-Faster RCNN

  • 图像金字塔:通过将图像放缩到不同的尺寸,然后提取特征去做。这有点类似有在 R-CNN 中的方法,显然这样需要为每一个尺寸重复进行特征提取,成本很高。
  • 卷积特征金字塔:首先对于图像提取卷积特征,然后将卷积特征方所到不同的尺寸。这里类似于 SPP 中的实现方式。
  • anchor 金字塔:通过不同尺度的 anchors 在卷积特征上滑窗相当于是 anchor 金字塔,而且不需要图像有多个尺度,仅需要有多个尺寸的anchor就好了。文章使用了3种尺度以及3种比例。

3.2 RPN loss function

首先给出原文:

For training RPNs, we assign a binary class label (of being an object or not) to each anchor. We assign a positive label to two kinds of anchors: (i) the anchor/anchors with the highest Intersection-over-Union (IoU) overlap with a ground-truth box, or (ii) an anchor that has an IoU overlap higher than 0.7 with

  上面这段话是说,为了训练 RPN,我们指定两类 anchors 为正样本,(i)与真实边框具有组大 IoU 的边框。(ii)与真实边框 IoU 大于 0.7 的边框。

We assign a negative label to a non-positive anchor if its IoU ratio is lower than 0.3 for all ground-truth boxes. Anchors that are neither positive nor negative do not contribute to the training objective.

  而负样本,我们选用的是那些与真实边框的 IoU 小于 0.3 的边框。那些既不属于正样本也不属于负样本的 anchors 对训练目标并不起作用。
  需要说明的是,一个真实包围盒可以对应多个 anchor,这样一个真实包围盒就可能有多个正标签。此外,事实上,在找正样本时仅使用第二个条件就可以找到足够的正样本,但是对于一些极端的情况,例如所有的 anchor 对应的 anchor box 与真实边框的 IoU 都不大于 0.7,则可以采用第一种规则进行生成。

  有了对正负样本的定义,我们就可以定义损失函数,这里的损失函数是一个多任务损失函数,如下所示:

L({pi},{ti})=1NclsiLcls(pi,pi)+λ1NregipLreg(ti,ti)

  需要说明的是,这是对于每一张图像来说的损失函数。
  从上面这个损失函数的公式可以看出,这个损失函数的定义遵循 multi-task loss 定义,最小化目标函数,其中,

  • pianchor 预测为目标的概率;
  • GT 标签: pi={0,1,negative labelpositive label
  • ti={tx,ty,tw,th} 是一个向量,表示预测的 bounding box 包围盒的 4 个参数化坐标;
  • Lcls(pi,pi) 是两个类别(目标和非目标)的对数损失:
    Lcls(pi,pi)=log [pipi+(1pi)(1pi)]
  • ti 是与 positive anchor 对应的 真实包围盒的坐标向量
  • Lreg(ti,ti) 是回归损失,计算方法为
    Lreg(ti,ti)=R(titi)
    其中,R 指的是 smooth L1 损失函数,具体形式在之前的文章中已经有介绍,在这里就不进行赘述。
  • 在损失的后一项中我们可以看到,pi 这一项意味着只有前景 anchor(pi=1) 才会有回归损失,其他情况则没有。cls 层和 reg 层的输出分别由 {pi}{ui} 组成,这两项分别由 NclsNreg 以及一个平衡权重 λ 进行归一化。

      总的来说, RPN 包含了两个网络分支,也就是分类层和回归层。分类层废除一个二分类的 label,也就是这个 region 中是否包含目标,回归层产生目标的位置。回归层采用的方法和 Fast R-CNN 中的方法一致。
      与 Fast R-CNN 不同点如下:

  • 分类损失是一个二分类,一个是类别相关的分类

  • 回归损失是一个非类别相关的,而在 Fast R-CNN 中是类别相关的;
  • Fast R-CNN 中 ROI Pooling 后面跟着两个 FC 然后再到相应的分类或者是回归。而 RPN 中则是一个全卷积的过程,包括对于后续的向量全谅阶操作都是通过 11 卷积实现的。而且文论回归还是分类从 256-d 向量到后面都只有一个卷积层。
  • 9 个anchor 的回归 参数不共享,但是每个滑窗位置的参数是共享的。

3.3 RPN 训练

  给出原文:

The RPN can be trained end-to-end by backpropagation and stochastic gradient descent (SGD). We follow the “image-centric” sampling strategy from [2] to train this network. Each mini-batch arises from a single image that contains many positive and negative example anchors. Instead, we randomly sample 256 anchors in an image to compute the loss function of a mini-batch, where the sampled positive and negative anchors have a ratio of up to 1:1. If there are fewer than 128 positive samples in an image, we pad the mini-batch with negative ones.

  可以看出,我们可以使用 SGD 端到端的对 RPN 进行训练。我们在每个图像中随机取出 256 个 anchors 进行训练,其中正负样本的比例是 1:1。

3.4 Faster R-CNN 训练方式

  因为 RPN 和 Fast R-CNN 的特征提取部分是相同的,因此可以将这两部分得到的权值进行共享,也就是生成候选区域和检测之间的共享。这从最上面的 Faster R-CNN 的整体框架中也可以看出。

  文中提出了三种训练方式:

  1. 交替训练,也就是先训练 RPN-> Fast R-CNN -> RPN -> Fast R-CNN 这样一直迭代下去
  2. 近似联合驯良,将每一次反向传播的 RPN 的梯度和 Fast R-CNN 的梯度进行合并
  3. 联合训练,从 Fast R-CNN 一直往后传递,RPN 看做是 Fast R-CNN 的输入。

最后,论文中采用的是四步交替训练法

  • 训练 RPN 网络,通过使用 ImageNet 数据与训练好的网络初始化网络,然后进行 end-to-end 的 微调;
  • 使用 Fast R-CNN 训练模型,将上一步 RPN 的输出的 region proposals 作为输入,同时也用 ImageNet 的与训练好的网络进行初始化,此时 RPN 和 Fast R-CNN 并没有共享网络
  • 使用 Fast R-CNN 训练的网络初始化 RPN 网络,接着训练 fine-tune RPN 网络中的非公共部分
  • 对 Fast R-CNN 进行微调,只修改非公共部分

其中最后两步可以通过迭代进行,但是作者发现迭代只能带来很少的收益。

3.4 实现细节

  在进行实现时将所有的图像都 resize 到 短边为 600 像素值,然后再送入神经网络进行检测,并利用分类的分数进行 NMS(非极大值抑制),得到最后的结果。需要说明的是,在测试的时候我们仅仅选用前 300 个 proposal,通过实验可以看出效果也十分的好。
  此外,由于图片大小是固定的,feature map 中的 anchor box 可能并非完全在照片内部,需要将所有超出图像边界的 anchor box 都删掉。作者发现,如果不删掉这些 anchors 就可能导致最终的训练不收敛。在测试的时候,由于 proposal boxes 是 RPN 网络预测出来的,所以可能会导致 anchor 不完全在图像内,处理方法是将超出图片的部分使用就近的图片边界替代

4. 综合对比

这里来对比一下 从 R-CNN 到 Fast R-CNN 再到本文的 Faster R-CNN。
from Faster RCNN解析
这里写图片描述

5.参考文献:

  1. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  2. Faster RCNN解析
  3. 目标检测(5)-Faster RCNN
  4. Faster-RCNN算法精读
原创粉丝点击