【CV论文笔记】Fast R-CNN

本文主要用于介绍rbg大神于2015年提出的Fast R-CNN网络,该网络架构是在其前作R-CNN上的升级改进版。本笔记主要为方便初学者快速入门,以及自我回顾。

论文链接:https://arxiv.org/pdf/1504.08083.pdf
github主页:https://github.com/rbgirshick/fast-rcnn
rbg大神个人主页:http://www.rossgirshick.info/#girshick2014rcnn

为更好的理解该论文,建议先行阅读R-CNN和SPPNet网络的相关论文,这里也附上本菇之前写的2篇论文笔记供大家参考~
R-CNN理解
SPPNet网络理解

基本目录如下:

  1. 摘要
  2. 核心思想
  3. 总结

------------------第一菇 - 摘要------------------

1.1 论文摘要

本论文提出了一种适用于目标检测的快速的基于区域候选的卷积神经网络架构(Fast R-CNN)。在之前R-CNN的架构基础上,Fast R-CNN引入了深度卷积神经网络快速对R-CNN第一阶段产生的候补区域进行分类,从而在训练和测试的时效性上取得了很大的突破,同时还提升了检测的准确率。Fast R-CNN相比R-CNN在训练VGG16上快了9倍,测试的时候快了213倍,而且在同一个数据集PASCAL VOC上有更高的MAP。相比于SPPnet,FAST R-CNN在训练VGG16上快了3倍,测试的时候快了10倍,并且准确率更高。FAST R-CNN同时有Python和C++俩个版本,开源地址:https: //github.com/rbgirshick/fast-rcnn

------------------第二菇 - 核心思想------------------

2.1 Fast R-CNN的突破点

再理解本文提出的新架构之前,我们先跟着论文思路来梳理一下在目标检测领域大放异彩的R-CNN网络架构的缺陷,

1)训练是多阶段的(Training is a multi-stage pipeline):R-CNN首先要用卷积层来训练提取特征,然后再用提取出的特征来训练一个分类器(SVM),最后还要来回归目标检测框。仔细看来,整个训练和预测过程是剥离开来了3个阶段,且不说实现上有多麻烦,整个时效性也是扛不住的。

2)训练耗费大量空间和时间(Training is expensive in space and time):这个已经是显而易见的,就不多说了,毕竟候选框也多达2000多个呢。。。

3)预测的时间太慢了(Object detection is slow):在GPU上,也要耗费47秒来预测一张图片。。。简直了。。。

SPPNet通过设计加入空间金字塔池化层,解决了R-CNN中重复提取图片特征的问题,在一定程度上加速了训练和预测的时效性,但是SPPNet本身并没有改动R-CNN的网络架构,因此仍然是多阶段的,并且因为引入了空间金字塔池化层,导致了一些预训练的策略无法使用,从而影响最终的结果。

因此,本文提出的Fast R-CNN网络架构,就是针对上面的缺陷做了重大的改进,主要的贡献包括,

1)相比于R-CNN和SPPNet更好的目标检测质量(map)

2)训练是单阶段的,而不是多阶段剥离开的

3)训练的时候可以更新所有层的参数

4)提取出的特征无需额外的硬盘空间来存储

对本文提出的Fast R-CNN了解到这一层面以后,我们再接着来细看其网络架构。

2.2 Fast R-CNN的网络架构

话不多说,我们直接上一张原论文中Fast R-CNN的网络架构图,

Fast R-CNN架构图.png

首先整个网络的输入依然是整张图片和多个候选区域框,经过一系列的卷积池化(跟之前保持一致)操作以后会生成特征图。变化的部分是,对于每一个候选区域框,都会通过映射关系,在特征图上找到对应的位置,并将其输入到RoI池化层,从而生成固定维度大小的特征向量。该特征向量随后送入到连续的几个全连接层后,再接着送入到2个分支中,一个分支用于做分类,一个分支用于做回归。至此,整一个训练过程就打通了,而不是跟之前一样剥离开的3个阶段。

整体的架构可以说是非常的清晰易懂,但是其中的RoI池化层和多任务的Loss函数设计值得我们深入探讨一下。

2.2.1 RoI池化层

首先明确一点,RoI池化层的作用就是将形状大小各异的特征图上的候选区域,转换为固定大小的特征向量(超参数,),因此可以简单理解为就是SPPNet最后接的空间金字塔池化层,但RoI池化层要更简洁一些。

然后明确一个目标候选区域在特征图上的,RoI(Region Of Interest)由1个4元组表示,,其中确定了其左上角的点(在特征图中),确定了其大小。

