计算机视觉之目标检测——R-CNN、Fast R-CNN和Faster R-CNN详解

计算机视觉之目标检测——R-CNN、Fast R-CNN和Faster R-CNN详解

目标检测的任务

目标检测是计算机视觉领域最经典最重要的任务之一,经过十几年的发展,目标检测已经日趋成熟。在2005年,有人将基于方向梯度直方图(HOG)的特征提取和基于支持向量机(SVM)的分类方法结合起来,创建了一种目标检测的方法,在行人识别上获得了很大的成功。后来,由于AlexNet(2012)的出现,学术界开始出现构建大型卷积神经网络的潮流,目标检测任务也在这个时间段蓬勃发展了起来,在速度、检测准确率等方面都得到了很大的进步。

关于目标检测,它的主要任务是在图片中检测出物体。一般我们看到的形式,大多是在一张图片上,用一个矩形框框出图片中的物体,并标注这个物体属于哪个类别。实际上,目标检测任务共有四个不同的方案,如下图所示。

1. 第一种是给定含有单个物体的图片,对于整张图片给出一个分类结果:图片中的物体属于哪种类别。这属于比较简单的工作,在实际应用中,往往是收集只含有一个对象并几乎占满整张图片的图片作为训练集,训练模型,并且把模型用作目标检测的一部分。 2. 第二种和第三种都是在给定图片中,**对于每一个物体都要框出物体所属的区域,并且给出每个框中识别到的物体的类别**。这种在实际应用中最为常用,本文介绍的目标检测就是要实现这样的效果。 3. 第四种是对图片中的对象进行实例边缘分割,要求将图像精确的轮廓描绘出来。在实际应用中,往往只有特别精细的检测才需要完成这种任务,本文不讨论这种情况。

目标检测的方法

接下来介绍依次改进的三种目标检测方法:R-CNN,Fast R-CNN,Faster R-CNN.

R-CNN

对于目标检测问题,首先我们来分析一下简单的实现方案。

以人脸识别为例,假设我们有很多很多类似证件照的人脸图片,每张图片的大小都相同。我们现在需要实现一种算法,使得在一张普通的图片中也能检测出人脸。

我们有了许多的人脸数据,那么就很容易训练出一个检测人脸的模型,去判断一张固定大小的图与人脸的相似度如何,判断它属不属于人脸。然后对于一张一般的图,我们使用一个滑动窗口去遍历图像的每一部分,输入检测模型去判断这个方框内是否存在人脸。然后对于检测出人脸的边框,利用一些算法将它们相近的几个整合成一个边框,从而达到识别出物体(人脸)的效果。

HOG+SVM的行人识别和基于区域的卷积神经网络(R-CNN)用的都是这种思想。这种目标检测的思想主要分为三个步骤:

  1. 生成候选区域:采用一些方法来给出图片可能含有目标物体的区域。遍历图像是一种生成候选区域的方法,但是显然效率很低,对于生成候选区域有非常多的方法,在R-CNN原论文中采用了选择性搜索(selective search)的方法来生成候选区域,然后将不同大小的候选区域resize成相同的尺寸。
  2. 特征提取:在HOG+SVM行人特征识别中,使用了HOG描述符来提取特征;而在R-CNN中,作者使用了去掉输出层的AlexNet或VGGnet-16来提取特征。
  3. 进行分类:HOG行人识别和R-CNN都使用了线性SVM来进行分类。
