Fast R-CNN阅读笔记

Fast R-CNN通过改进R-CNN和SPPnet,实现了更快的训练和检测速度,尤其在VGG16上显著提升了效率。文章介绍了RoI池化层、网络初始化和微调策略,以及多任务损失函数和采样方法,旨在将目标检测过程整合为单一算法。
摘要由CSDN通过智能技术生成

文章地址Fast R-CNN
代码地址code

这篇是Ross大神15年写的,通过一些改进让R-CNN变得更快了,在VGG16网络上训练的时候快了9倍,测试的时候快了213倍,在PASCAL VOC2012上的mAP也提高了。
Object detection主要有两个挑战:1、对目标所在位置进行定位,定位的区域被称作proposal。2、这些区域只是大概的对目标进行定位,需要进一步处理达到精确定位。这篇论文试图将这两步结合成一个算法来训练。这种算法可以大大提高训练网络的速度,对于VGG16这个网络来说,这种方法比R-CNN快9倍,比SPPnet快3倍。

R-CNN通过训练卷积网络来做检测,但是其有一些缺点有待改进:1、检测是多层的。R-CNN需要先计算出region proposals,用CNN对proposals提取特征,然后用SVM做分类,最后用微调来校正bounding-box;2、训练需要花费大量的空间和时间。3、目标检测非常慢。在GPU上,一张图片需要47s。

R-CNN 的缓慢是因为对于每张图片每个proposal都要在网络中做一次前向传播,而计算没有共享。SPPnets针对这个问题做了改进。我之前并没有阅读过SPPnets(Spatial pyramid pooling networks),这边一笔带过。SPPnet是对于整张输入图片计算一个特征图,然后从这个特征图中提取每个region proposal的特征向量进行分类。所以SPPnet比R-CNN快3倍,但是其也有检测是多层的这个缺点。

Architecture and training

先放一张Fast R-CNN的结构图:

输入是一张图片和许多RoI(Regions of Interest),然后经过卷积神经网络得到一个卷积特征图。对于每一个特征图上的proposal,通过一个RoI池化层提取一个固定长度的特征向量,每一个特征向量喂给一些全连接层,之后分出两个输出:一个是通过softmax层得到的概率分布(K个分类和一个背景),另外一个是通过bounding box regressor得到的这K个分类的实际数量。

RoI pooling layer

RoI是一个长方形,由四个参数(r, c, h, w)定义,其中(r, c)代表RoI左上角坐标,h和w分别是高度和宽度。但是不管RoI的大小,通过池化层之后的小特征图都是H* W的大小,H和W都是网络的参数。做法就是将h* w的RoI划分成H* W的网格,每一个网格边长是h/H* w/W,对于每一个网格做max-pooling

Initializing from pre-trained networks

在预训练的网络初始化Fast R-CNN的网络的时候,有以下三个变化:
1、最后一个max-pooling层替换成RoI池化层,RoI池化层设定了H和W,使池化后的RoI特征图适合全连接层(VGG16用的H=7,W=7)。
2、网络最后的全连接层和softmax层分成两个分支,一个分支是全连接层+(K+1)输出的softmax层,另外一个分支是全连接层+有特定分类的bounding box regressor。
3、与之前接收一张图片不同的是,这个网络接收一张图片+许多RoI的输入。

Fine-tuning

对比SPPnet,Fast R-CNN的效率非常高。原因是在SPPnet中,每一个RoI的感受野很大,所以训练的输入很大,导致当RoI来自不同的图像时,后向传播效率很低,使SPPnet没有办法高效的更新参数。基于特征共享的优势,我们建立了Fast R-CNN的训练方式:SGD mini-batch的采样是分级的,首先对N个图像进行采样,之后在每个图像中采样R/N个RoI,由于同一张图像的RoI在前向和后向传播中是共享计算和内存的,所以此举可以大大提高训练速度。比如,我们从两张图片中采样出128个区域(N=2, R=128),用Fast R-CNN训练比SPPnet和R-CNN训练提高了64倍。

