基于深度模型的对象检测综述:Faster RCNN, R-FCN,以及SSD

喜你入骨 提交于 2019-12-10 09:47:33

基于深度模型的对象检测综述:RCNN,Fast RCNN,Faster ECNN, R-FCN,以及SSD1

XB D., xingbod@gmail.com

前言

随着自动驾驶汽车,智能视频监控,人脸检测和各种人员计数应用的兴起,对快速,准确的对象检测系统的需求日益增长。这些系统不仅涉及识别和分类图像中的每个对象,还涉及通过在图像周围绘制适当的边界框来对每个对象进行定位。与传统的计算机视觉的前身,图像分类相比,对象检测成为一项艰巨的任务。

但是,幸运的是,当前最成功的对象检测方法也是图像分类模型的扩展。Google Tensorflow 发布了新的对象检测API,附带了一些特定模型的结构和预训练模型(原论文请点击相应链接):

  1. Single Shot Multibox Detector (SSD) with MobileNets
  2. SSD with Inception V2
  3. Region-Based Fully Convolutional Networks (R-FCN) with Resnet 101
  4. Faster RCNN with Resnet 101
  5. Faster RCNN with Inception Resnet v2

在本文,会简要介绍Faster R-CNN, R-FCN, and SSD。希望到本文结束时,我们将对深度学习如何应用于对象检测以及这些对象检测模型如何相互启发有所了解。在这里插入图片描述

Faster R-CNN

Faster R-CNN是基于深度学习的对象检测的经典模型。它激发了随之而来的许多检测和细分模型,包括我们今天要研究的另外两个模型。不幸的是,如果不先了解Faster R-CNN的前身R-CNN和Fast R-CNN,我们就无法真正开始理解Faster R-CNN,因此让我们快速了解一下其起源吧。

R-CNN

R-CNN是Faster R-CNN的祖父。换句话说,R-CNN 是第一个开启此类方法的。
R-CNN,或Region-based Convolutional Neural Network,由3个简单的步骤组成:

  1. 使用称为“选择性搜索”的算法在输入图像中扫描可能的物体,生成约2000个区域建议 (region proposals)
  2. 在每个region proposal的顶部运行卷积神经网络(CNN)
  3. 取得每个CNN的输出,并将其输入到a)支持向量机(SVM)对区域进行分类,以及b)线性回归以收紧对象的边界框(如果存在这样的对象)。

下图说明了这3个步骤:
在这里插入图片描述

换句话说,我们首先找出region proposals,然后提取特征,然后根据其特征对这些区域进行分类。从本质上讲,我们已经将对象检测变成了图像分类问题。R-CNN非常直观,但是非常慢。

Fast R-CNN

R-CNN的直接后代是Fast-R-CNN。Fast R-CNN在很多方面都类似于原始R-CNN,但是通过两个方面的增强提高了其检测速度:

  1. 在region proposal之前对图像执行特征提取,因此仅在整个图像上运行一个CNN,而不是在2000个重叠区域中运行2000个CNN
  2. 用softmax层替换SVM,从而扩展神经网络进行预测,而不是创建新模型

新模型如下所示:
在这里插入图片描述

从图像中可以看到,我们现在基于网络的最后一个特征图而不是原始图像本身来生成region proposal。结果,我们只能为整个图像训练一个 CNN。
另外,没有训练许多不同的SVM对每个对象类别进行分类,而是有一个softmax层直接输出类别概率。现在我们只需要训练一个神经网络,而不是一个神经网络和许多SVM。
Fast R-CNN在速度方面表现更好。仅存在一个大瓶颈:用于生成region proposal的选择性搜索算法。( selective search algorithm)

Faster R-CNN

至此,我们回到了最初的目标:Faster R-CNN。Faster R-CNN的主要贡献是用快速神经网络代替慢速选择性搜索算法。具体来说,它引入了 region proposal network(RPN)。

RPN的工作方式如下:

  1. 在初始CNN的最后一层,一个3x3的滑动窗口会在整个特征图上移动并将其映射到较低尺寸(e.g 256-d)
  2. 对于每个滑动窗口位置,它基于k个固定比率的锚框(默认边界框)生成多个可能的区域
  3. 每个region proposal均包括a)该区域的得分(是否有object) 和b)代表该区域边界框的4个坐标

