[深度学习]RCNNs系列(3)Fast RCNN介绍

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

最近我做的任务一直没有什么进展,所以也没抽出时间来补RCNNs系列的博客,今天来补一下吧,不过最近又多调研了不少方法,有时间一起写出来。
为了节省时间,Fast RCNN我就不仔细按照论文介绍一遍了,这篇博客主要介绍Fast RCNN的核心思想。

Fast RCNN是RCNN的作者提出的RCNN的改进版,它的研究基础是RCNN以及Kaming大神他们提出的SPPnet。RCNN就不用多说了,我前一篇博文已经介绍过了,这里我们来提一提SPPnet。

1. SPPnet

SPPnet是2014年Kaming大神在《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》一文中提出的一种网络结构。
我认为SPPnet的贡献主要有两点:
(1)提出了一种Spatial Pyramid Pooling的Pooling方法。
使用这种方法CNN(带有全连接层的)可以处理任意大小的图像。即在全连接层之前使用SPP可以把不同大小的特征图转换为固定长度的特征向量输入到全连接层中,从而达到获取多层次的信息并处理任意大小图像的目的。
SPP的思想非常简单,看论文中一个图就可以搞定,如下图所示:


这里写图片描述

SPP就是把最后一组特征图划分成多个不同的区域,如上图中把特征图划分为 44,2211 的区域,然后对这些区域分别pooling,最后统一得到 (16+4+1)n 维的特征向量($n是feature map/filter的数目)。由于是对特征图进行的区域划分,所以与特征图的大小和形状无关,也就保证了最终输入的全连接层的特征向量长度的固定。
(2)SPPnet在应用于目标检测时只对图像提取了一次特征
我们都知道RCNN的流程是很简单也很容易想到的,先提取proposal,然后使用CNN提取proposal对应图像的特征,再使用SVM对特征进行分类,从而完成定位。这里就存在一个问题,如果同一幅图像中有2个待检测目标,那么RCNN就需要对这两个待检测目标分别使用CNN提取一次特征,目标少还好,如果一副图像中有n个待检测目标,那么就需要用CNN提取n次特征,这样就会极大的降低检测效率。(注意,RCNN中是把所有proposal图像都resize成224*224大小的,因此CNN提取特征非常费时,同时由于resize也会令目标变形)
SPP的流程则是对整幅图像进行特征提取,也就是说不管图像中有多少目标SPP都只用CNN提取一次特征。在对整幅图像提取特征以后,SPPnet在得到的特征图中找到proposals对应的区域,对该区域进行SPP特征提取,得到固定的特征向量输入到全连接层中,相比RCNN极大的提高了检测效率。SPP的检测流程如下图所示。

这里写图片描述

以上就是SPPnet的主要思想,也是Fast RCNN包括以后RCNN系列都借鉴的思想。

2. Fast RCNN

SPPnet只对整幅图像提取一次CNN特征,极大的提高了检测效率,Fast RCNN在SPPnet的基础上进一步改进,将特征提取和分类以及目标的位置回归统一到一个CNN网络中(注意,从这里我们就可以看出深度学习的目标——端到端),进一步提高了检测效率和实验结果。
Fast RCNN的主要贡献如下:
(1)相比RCNN和SPPnet更好的检测效果;(必然的)
(2)训练过程统一为一个阶段,网络是多任务的;
(3)训练过程中可以更新网络中所有层的权值;
(4)在检测过程中不再需要额外的硬盘存储。
这里我要讲得主要是第2点和第3点。
首先挑简单的来,先讲第3点,Fast RCNN论文中提出SPPnet在训练的过程中只能更新全连接层而不能更新卷积层的参数,在Fast RCNN中则可以更新所有网络层的参数。这里论文中也讲的不是很清楚,我觉得这主要跟SPPnet和Fast RCNN的训练方式有关,Fast RCNN在训练的过程中每次都是2幅图像中的proposal参与训练,所以显存够用,而SPPnet中每次的proposal可能来自多幅图像,若都提取特征进行更新的话显存不够用,因此无法更新卷积层的信息。(个人理解,不一定正确)
下面来介绍第2点,也是Fast RCNN的核心内容,首先我们来看一下Fast RCNN的检测流程,如下图所示。


这里写图片描述

可以看出,得到proposals以后,并将proposal的位置映射到feature map的位置,然后通过ROIPooling把特征转换为特定长度的特征输入到卷积神经网络中,最后完成分类和位置回归任务的完成。

2.1 ROI Pooling

ROIPooling可以看做是SPPnet中SPP过程的简化版,这里只是对得到的特征图中proposal位置划分成固定的若干个区域(SPP中是划分多次,每次划分的区域数目不一样,对应名字中的Pyramid),对这些区域分别进行Pooling,如VGG16中对所有proposal特征图划分成7*7大小,最终ROIPooling的结果为7*7的大小。

2.2 多任务Loss

从上面的Fast RCNN流程图中可以看出,Fast RCNN把物体的分类识别和位置回归都放入了CNN网络中,这也是Fast RCNN的创新点之一。
多任务的Loss计算方程为

L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)
其中 p=(p0,p1,...,pk) ,其中 pk 为分类为 k 类的概率; u 为类别ground-truth的标签, tu=(tkx,tky,tkw,tkw) tk 的定义于RCNN中对应的定义相同; v 为ground truth的回归目标; [u1] 表示 u1 是为1,否则为0
物体的分类Loss为 Lcls(p,u)=logpu 这里就不多介绍了,就是普通的Softmax过程,不过这里有一点需要注意作者分类物体时是分为了K+1类(包含了background类),这样做当然是可以的,不过在最近的一些文献中也在探讨这样做是否是最好的,因为有时候background会被误识别。
位置回归的loss为 Lloc(tu,v)=ix,y,w,hsmoothL1(tuivi) 其中


这里写图片描述

关于Fast RCNN我就介绍到这里了,关系训练的细节可以直接在论文中找到,我觉得没有太多的必要做介绍了,毕竟现在Faster RCNN完全可以替代Fast RCNN,所以下篇博客我们来着重看下Faster RCNN。

猜你喜欢

转载自blog.csdn.net/lhanchao/article/details/73870716