1.算法流程
本篇论文采用的方法是:首先输入一张图片,然后用选择性搜索(SS)的方法给出2000个物体候选框,接着利用CNN网络对每个候选框提取特征向量,最后用SVM对每个候选框中的物体进行分类识别和用回归器精细修正候选框的位置。
算法的具体流程如下图所示:
2.区域候选框
RCNN论文采用的是传统的选择性搜索的方法来生成2000个大小各不相同的矩形候选框。从上面的算法流程我们可以知道,下一步是要将这些候选框送入CNN进行特征计算,由于CNN网络的输入是尺寸固定的,所以在进行特征提取之前要把区域候选框固定到统一的大小。
RCNN论文采用了两种方法来对候选框的大小进行处理:
(1)各向异性缩放
这种方法的思路就是不管图片的尺度是多少,也不管图片是否扭曲,全部缩放到CNN输入所需的尺寸。如下图D所示。
(2)各向同性缩放
因为图片扭曲之后,估计会对后续CNN网络的训练精度有影响,所以作者试验了两种“各向同性缩放”方法。
①直接在原始图片中,将bounding box的边界扩展延伸成所需尺寸,然后再进行剪裁;如果已经延伸到原始图片的外边界,就用bounding box中的颜色均值填充,具体结果如下图B所示。
②先把bounding box图片剪裁出来,然后用固定的背景颜色填充成所需尺寸图片,具体结果如下图C所示。
上述方法经过作者的试验,发现采用各向异性缩放、padding=16的精度最高。
经过上述操作之后,我们就得到了输入CNN网络指定大小的图片。如下面所述,我们采用的是AlexNet的CNN结构,所以输入大小是227*227。
3.CNN提取特征
(1)网络结构设计
可采用的CNN网络架构有两种,分别为Alexnet和VGG16。VGG模型的特点是选择比较小的卷积核和步长,这个网络的精度高,但是计算量是AlexNet的7倍。所以我们直接选用AlexNet,它包含5个卷积层和2个全连接层,通过这个网络训练之后,每个候选框都能得到一个4096维的特征向量。
(2)网络有监督预训练阶段
物体检测的一个难点在于:物体标签训练数据少。如果直接采用随机初始化的参数的方法,目前的数据量是不够的。这篇文章采用的是有监督的预训练。所以文章在网络结构设计的时候,直接采用的是AlexNet网络,然后参数也是直接采用的它的参数作为初始参数,然后再微调训练。网络优化求解过程中采用SGD,学习率为0.001。
(3)fine-tuning阶段
假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个事正样本、96个事负样本。
4.SVM训练
首先解决的一个问题是:如果检测窗口只有部分包含物体,怎么定义正负样本?作者通过测试IOU数值分别为0,0.1,0.2,0.3,0.4,0.5发现,选择IOU数值为0.3的效果最好,即当重叠度小于0.3的时候,我们将它标注为负样本。一旦上述4096维的特征被提取出来,我们将为每一个物体训练一个SVM分类器,得到最终的分类结果。
5.位置精修
目标检测的衡量标准是重叠面积。许多看似准确的检测结构,往往因为候选框不够准确,重叠面积很小,所以需要对候选框的位置进行精细修正。对于每一类,训练一个线性回归模型去判定这个框是否完美,如下图所示。
为什么要进行位置的精修呢?首先,原始的bb是用SS选出来的,这相当于是一个外部算法,硬加到了CNN当中,经过一系列的过滤和NMS,可以认为得到了一个“暂时最优”的bb,这也是detection暂时工作的结果。以下图为例:
红色框是我们预先propose出来的,绿色框是ground true,是最优的。这两个框显然是不太重合的,如果有一种方法,能够让我们在经过一系列CNN计算之后,将这个“暂时最优”的框“挪动”一下,更接近ground true,岂不是最好,这就是边框精修。
具体的方法过程见博客:https://blog.csdn.net/u014433413/article/details/78194855
6.总结
(1)RCNN的优点(贡献)
① 使用了卷积神经网络进行特征提取
② 使用bounding box regression进行目标框的修正
(2)RCNN的缺点
① 耗时的SS:候选框生成采用selective search的方法,对于一帧图像,需要花费2s。
② 耗时的串行式CNN前向传播:对于每一个ROI,都需要经过AlexNet网络进行特征提取,为所有的ROI提取特征大约要47s。
③ 三个模块是分别训练的,对于存储空间消耗比较大。