换句话说,我们查看最后一个特征图中的每个位置,并考虑以其为中心的kk个不同的框:一个高框,一个宽框,一个大框等。对于每个框,我们输出是否它包含一个对象的分数,以及该框的坐标。这是一个滑动窗口位置:
在这里插入图片描述

2k2k个分数表示kk个边界框在“对象”上的每一个的softmax概率。请注意,尽管RPN输出边界框坐标,但它并未尝试对任何潜在对象进行分类:其唯一的工作仍然是提出对象区域。如果锚点框的“客观性”分数高于某个阈值,则该框的坐标将作为区域建议而向前传递。

一旦有了我们的region proposals,我们就将它们直接输入Fast R-CNN。我们添加了一个池化层,一些全连接层,最后是一个softmax分类层和bounding box回归器。从某种意义上说, Faster R-CNN = RPN + Fast R-CNN。在这里插入图片描述

总之, Faster R-CNN 可以实现更快的速度和最好的准确性。值得注意的是,尽管未来的模型在提高检测速度方面做了很多工作,但很少有模型能够在很大程度上超越Faster R-CNN。换句话说,Faster R-CNN可能不是最简单或最快的对象检测方法,但它仍然是性能最好的方法之一。例如,Tensorflow的带有Inception ResNet的Faster R-CNN是他们最慢但最准确的模型。

归根结底,Faster R-CNN看起来可能很复杂,但其核心设计与原始R-CNN相同:假设对象区域,然后对其进行分类。这是如今许多对象检测的主要做法(包括下一个要介绍的模型)。

R-FCN

还记得快速R-CNN如何通过在所有region proposals之间共享使用单个CNN计算来提高检测速度吗?这种想法也是R-FCN背后的动机:通过最大化共享计算来提高速度。

R-FCN,或 Region-based Fully Convolutional Net,每个输出之间共享100%的计算。由于是完全卷积的,因此在模型设计中遇到了一个独特的问题。

一方面,在对对象进行分类时,我们要达到分类具有位置不变性( location invariance ):无论猫在图像中出现的位置如何,我们都希望将其分类为猫。另一方面,在执行物体检测时,我们想了解位置差异性( location variance):如果猫在左上角,我们想在左上角画一个框。因此,如果我们尝试在100%的网络上共享卷积计算,我们如何在位置不变性和位置差异性之间妥协?

R-FCN的解决方案:位置敏感得分图(position-sensitive score maps)。

各位置敏感得分图(position-sensitive score map)表示一个相对位置的一个对象类。例如,一个得分图可能会在它检测到猫的右上角的任何地方激活。在看到汽车左下角的地方,可能会激活另一个得分图。本质上,这些得分图是经过训练以识别每个对象的某些部分的卷积特征图。

R-FCN的工作方式如下:

  1. 在输入图像上运行CNN(在本例中为ResNet)
  2. 添加一个完整的卷积层以生成上述“位置敏感得分图” 的得分库(score bank)。应该有k2C+1k^2(C + 1)个得分图,其中k2k^2代表划分对象的相对位置数(例如323^2,3 x 3网格),C + 1代表类的数量加上背景。
  3. 运行fully convolutional region proposal network (RPN) 以生成感兴趣的区域regions of interest (RoI’s)
  4. 对于每个RoI,将其划分为与得分图相同的k2k^2 "bin"或子区域
  5. 对于每个bin,检查分数库以查看该bin是否与某个对象的相应位置匹配。例如,如果我在“左上”容器中,我将获取与对象的“左上”角相对应的分数图,并在RoI区域中对这些值取平均值。每个类都会重复此过程。
  6. 一旦k2k^2 bins中每个bin都有一个“对象匹配”值对应每个类别,则对这些bin进行平均以得到每个类别的单个分数。
  7. 使用剩余C + 1维向量,利用softmax对RoI进行分类

总体而言,R-FCN看起来像这样,其中RPN生成了RoI:

在这里插入图片描述

即使提供了说明和图像,您可能仍然对该模型的工作原理有些困惑。老实说,当您可以可视化R-FCN的工作方式时,它更容易理解。这是实际中检测婴儿的R-FCN的一个示例:

在这里插入图片描述

简而言之,R-FCN会考虑每个region proposal,将其划分为子区域,然后在子区域中进行迭代,询问:“这看起来像是baby的左上角吗?”,“这看起来像是顶部的一样” -baby的中心?”“看起来像baby的右上角吗?”等。在所有可能的类别中都重复此步骤。如果足够多的子区域说“是的,我要与baby的那一部分匹配!”,则在所有类别的softmax之后,ROI会被归类为baby。

