Fast R-CNN: Fast Region-based Convolutional Networks for object detection(阅读)

来源:互联网 发布:mill9.1编程入门教程 编辑:程序博客网 时间:2024/06/11 10:44

Fast R-CNN

  • arxiv: http://arxiv.org/abs/1504.08083
  • slides: http://tutorial.caffe.berkeleyvision.org/caffe-cvpr15-detection.pdf
  • github: https://github.com/rbgirshick/fast-rcnn
  • webcam demo: https://github.com/rbgirshick/fast-rcnn/pull/29
  • notes: http://zhangliliang.com/2015/05/17/paper-note-fast-rcnn/
  • notes: http://blog.csdn.net/linj_m/article/details/48930179
  • github(“Fast R-CNN in MXNet”): https://github.com/precedenceguo/mx-rcnn
  • github: https://github.com/mahyarnajibi/fast-rcnn-torch
  • github: https://github.com/apple2373/chainer-simple-fast-rnn

看名字就知道速度比R-CNN快。

论文整体实验流程如下图


以AlexNet(5个卷积和3个全连接)为例,大致的训练过程可以理解为:

  1. selective search在一张图片中得到约2000个object proposal(这里称为RoI)
  2. 缩放图片的scale得到图片金字塔,FP得到conv5的特征金字塔。
  3. 对于每个scale的每个ROI,求取映射关系,在conv5中crop出对应的patch。并用一个单层的SPP layer(这里称为Rol pooling layer)来统一到一样的尺度(对于AlexNet是6x6)。
  4. 继续经过两个全连接得到特征,这特征有分别share到两个新的全连接,连接上两个优化目标。第一个优化目标是分类,使用softmax,第二个优化目标是bbox regression,使用了一个smooth的L1-loss.
=============================================================================

细节一:Rol pooling layer

Rol pooling layer其实是一个max pooling layer。假设有两个超参数H、W,把输入的patch划分成H*W个小方格,假设投影的每个ROI的patch为h*w,则每个小子方格的大小没h/H*w/W,而在每个方格中,执行的是max pooling layer 的操作。

它的作用主要有两个,一个是将image中的rol定位到feature map中对应patch(如何找到对应的位置呢?http://caffecn.cn/?/question/135,首先计算rois映射到feature map的坐标,即原始坐标*spacial_scale【大小为所有stride的乘积分之一】,然后针对每个输出来进行计算,即每个输出点都代表原先的一块区域,这个区域大小为bin_h= roi_height / pooled_ height, bin_w=roi_width / pooled_width.遍历所有top的点所映射回feature map的区域,并找到最大值,记录最大值所在的位置),另一个是用一个单层的SPP layer将这个feature map patch下采样为大小固定的feature再传入全连接层。

它的backward没有cpu形式,直接写成gpu的形式,遍历feature map并记录n, c, h, w,为之后记录bottom_diff做准备,然后计算每个roi映射到feature map的坐标,


如果h,w如果不在roi区域内的话,可以直接continue了,某个点在roi中可能对这个roi所对应的top产生贡献(在某个bin中为最大),如果点不在那个区域中,一定不会对top产生贡献。而某一点可能对多个区域产生贡献,故loss返回来时,同一点的loss累加。判决函数[i=i*(r,j)]表示i节点是否被候选区域r的第j个输出节点选为最大值输出。

具体这个训练前向和反向传播的详细见RoI池化层的解释。

细节二:Mini-batch sampling

当使用pre-trained网络的参数去初始化Fast RCNN网络时,需要三个改变。第一,把最后一层的max pooling使用ROI pooling层去替代;第二、最后一层fc层以及softmax层用softmax层和bounding box预测层替代;第三,输入包含两种数据:image以及ROI。

batch就是完成一次训练的数据集,这里对参数进行tune,就是有监督训练对参数进行微调(使用的是SGD,随机梯度下降法)。mini batch是通过随机采样得到的,首先随机选择N张图片,然后每张图片随机采样R/N个ROI。论文采用R=128,N=2。

一次处理先是一张的图片,在最后输出层计算这张图片的产生的loss,把batch里的图片全部输入到网络里,就产生了loss的和LOSS,这时可以使用这个LOSS去执行BP算法,微调网络中的参数。因为SGD求解循环是从1开始,所以先处理一张。

(详细见http://www.cnblogs.com/maybe2030/p/5089753.html#_label2)

同样的,当IOU至少是0.5的才有可能是带有类别标志的,而0.1到0.5的认为是背景,而低于0.1的act as a heuristic for hard example mining.

文中有一个分层采样技巧:

RoI-centric sampling:从所有图片的所有RoI中均匀取样,这样每个SGD的mini-batch中包含了不同图像中的样本。(SPPnet采用) 
FRCN想要解决微调的限制,就要反向传播到spp层之前的层,反向传播需要计算每一个RoI感受野的卷积层,通常会覆盖整个图像,如果一个一个用RoI-centric sampling的话就又慢又耗内存。 
image-centric sampling: mini-batch采用层次取样,先对图像取样,再对RoI取样,同一图像的RoI共享计算和内存。从所有的图片中 sample 得到N张图片,对这N张图片, 每张图片中再 sample R/N个RoI,把这R个 RoI 作为一个minibatch 进行训练。


在微调时,每个SGD的mini-batch是随机找两个图片,R为128,因此每个图上取样64个RoI。从object proposal中选25%的RoI,就是和ground-truth交叠至少为0.5的。剩下的作为背景。

细节三:Multi-task loss



对于分类loss,是一个K+1路的softmax输出,其中的K是类别个数,1是背景。
对于回归loss,是一个4xK路输出的regressor,regressor的loss不是L2的,而是一个平滑的L1,L1对于离群点更加鲁棒,控制梯度的量级使得训练时不容易跑飞。

其中结果输出

-cls_score层用于分类,输出K+1维数组p,表示属于K类物体和背景的概率; 
-bbox_predict层用于调整候选区域位置,输出4*K维数组,也就是说对于每个类别都会训练一个单独的回归器; 

-loss_cls层评估分类代价,由真实分类u对应的概率决定见公式(1)中的第一个函数:

-loss_bbox评估回归损失代价,比较真实分类u对应的预测平移缩放参数t和真实平移缩放参数v的差距见公式(2);

细节四:SVD分解FCs

分类和位置调整都是通过全连接层(FCs)实现的,设前一级数据为X,后一级为Y,全连接层参数为W。一次前向传播计算复杂度为u*v,计算复杂度变为u*t+v*t(若t<min(u,v)则这种分解会大大减少计算量),在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置;实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作。如图分解:



细节五:需要更多的proposals???



0 0