【笔记】Fast_R-CNN_ICCV_2015_paper
论文地址:http://arxiv.org/abs/1504.08083
代码:https://github.com/rbgirshick/fast-rcnn
概要
缺点
为何有了R-CNN和SPP-Net之后还要提出Fast RCNN(简称FRCN)?因为前者有三个缺点
- 训练是多阶段的:训练的时候,pipeline是隔离的,先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression。FRCN实现了end-to-end的joint training(提proposal阶段除外)。
- 训练非常耗费时间和空间(存储):RCNN中ROI-centric的运算开销大,要从每一张图像上提取大量proposal,还要从每个proposal中提取特征,并存到磁盘中。所以FRCN用了image-centric的训练方式来通过卷积的share特性来降低运算开销;RCNN提取特征给SVM训练时候需要中间要大量的磁盘空间存放特征,FRCN去掉了SVM这一步,所有的特征都暂存在显存中,就不需要额外的磁盘空间了。
- 物体检测非常慢:测试时间开销大,依然是因为ROI-centric的原因,这点SPP-Net已经改进,然后FRCN进一步通过single scale testing和SVD分解全连接来提速。
整体框架
如果以AlexNet(5个卷积和3个全连接)为例,大致的训练过程可以理解为:
- selective search在一张图片中得到约2k个object proposal(这里称为RoI)
- 缩放图片的scale得到图片金字塔,FP得到conv5的特征金字塔。
- 对于每个scale的每个ROI,求取映射关系,在conv5中crop出对应的patch。并用一个单层的SPP layer(这里称为Rol pooling layer)来统一到一样的尺度(对于AlexNet是6x6)。
- 继续经过两个全连接得到特征,这特征有分别share到两个新的全连接,连接上两个优化目标。第一个优化目标是分类,使用softmax,第二个优化目标是bbox regression,使用了一个smooth的L1-loss.
Fast RCNN的优点
1. 比RCNN,SPPnet有更高的准确率(mAP)。
2. 训练是单阶段的,使用多任务的loss。
3. 训练可以更新所有的网络层(SPPnet只能更新fc层)。
4. 特征缓存的时候不需要硬盘存储。
第一步,将这个完整的图片经过若干卷积层与max pooling层,得到一个feature map。
第二步,用selective search算法从这完整的图片中提取出object proposals,即RoI。
第三步,根据映射关系,可以得到每个object proposal对应的feature map。
第四步,将第三步得到的feature map经过RoI pooling layer得到固定大小的feature map(变小了)。
第五步,经过2层全连接层(fc),得到固定大小的RoI特征向量。
第六步,特征向量经由各自的FC层,得到两个输出向量:第一个是分类,使用softmax,第二个是每一类的bounding box回归。
简要流程图如下:
说明:在训练的时候,分类与回归是一起训练的,总的loss是分类的loss加上回归的loss。计算公式如下:
FRCN大致就是一个joint training版本的SPP-Net:
- SPP-Net在实现上无法同时tuning在SPP layer两边的卷积层和全连接层。
- SPP-Net后面的需要将第二层FC的特征放到硬盘上训练SVM,之后再额外训练bounding box regressor。
Rol pooling layer
N
个特征映射和一组R
个RoI(R>>N)
。N
个特征映射来自于最后一个卷积层,每个特征映射都是H
x W x C
的大小。每个RoI是一个元组(n, r, c, h, w)
,n
是特征映射的索引,n∈{0,
... ,N-1}
,(r, c)
是RoI左上角的坐标,(h,
w)
是高与宽。输出是max-pool过的特征映射,H'
x W' x C
的大小,H'≤H
,W'≤W
。对于roI,bin-size
~ h/H' x w/W'
,这样就有H'W'
个输出bin,bin的大小是自适应的,取决于RoI的大小。
Rol pooling layer的作用主要有两个,一个是将image中的rol定位到feature map中对应patch,另一个是用一个单层的SPP layer将这个feature map patch下采样为大小固定的feature再传入全连接层。
- 对于某个rol,怎么求取对应的feature map patch?代码中寻找。
- 为何只是一层的SPP layer?多层的SPP layer不会更好吗?因为需要读取pretrain model来finetuning,比如VGG就release了一个19层的model,如果是使用多层的SPP layer就不能够直接使用这个model的parameters,而需要重新训练了。
pre-trained networks
fine-tuning
Multi-task loss
k*是真实类别,式中第一项是分类损失,第二项是定位损失,L由R个输出取均值而来,不再具体展开。
mini-batch sampling
在微调时,每个SGD的mini-batch是随机找两个图片,R为128,因此每个图上取样64个RoI。从object proposal中选25%的RoI,就是和ground-truth交叠至少为0.5的。剩下的作为背景。
backpropagation through RoI pooling layers
RoI pooling层计算损失函数对每个输入变量x的偏导数,如下:
SGD hyperparameters
是一些参数的设置。
Scale invariance
这里讨论object的scale问题,就是网络对于object的scale应该是要不敏感的。这里还是引用了SPP的方法,有两种。
- brute force (single scale),也就是简单认为object不需要预先resize到类似的scale再传入网络,直接将image定死为某种scale,直接输入网络来训练就好了,然后期望网络自己能够学习到scale-invariance的表达。
- image pyramids (multi scale),也就是要生成一个金字塔,然后对于object,在金字塔上找到一个大小比较接近227x227的投影版本,然后用这个版本去训练网络。
Truncated SVD on fc layers for faster detection
Which layers to finetune?
对应文中4.5,作者的观察有2点
- 对于较深的网络,比如VGG,卷积层和全连接层是否一起tuning有很大的差别(66.9 vs 61.4)
- 有没有必要tuning所有的卷积层?答案是没有。如果留着浅层的卷积层不tuning,可以减少训练时间,而且mAP基本没有差别。
Data augment
Are more proposals always better?
results
method | mAP S M L | train time(h) S M L | test rate (s/im) S M L |
---|---|---|---|
SPPnet BB | — — 63.1 | — — 25 | — — 2.3 |
R-CNN BB | 58.5 60.2 66.0 | 22 28 84 | 9.8 12.1 47.0 |
FRCN | 57.1 59.2 66.9 | 1.2 2.0 9.5 | 0.10 0.15 0.32 |
参考:
http://blog.****.net/liumaolincycle/article/details/50203333
http://blog.****.net/shenxiaolu1984/article/details/51036677