在训练模型时,首先要在训练集上训练一个完整的AlexNet,然后再去掉最后一层,接上SVM分类器,再用经过AlexNet特征提取后的特征图,训练基于OVR策略的SVM。有关SVM和AlexNet的详细内容,可以查看我之前的博客。[AlexNet](https://blog.csdn.net/qq_43371810/article/details/104077151),[SVM](https://blog.csdn.net/qq_43371810/article/details/103419187)

R-CNN的解决方案实际上效果也很不错,但是也存在着许多缺点:

  1. 速度慢。对于一张图片而言,需要大量选取候选区域并逐个进行特征提取,速度非常慢,每秒钟只能处理0.07张图片,与“实时”的最终要求差距甚远。
  2. 空间利用率低:在提取特征时,一张图片可以生成足足2000个候选区域,对于每一个候选区域进行卷积操作后,都要保存它们的特征图,这就会导致存储所需空间的成倍扩大。

于是,从改进这两点的角度出发,Fast-R-CNN出现了。

Fast R-CNN

Fast R-CNN,顾名思义,就是在R-CNN基础上发展起来的检测速度更快的解决方案。由于R-CNN产生的候选区域之间可能有很多重叠的部分,在使用卷积神经网络进行特征提取时,有重叠的候选部分区域的特征图之间也会有很大部分重叠,这就会导致对于一张图片的某一部分进行多次特征提取,浪费时间和空间资源。

从这个角度出发,我们是否可以先对图像进行特征提取,再选出候选区域呢?这显然是可行的。但也存在这一个问题:对于卷积神经网络中的层次来说,我们都必须要保证所有图片到达每个层次的尺寸是一样的,例如AlexNet的输入必须都是(224,224,3),而选择性搜索产生的候选区域可能是大小不一的,经过卷积神经网络提取特征后的映射部分也同样是大小不一的,这样,普通的卷积神经网络就无法再进行下一步的操作了。在R-CNN中,这个问题的解决方案是对于选出的候选区域进行resize,但卷积操作后的特征图已经没有了图像原本的特征,不能进行resize。针对这个问题,Fast R-CNN使用了一种称为感兴趣区域RoI池化层的神经网络层次,解决了这个问题。

RoI池化层是将一张任意大小的图像,均匀分成 X × Y X\times Y X×Y个部分,然后在每个部分中使用最大或平均池化,这样就可以将不同大小的特征图在充分保留其特征的前提下,达到输入特征图尺寸相同的目的。

另外,Fast R-CNN还使用了一种微调候选框的一种方法:边界框回归。我们首先要在图片中精准地标出物体的真实位置,然后用回归的思想,利用提取出的特征图去拟合这个真实位置,达到微调候选框的效果。当然,也不能少了分类模块。因此进行RoI池化后的特征图,先经过几层共用的全连接层进一步提取特征后,一部分送给全连接层+softmax进行分类工作,另一部分送入边界框回归模块执行定位操作。如下图所示。

比起R-CNN,Fast R-CNN有如下优点:
  1. 训练速度和检测速度更快。使用VGGnet-16的Fast R-CNN比R-CNN的训练速度快9倍,检测时的速度快了7倍。
  2. 识别精度更高。Fast R-CNN的mAP为66%,而R-CNN只有62%.

Fast R-CNN较之R-CNN在速度和精度方面已经有了很大提升,但生成区域建议的算法需要在CPU上运行,限制了速度的提高。从这个角度出发,将生成区域建议的算法进行改进,就产生了Faster R-CNN.

Faster R-CNN

Faster R-CNN最大的创新点在于引入了区域建议网络(RPN),将生成区域建议的步骤也放入了神经网络中,在端到端学习方式中实现了一种几乎无成本的区域建议算法。Faster R-CNN的网络架构如下图所示:

从图中可以看出,Faster R-CNN其实就是在Fast R-CNN基础上加入了RPN。细分下来,Faster R-CNN可以认为由五个模块组成:
  1. 深度卷积网络:Faster R-CNN仍然使用卷积神经网络来提取图像特征。图中使用了VGGnet-16来提取特征。训练时,利用预训练的VGGnet-16,将最后一层池化层的输出作为特征图提取出来。
  2. 区域建议网络(RPN):深度卷积网络生成特征图后,对于特征图中的每一个点,使用 12 8 2 , 25 6 2 , 51 2 2 128^2,256^2,512^2 1282,2562,5122三种不同尺度和1:2,1:1,2:1三种不同纵横比产生9个不同的边框盒区域,称为“”(anchor)。RPN的作用就是对这些锚进行筛选和分类。首先去除一些方框跨出边界的锚,剩下的锚用于训练一个softmax二分类器,这个二分类器只需要判断:锚中的图像是属于前景(含有对象)还是背景,一般认为与真实边框标注重叠最大或者重叠IoU大于0.7的认为是前景。训练完成后RPN就可以给出更加精确的区域建议。
  1. RoI池化层:对于生成的区域建议共有9种不同大小,因此也需要经过RoI池化层将它们转化为相同的大小。
  2. 目标分类模块和边界框回归模块:这两部分的内容与Fast R-CNN基本相同,都使用了边界框回归的方法来微调边界框,提升检测效果。

训练时,利用预训练的VGGnet-16模型初始化网络,随机初始化RPN,利用标注数据训练RPN;接下来使用训练好的区域建议网络训练单独的一个快速R-CNN网络,这两步中的卷积层不共享;再保持共享卷积层固定,微调RPN的特定层;最后再调整后续的全连接层参数。

对于各种目标检测算法的速度,可以详见下图。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值