FasterR-CNN、R-FCN和SSD是三种最先进、应用最广泛的目标检测模型。其他流行的模型通常与这三个类似,依赖深度CNN(如ResNet、Inception等)进行网络初始化,并且大多数遵循相同的提议/分类管道。本文介绍深度学习目标检测的三种常用模型:FasterR-CNN、R-FCN、SSD。随着自动驾驶汽车、智能监控摄像头、面部识别以及许多其他对人们有价值的应用的出现,快速准确的物体检测系统市场正在蓬勃发展。除了识别和分类图像中的每个对象之外,这些系统还可以通过在该对象周围绘制适当大小的边界框来对其进行定位。这使得目标检测技术比传统的计算机视觉处理技术——图像分类更难。然而,幸运的是,目前最成功的目标检测方法是图像分类模型的扩展。几个月前,谷歌为Tensorflow发布了一个新的对象检测API。随之而来的是一些特定模型的预构建框架和权重。基于MobileNets框架的SingleShotMultiboxDetector(SSD)模型。基于InceptionV2框架的SSD模型。使用ResNet-101框架的基于区域的全卷积网络(R-FCN)模型。基于ResNet-101框架的FasterRCNN模型。基于InceptionResNetv2的FasterRCNN模型。在上一篇文章中,机器之心梳理了Xception、Inception和ResNet等基础网络的架构及其背后的设计思路。在本文中,我们将对Tensorflow的对象检测模型FasterR-CNN、R-FCN和SSD进行同样的操作。希望看完这篇文章,你能明白以下两点:深度学习是如何应用在物体检测中的。这些目标检测模型的设计方式相互启发,各有特点。FASTERR-CNN模型FasterR-CNN模型是目前典型的基于深度学习的目标检测模型。受其启发,出现了许多对象检测和分割模型,比如我们将在本文中看到的另外两个模型。然而,要真正开始理解FasterR-CNN,我们需要理解其前身R-CNN和FastR-CNN。那么,现在快速介绍一下FasterR-CNN的来龙去脉。如果R-CNN模型要拟人化,那么R-CNN一定是FasterR-CNN的祖父。换句话说,R-CNN是一切的起点。R-CNN,即基于区域的卷积神经网络,分三步工作:借助可以生成大约2000个区域建议的“选择性搜索”算法,R-CNN可以对可能的目标进行扫描。卷积神经网络(CNN)在每个区域提议上运行。每个CNN的输出被馈送到:a)支持向量机(SVM)以对上述区域进行分类。b)一个线性回归器,用于缩小对象周围的边界框,前提是存在此类对象。下图具体描述了以上3个步骤:也就是说,首先,我们给出一些建议区域,然后从中提取特征,然后根据这些特征对这些区域进行分类。本质上,我们将目标检测变成了图像分类问题。R-CNN模型虽然非常直观,但速度很慢。FastR-CNN直接跟在R-CNN后面的就是FastR-CNN。FastR-CNN在很多方面与R-CNN相似,但是它的检测速度相比R-CNN有两个主要增强:在推荐区域之前,它对图像进行特征提取,通过这种方法是只使用一个CNN用于整个图像(之前的R-CNN网络需要在2000个重叠区域上运行2000个CNN)。用softmax层代替支持向量机,这种变化并没有创建新的模型,而是扩展了用于预测工作的神经网络。FastR-CNN模型结构示意图:如你所见,我们现在基于网络的最佳特征图(而不是原始图像)创建区域建议。因此,我们只需要为整个图像训练一个CNN。此外,我们使用softmax层直接输出类别概率,而不是像以前那样训练许多不同的SVM来对每个对象类别进行分类。现在,我们只需要训练一个神经网络,而之前我们需要训练一个神经网络和许多SVM。在速度方面,FastR-CNN有了很大的提升。然而,有一个很大的未解决的瓶颈:用于生成区域建议的选择性搜索算法。FASTERR-CNN至此,我们完成了对FasterR-CNN早期两个模型的溯源。让我们开始研究FasterR-CNN。FasterR-CNN的主要创新是用快速的神经网络代替了之前慢速的选择性搜索算法。具体来说,它引入了区域建议网络(RPN)。RPN的工作原理:在***卷积得到的featuremap上,用一个3×3的窗口在featuremap上滑动,然后映射到更低的维度(比如256维),在每次滑动的时候窗口的位置,RPN可以基于k个固定尺度的锚框(默认边界框)生成多个可能的区域。每个regionproposal由两部分组成:a)该区域的objectness分数。b)4个坐标表征区域的边界框。换句话说,我们观察顶层特征图上的每个位置,然后关注它周围的k个不同的锚框:一个高框、一个宽框、一个大框等。对于这些框中的每一个,我们输出是否我们认为它是否包含一个对象,而不考虑该框中的坐标。下图显示了在单个滑动框位置发生的情况:图中的2k个分数表示k中每个边界框准确覆盖“对象”的softmax概率。请注意,尽管RPN输出边界框的坐标,但它不会对任何可能的对象进行分类:它唯一的工作仍然是给出对象区域。如果锚框的“客观性”分数高于某个阈值,则该边界框的坐标将作为区域提案向前传递。一旦我们有了区域建议,我们就直接将它们输入到本质上是FastR-CNN模型中。我们添加了另一个池化层、一些全连接层和***,一个softmax分类层和边界框回归器。所以从某种意义上说,FasterR-CNN=RPN+FastR-CNN。总体而言,FasterR-CNN的速度明显快于FastR-CNN,其准确率也达到了state-of-the-art。值得一提的是,虽然未来的模型可以提高检测速度,但很少有模型能够显着优于FasterR-CNN。换句话说,FasterR-CNN可能不是最简单和最快的目标检测方法,但它的性能仍然是最好的。例如,Tensorflow使用InceptionResNet构建的FasterR-CNN是他们最慢但最准确的模型。也许FasterR-CNN可能看起来很复杂,但它的核心设计还是和原来的R-CNN一致:先假设物体区域,然后再分类。目前,这是很多目标检测模型所采用的主要思想,包括我们接下来要提到的模型。R-FCN还记得FastR-CNN如何通过在所有区域建议上共享相同的CNN来提高检测速度吗?这也是设计R-FCN的动机之一:通过最大化共享计算来提高速度。R-FCN,即Region-basedFullyConvolutionalNet(基于区域的全卷积网络),可以在各个输出之间完全共享计算。作为一个全卷积网络,它在模型设计过程中遇到了一个特殊的问题。一方面,在对物体进行分类任务时,我们希望在模型中学习位置不变性:无论猫出现在图像中的哪个位置,我们都希望将其分类为猫。另一方面,在做物体检测任务时,我们想学习位置方差:如果猫在左上角,那么我们想在图像左上角的那个位置画一个框。那么,问题来了,如果我们要在网络中共享100%的卷积计算,我们应该如何在位置不变性和位置可变性之间做一个权衡呢?R-FCNScheme的解决方案:PositionSensitiveScoreMaps每个positionsensitivescoremap表示一个objectclass的相对位置。例如,每当在图像的右上角检测到一只猫时,就会激活得分图。而当系统看到左下角出现一辆汽车时,另一张分数图也会被激活。本质上,这些分数图是卷积特征图,经过训练可以识别每个对象的特定部分。R-FCN的工作原理如下:在输入图像上运行CNN(本例中为ResNet)。添加一个完全卷积层以生成位置敏感分数图的分数库。应该有k2(C+1)个分数图,其中k2表示分割对象的相关位置的数量(例如,32表示3×3空间网格),C+1表示C类加上背景。运行完全卷积区域建议网络(RPN)以生成感兴趣区域(RoI)。对于每个RoI,我们将其拆分为相同的k2子区域,然后将这些子区域用作分数图。对于每个子区域,我们检查其分数库以确定该子区域是否与特定对象的相应位置匹配。例如,如果我们在“左上”子区域,那么我们取这个目标“左上”子区域对应的分数图,并在感兴趣区域(RoI区域)中对那些值进行平均。我们为每个班级做这个过程。一旦每个k2子区域都有每个类别的“目标匹配”值,那么我们可以对这些子区域进行平均以获得每个类别的分数。通过对剩余的C+1维向量执行softmax回归来对RoI进行分类。下面是R-FCN的示意图,使用RPN生成RoI:当然,即使有了上面的文字和图片的解释,你可能还是不太明白这个模型是如何工作的。老实说,当你真正看到R-FCN的实际效果时,它就更容易理解了。这里有一个实际应用的R-FCN,就是从一张图片中检测一个婴儿:我们简单的让R-FCN处理每个regionproposal,然后将其划分为子区域,在子区域上迭代询问系统:”这看起来像婴儿的“左上”部分吗?“,”这看起来像婴儿的“中上”部分吗?等等。系统对所有班级重复此过程。如果有足够的分区域说“是的,我确实匹配了这个部位的宝宝!”然后通过对所有类别的softmax回归将RoI分类为婴儿。”通过这种设置,R-FCN可以同时处理locationvariance和locationinvariance。它给出不同的目标区域来处理positionvariability,让每个regionproposal参考同一个scoremapscorebank来处理positioninvariance。这些scoremaps应该学习将猫归类为猫,而不管猫在哪里。最重要的是,由于它是完全卷积的,这意味着网络中的所有计算都是共享的。因此,R-FCN比FasterR-快几倍CNN和SSD可以达到相似的准确率我们最后一个模型是SSD,也就是Single-ShotDetector。和R-FCN一样,它比FasterR-CNN快很多,但是它的工作原理和R-FCN明显不同。我们的前两个模型regionproposal和regionclassification分两步进行。首先,他们使用regionproposalnetwork生成感兴趣的区域;然后,他们使用全连接或位置敏感的卷积层对这些区域进行分类。然而,SSD可以完成以上两个步骤一步到位,并在处理图像时预测边界框和类别。具体来说,给定一张输入图像和一组真实标签,SSD按如下方式进行:将此图像传递给一系列卷积层,产生一系列不同大小的特征图(例如,10×10、6×6、3×3等)对于每个特征图中的每个位置,使用3×3卷积过滤器来评估一小组默认边界框。这些默认边界框本质上等同于FasterR-CNN的锚框。对每个边界框同时进行预测:a)边界框的偏移量;b)分类概率。在训练过程中,这些基于IoU(IntersectionoverUnion,也称为Jaccardsimilaritycoefficient)系数的预测边界框被用来匹配正确的边界框。预测最好的边界框将被标记为“正”,其他边界框的IoU大于0.5。SSD的工作方式听起来很简单,但训练它却提出了不同寻常的挑战。在前面两个模型中,regionproposalnetwork可以保证我们尝试分类的每一个对象都会有一个最小的概率值作为“目标”。然而,在SSD中,我们跳过了这个过滤步骤。我们从图像中的每个位置分类并绘制不同形状和大小的边界框。通过这种方式,我们可以生成比其他模型更多的边界框,但它们基本上都是反例。为了解决这个问题,SSD做了两件事。首先,它使用非最大抑制(NMS)技术将高度重叠的边界框集成为一个。换句话说,如果有4个形状、大小等相似的边界框包含同一只狗,那么NMS将保留可靠性最高的边界框并丢弃其他边界框。其次,SSD模型使用一种称为hardnegativemining的技术在训练期间保持类别平衡。在hardnegativemining中,每次训练迭代中只使用那些具有最大训练损失的负样本子集。SSD的“正负”比例一直维持在1:3。下图是SSD的架构示意图:上面说了,终于有了可以减小体积的“额外特征层”。这些大小不同的特征图有助于捕获不同大小的对象。例如,下面是正在运行的SSD。在较小的特征图中(例如4×4),每个单元格覆盖图像的较大区域,使其能够检测较大的对象。区域提议与分类同时执行:假设p是目标类别,每个边界框与一个(4+p)维向量连接,输出4个框偏移坐标和p个分类概率。在最后一步中,再次使用softmax对对象进行分类。最终,SSD与前两种型号没有什么不同。它只是简单地跳过了“regionproposal”这一步,而不是同时考虑每个边界及其在图像每个位置的分类。由于SSD一次完成所有操作,因此它是三种型号中速度最快的,而且性能仍然相对较好。结论FasterR-CNN、R-FCN和SSD是三种最先进且使用最广泛的目标检测模型。其他流行的模型通常与这三个类似,依赖深度CNN(如ResNet、Inception等)进行网络初始化,并且大多数遵循相同的提议/分类管道。但是,使用这些模型需要了解Tensorflow的API。Tensorflow有使用这些模型的初学者教程(https://github.com/tensorflow/models/blob/master/object_detection/object_detection_tutorial.ipynb)。
