随着自动驾驶汽车、智能视频监控、面部检测和各种人数统计应用的兴起,对快速准确的物体检测系统的需求也在不断增长。这些系统不仅涉及识别和分类图像中的每个对象,还涉及通过在图像周围绘制适当的边界框来定位每个对象。这使得对象检测比其传统的计算机视觉前身图像分类更难完成。
然而,幸运的是,目前最成功的对象检测方法是图像分类模型的扩展。几个月前,谷歌发布了一个新的Tensorflow对象检测API。此版本附带了一些特定模型的预构建架构和权重:
在我的上一篇博客文章中,我介绍了上面列出的三种基本网络架构背后的直觉:MobileNets,Inception和ResNet。这一次,我想对Tensorflow的对象检测模型做同样的事情:更快的R-CNN,R-FCN,和SSD。在这篇文章的最后,我们希望已经了解深度学习如何应用于对象检测,以及这些对象检测模型如何相互启发和发散。
Faster R-CNN现在是基于深度学习的对象检测的规范模型。它帮助激发了之后的许多检测和分割模型,包括我们今天要研究的另外两个模型。不幸的是,如果不了解Faster R-CNN的前身R-CNN和Fast R-CNN,我们就无法真正开始理解它,所以让我们快速了解一下它的祖先。
R-CNN是Faster R-CNN的祖父。换句话说,R-CNN真的启动了事情。
R-CNN,或基于Region的Convolutional N eural Network,由3个简单的步骤组成:
下图说明了这 3 个步骤:
换句话说,我们首先提出区域,然后提取特征,然后根据其特征对这些区域进行分类。从本质上讲,我们已经将对象检测变成了图像分类问题。R-CNN非常直观,但非常慢。
R-CNN的直系后代是Fast-R-CNN。Fast R-CNN在许多方面与原版相似,但通过两个主要增强提高了检测速度:
新模型看起来像这样:
正如我们从图像中看到的,我们现在基于网络的最后一个特征图生成区域建议,而不是从原始图像本身。因此,我们可以只为整个图像训练一个CNN。
此外,与其训练许多不同的 SVM 来对每个对象类进行分类,不如使用单个 softmax 层直接输出类概率。现在我们只有一个神经网络需要训练,而不是一个神经网络和许多SVM。
Fast R-CNN在速度方面表现得更好。只剩下一个大瓶颈:用于生成区域提案的选择性搜索算法。
在这一点上,我们回到了最初的目标:更快的R-CNN。Faster R-CNN的主要见解是用快速神经网络取代慢速选择性搜索算法。具体而言,它引入了区域提案网络(RPN)。
以下是 RPN 的工作原理:
换句话说,我们查看上一个特征图中的每个位置,并考虑以它为中心的k个不同的框:一个高框,一个宽框,一个大框等。对于这些盒子中的每一个,我们输出我们是否认为它包含一个对象,以及该盒子的坐标是什么。这是它在一个滑动窗口位置的外观:
2 k 分数表示每个 k 边界框位于“对象”上的 softmax 概率。请注意,尽管 RPN 输出边界框坐标,但它不会尝试对任何潜在对象进行分类:它的唯一工作仍然是建议对象区域。如果锚框的“客观性”分数高于某个阈值,则该框的坐标将作为区域建议向前传递。
一旦我们有了我们的区域提案,我们就直接将它们输入到本质上是快速R-CNN的东西中。我们添加一个池化层,一些全连接层,最后添加一个softmax分类层和边界框回归器。从某种意义上说,更快的R-CNN = RPN + Fast R-CNN。
总而言之,Faster R-CNN实现了更好的速度和最先进的准确性。值得注意的是,尽管未来的模型在提高检测速度方面做了很多工作,但很少有模型能够显着优于Faster R-CNN。换句话说,Faster R-CNN可能不是最简单或最快的目标检测方法,但它仍然是性能最好的方法之一。举个例子,Tensorflow的Faster R-CNN和Inception ResNet是他们最慢但最准确的模型。
归根结底,Faster R-CNN 可能看起来很复杂,但其核心设计与原始 R-CNN 相同:假设对象区域,然后对其进行分类。现在,这是许多对象检测模型的主要管道,包括我们的下一个模型。
还记得 Fast R-CNN 如何通过跨所有区域提案共享单个 CNN 计算来提高原始检测速度吗?这种想法也是R-FCN背后的动机:通过最大化共享计算来提高速度。
R-FCN,或基于Region的Fully C卷积Net,在每个输出中共享100%的计算。由于是完全卷积的,它在模型设计中遇到了一个独特的问题。
一方面,在对对象进行分类时,我们想学习模型中的位置不变性:无论猫出现在图像中的哪个位置,我们都想将其归类为猫。另一方面,在对物体进行检测时,我们要学习位置方差:如果猫在左上角,我们想在左上角画一个框。因此,如果我们试图在100%的网络中共享卷积计算,我们如何在位置不变性和位置方差之间做出妥协?
R-FCN的解决方案:位置敏感的分数图。
每个位置敏感分数图表示一个对象类的一个相对位置。例如,一个分数地图可能会在检测到猫的右上角时激活。另一个分数地图可能会激活它看到汽车左下角的位置。你明白了。从本质上讲,这些分数图是卷积特征图,经过训练以识别每个对象的某些部分。
现在,R-FCN的工作原理如下:
总的来说,R-FCN看起来像这样,RPN生成了RoI:
即使有解释和图像,您可能仍然对此模型的工作原理感到有些困惑。老实说,当您可以可视化R-FCN正在做什么时,它更容易理解。以下是R-FCN在实践中检测婴儿的一个这样的例子:
简单地说,R-FCN考虑每个区域提案,将其划分为子区域,并迭代子区域,询问:“这看起来像婴儿的左上角吗?”,“这看起来像婴儿的顶部中心吗?“这看起来像婴儿的右上角吗?”等。它对所有可能的类重复此操作。如果有足够多的子区域说“是的,我与婴儿的那部分相匹配!”,那么在所有类别的softmax之后,RoI将被归类为婴儿。
通过此设置,R-FCN能够通过提出不同的对象区域来同时解决位置方差问题,并通过让每个区域提案引用相同的分数图库来同时解决位置不变性问题。这些分数图应该学会将猫归类为猫,无论猫出现在哪里。最重要的是,它是完全卷积的,这意味着所有的计算都在整个网络中共享。
因此,R-FCN比Faster R-CNN快几倍,并且达到了相当的精度。
我们的最终型号是SSD,代表S ingle-S hot Detector。与R-FCN一样,它比Faster R-CNN提供了巨大的速度提升,但方式明显不同。
我们的前两个模型分两个单独的步骤执行区域建议和区域分类。首先,他们使用区域提案网络来生成感兴趣的区域;接下来,他们使用全连接层或位置敏感的卷积层对这些区域进行分类。SSD 在“单次拍摄”中完成这两个操作,在处理图像时同时预测边界框和类。
具体来说,给定一个输入图像和一组真实标签,SSD 执行以下操作:
SSD听起来很简单,但训练它有一个独特的挑战。使用前两个模型,区域提案网络确保我们试图分类的所有内容都具有成为“对象”的最小概率。但是,对于SSD,我们跳过了该过滤步骤。我们从图像中的每个位置对边界框进行分类和绘制,使用多个不同的形状,在几个不同的比例下。因此,我们生成的边界框数量比其他模型多得多,而且几乎所有边界框都是否定示例。
为了解决这种不平衡,SSD做了两件事。首先,它使用非极大值抑制将高度重叠的盒子组合成一个盒子。换句话说,如果四个形状、大小等相似的盒子。包含同一只狗,NMS 将保留置信度最高的那只并丢弃其余的狗。其次,该模型使用一种称为硬负挖掘的技术来平衡训练期间的类。在硬负挖掘中,每次训练迭代中仅使用具有最高训练损失(即误报)的负示例的子集。SSD 保持 3:1 的负负与正之比。
它的架构如下所示:
正如我上面提到的,最后有“额外的要素图层”可以缩小大小。这些不同大小的特征图有助于捕获不同大小的对象。例如,以下是 SSD 的实际应用:
在较小的特征图(例如4x4)中,每个单元格覆盖图像的较大区域,使它们能够检测较大的物体。区域建议和分类同时执行:给定 p 个对象类,每个边界框都与一个 (4+p) 维向量相关联,该向量输出 4 个框偏移坐标和 p 类概率。在最后一步中,softmax再次用于对对象进行分类。
最终,SSD与前两种型号没有太大区别。它只是跳过“区域建议”步骤,而是同时考虑图像每个位置的每个边界框及其分类。由于SSD可以一次性完成所有操作,因此它是三种型号中最快的,并且性能仍然相当可比。
更快的 R-CNN、R-FCN 和 SSD 是目前最好和最广泛使用的三种对象检测模型。其他流行的模型往往与这三个模型非常相似,都依赖于深度CNN(阅读:ResNet,Inception等)来完成最初的繁重工作,并且在很大程度上遵循相同的提案/分类管道。
在这一点上,使用这些模型只需要了解Tensorflow的API。Tensorflow在这里有一个关于使用这些模型的入门教程。试一试,祝黑客愉快!