清晰上述定义后,RoI最大池化层的工作原理就是,将一个的区域均分为,然后对其每一个网格取最大值池化(如果有不理解的,见下图),从而对任意大小的区域,我们最终得到的特征向量纬度是固定的。

RoI示意图.png

至此,大家应该理解为啥比SPPNet的金字塔池化层要简化了吧~金字塔池化还涉及多个池化核组合,这里就很简单的直接输出一个固定大小的~

RoI池化层的结构算是讲明白了,不过文中还是多提了一句,如何对RoI池化层进行求导(文中说的比较晦涩,但还是要理解那个累加求和公式的意义),这里我也说一下,我对此的理解,也是参考了这篇博文的~从该博文中盗一张图,来加深理解,

RoI层求导示意图.png

如上图,有2个候选区域(蓝色,橘色),其中,7这个点,同时被2个区域所覆盖,而我们知道,最大池化求导的时候,只有那个最大值(响应结点)的倒数是有值的,其他的结点都是0,因此,值为7的这个结点,在俩个候选区域中都有了响应,因此,传到该结点的梯度值就是2个候选区域反向传播回来的梯度值的和,因此,文中给出的求梯度公式是求和的形式~

RoI梯度求和公式.png

至此,有关RoI池化层的内容应该算是讲明白了,有细节不清楚的,还是应该再翻看原论文加深理解。

2.2.2 微调策略

Fast R-CNN还有一个巨大的优势就是能通过反向传播算法同时更新所有层的参数,而这是SPPNet所不具备的。文中给出的依据是,SPPNet中的空间金字塔池化层,如果训练样本来源于不同的图片,其训练是十分低效的。之所以低效是每一个RoI都可能会有很大的感受野(receptive field),经常会覆盖到全图。因此,前向传播就必须要处理很大的感受野,从而导致训练的输入就很大(经常是全图)。而Fast R-CNN在训练方法上做了一点改进,从而解决了这个问题。

哎,其实就是在样本采样上做的一点处理。简单讲就是作者采用了分层采样的手段,确保了每一个mini-batch里面输入的RoI都是来自于同一张图片的。。。那自然,每一个RoI都能共享计算的参数和存储内存了。。。虽然有违第一直觉(毕竟样本不是要尽量打散么。。。)但人家实验做出来,效果没毛病,那既然训练的速度更快了,何乐而不为呢~

2.2.3 多任务损失函数设计

不同前作,提取出固定特征以后,就分别扔到分类器和回归器里面去训练,Fast R-CNN在后面开了2分支,一起训练,因此,只要定义好损失函数,那自然就行得通了。

首先,明确一下,Fast R-CNN的输出,因为有2个分支,所以有2个输出,

对于每一个RoI,首先有一个分类的输出(softmax),假设有类,加上背景一共有个值,

其次是有一个位置框信息,

因此,我们也有2个损失要去求,第一个是分类的损失,即对真实的类别的概率取对数值。

而对于回归的损失,注意,只有分类对了的,才会去计算回归的损失,因此,其损失表示为(v表示gt),

其中,这里用了L1正则平滑,

平滑项.jpg

因此,最终的损失函数就可以表达为,

至此,整一套Fast R-CNN相关的重点已经讲述清楚明白了~

2.3 论文小结

本文提出的Fast R-CNN毫无疑问是R-CNN和SPPNet的简洁优化版。作者通过大量详细的对比实验发现了很多新的训练及优化技巧,比如最后一层用softmax直接做分类效果优于用svm的,并不是越多的候选区域就越能提升最终的检测效果,更多的训练数据带来更好的结果,单一尺度的输入框经常就能达到多尺度输入框的效果等等(更多细节大家可以看原论文)。其中,作者也在小结中强调了最重要的一点发现,即稀疏的候选区域对最终检测效果是有提升的,并且大大提高了时效性。当然,日后必定还会发展出更多的小技巧来加速目标检测算法~

------------------第三菇 - 总结------------------

3.1 总结

到这里,整篇论文的核心思想已经说清楚了。本论文主要是在R-CNN和SPPNet的基础上提出了一种适用于目标检测的新的网络架构Fast R-CNN,并实验证明其可行性,为后续发展奠定了基础。

简单总结一下本文就是先罗列了一下该论文的摘要,再具体介绍了一下本文作者的思路,也简单表述了一下,自己对Fast R-CNN网络的理解。希望大家读完本文后能进一步加深对该论文的理解。有说的不对的地方也请大家指出,多多交流,大家一起进步~

你可能感兴趣的:(【CV论文笔记】Fast R-CNN)