R-CNN:Region-CNN,是第一个成功将深度学习应用到目标检测上的算法。R-CNN基于卷积神经网络(CNN),线性回归,和支持向量机(SVM)等算法,实现目标检测技术。
创新点:将CNN用作目标检测的特征提取器、有监督预训练的方式初始化CNN、在CNN特征上做BoundingBox 回归。
目标检测区别于目标识别很重要的一点是其需要目标的具体位置,也就是BoundingBox。而产生BoundingBox最简单的方法就是滑窗,可以在卷积特征上滑窗。但是我们知道CNN是一个层次的结构,随着网络层数的加深,卷积特征的步伐及感受野也越来越大。例如AlexNet的Pool5层感受野为195*195,feature map大小为32*32,显然这种感受野是不足以进行目标定位的。使用浅层的神经网络能够保留这种空间结构,但是特征提取的性能就会大打折扣。RCNN另辟蹊径,既然我们无法使用卷积特征滑窗,那我们通过Region Proposals(区域建议)方法产生一系列的区域,然后直接使用CNN去分类这些区域是目标还是背景不就可以吗?当然这样做也会面临很多的问题,不过这个思路正是RCNN的核心。因此RCNN全称为Regions with CNN features。
RCNN算法分为4个步骤:
候选区域生成:一张图像生成1K~2K个候选区域 (采用Selective Search 方法);
特征提取:将每个候选区域缩放至相同大小,使用CNN提取特征;
类别判断:特征送入每一类的SVM 分类器,判别是否属于该类,分类后使用NMS算法减少检测结果的个数;
位置精修:使用回归器精细修正候选框位置。
整体结构
RCNN的输入为完整图片,首先通过区域建议算法产生一系列的候选目标区域,其中使用的区域建议算法为Selective Search,具体可以参照:目标检测(1)-Selective Search - 知乎专栏。然后对于这些目标区域候选提取其CNN特征,并训练SVM分类这些特征。最后为了提高定位的准确性在SVM分类后区域基础上进行BoundingBox回归。
1、产生目标区域候选
这部分其实就是直接使用Selective Search,选择2K个置信度最高的区域作为候选区域。
正负样本的选择:如果用selective search挑选出来的候选框与物体的人工标注矩形框的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别(正样本),否则我们就把它当做背景类别(负样本)。该方法在目标检测领域几乎是通用的。
2、CNN目标特征提取
RCNN使用的是AlexNet,可以参见我们的相关文章:卷积神经网络模型(2)-AlexNet解读 - 知乎专栏,由于CNN的参数量巨大,训练CNN需要大量的样本,此前的方法是大家先用无监督的预训练初始化CNN的参数,然后再在样本集上使用监督的训练方法。不同于这些方法,RCNN使用ImageNet的有标签数据进行有监督的预训练,然后再在本数据集上微调最后一层全连接层。直到现在,这种方法已经成为CNN初始化的标准化方法。但是训练CNN的样本量还是不能少的,因此RCNN将正样本定义的很宽松,为了尽可能获取最多的正样本,RCNN将IOU>0.5(IoU 指重叠程度,计算公式为:A∩B/A∪B)的样本都称为正样本。每次迭代批大小为128,其中正样本个数为32,负样本为96.其实这种设置是偏向于正样本的,因为正样本的数量实在是太少了。由于CNN需要固定大小的输入,因此对于每一个区域候选,首先将其放缩至227*227,然后通过CNN提取特征。
· CNN特征层选取(选择最后一个全连接层作为特征提取层)
现在CNN已经能够提取到目标的特征了,但是CNN的层数很多,选择哪一层作为特征提取层呢?RCNN进行了宽泛的实验,最终选择的fc层。
对比Pool5层以及FC层,可以看出fc层相对的MAP要高很多,尤其是经过预训练后的网络。一方面原因是Pool5层的特征尺寸比较大,另一方面是全连接层特征更加符合类别信息。但是选用Fc6还是Fc7呢差距还是不明显的。其中R-CNN FT fc7 BB取得了最高的MAP,数据是在经过微调的RCNN上取得Fc7层特征,然后训练SVM,并通过BoundingBox回归得到的最终结果。
3、目标种类分类器(使用SVM作为目标种类分类器)
在通过CNN提取区域候选的特征后,RCNN对于每个种类训练SVM用以分类这些特征具体属于哪个种类。但是这里面的样本和CNN中的样本也是不一样的,因为CNN需要大量的样本去驱动特征提取,因此正样本的阈值比较低。而SVM适合小样本的分类,通过反复的实验,RCNN的SVM训练将ground truth样本作为正样本,而IOU<0.3的样本作为负样本,这样也是SVM困难样本挖掘的方法。
4、贪婪非极大值抑制(NMS)
由于有多达2K个区域候选,我们如何筛选得到最后的区域呢?RCNN使用贪婪非极大值抑制的方法,假设ABCDEF五个区域候选,首先根据概率从大到小排列。假设为FABCDE。然后从最大的F开始,计算F与ABCDE是否IoU是否超过某个阈值,如果超过则将ABC舍弃。然后再从D开始,直到集合为空。而这个阈值是筛选得到的,通过这种处理之后一般只会剩下几个区域候选了。
5、BoundingBox回归
为了进一步提高定位的准确率,RCNN在贪婪非极大值抑制后进行BoundingBox回归,进一步微调BoundingBox的位置。不同于DPM的BoundingBox回归,RCNN是在Pool5层进行的回归。而BoundingBox是类别相关的,也就是不同类的BoundingBox回归的参数是不同的。
注:使用每个proposal的最后的卷积的输出Pool5作为特征,训练了线性回归模型,用来预测新的窗口的位置。
例如我们的区域候选给出的区域位置,也就是区域的中心点坐标以及宽度和高度:
我们要做的就是找到一个映射把他转换到真实的位置:
那我们就要定义一些转换的参数:
这些就是我们需要的参数,我们想得到关于尺寸无关的X,Y偏移量,以及尺度变化信息。如果求解到了这四个参数,我们就能成功的映射到真是目标位置了。
RCNN选用的特征是Pool5层特征,然后假设每个偏移量是Pool5特征的一个线性映射,也就是:
然后我们要求解这个W就可以了,RCNN使用的是L2范数的最小均方误差,也就是下面这个式子,T就是我们的目标,根据我们上面的GP的公式可以很容易得到T的表达式,也就是最后这个式子:
这就是个规则的最小均方误差的问题了,很容易求解,比如BP算法。需要注意的一点就是在对于训练样本的选择上,我们做的只是微调,因此不能选择目标框与真实位置相差较大的情况。
为什么不直接使用Fc8的结果作为贪婪极大值抑制的输入而是重新训练很多的SVM呢?
使用SVM相当于先将所有的检测结果筛选一遍。作者有去尝试使用Fc8结果作为输入,但是发现精度大约下降了4%,产生这种情况的原因是我们CNN的图片正样本定义为IOU>0.5,这是个很宽松的条件,导致CNN并不能定位到很精确的位置。那能不能将IOU设置的高一点呢?答案是否定的,因为CNN需要大量的样本,当正样本设置为真时BoundingBox效果很差,而IOU>0.5相当于30倍的扩充了样本数量。而我们将CNN结果作为一个初选,然后用困难负样本挖掘的SVM作为第二次筛选就好多了。
在什么时候训练SVM分类器,训练多少个分类器,用哪些样本训练呢?
在最后一个全连接层(fc7层)之后来训练SVM分类器,选择那些判定为本类的候选框中和真值重叠面积大于0.6的候选框作为正样本,重叠度小于0.3的候选框,我们就把它标注为负样本;
对每个类别都会训练一个SVM分类器,即二分类任务,SVM的输出为待分类的目标类和其它类+背景。
存在的问题
RCNN虽然效果很好,但是存在一些问题,比如时间代价太高了,网络训练是分阶段的,太麻烦了等。而这些问题将在我们后面的文章一一解决。直到最终版本Faster RCNN可以说是近乎完美的目标检测模型了,网络优美,速度快。
缺点:速度慢,由于一张图可以提取大量的候选框(约2000个),每个候选框都要通过网络进行前馈,这样就造成了大量的计算量。
参考链接:https://zhuanlan.zhihu.com/p/23006190
https://zhuanlan.zhihu.com/p/27473413