Fast R-CNN 笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24548569/article/details/82024392

1 Motivation

作者之前提出的R-CNN速度实在是太慢了,无论是在训练过程还是在预测过程,速度都难以让人忍受。SPPnet 改进了R-CNN运行慢的缺定,但是 SPPnet 不能对 spatial pyramid pooling 层进行 fine-tune,这就限制了深度网络的精度。作者提出了新的网络—— Fast R-CNN,结合了 R-CNN 和 SPPnet 的优点,同时改正了二者的缺点。

2 Innovation

提出了 Fast R-CNN 网络。

3 Adavantages

Fast R-CNN 在提高了训练和测试速度的同时提高了目标检测的精度,比 R-CNN 和 SPPnet 快,又比它们的精度高。

Fast R-CNN 训练 VGG16 比 R-CNN 快9倍,在测试中快213倍,而且在 PASCAL VOC 2012 有更高的 mAP。对比 SPPnet,训练快3倍,测试快10倍,精度更高。

4 Related Work

R-CNN

R-CNN 有以下缺点:

  • 训练是一个多阶段的 pipline。首先对卷积网络进行 fine-tune,接着训练SVM用来对目标进行分类,最后训练 bounding-box 回归器提高目标定位的精准度。
  • 在空间和时间上训练的代价太大。当训练非常深的网络,例如 VGG16,训练5k张图片需要2.5个GPU-days。训练过程提取的特征需要存放到硬盘,需要几百G的存储空间。
  • 目标检测过程很慢。使用 VGG16 进行在GPU中对一张图片进行检测需要47s。

SPPnet

SPPnet首先对整个图片计算 feature map,然后从 feature map 中提取特征向量对每个 object proposal 进行分类,这样比 R-CNN 快。通过 spatial pyramid pooling 把 object proposal 的 feature map 转成固定大小的特征向量。

SPPnet的缺点是:训练过程也是多阶段的 pipline。而且,不能对 spatial pyramid pooling 层进行 fine-tune,这就限制了网络的精度。

5 Model

Fast R-CNN 的架构如下:
Fast R-CNN architecture

Fast R-CNN 输入的是一张图片和多个 RoI,然后接一个卷积网络,可以是 AlexNet、VGG_CNN_M_1024、VGG16 等。接着,对每个RoI,使用 RoI pooling 层提取一个固定长度的特征向量,最后经几个全连接层,接着来到一个分岔路口,一个用来预测目标的类别,使用softmax,而不是R-CNN的svm,另外一个用来预测目标的位置。这样处理,Fast R-CNN 就是一个多任务网络。最后对每个类使用非极大值抑制算法去掉重复的 bounding-box。

RoI pooling 层使用 max pooling,把不同大小的 RoI 转换成固定大小的 H × W 的 feature map。每个RoI由元组 ( r , c , h , w ) 表示,其中 ( r , c ) 表示 RoI 的左上角, ( h , w ) 表示高度和宽度。RoI pooling 把 RoI 分成 H × W 大小的网格,网格里的每个小窗体大小为 h / H × w / W 。然后,取每个小窗体最大的一个值作为小窗体的输出,注意,是对每个 feature map 通道进行 RoI max pooling。

对 pre-trained netwrok 进行初始化时,要进行3步处理。第一步,把最后一层 max pooling layer 改成 RoI pooling layer。第二步,把最后一层 FC 和 softmax 改成两个兄弟层,分别作为对K+1个类别进行分类的 FC+softmax 层和 bounding-box regressors。

因为在检测阶段全连接层比较耗费时间,因此作者对全连接层进行优化。作者使用 truncated SVD 压缩巨大的全连接层。对于一个全连接层的参数矩阵 W ,大小为 u × v ,使用SVD分解 W :

W U Σ t V T

其中, U 是包含 W 的前t个左奇异向量的 u × t 的矩阵, Σ t 是包含 W 的前t个奇异值的 t × t 对角矩阵, V 是包含前t个右奇异向量的 v × t 的矩阵。Truncated SVD 减少了参数,从 u v t ( u + v ) 。为了压缩网络,一个全连接层分为两个全连接层,中间没有使用激活函数。第一层使用参数 Σ t V T ,没有偏置b,第二层使用参数 U 和原来的偏置b。这种方法有效地加快了检测的速度。

改进前和改进后 Fast R-CNN 的检测运行时间如下:
Timing for VGG16 before and after truncated SVD

6 Learning

Loss function

Fast R-CNN 要预测K+1个类,其中1指背景,预测结果是 p = ( p 0 , p 1 , , p K ) ,其中 q 0 是背景的预测概率。因为 Fast R-CNN 是端对端学习算法,损失函数要同时包含目标分类的损失和 bounding-box regression的损失。对于每个RoI,损失函数为:

L ( p , u , t u , v ) = L cls ( p , u ) + λ [ u 1 ] L loc ( t u , v )

其中,p表示预测概率, v = ( v x , v y , v w , v h ) 表示目标对象的bounding-box, t u = ( t x u , t y u , t w u , t h u ) 表示RoI的实际类u的预测bounding-box。 L cls ( p , u ) = log p u 是目标分类的损失项。指示函数 [ u 1 ] 表示 u 1 取值为1,否则取值为0。如果预测结果是背景( u = 0 ),那么不需要计算 bounding-box regression的损失。 λ 权衡两个损失项,作者取值为1。

L loc ( t u , v ) 的形式是:

L loc ( t u , v ) = i { x , y , w , h } smooth L 1 ( t i u v i )

其中
smooth L 1 ( x ) = { 0.5 x 2 if  | x | 1 | x | 0.5 otherwise

这是一个鲁棒性的 L 1 损失,敏感度比 L 2 低。当回归目标没有限制时,使用 L 2 损失要小心地调整学习率以防梯度爆炸。

SGD mini-batch

作者使用SGD mini-batch进行训练,每个batch采样N张图片,每张图片采用R/N个RoI。N值越小,mini-batch的计算量越少,因为同一张图片可以共享 feature map。作者使用 N = 2 R = 128 ,少SGD迭代次数就得到比R-CNN更好的结果。

在RoI的采样过程中,作者的25%的RoI都是从和 ground-truth bounding box 的 IoU 大于等于0.5的 object proposal 中选取,其他75%的RoI是选择IoU在 [ 0.1 , 0.5 ) 范围的 object proposal,这75%的RoI都是作为背景。在训练过程中,图片有0.5的机率进行水平翻转。

SGD hyper-paramters

对于全连接层,softmax classification 的参数使用均值为0标准差为0.01的高斯分布进行初始化。Bounding-box regression的参数使用均值为0标准差为0.001的高斯分布进行初始化。偏置初始化为0。

权重的学习率为1,偏置的学习率为2,全局的学习率为0.001。作者在训练 VOC 07 和 VOC 12 数据集时,30k mini-batch iteration 之后,把学习率降为0.0001,再训练10k iteration。作者使用0.9作为 momentum 参数,0.0005作为参数衰减率。

7 Experiment

实验的对比结果如下:
experiment results

训练时间和测试时间对比如下:
runtime comparison

作者得出的结论:

  • R-CNN 在 VOC 07, 2010 和 2012 的数据集中取得了最好的mAP结果。
  • 训练和测试都比 R-CNN 和 SPPnet 快。
  • 在VGG16中对卷积层进行 fine-tune 可以提高mAP。

R-CNN 的代码实现地址:https://github.com/rbgirshick/fast-rcnn

猜你喜欢

转载自blog.csdn.net/qq_24548569/article/details/82024392
今日推荐