目标检测(Object Detection)1—RCNN

RCNN概述

RCNN是在目标检测领域中具有里程碑意义的一个重要算法,在2014年由Ross Girshick等人提出,paper的题目是“Rich feature hierarchies for accurate object detection and semantic segmentation.”
RCNN的总体流程大致可以用下图来表示。
在这里插入图片描述
或者下面这张被用烂的图哈哈
在这里插入图片描述
OK,话不多说,我们开始每一部分的详细讨论。

1.候选区域生成

使用的算法是selective search,是一种十分经典的 regional proposal 算法,相较于滑动窗口,计算量减少同时能够提供不同尺寸的目标候选区域。下面我们来仔细看一看这个算法。
在这里插入图片描述
如图中所示,我们的input当然是一张图片,我们的output是一系列候选区域的集合。那具体怎么实现呢?
1.首先我们通过基于图论的图像分割算法得到一系列初始候选区域集合R。
2.定义一个相似度集合S,初始为空。(这里说明一下为什么需要check相似度。因为当两个相邻区域的相似度极高时,我们可以认为这两块区域很有可能是一个完整目标的两部分,因此我们会将这两块区域合并。 关于相似度的度量,我们会从一些基本维度入手比如颜色,光照等等
3.对于任意两个相邻的区域ri和rj,我们去计算它们的相似度s(ri,rj)(注意,这里的相似度是不同维度相似度的加权平均后的综合, 并将结果添加到S中。
4.当S不为空时,不断循环下面的操作
{ a.从所有的相似度s(ri,rj)中,选出最大的那一个对应的ri和rj,并将它们 merge,计作rt,同时从S中删除任何与ri和rj相关的相似度。
b. 新增一个St用来包含rt和和与它相邻区域的相似度。
c.update S=SUSt,R=RUrt }
当上述算法运行结束后,R中就会包含非常多不同size的候选区域,用来作为后续目标识别算法的输入。
在这部分还有一个非常重要的问题就是,因为我们接下来需要将这些候选区域作为神经网络的输入,因此必须保证每一个候选区块的size要保持一致。原文中作者将它们统一压缩到227*227 pixel 的统一 size,这里具体的方法就不再展开了,有兴趣的朋友可以阅读一下paper或者其他博主的相关文章,里面有相关的细节说明。

特征提取(CNN)

为什么说RCNN对于目标检测具有里程碑式的意义呢?其中一个重要的突破就是引入deep learning。具体来说,在RCNN中,我们通过使用卷积神经网络(CNN)来提取特征。对于每一个候选区域,我们通过CNN将其转化为一个相同长度的vector。在原文中,作者使用的CNN包括5层卷积加上2个全连接层,最后使用一个4096维的vector作为每一个候选区域的特征。这里需要注意的一个点是,这个vector并不是CNN的输出层,因为CNN的输出层是一个N维的向量,N代表总共可能的物体类别总数(包括背景),比如图片中总共有20个可能的物体类别,那么最后的输出层应该是(20+1)维,1代表背景。我们使用的是在softmax前的最后一层全联接层,作为每个候选区域的特征。

下面对于CNN的训练过程做一些说明。首先,大家会不会有一个疑问就是,既然我们已经有了CNN这个完整的分类模型,为什么还要多此一举的将CNN提取的特征再放给SVM分离器去再做分类呢?原因在于在SVM与CNN中对正负样本定义的严格程度不同。具体来说,通过CNN训练时,对数据的标注相对比较宽松,比如我们有一个bounding box,它可能和真实的ground truth(物体真实框)只重合了一部分,在CNN的训练中,我们也把它记为正样本。那么在CNN中我们为什么要这么做呢?原因在于如果我们的要求过于严格,那么被打上positive标签的样本数就太少了,模型根本训练不起来。因此对于那些IOU大于0.5的样本都被label成正样本。哦对了,忘记介绍IOU这个概念了,本质上它就是用来度量候选框与真实框的overlap程度,假设真实框为A,候选框为B,那么IOU=overlap(A,B)/(AUB),越大,代表候选框越准确。介绍完毕,相信大家都能理解。

OK,我们继续讲。上面我已经提到了,我们在训练CNN时的样本数量,特别是正样本的数量十分欠缺,如果我们从随机初始化参数开始训练,很大可能得不到好的结果。那么在原文中作者采用的一个idea就是迁移学习。简单来说,作者使用了一个已经在大规模数据上(ImageNet)训练好的CNN网络的前面几层结构的参数,把它作为我们训练的起点,在用我们的数据(PASCAL VOC)去训练神经网络中基于特定数据后几层的参数(fine-tune)。在原先通过ImageNet训练的CNN结构,最后的分类种类是1000,意味着输出层是1000维的vector。对于我们这个特定的数据集,我们需要调整到对应的class 数目N,比如对于VOC数据集,我们总共有20个类别再加上1个background总共21。接下来我们可以开始训练了,训练具体使用的是SGD(随机梯度下降),初始学习率设定为0.001。同时在每组训练中,我们的batch size=128,其中包括32个正样本,和96个负样本。为什么这里不选择随机抽样呢而要保证正负样本的比例?原因还是我之前提到问题,正样本数太少了,如果不这样设置,很有可能在一个batch中,没有几个正样本,而导致出现正负样本数unbalanced的情况。

分类(SVM)

当我们完成CNN的训练阶段之后,我们得到了每个候选区域的对应特征向量。接下来我们的目标是使用SVM算法来训练多个二元分类器。对于图片中的每一个物体种类,我们都训练一个分类器来判定候选区域中是否包含这个物体种类。既然是二元分类,那么训练集的标签自然也是0或1了。比方说,我们需要训练一个分类器来判断是否包含狗。那么对于那些有狗的候选区域我们打上正标签,其余一律打上负标签,其他的类别也是一样。那么这里的一个重点是,对于那些与真实框有相交但不完全overlap的区域怎么办?原文中作者尝试了一系列IOU overlap 的threshold,通过grid search最后选择了0.3作为阈值,也就是IOU大于0.3的打上正标签,反之打上负标签。OK,我们有了从CNN 中提取的特征和我们打上的标签,就可以开启SVM的训练了。当完成所有的SVM分类器训练之后,我们还需要做的就是根据SVM为各个候选区域的打分,评出最优的几个作为真实物体的候选框。这里我们用到的方法叫做非极大值抑制。
大致流程如下:假设我们根据分类器概率预测结果得到一系列包含汽车这个物体的候选框:A,B,C,D,E,F,G。其中A的概率最高,意味着分类器认为A最可能就是包含汽车的框,那么我们设定一个阈值,一切和A重叠超过这个阈值的候选框全部被除去,假设除去了B,C,D,保留A。然后对于剩下的E,F,G,重复上述的算法,直到确定所有被保留的框。

回归(BBOX Regression)

对于每个类别选出的候选框,即便候选框被认为是真实框,但是无可避免的是目前为止,这两个框很难做到完全overlap。因此我们还需要通过一个func去减少这部分偏差,让我们的bbox更精准的包含物体。这里我们不能再做分类了,而是应该做回归。BBox Regression就是一个用来做微调的回归。关于这部分内容的细节,大家可以参考这篇文章,我觉得写得非常详细。
https://blog.csdn.net/zijin0802034/article/details/77685438/

OK,以上就是RCNN的全部内容了,作为一名刚接触CV的小白,还有非常多的不足,希望大家批评指正,共同进步。

参考:
1.https://blog.csdn.net/hjimce/article/details/50187029?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.channel_param
2.
https://blog.csdn.net/zijin0802034/article/details/77685438/
3.Rich feature hierarchies for accurate object detection and semantic segmentation -Ross Girshick Jeff Donahue Trevor Darrell Jitendra Malik UC Berkeley

猜你喜欢

转载自blog.csdn.net/weixin_44607838/article/details/109340402