R-CNN,下面介绍R-CNN的训练过程,整体训练流程如图1所示。
图1 R-CNN训练过程
(1)选出潜在目标候选框(ROI)
R-CNN使用selectiveSearch算法通过图像分割的方法得到一些原始区域,然后使用一些合并策略将这些区域合并,得到一个层次化的区域结构,而这些结构就包含着可能需要的物体。
objectness[10]、selectivesearch[11]、category-independent object proposals[12]等很多论文都讲述了候选框提取的方法,R-CNN使用selective search的方法选出2000个潜在物体候选框。
(2)训练一个好的特征提取器
R-CNN使用卷积神经网络AlexNet提取4096维的特征向量,实际上使用VGGNet、GoogLeNet或ResNet等也可以。将2000候选区域缩放到227x227pixel,接着将候选区域输入事先训练好的AlexNet CNN网络获取4096维的特征得到2000×4096维矩阵。
AlexNet等网络要求输入的图片尺寸是固定的,而R-CNN中的ROI尺寸大小不定,这就需要将每个ROI调整到指定尺寸,调整的方法有很多种,包含上下文的尺寸调整,不包含上下文的尺寸调整,尺度缩放等。
判定类别,将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘,获得2000×20维矩阵表示每个建议框是某个目标类别的得分。分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框。
为了获得一个好的特征提取器,一般会在ImageNet预训练好的模型基础上做调整(因为ImageNet预测的种类较多,特征学习相对比较完善),唯一的改动就是将ImageNet中的1000个类别的输出改为(C+1)个输出,其中,C是真实需要预测的类别个数,1是背景类。新特征的训练方法是使用随机梯度下降(Stochastic Gradient Descent,SGD),与前面介绍的普通神经网络的训练方法相同。
图2 IOU图示
提到训练,就一定要有正样本和负样本,这里先抛出一个用于衡量两个矩形交叠情况的指标:IOU(Intersection Over Union)。IOU其实就是两个矩形面积的交集除以并集,如图2所示。一般情况下,当IOU>=0.5时,可以认为两个矩形基本相交,所以在这个任务中,假定在两个矩形框中,1个矩形代表ROI,另一个代表真实的矩形框,那么当ROI和真实矩形框的IOU>=0.5时则认为是正样本,其余为负样本。
至此,R-CNN的第二步特征提取器就可以开始训练了,不过在训练过程中应注意,需要对负样本进行采样,因为训练数据中正样本太少会导致正负样本极度不平衡。最终在该步得到的是一个卷积神经网络的特征提取器,其特征是一个4096维特征向量。
(3)训练最终的分类器
每个类别单独训练一个SVM分类器。这里介绍一个小技巧,SVM的训练也需要选择正负样本,R-CNN的提出者做了一个实验来选择最优IOU阈值,最终仅仅选择真实值的矩形框作为正样本。
(4)训练回归模型
为每个类训练一个回归模型,用来微调ROI与真实矩形框位置和大小的偏差,
NMS(非极大值抑制)处理后剩余的建议框进一步筛选。接着分别用20个回归器对上述20个类别中剩余的进行回归操作,最终得到每个类别的修正后的得分最高的框,就是输出结果。
如图3训练结果所示。
图3 R-CNN中的ROI结果微调
下面是所有检测问题都会用到的一段代码(IOU的计算):
def bboxIOU (bboxA, bboxB):
A_xmin = bboxA[0]
A_ymin = bboxA[1]
A_xmax = bboxA[2]
A_ymax = bboxA[3]
A_width = A_xmax - A_xmin
A_height = A_ymax - A_ymin
B_xmin = bboxB[0]
B_ymin = bboxB[1]
B_xmax = bboxB[2]
B_ymax = bboxB[3]
B_width = B_xmax - B_xmin
B_height = B_ymax - B_ymin
xmin = min(A_xmin, B_xmin)
ymin = min(A_ymin, B_ymin)
xmax = max(A_xmax, B_xmax)
ymax = max(A_ymax, B_ymax)
A_width_and = (A_width + B_width) - (xmax - xmin) #宽的交集
A_height_and = (A_height + B_height) - (ymax - ymin) #高的交集
if ( A_width_and <= 0.0001 or A_height_and <= 0.0001):
return 0
area_and = (A_width_and * A_height_and)
area_or = (A_width * A_height) + (B_width * B_height)
IOU = area_and / (area_or - area_and)
return IOU
预测阶段可分为如下几个步骤。
1)使用selectivesearch方法先选出2000个ROI。
2)所有ROI调整为特征提取网络所需的输入大小并进行特征提取,得到与2000个ROI对应的2000个4096维的特征向量。
3)将2000个特征向量分别输入到SVM中,得到每个ROI预测的类别。
4)通过回归网络微调ROI的位置。
5)最终使用非极大值抑制(Non-MaximumSuppression,NMS)方法对同一个类别的ROI进行合并得到最终检测结果。NMS的原理是得到每个矩形框的分数(置信度),如果两个矩形框的IOU超过指定阈值,则仅仅保留分数大的那个矩形框。
以上就是R-CNN的全部过程,我们可以从中看出,R-CNN存在如下一些问题。
·不论是训练还是预测,都需要对selective search出来的2000个ROI全部通过CNN的Forward过程来获取特征,这个过程花费的时间会非常长。
·卷积神经网络的特征提取器和用来预测分类的SVM是分开的,也就是特征提取的过程不会因SVM和回归的调整而更新。
·R-CNN具有非常复杂的操作流程,而且每一步都是分裂的,如特征提取器通过Softmax分类获得,最终的分类结果由SVM获得,矩形框的位置则是通过回归方式获得。
领取专属 10元无门槛券
私享最新 技术干货