通过这种设置,R-FCN能够通过proposing不同的对象区域来解决 location variance,并通过让每个region proposal 返回到相同的得分图库来解决位置不变性location invariance。这些分数图应该学会将猫归类为猫,无论猫出现在哪里。最重要的是,它是完全卷积的,这意味着所有计算都在整个网络中共享。

结果,R-FCN比Faster R-CNN快几倍,并且达到了很接近的精度。

SSD

我们的最终模型是SSD, Single-Shot Detector。像R-FCN一样,与Faster R-CNN相比,它提供了巨大的速度增益,但是这样做的方式明显不同。

我们的前两个模型在两个单独的步骤中执行了region proposals和region classifications。首先,他们使用region proposals网络生成感兴趣的区域;接下来,他们使用全连接层或位置敏感卷积层对这些区域进行分类。SSD在“single shot”中完成这两个操作,在处理图像时同时预测边界框和类别。

具体来说,给定一个输入图像和一组标签,SSD会执行以下操作:

  1. 使图像经过一系列卷积层,以不同比例(例如10x10、6x6、3x3等)生成几套特征图。
  2. 对于每个位置中每个特征图,使用一个3x3卷积filter来评估一小组默认的边界框。这些默认边界框从本质上等效于Faster R-CNN的锚点框。
  3. 对于每个框,同时预测a)边界框偏移量和b)类概率
  4. 在训练期间,将真值框与这些基于IoU的预测框进行匹配。最佳预测的框将被标记为“positive”,其他所有具有IoU且真值> 0.5的框也将被标记为“positive”。

SSD听起来简单明了,但是train它却面临着独特的挑战。使用前两个模型,region proposal network确保我们尝试分类的所有内容均具有成为“对象”的最小可能性。但是,使用SSD时,我们跳过了该过滤步骤。我们使用多种不同的形状,在不同的比例下,从图像中的每个位置分类并绘制边界框。结果,我们生成的边界框比其他模型要多得多,并且几乎所有边界框都是negative。

为了解决这种不平衡,SSD做了两件事。首先,它使用非极大抑制( non-maximum suppression,NMS )将高度重叠的框组合在一起成为一个框。换句话说,如果四个形状,大小等相似的盒子包含同一只狗,则NMS会将其保持最高的置信度,并丢弃其余的。其次,该模型使用一种称为“hard negative mining”的技术来平衡训练期间的类。在hard negative mining中,每次训练迭代仅使用具有最高训练损失(即假阳性 false positives)的negative样本的子集。SSD保持负数与正数之比为3:1。

其架构如下所示:
在这里插入图片描述
如上所述,最后有“extra feature layers”,它们按比例缩小。这些大小可变的特征图有助于捕获不同大小的对象。例如,这是运行中的SSD:
在这里插入图片描述
在较小的特征图中(例如4x4),每个cell覆盖图像的较大区域,从而使它们能够检测较大的对象。Region proposal和分类是同时执行的:给定p个对象类,每个边界框与一个(4+ p)维向量关联,该向量输出4个框偏移坐标和p个类概率。在最后一步中,再次使用softmax对对象进行分类。

最终,SSD与前两种型号并没有太大区别。它只是跳过了“Region proposal”步骤,而不是同时考虑图像每个位置的每个边界框及其分类。由于SSD一次完成所有操作,因此它是三种型号中最快的,并且仍然具有相当的精度。

结论

Faster RCNN,R-FCN和SSD是目前最好的和使用最广泛的三种对象检测模型。其他流行的模型往往与这三个模型非常相似,它们都依赖于深层的CNN(ResNet,Inception等)来进行最初的繁重工作,并且很大程度上遵循相同的Region proposal/classification流程。

此时,仅需了解Tensorflow的API,即可使用这些模型。Tensorflow在这里有一个使用这些模型的入门教程 。尝试一下!

Reference

[1] Deep Learning for Object Detection: A Comprehensive Review

于Salzburg, Austra, 9th, Dec. 凌晨
今天收到今年以来第五封投稿的reject邮件,非常不爽,做research真的是太难了。找工作也没啥好结果,问了一个实习一个月几千块钱,都不够别人工资的零头,这个PhD读的我真的懵了。为什么我这么难。。。。。。。。。。。。。。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!