R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN详解

一、R-CNN

R-CNN的全称是Region-CNN,是第一个成功将深度学习应用到目标检测上的算法。R-CNN基于卷积神经网络(CNN),线性回归,和支持向量机(SVM)等算法,实现目标检测技术。

传统的目标检测方法大多以图像识别为基础。 一般可以在图片上使用穷举法选出所所有物体可能出现的区域框,对这些区域框提取特征并使用图像识别方法分类, 得到所有分类成功的区域后,通过非极大值抑制(Non-maximumsuppression)输出结果。

R-CNN的算法流程图如下:

首先输入一张图片,然后提取出2000个左右的候选区域,然后用卷积神经网络提取出每个区域的特征,然后对每个区域用SVM的方法进行分类。R-CNN在PASCAL VOC 2010竞赛上取得了58.5%的平均精确度(mAP)。

R-CNN采用了selective search的方法来提取候选区域。

作者采用了AlexNet来提取特征,最终获得4096维度的向量,输入图像的尺寸是277*277的RGB图像,有5个卷积层和2个全连接层,为了计算候选区域的特征,必须把候选区域转化成标准尺寸的图像(277*277)。

然后将这些区域提取出特征放入到SVM中进行训练,用训练好的模型得到特征向量的分数,在一张图片中得到所有的得分区域,用非极大抑制方法得到最后的框。

二、SPP-Net

SPP-Net可以在任意一个尺度的图片下产生一个固定长度的特征。 

传统的卷积网络和SPP-Net的对比:

卷积网络结构和特征图:

空间金字塔pooling层。黑色图片代表卷积之后的特征图,接着我们以不同大小的块来提取特征,分别是4*4,2*2,1*1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins),我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。因为黑色图片有256张,所以最后产生21*256维的特征向量,输入到分类器中。

 

论文中将网络的训练分为两种:一种是single-size,一种是Multi-size。

single-size的训练过程:

理论上说,SPP-net支持直接以多尺度的原始图片作为输入后直接BP即可。实际上,caffe等实现中,为了计算的方便,GPU,CUDA等比较适合固定尺寸的输入,所以训练的时候输入是固定了尺度了的。

Multi-size training

使用两个尺度进行训练:224*224 和180*180

训练的时候,224x224的图片通过crop得到,180x180的图片通过缩放224x224的图片得到。之后,迭代训练,即用224的图片训练一个epoch,之后180的图片训练一个epoch,交替地进行。

两种尺度下,在SSP后,输出的特征维度都是(9+4+1)x256,参数是共享的,之后接全连接层即可。

论文中说,这样训练的好处是可以更快的收敛。

SPP-Net与R-CNN的对比:

对于R-CNN,整个过程是:

首先通过选择性搜索,对待检测的图片进行搜索出~2000个候选窗口。 

把这2k个候选窗口的图片都缩放到227*227,然后分别输入CNN中,每个proposal提取出一个特征向量,也就是说利用CNN对每个proposal进行提取特征向量。 

把上面每个候选窗口的对应特征向量,利用SVM算法进行分类识别。 

可以看出R-CNN的计算量是非常大的,因为2k个候选窗口都要输入到CNN中,分别进行特征提取。

而对于SPP-Net,整个过程是:

首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。

特征提取阶段。这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。

最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。

SPP-Net的意义就是,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。

三、Fast R-CNN

Fast R-CNN的结构如下图所示:

该网络结构的输入是一张整个的图片和一系列的物体候选区域。网络首先用几个卷积和最大池化的得到特征图,然后对每个候选区域一个ROI池化层会从特征图得到一个固定长度的特征向量。每一个特征向量和全连接层相连,最后分成两个输出层:一个产生概率,一个产生4个数字,代表某一类物体框的位置信息。

