首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

图像识别与原理50 目标检测03 R-CNN

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获得,矩形框的位置则是通过回归方式获得。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OLAxQiy7-j_ejgViqV2hlW0Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券