除此之外,Fast R-CNN还摒弃了之前的需要用三个阶段来训练softmax、SVM、regressor,它只需要一个高效率的算法,综合了softmax层和bounding box regressor。改变包括损失、mini-batch采样策略、RoI池化层的后向传播、SGD的参数。

Multi-task loss
之前说了网络有两个输出:第一个是离散概率分布p=(p0, …, pK),p是softmax层根据(K+1)输出的全连接层计算出的。第二个输出bounding-box regression偏置tk=(txk, tyk, twk, thk),tk代表一种尺度不变对数空间变换。我们用下式的损失函数来综合classification和bounding box regression:

其中Lcls代表分类u的对数损失log loss:

Lloc是通过类别u的真实bounding box regression的数组v和预测的数组tu来定义的(v=(vx, vy, vw, vh), tu=(txu, tyu, twu, thu)):

其中:

而Iversion bracket λ \lambda λ[u>=1]意思是当满足括号中的条件时,值为1,不满足则为0。背景的分类是u=0,所以对于背景来说,Lloc为0。

Mini-batch sampling
每一个SGD mini-batch的采样都是从N=2张图像中随机选择的,mini-batch的大小是128,每张图像选取64个RoI。在R-CNN那篇论文中,如果一个object proposal与标注为真的bounding box重合至少为0.5(IoU>=0.5),则这个proposal中采样出的RoI被标注为真,也就是说其u>=1。其余的object proposals(IoU在[0.1, 0.5)这个集合中)中的RoI的u=0,标注为背景。而剩下比0.1还小的的样本用作困难样本挖掘hard examples mining。mini-batch中25%的RoI来自标注为真,75%来自背景标注。

Back-propagation through RoI pooling layers
假设mini-batch只有一张图片N=1(在N>1时情况并没有什么变化,因为前向传播时每张图片是独立的)。记xi为RoI池化层第i个输入,yrj为池化层第r个RoI的第j个输出,则池化层所做运算是:

其中:

R(r, j)是输出单元yrj做最大值池化时,每一个池化单元的输入数组。后向传播时,计算RoI pooling layer损失对于每一个xi的偏导:

SGD hyper-parameters
连接softmax层和bounding box regression的两个全连接层权重初始化是用均值为0,标准差分别为0.01和0.001的高斯分布,偏置为0。对于权重,学习率是1,偏置学习率为2,全局学习率0.001(这里我没搞懂全局学习率是什么,有人知道的麻烦告诉一下hiahia~)。动量0.9,weight decay为0.0005。
在VOC07和VOC12上,SGD mini-batch循环30k次,然后把全局学习率降到0.0001,再训练10k次。

detection

当Fast R-CNN网络完成微调之后,目标检测就只稍微多于前向传播的计算量(proposal已经预先计算好的情况下)。对于每一个RoI r,前向传播输出一个先验概率分布p和一组与r有关的预测的bounding-box偏置。
在R-CNN时,卷积层比全连接层的计算量大得多,但是在Fast R-CNN中,大多数计算量是花在了全连接层上,作者用了奇异值分解SVD这种方法去加速全连接层的训练速度。假设一层权重矩阵W=u* v,那么W可以分解为:

U是W的前t个左奇异向量组成的u* t的矩阵, Σ \Sigma Σt是W的t个顶部奇异值组成的t* t的对角矩阵,V是W的前t个右奇异向量组成的v* t的矩阵。这种truncated SVD的方法将参数从uv减少到t(u+v)。所以原先的一层全连接层可以由两个全连接层代替:一层参数是 Σ \Sigma ΣtVT,一层参数是U。

到此为止,这篇论文重点部分就说完了。之后是训练结果和一些讨论。这篇论文有些计算还是比较难理解的。我们下篇论文见~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值