Selective Search 和 R-CNN、Fast-CNN 简介
- 1 目标检测算法简介
- 1.0滑窗法的思路
- 1.1 Selective Search 和 R-CNN 简介
- 1.2.1 Selective Search简介
- 1.1.1 Selective Search的思路
- 1.1.2 Selective Search图解
- 1.2 Selective Search 和 Fast-CNN简介
- 1.2.1 SPP和ROI Pooling简介
- 1.2.2 FastR-CNN简介
1 目标检测算法简介
1.0滑窗法的思路
首先需要一个已经训练好的分类器,然后把图像按照一定间隔和不同的大小分成若干窗口,在这些窗口上执行分类器,如果得到较高的分类分数,就认为是检测到了物体。把每个窗口都用分类器执行一遍之后,再对得到的分数做一些后处理如非极大值抑制(Non-Maximum Suppression, NMS)等,最后就得到了物体类别和对应区域,其方法示意图如图所示。
1.1 Selective Search 和 R-CNN 简介
1.2.1 Selective Search简介
滑窗法相当于对一张图像上的子区域进行类似穷举式的搜索, 一般情况下这种低效率搜索到的区域里大部分都是没有任何物体的。所以一个很自然的想法就是只对图像中最有可能包含物体的区域进行搜索,进而提升物体检测的效率。在这种思路的方法中,最为熟
知的是 Selective Search。
1.1.1 Selective Search的思路
Selective Search的思路是,可能存在物体的区域都应该是有某种相似性的或连续的区域。针对这两个特点,Selective Search采用的是超像素合并的思路,**首先用分割算法在图像上产生很多的小区域,这些区域就是最基础的子区域,或者可以看作是超像素。然后根据这些区域之间的相似性进行区域合并,成为大一点的区域。**衡量相似性的标准可以是颜色、纹理和大小等。不断迭加这种小区域合并为大区域的过程,最后整张图会合并成为一个区域。
1.1.2 Selective Search图解
这个过程中,**给每个区域做一个外切的矩形,就得到了许许多多的可能是物体的区域方框。**其实无论是滑窗还是Selective Search,这种找出可能包含物体的区域的方法,统称为Region Proposal。算法执行过程的示意图如图11-3所示。
可以看到Selective Search和滑窗法相比第一个优点就是高效,因为不再是漫无目的的穷举式搜索。另外,在 Selective Search中,一开始的区域是小区域,合并过程中不断产生大区域,所以天然能够包含各种大小不同的疑似物体框。另外计算相似度采用了多样的指标,提升了找到物体的可靠性。至于算法本身当然也不能太慢,否则和滑窗法相比的优势就体现不出来了
有了Selective Search高效地寻找到可能包含物体的方框(实际中常进行一定像素的外 扩包含一定背景),那么接下来只要接个CNN提取特征,然后做个分类不就相当于检测吗?这正是于深度学习做物体检测的开山之作R-CNN ( Region-based Convolutional Neural Networks) , 当然直接用Selective Search选出的框未必精确,所以还加入了一些改进,如和物体标注框单位置的回归来修正Selective Search提出的原始物体框。R-CNN就像Alexnet,让物体检测的指标跃上了新台阶(PASCAL VOC, mAP从40.1%提升53.3%)
1.2 Selective Search 和 Fast-CNN简介
R-CNN虽然比起滑窗法已经快了很多,但可用性还是很差,因为一个稍微“靠谱”的识别任务需要用Selective Search提出上千个框(R-CNN中是2000个 )。这上千个图像区域都需要单独过一遍卷积神经网络进行前向计算,速度自然快不了。
1.2.1 SPP和ROI Pooling简介
由于卷积的同变性质(equivariance) ,通过每类别对应物体的激活响应图的例子,定性理解了物体通过卷积网络之后,会在语义层的响应图上的对应位置有特别的响应。
因此产生思路:对整张图片执行一次卷积神经网络的前向计算,到了最后一层的激活响应图的时候,通过某种方式把目标物体所在区域部分的响应图拿出来作为特征给分类器。这样做对画面内所有可能物体的检测就可以共享一次卷积神经网络的前向计算,大大节省了时间。
第一个在物体检测中实现这个思路的就是SPP,全称为空间金字塔池化(Spatial Pyramid Pooling),
如图11-4所示,假设输入图片中框住小马和摄影师的两个框是Selective Search选出来的框,那么经过了(没有全连接层的)卷积神经网络,到了最后一层输出的n个通道的响应图时,原图像上的两个框也会对应两个区域。这样的区域称为感兴趣区域(Region Of Interest, ROI)。一般常用的分类器,无论是SVM还是称浅层神经网络,都需要输入固定的维度。所以如果可以有一种方式把ROI的信息都转化成固定维度的向量,那么就能把每个ROI都给分类器去计算获得结果,并且在进入分类器之前,只需要运行一次卷积神经网络的前向计算,所有的ROI都共享同样的响应图。
思路①:SPP就是这样一种方法,对于每一个ROI,如图11-4中所示,SPP分层将指定区域划分为不同数目,图中分为3个层次,最底层划分为4x4=16个子区域,中间层是2x2=4个子区域,最顶层则直接整个区域进行池化,对于每个通道,每个ROI变成了一个21维的向量,因为有n个通道,所以每个ROI都生成了一个21×n维的向量。因为越是底层划分的数目越多,SPP是通过像金字塔一样的结构来获得感兴趣区域不同尺度的信息,所以叫空间金字塔池化。
SPP不仅**实现了对ROI的分类,而且对于整张图像只需要进行一次卷积神经网络的前向计算,大幅降低了算法执行的时间。**另外需要提的是,SPP把任意大小的向量转化为固定大小的向量的方法还有另一个意义,就是让输入神经网络的图像大小不再固定,在执行分类任务的时候,这种做法的优点是不需要再对图像进行裁剪或者缩放。
SPP的论文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》发表在 2014 的 ECCV 上,有兴趣的读者可以自行搜索原文参考。
思路②【FastR-CNN】:在SPP中,包含信息最多的其实就是最底层,所以另一个思路是直接把ROI划分为固定的大小,并不分层。如把所有ROI区域池化到7x7的大小,再送入分类器,这就是ROI Pooling,如图11-4的右下部分所示。
1.2.2 FastR-CNN简介
SPP用于物体检测相比R-CNN获得了速度上的巨大提升,但仍然继承了一些R-CNN的缺点。最明显的是分阶段训练,不仅麻烦,而且物体框回归训练过程和卷积神经网络的训练过程是割裂的,整个参数优化的过程不是一体的,限制了达到更高精度的可能性。
针对SPP的缺点,R-CNN的作者Ross B. Girshick再度发力,在 SPP检测的基础上提出了两个主要的改进/变化:
第一点是ROI提取特征后,把物体框的回归和分类这两个任务的loss融合一起训练,相当于端到端的多任务训练( end-to-end with a multi-task loss) 这让整个训练过程不再是多个步骤分别进行,训练效率也更高;
第二点是把SPP换成了 ROI Pooling,这就是Fast R-CNN。在计算预测的框和标注框的loss时,采用了一种叫做Smooth-L1的loss计算方法:
就是把L2和L1拼一块了,其中小的偏差利用L2计算,大的偏差利用L1计算。而Smooth-L1对偏差很大的值没有那么敏感,好处是提高 loss计算的稳定性。
在这种框架下,因为卷积神经网络计算对每张图像只执行了一次,所以重复计算大都在ROI Pooling之后,于是**提出用SVD分解然后忽略次要成分,把全连接层的计算量减小,达到精度损失极其微小的情况下,获得较大幅度的计算速度提高,**这也是算是论文中的一个小的优点。