fast-RCNN论文笔记(3)

来源:互联网 发布:小米笔记本 游戏 知乎 编辑:程序博客网 时间:2024/06/06 21:44

Fast RCNN比RCNN主要的优点就是速度快。

因为:在RCNN中,在region proposal的forward中,每一个候选区域都需要单独计算,而在fast中,候选区域的计算过程是共享的,可以减少很多重复的计算。另外,fast的训练过程是端到端的。

一、介绍

基础:RCNN

简单来说,RCNN使用以下四步实现目标检测: 
a. 在图像中确定约1000-2000个候选框 
b. 对于每个候选框内图像块,使用深度网络提取特征 
c. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类 
d. 对于属于某一特征的候选框,用回归器进一步调整其位置 

改进:Fast RCNN

Fast RCNN方法解决了RCNN方法三个问题:

问题一:测试时速度慢 
RCNN一张图像内候选框之间大量重叠,提取特征操作冗余。 
本文将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。

问题二:训练时速度慢 
原因同上。 
在训练时,本文先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。

问题三:训练所需空间大 
RCNN中独立的分类器和回归器需要大量特征作为训练样本。 
本文把类别判断和位置精调统一用深度网络实现,不再需要额外存储。

总之,其贡献在于以下4点:

 1.更高的检测质量。
 2.利用多任务损失将训练变为单次训练
 3.训练可以更新所有的网络层
 4.特征缓存不再需要保存在内存中

Fast RCNN的大致步骤如下:


主要步骤描述为:

  • 经过多层的卷积和pooling得到一组feature map
  • 通过SPP net中的ROI projection在这层feature map上找到原图的proposal对应的区域(ROI)
  • 利用spatial pooling的思路,对每个ROI做pooling。具体来说就是把h×w的ROI划分为H×W个grid/sub-window,每个grid大小是h/H × w/W,在每个grid内取max。
  • 把ROI pooling layer对每个ROI(对应回原图就是每个proposal)输出的H×W长的max pooling feature vector接全连接层
  • 全连接层之后有两个输出层,一个softmax分类器,输出该ROI对应的proposal的object类别,一个是bounding box回归层,输出category specific bounding box
二、Fast RCNN结构和训练

2.1 ROI pooling层

 ROI pooling层的作用就是让每一个ROI都能在总的conv feature map中找到自己的对应的patch。
       具体方法是:
       假设一个ROI的尺寸是h*w,需要用max pooling将其池化为一个H*W的map(即用h/H*w/W的窗口滑动进行max pooling),将所有的ROI都pooling到相同的尺寸H*W之后,就可以在总的conv feature map中寻找对应的feature vector。

这一步是fast rcnn的关键解决了rcnn中需要将每一个ROI都过一遍cnn十分浪费时间的问题。先只需将整个图片过一遍cnn,就可以在feature map中提取出ROI对应的patch。

2.2 初始化pre-trained 网络

利用已经训练好的卷积网络,例如ImageNet、VGG16等,将网络最后一个max pooling层用一个ROI pooling层替换,并且将最后的FC层替换成fit max pooling尺寸的,在VGG16中取H=W=7。随后将FC层的输出从1000换为N+1层,N为分类类别,1为背景。最后网络将被调整成可以接纳两个输入更新,分别是图像和RoI。

2.3 Fine-tuning

训练网络的过程可以得到优化。同一张图中的ROI可以共享一个图的Feature map,每一次的随机梯度下降SGD需要N张图片和R个ROI,作者经过试验,发现N=2,R=128时(一次训练两张图,每张图上有128/2 =64个ROi)训练的速度比N=1,R=128(一次训练一张图每张图上128个ROI)要快64倍。最终选择N=2,R=128。

2.4 多任务损失函数 multi-task loss

fast RCNN有两个输出层,分别对应了ROI对应的分类p,和ROI的bounding-box回归t。
在训练的时候,每一个ROI都与一个ground truth(人为标定的正确的)的分类u和一个ground truth的bounding-box目标v绑定。
作者利用一个损失函数把分类和bounding-box一起考虑了进去。
第一个 Loss 是用来训练bounding box 的类别的. 输出是一个离散的概率分布, 输出的节点个数为K+1,
 ,其中K是数据集中的类别数,1是背景。
第二个 Loss 是用来训练 bounding box regression offset 的, 
每一个 RoI 都有两个 label, 一个是类别 
u, 另外一个是 bounding box regression target v. Multi-task loss 定义为:


其中, 是针对 classify 的loss
另外一部分,  是定义在一个四元组上面的 bounding box 的损失函数. 对于类别u,
其ground truth的bbox为:,其预测到的结果为:


针对bbox回归的loss定义是:

其中:

2.5 小批量取样

每个mini-batch来自于N=2张图片,mini-batch size取R=128,也就是从每张图片中取64个ROIs。25%的ROIs来自于候选区域中和标注边界框有至少0.5(IoU)重叠,这些ROIs包含标记有前景对象类的示例,也就是u>=1的那些具体物体,剩下75%的ROIs取自最大IoU在[0.1,0.5)之间的候选区域,代表u=0的背景样例。训练时,图片以0.5概率采用水平翻转,不采用其他的数据增强技术。

2.6 ROI pooling层的反向传播

首先考虑普通max pooling层。设xi为输入层的节点,yj为输出层的节点。 

Lxi={0Lyjδ(i,j)=falseδ(i,j)=true

其中判决函数δ(i,j)表示i节点是否被j节点选为最大值输出。不被选中有两种可能:xi不在yj范围内,或者xi不是最大值。

对于roi max pooling,一个输入节点可能和多个输出节点相连。设xi为输入层的节点,yrj为第r个候选区域的第j个输出节点。 
这里写图片描述 

Lxi=Σr,jδ(i,r,j)Lyrj

判决函数δ(i,r,j)表示i节点是否被候选区域r的第j个节点选为最大值输出。代价对于xi的梯度等于所有相关的后一层梯度之和。

3 全连接层提速(没搞懂)

分类和位置调整都是通过全连接层(fc)实现的,设前一级数据为x后一级为y,全连接层参数为W,尺寸u×v。一次前向传播(forward)即为: 

y=Wx

计算复杂度为u×v

W进行SVD分解,并用前t个特征值近似: 

W=UΣVTU(:,1:t)Σ(1:t,1:t)V(:,1:t)T

原来的前向传播分解成两步: 

y=Wx=U(ΣVT)x=Uz

计算复杂度变为u×t+v×t。 
在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。 
这里写图片描述

4.实验与结论

实验过程不再详述,只记录结论 
- 网络末端同步训练的分类和位置调整,提升准确度 
- 使用多尺度的图像金字塔,性能几乎没有提高 
倍增训练数据,能够有2%-3%的准确度提升 
- 网络直接输出各类概率(softmax),比SVM分类器性能略好 
更多候选窗不能提升性能



0 0