R-CNN是基于region proposal方法的目标检测算法系列开山之作,由加州大学伯克利分校的RBG大神于2014年提出,其先进行区域搜索,然后再对候选区域进行分类。在R-CNN中,通过Selective search方法来生成候选区域,这是一种启发式搜索算法。它先通过简单的区域划分算法将图片划分成很多小区域,然后通过层级分组方法按照一定相似度合并它们,最后的剩下的就是候选区域(region proposals),它们可能包含一个物体。
论文地址:https://arxiv.org/abs/1311.2524
github:https://github.com/rbgirshick/rcnn
two stage目标检测算法的第一步是要做区域提名(Region Proposal),也就是找出可能的感兴趣区域(Region Of Interest, ROI)。常用的区域提名方法有:
(1)滑动窗口。滑动窗口本质上就是穷举法,简单暴力,利用不同的尺度和长宽比把所有可能的大大小小的块都穷举出来,然后送去识别,识别出来概率大的就留下来。
(2)规则块。在穷举法的基础上进行了一些剪枝,只选用固定的大小和长宽比。这在一些特定大小的应用场景是很有效的,但对于普通目标检测依然不好,且计算复杂度依然很高。
(3)选择性搜索。前面方法的很大问题就是候选区域太多,且大多数都是无用的,所以问题的核心在于如何有效地去除冗余候选区域。其实冗余候选区域大多是发生了重叠,选择性搜索利用这一点,自底向上合并相邻的重叠区域,从而减少冗余。
Selective search使用Felzenszwalb(也是提出DPM的大佬)和Huttenlocher提出的Graph-Based Segmentation算法做图像分割,根据像素的强度对图像进行过度分割。算法的输出如下图所示。右边的图像包含使用纯色表示的分割区域。
但是不能直接基于图像分割的结果做计算,原因如下:
(1)对于同一个物体可能存在两个或者两个以上的区域。
(2)对于遮挡物体不能给出推荐。
Selective search基于Graph-Based Segmentation的过度分割结果是这样的
Selective Search算法流程:
(1)计算任意两个分各区域的相似度集合A。
(2)然后选出A中相似度最大的两个区域合并,并从A中删除所有和这两个区域相关的相似度。
(3)然后计算新的区域与其他区域的相似度,并添加到A中。
(4)循环上述步骤,直到A为空,不能再合并为止。
很显然,相似性计算就是其中的关键。Selective Search使用基于颜色(color)、纹理(texture)、大小(size)和形状兼容性(shape compatibility)的4种指标来度量相似性。两个区域的相似性是上述四个相似性的线性组合。下图既是Selective Search的候选区域结果。通常来说1000~1200个候选区域(对合并后的每个子区域做bounding boxes(外切矩形))就足以涵盖正确结果。为什么Selective Search最后输出大约2000个候选区呢?因为从计算成本和性能考虑,2000的时候,效果最好。选择性搜索是一种比较朴素的区域提名方法,被早期的基于深度学习的目标检测方法(包括Overfeat和R-CNN等)广泛利用,但被当前的新方法弃用了。关于Selective Search的详细内容和代码可以参考这里。
OverFeat由纽约大学Yann LeCun团队于2013年提出,并于ILSVRC2013比赛中获得了多项第一。“Finally, we release a feature extractor from our best model called OverFeat.”这是论文摘要中对OverFeat的一句总结性概括,注意feature extractor ,难道OverFeat就是一个特征提取器?OverFeat改进了Alexnet,提出了使用同一个卷积网络完成了多个任务的方法。该方法充分利用了卷积神经网络的特征提取功能,它把分类过程中提取到的特征同时又用于定位检测等各种任务,只需要改变网络的最后几层,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。这充分体现和发掘了CNN特征共享的优点。这就是深度学习的发展规律,当我们回顾过去深度学习在CV领域的每一次创新时,似乎都觉得逻辑简单、自然,然而正如哥伦布发现新大陆一样,总是极少数人才可以完成!
OverFeat主要是把网络的第一层到第五层看做是特征提取层,然后不同的任务共享这个特征提取层。基本用了同一个网络架构模型(特征提取层相同,分类回归层根据不同任务稍作修改、训练)、同时共享基础特征。
R-CNN是Region-based Convolutional Neural Networks的缩写,中文翻译是基于区域的卷积神经网络,是一种结合区域提名(Region Proposal)和卷积神经网络(CNN)的目标检测方法,论文全名为《Rich feature hierarchies for accurate object detection and semantic segmentation》。其实在R-CNN之前已经有很多研究者尝试用Deep Learning的方法来做目标检测了,包括上文介绍的OverFeat,但R-CNN是第一个真正可以工业级应用的解决方案,并且在R-CNN的基础上后续依次出现了SPP-net、Fast R-CNN、Faster R-CNN、R-FCN等多个著名的目标检测模型。R-CNN这篇论文主要有两点主要贡献:(1)如何利用深度的神经网络去做目标的定位。(2)如何在一个小规模的数据集上利用迁移学习 fine-tune 得到一个更好的模型。
R-CNN同样借鉴了滑动窗口思想,采用采用基于候选框的区域识别方案,具体步骤是:
乍一看,R-CNN的识别过程似乎和OverFeat一致,其实不然,R-CNN没有采用基于滑动窗口的方式进行穷举窗口提名,采用的是Selective Search进行选择性搜索,降低了计算成本,并且采用了统一的边框回归器,最后的分类工作是由SVM来完成的。
R-CNN的特征提取工具采用的是AlexNet,Selective Search提取的候选区大小都是不同的,R-CNN采用了比较暴力的手段直接把所有候选区resize到AlexNet的输入大小227 * 227,然后AlexNet会对每个候选区输出一个长度为4096的特征向量,然后我们使用对每个类别训练出的SVM给整个特征向量中的每个类别单独打分(概率)。
针对每个类,通过计算 IoU 指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。
前面已经提到,所有候选区图片需要变换到227*227大小,因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了不同的变换方法。如图6,左边是原始图片,右边第一行三列的处理方法依次为:
同时作者还测试了在变形前先进行边界像素填充padding处理,即向外扩展建议框边界,图6右边第一行相当于采用padding=0的结果,图6右边第二行是 padding=16 处理的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高,也即是图6右边第二行第三列。
针对每个类别训练一个SVM的二分类器。输入是f7的特征,f7的输出维度是4096,输出的是是否属于该类别,训练结果是得到SVM的权重矩阵W。这里选定IOU<0.3的是负样本,正样本是Ground Truth。IOU的阈值选择和fine-tuning不一样,主要是因为:fine-tuning需要大量的样本,所以设置成0.5会比较宽松。而在SVM阶段是由于SVM适用于小样本,所以设置0.3会更严格一点。
为什么R-CNN选择SVM作为分类器,而没有使用softmax呢?上面我们提到在训练阶段,正例是Ground Truth(IoU>0.7),IoU<0.3的定义为负例(其他的忽略),为什么是0.3呢?论文也提到这个阈值的设定非常重要,通过网格搜索{0, 0.1, . . . , 0.5},测试发现如果设置为0.5,mAP会降低5个百分点,如果设置为0,则会降低4个百分点。在fine-tuning阶段,softmax的训练本身就需要大量数据集,而SVM更适合在只有小数据集场景下的表达。cnn在训练的时候,IoU的阈值设置为0.5,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn,采用这个方法的主要原因在于因为CNN容易过拟合,需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。在fine-tuning时,首先也使用了IoU阈值为0.3,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。
原始候选区的大小和位置不一定是准确位置,可能存在偏差(如图7),训练一个线性回归模型去判定这个框是否框得完美,修正候选框位置。
用pooling3的特征6*6*256和bounding box的ground truth来训练回归,每种类型的回归器单独训练。输入是pooling3的特征,以及每个样本对的坐标和长宽值。另外只对那些跟ground truth的IOU超过某个阈值且IOU最大的proposal回归,其余的region proposal不参与。通过对pooling3层的特征X做线性变换WX得到变换函数F(X),这些变换函数作用于候选框的坐标达到回归的作用(包括对x,y的平移以及对w,h的缩放)。
本文的第二个核心贡献是在辅助数据集(ILSVRC)上进行有监督预训练,再在小数据集上针对特定问题进行调优。这是在训练数据稀少的情况下一个非常有效的训练大型卷积神经网络的方法。原文在大型辅助训练集ILSVRC2012分类数据集(没有约束框数据)上预训练了CNN,然后在VOC数据集上判断21个类别(其中20是VOC的类别数,1代表背景)任务的微调。
尽管R-CNN的识别框架与传统方法区别不是很大,但是得益于CNN优异的特征提取能力,R-CNN的效果还是比传统方法好很多。如在VOC2007数据集上,传统方法最高的平均精确度mAp为40%左右,而R-CNN的mAp达到了58.5%。
但是R-CNN的缺点也很明显。第一,R-CNN流程较多,包括region proposal的选取、训练卷积神经网络、训练SVM和训练 regressor(squared loss),这使得训练时间非常长,并且因为要保存CNN提取的特征结果,占用磁盘空间也大。第二,在训练卷积神经网络的过程中对每个region proposal都要计算卷积,每张图片有2000多个region proposal,大部分都有重叠,导致计算量大,且存在太多重复的计算,一张图在GPU上也需要十几秒。
既然2000个region proposal都需要做CNN计算,那么我们完全可以对图像提一次卷积层特征,然后只需要将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要进行一次卷积计算,然后将每个region proposal对应的卷积层特征输入到全连接层做后续操作即可。但是因为候选区的大小不同,没有像R-CNN一样做变换到同一个尺寸,因此对应的特征大小也是不同的,所以不能直接输入到全连接层中。
SPP-Net(Spatial Pyramid Pooling 空间金字塔池化)是出自2015年发表在IEEE上的论文《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。众所周知,大多数经典神经网络都是由CNN和FCN组成,CNN负责特征提取,FCN负责分类。其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入,所以很多网络都对输入大小有要求,例如Alexnet、VGG等,输入图片需要先做warp/crop处理才能输入到网络中。但warp/crop这种预处理,往往会导致图片变形、产生干扰或者多余信息,影响识别结果。
SPP-Net借鉴了CNN可以有任意大小输入的特性,如图8,通过使用金字塔池化层SPP取代了原来网络中最后一个池化层,使得整个网络可以接受任意大小的输入,同时产生固定大小的输出,然后后面再接全连接层。
SPP-Net是怎么实现如此神奇的操作呢?如图9,是SPP的网络结构图,对于最后一层的卷积输出,我们以不同大小的池化层来对图片提取特征,这里和传统池化操作不同的地方在于,以前的池化窗口和步长都是固定的,因为输入是固定的,所以池化后的输出也是固定的。SPP的操作是池化窗口和步长都不是固定的,但是输出是固定的,如图9,每个pooling bin(一次池化计算)对应一个输出,所以最终pooling后特征输出由bin的个数来决定。本文就是分级固定bin的个数,调整bin的尺寸来实现多级pooling固定输出。假设图9的输入特征大小是 a * a * 256, 256是通道数(当然特征大小不一定是方形的,也可以是h * w),设置了三个不同大小的bin输出,分别是1*1、2*2、4*4,所以bin为1 * 1时,池化窗口大小是a,bin为2 * 2时,池化窗口大小是a/2向上取整,步长是a/2向下取整,bin为4 * 4时,池化窗口大小是a/4向上取整,步长是a/4向下取整。SPP输出的特征大小就是固定大小 (16+4+1) * 256。
当然,SPP的bin的个数是可以修改的,假设输入特征大小是 13 * 13,三层金字塔池化bin分别为:3×3, 2×2, 1×1,其池化窗口和步长参数分别如图10。
因为SPP的所有操作都是由pooling完成的,因此在接受任意大小输入,固定输出的基础上,没有新增任何参数,所以所有输入共享一套参数。
现在我们来总结一下SPP-Net的特点:SPP-Net突破了之前网络结构对于输入大小固定的限制,可以接受任意大小输入;相比于R-CNN需要进行多次CNN计算,SPP-Net因为只需要对全图进行一次CNN计算,因此速度相对于R-CNN快了一百多倍;SPP-Net的金字塔池化结构取代了FC6,大大减少了网络参数;另外,原文还提到了一些训练方面的工作,多尺度的图片变换效果会好于单尺度,例如采用224和180两种大小,具体可以详细看一下论文。
https://www.cnblogs.com/zyly/p/9259392.html
https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf
https://blog.csdn.net/hjimce/article/details/50187881
https://blog.csdn.net/v_JULY_v/article/details/80170182
https://blog.csdn.net/WoPawn/article/details/52133338
https://www.cnblogs.com/xiaotongtt/p/6691103.html
https://blog.csdn.net/whiteinblue/article/details/43415035