目录
3.Initializing from pre-trained networks
6.Truncated SVD for faster detection
论文全称:《Fast R-CNN》
论文地址:https://arxiv.org/pdf/1504.08083.pdf
1.introduction
提出了两个目前的难题:
首先,必须处理大量候选对象位置(通常称为“proposal”)。其次,这些候选对象只提供了粗略的定位,必须进行refine以实现精确的定位。这些问题的解决方案通常会影响速度、准确性或简易性。
本论文提出了一种single stage的训练算法,该算法共同学习对目标proposal进行分类并refine其空间位置。
论文首先批斗了R-CNN和SPPNet的缺点。
对于R-CNN:
- Training is a multi-stage pipeline 训练是一个多级管道
- Training is expensive in space and time 训练时间和空间的消耗都很大
- Object detection is slow 检测速度很慢
这种慢是因为没有共享计算资源,不断的重复计算可能重叠的部分的卷积。虽然SPPNet解决了共享计算的问题,但也有缺点。
对于SPPNet:
- 与R-CNN一样,训练是一个多级管道
- 特性也写入磁盘
- 与R-CNN不同,fine-tuning算法不能更新spatial pyramid pooling之前的卷积层,固定的卷积层限制了深度网络的准确性。
对比起来Fast R-CNN的优势在于:
- Higher detection quality (mAP) than R-CNN, SPPnet 更高的准确率
- Training is single-stage, using a multi-task loss 单级管道,多任务loss
- Training can update all network layers 即fine-tuning过程也能更新卷积层参数
- No disk storage is required for feature caching 不需要额外的存储空间来存放feature
那么Fast R-CNN的结构就是下图这样:
首先将整张图片作为卷积网络的输入得到feature map,根据regions of interest 的映射关系在卷积后的feature map上针对每一个region的feature map进行RoI pooling,得到一个固定大小的feature vector,再把它作为fully connetion的输入。网络最后有两个分支输出,一个关于是softmax的分类概率输出(包括K+1类,其中+1代表背景类),一个是关于bounding-box的定位输出(为了定位的refine)。值得注意的是,这里所有的候选框依然是由selective search方法生成。
2.The RoI pooling layer
其实跟SPPNet里面的spatial pyramid pooling layer大同小异。他们都是对于输入的size没有要求,可以是任意大小,但是输出是固定了(例如7**7)。RoI pooling layer和spatial pyramid pooling layer区别在于前者是多个pyramid level后者只有一个。
3.Initializing from pre-trained networks
使用ImageNet的pre-trained networks需要经过三个变换才能作为Fast R-CNN的networks。
- 首先,最后一个最大池化层被RoI池化层所取代。
- 第二,网络的最后一个fully connetion层和softmax(经过ImageNet1000个分类的训练)被前面描述的两个分支层替换(一个完全连接层和softmax超过K + 1类别和特定于类别的边界框回归子层)。
- 第三,网络被修改为获取两个数据输入:image列表和这些image中的RoIs列表。
4.Fine-tuning for detection
这里解释了为什么SPPnet无法更新空间金字塔池层以上(卷积层)的权重。其根本原因是SPPNet的反向传播效率非常低,因为这些RoI都是来自不同的图像。这也是SPPNet和R-CNN所训练的方式。举例来说就是,从多张图片抽取一个RoI训练,那么这些RoI是来自不同的image的。同时这也是因为每个RoI都可能有一个非常大的接受域,通常横跨整个输入图像。由于前进通道必须处理整个接受域,所以训练输入很大(通常是整个图像)。简单点说就是输入太大了,根本没有达到分类某一个类别的要求,很多输入都是一整张的输入训练出来的networks效果可想而知。
而论文提出了一个feature sharing共享特征的训练方法。他们使用sampled hierarchically分层采样的SGD训练方式,先采样image,再采样image相关的RoIs。关键是,同一图像的RoIs在前后传递中共享计算和内存。与SPPNet和R-CNN从多张图片抽取一个RoI训练,Fast R-CNN是从同一张图片抽取不同的RoI训练。
但是这么做可能会导致收敛很慢,因为同一张image里的RoI是关联的,论文里说在实验里没有表现出收敛慢。
除了使用层级采样,还使用一个流线型的训练过程和一个fine-tuning阶段,联合优化softmax分类器和边界框回归器,而不是在三个单独的阶段训练softmax分类器、SVMs和边界框回归器。
5.Multi-task loss
左半部分是分类的loss,右半部分是边界框的loss。λ是平衡两个loss哪个更重要的因子,但本论文实验都是设为1.u>=1的含义是只计算不包括背景的分类的边界框的loss,u =0是背景类。
具体左半部分:跟以前的分类问题一样。
具体右半部分:t和v分别是预测框和真实框的(左上定点x坐标,左上定点y坐标,宽度,长度),smooth函数就是一个更鲁棒的L1损失函数,没有L2那么敏感(SPPNet和R-CNN使用L2损失函数)
6.Truncated SVD for faster detection
在detection的时候由于有很多个region proposals,大部分的时间都浪费在了最后的全连接层,通过使用截断的SVD压缩大型完全连接层,可以很容易地加快它们的速度。这一部分可以参考https://blog.csdn.net/zhongkejingwang/article/details/43053513
主要思想是对全连接的W降维,减少计算量。
7.Result
- State-of-the-art mAP on VOC07, 2010, and 2012
- Fast training and testing compared to R-CNN, SPPnet
- Fine-tuning conv layers in VGG16 improves mAP
结果就不贴出来了,具体可以查看论文。
8.Design evaluation
论文最后探讨了一些问题,包括:
Does multi-task training help?多任务训练有效果吗?
实验结果表明多任务效果更好。
Scale invariance: to brute force or finesse?缩放不变性:是使用单一尺度法还是多尺度?
实验结果表明对于很深的model单尺度会更好(他们的gpu在Largemodel下内存不够了),多尺度方法只提供了少量mAP的增加,而成本很高。综合考虑时间和算力还是决定使用单尺度。
Do SVMs outperform softmax?使用SVMs还是softmax?
与one-vs-rest SVMs不同,softmax在评价RoI时引入了类之间的竞争。但是这种提高很小。
Are more proposals always better?更多的候选框会更好吗?
以下实验表明,用更多的proposals对于深层分类器并没有帮助,甚至轻微地降低准确率。