ROI Pooling层:先对输入图像使用一次CNN前向计算, 得到整个图像的特征图, 再在这个特征图中分别取提取各个候选区域的特征。由于候选区域的大小不一样, 而对应的特征需要要具有固定的特征长度,因此该方法对各个候选区域分别使用ROI Pooling。假设第i个候选区域ROI的大小为hi×wi, 要使输出的大小为h×w�,那么就将该ROI分成ℎ × w个格子,每一个格子的大小为hi/h×wi/w, 然后对每一格子使用max-pooling, 最终得到大小为h×w的特征图像。

代价函数:

cls_score用于分类,输出K+1维数组p,表示属于K类和背景的概率。

bbox_prdict用于调整候选区域位置,输出4*K维数组t,表示分别属于K类时,应该平移缩放的参数。

该算法的问题是生成候选区域的Selective Search算法处理一张图像大概需要2s时间, 依然是检测速度的瓶颈。

四、Faster R-CNN

算法结构图如下。Faster R-CNN提出了Region Proposal Network (RPN),从与fast R-CNN共享的卷积层中估计候选区域。由于RPN与fast R-CNN在前几个卷积层共享参数, 因此,候选区域计算与分类网络计算有大部分重合, 大大减少整体检测时间。

具体过程:

得到最终用来预测的feature map:图片在输入网络后,依次经过一系列conv+relu (套用ImageNet上常见的分类网络即可。本论文实验了5层的ZF,16层的VGG-16)得到的feature map,额外添加一个conv+relu层,输出51*39*256维特征(feature map)。准备后续用来选取proposal,并且此时坐标依然可以映射回原图。

计算Anchors: 在feature map上的每个特征点预测多个region proposals。具体作法是:把每个特征点映射回原图的感受野的中心点当成一个基准点,然后围绕这个基准点选取k个不同scale、aspect ratio的anchor。论文中3个scale(三种面积{ 128^2, 256^2,

521^2),3个aspect ratio({1:1,1:2,2:1})。虽然 anchors 是基于卷积特征图定义的,但最终的 anchos 是相对于原始图片的。

 

 

 

 

关于正负样本的划分: 考察训练集中的每张图像(含有人工标定的ground true box) 的所有anchor(N*M*k)。

a. 对每个标定的ground true box区域,与其重叠比例最大的anchor记为 正样本 (保证每个ground true 至少对应一个正样本anchor)

b. 对a)剩余的anchor,如果其与某个标定区域重叠比例大于0.7,记为正样本(每个ground true box可能会对应多个正样本anchor。但每个正样本anchor 只可能对应一个grand true box);如果其与任意一个标定的重叠比例都小于0.3,记为负样本。

 

上图是原始图片上的 Anchor Centers。

上图中,左:Anchors;中:单个点的 Anchor;右:全部Anchors。

定义损失函数:对于每个anchor,首先在后面接上一个二分类softmax,有2个score 输出用以表示其是一个物体的概率与不是一个物体的概率 (p_i),然后再接上一个bounding box的regressor 输出代表这个anchor的4个坐标位置(t_i),因此RPN的总体Loss函数可以定义为 :

i表示第i个anchor,当anchor是正样本时 p_i^* =1 ,是负样本则=0 。t_i^* 表示 一个与正样本anchor 相关的ground true box 坐标 (每个正样本anchor 只可能对应一个ground true box: 一个正样本anchor 与某个grand true box对应,那么该anchor与ground true box 的IOU要么是所有anchor中最大,要么大于0.7)

x,y,w,h分别表示box的中心坐标和宽高,x,x_a,x^* 分别表示 predicted box, anchor box, and ground truth box (y,w,h同理)t_i 表示predict box相对于anchor box的偏移,t_i^* 表示ground true box相对于anchor box的偏移,学习目标自然就是让前者接近后者的值。

作者发布的源代码里用了一种叫做4-Step Alternating Training的方法,思路和迭代的Alternating training有点类似,但是细节有点差别:

第一步:用ImageNet模型初始化,独立训练一个RPN网络;

第二步:仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;

第三步:使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;

第四步:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。

 

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值