Faster RCNN的一些Note

简单回忆一下Fast RCNN的流程。Fast RCNN首先通过selective search,挑选出若干候选框,然后将候选框中的图片输入到卷积网络中提取特征,然后经过一个ROI pooling 层,将特征resize到相同大小。最后是一个multi-task模型,一部分是分类任务,区分对应图片是背景还是含有object,对应的object是什么;另一部分是一个回归任务,做了bbox regression。

Faster RCNN 与之前相比,重点在于提出了Region Proposal Network,可以利用卷积神经网络来提出候选框,取代之前的Selective Search的工作。Selective Search在很大程度上还是基于人工规则提取,比如说颜色、纹理等等特征,这些特征也属于比较底层的特征。SS方法在提取了大量的候选框以后,构造了一些方法来计算相似度,然后将相近区域融合在一起。提取的过程中计算量还是挺大的,也有很多的重复计算。所以Faster RCNN在速度上是有明显的提升的。

Faster rcnn的结构,先利用卷积网络提取图片的特征(feature map),然后分两个支路:

  1. RPN的支路,它的输出(y)就是很多候选框,它里面是否包含object,object属于哪一类,以及它的位置信息;
  2. 然后另一个支路根据这些候选框提取特征,过roi pooling 层
  3. 然后就有一个classifier,告诉你这里面是不是有object。

我们看RPN的结构,从feature map (假设是M \times M \times channels)的每个n\times n\times channels的块作为输入。(很像那种把图片一点一点切片丢进卷积网络的那种做法。)怎么弄成256-d的向量呢,找256个对应size的filter就可以了。

关于anchor box。我看了一下Andrew Ng的视频,他里面讲anchor大概是这样的,首先原图分成了很多grid,然后一个anchor(矩形框)可以通过这个矩形框在这个grid的中的位置,矩形框的长、宽和grid的size的比值来表示。这里有y的定义就相对好理解。y_i=(p_c,b_x,b_y,b_w,b_h,c_1, c_2,c_3),y=(y_1,y_2,...,y_k).每个y_i对应一个anchor,p_c对应是否是object,c_1表示是否属于第一类。在一个grid里面对应有多个anchor,这是因为可能有多个object的中心都在一个grid里面(比如人和车),那不同size和面积的anchor可以分出不同的object。当然如果object多于anchor数量之类还是挺难的。

在Faster RCNN中使用 multi-scale anchor 来取代multi-scale filter 和multi-scale image. 为什么multi-scale anchor的效果好呢?一个小的揣测:可能用不同的filter,感受野不同,然后可以反推出框的scale;但相同的filter也可以同样的提取足够的特征信息,知道这个地方有没有这件物体,也可以学到这个感受野内的图像信息这是局部信息还是整体信息,选择相应的scale。

训练RPN:损失函数的定义,考虑到y的定义其实很好理解为什么要在回归的部分乘上p_c,如果是背景,就不存在回归bbox的问题了嘛。bounding box regression:

RPN如何与Fast CNN共享卷积层:使用了交替训练的方法

  1. 利用一个预训练的网络初始,训练RPN网络;
  2. 训练一个Fast RCNN网络,它的候选框由第一步的RPN网络给出;
  3. 利用第2步训练出的detection网络来初始化RPN,固定共享的卷积层,只在与RPN有关的层上fine-tuning
  4. 在只与Fast-RCNN相关的层上fine-tuning。

当然可以迭代的进行这些操作,不过通过实验迭代并没有带来很多变化。

你可能感兴趣的:(Faster RCNN的一些Note)