目标检测向:Fast R-CNN

Abstract

 

1. Introduction

背景:现有的SOTA都是通过multi-stage pipelines的方式,这样会导致速度降低,模型较为复杂。

挑战:

 

  • 需要预先加工出proposals
  • 后续需要对这些较为不精确的proposals进行refine

解决办法:提出一个单阶段训练算法,可以同时学会对proposals进行分类以及refine空间位置。

 

1.1 R-CNN和SPPnet

R-CNN的显著缺点:

 

  • 训练是多阶段的pipeline:首先用SS提取region proposal,进行warp/crop后送去CNN进行卷积得到特征,送进SVM里面进行分类,最后送到bbox regression里面进行位置修偏;
  • 训练对时间和空间的占用都很大:无论是SVM还是bbox regressor的训练,都是对每张图片上的每一个proposal进行的,并且要写入硬盘;
  • 目标检测速度很慢:在GPU上,VGG16的速度是每张图片46s。它慢的原因是卷积前向传播是针对每一个proposal进行的,没有进行计算共享。

SPPnet是通过共享计算实现了速度的提升。

 

  • 通过对整张图片进行卷积特征图计算;
  • 通过从共享特征图上提取的特征向量对每个proposal进行分类。具体的特征提取方式是,通过最大池化将proposal中的特征图映射为一个固定大小的输出;
  • 同时选择好几种大小的输出,最后将它们连接起来

SPPnet的显著缺点:

 

  • 类似R-CNN,同样是一个多阶段的pipeline;
  • 特征同样要写入内存中去;
  • SPPnet中提到的fine-tuning算法无法更新SPP层前面的卷积层,这就限制了深度神经网络的准确性(?)

 

2. Fast R-CNN architecture and training

下图展示了Fast R-CNN的结构

目标检测向:Fast R-CNN_第1张图片

网络首先对整张图片用conv和pooling层进行加工,产生一张卷积特征图。随后,对于每一个proposal,RoI pooling层将会从中提取出一个固定长度的特征向量,随后将这一特征向量送到全连接层中去,这一全连接层分类两个子输出层:一个输出K+1个类别的softmax概率估计,另一个输出K个类别的bbox位置。

2.1 The RoI pooling layer

  • RoI pooling层通过最大池化将任意RoI中的特征转化成一个有着固定空间大小为H x W的小特征图。其中H和W是在每个RoI之间相互独立的超参数。每一个RoI都是由4个参数定义的,(r, c, h, w)分别代表左上角(r, c)以及高度和宽度(h , w)。
  • 可以看出RoI pooling只是SPPnet中spp layer的一种特殊情况,即只存在一种pyramid level的情况。
  • RoI pooling的具体操作就是在下面的图中进行max-pooling。

目标检测向:Fast R-CNN_第2张图片

2.2 Initializing from pre-trained networks

对3个在ImageNet上进行预训练的模型进行过实验,这3个模型都有5个max pooling层,5~13个conv层。当使用这些预训练模型对Fast R-CNN进行初始化时,首先需要进行三个转化:

 

  • 最后一个max pooling层用RoI pooling替代,并设置合适的H和W,以此匹配随后的第一个fc层
  • 预训练网络的最后一个fc层和softmax层用两个sibling层替代(一个是关于K+1个类别的softmax概率,另外一个是bbox回归)
  • 将网络输入修改为两种输入,分别是图片和图片中的RoI

2.3 Fine-tuning for detection

Fast R-CNN可以通过BP训练网络所有参数。First, let’s elucidate why SPPnet is unable to update weights below the spatial pyramid pooling layer. 

The root cause is that back-propagation through the SPPlayer is highly inefficient when each training sample (i.e.RoI) comes from a different image, which is exactly how R-CNN and SPPnet networks are trained. The inefficiency stems from the fact that each RoI may have a very large receptive field, often spanning the entire input image. Since the forward pass must process the entire receptive field, the training inputs are large (often the entire image).

上面这一段表面意思可以看懂,但并不知道SPPnet为什么不能用BP去更新SPP层前面的所有层的权重,以及SPPnet和R-CNN的训练方式具体是什么。为什么说每个训练样本来自于不同的图片?

Fast R-CNN中,SGD的minibatches是按照层级进行抽样的,即先抽取N张图片,然后从每张图片中抽取出R/N个RoI。同一张图片中的RoI在前向传播和反向传播过程中是共享计算和内存的。举个例子,比如当N=2, R=128时,Fast R-CNN中的训练方法就是从128张图片中抽取1个RoI(据说是SPPnet和R-CNN的训练策略)速度的64倍。

Multi-task loss

Mini-batch sampling

在fine-tuning过程中,每个SGD的batch size为2,即每个SGD的mini-batch来自于两张图片,每张图片中抽取64个RoI。同R-CNN中类似,25%的RoI来自于那些和gt bbox的IoU大于0.5的proposals,它们的u大于等于1;余下的RoI来自于同gt boxes的最大IoU介于[0.1, 0.5)的那些proposal,它们的u=0。0.1是根据hard example mining方法得到的。训练的时候,图片以0.5的概率进行翻转。

Back-propagation through RoI pooling layers

考虑N=1的情况,x_i代表RoI池化层的第i个输入,y_rj代表第r个RoI的第j个输出。

目标检测向:Fast R-CNN_第3张图片

2.4 Scale invariance

为了实现检测的大小不变性,作者实验了两种方法,分别是BF蛮力算法和图像金字塔方法。前种方法中训练和测试时所有图片都先被加工到某种特定大小。两种方法的具体做法都参考SPPnet中的方法即可。

 

3. Fast R-CNN detection

你可能感兴趣的:(NN,算法)