图像分类是拍摄一张图像并对其中的对象进行预测。例如:当我们构建一个猫狗分类器时,我们拍摄了猫或狗的图像,并预测它们属于哪个类别。
如果猫和狗都出现在同一张图像中,你会怎样做呢?
我们的模型将会预测出什么呢?为了解决这一问题,我们可以训练一个可预测这两个类别(猫和狗)的多标签分类器。然而,我们仍然不知道猫或狗所在的位置。识别图像中给定类别对象的位置称为定位(Localization)。如果不知道对象类别,我们不仅要确定其位置,还要预测每个对象的类别。
预测对象的位置和类别称为对象检测(Object Detection)。过去从图像中预测对象的类别,而现在我们必须预测对象类别及包含该对象的矩形——称为边界框(Bounding Box)。这需要4个变量唯一确定一个矩形。因此,对于图像中的每个对象实例,应预测以下5个变量:class_name,ounding_box_top_left_x_coordinate,ounding_box_top_left_y_coordinate,ounding_box_width,ounding_box_height。
就像多标签图像分类一样,我们可以拥有多类别对象检测器来检测单张图像中的多种类别的对象:
在以下章节中,我将介绍当前所有流行的科学方法来训练对象检测器。从2001年 Viola和Jones提出Haar Cascades开始,目前已经有很多种方法来进行对象检测。本文将聚焦于所有使用神经网络和深度学习的最先进的方法。
我们将对象检测建模为一个分类问题。我们从输入图像所有可能的位置获取固定大小的窗口,并将这些小块送入图像分类器。
滑动式窗口检测器演示
每个窗口被送入分类器,该分类器可以预测窗口内对象的类别(或者是背景)。因此,我们确定了图像中对象的类别和位置。那么如何确定窗口的大小以便它总是包含对象?请看下面的例子:
小尺寸对象
正如你所看到的,对象可以有不同的尺寸。我们通过测量图像来创建一个图像金字塔来解决这一问题。想法如下:调整图像到多个不同的尺寸,并基于这样一个事实,即选择的窗口将完全包含这些调整过的图像中的对象。最常见的情况就是,将图像下采样(缩小),直到达到某些条件下的最小尺寸。在每个图像上运行一个固定大小的窗口检测器,这样,在这个金字塔上通常会有64层。现在,所有的窗口被送入一个分类器检测感兴趣的对象。这解决了大小和位置两个问题。
还有一个问题:宽高比。很多对象可以以不同的形状呈现出来,例如:坐下的人与站立或睡觉的人的宽高比不同。我们将稍后进行阐述。
目前,对象检测的算法有很多,如RCNN,Faster-RCNN,SSD等,为什么会有这么多的方法?每个方法的显著特点是什么? 我们来看一下:
1.使用HOG Features进行对象检测
2005年,Navneet Dalal和Bill Triggs阐述了面向梯度直方图的特征提取(HOG features),其计算简单且适用于很多现实问题。金字塔上运行滑动窗口所获得的每个窗口上,我们计算HOG features——被送入支持向量机(SVM)——来创建分类器。我们能够在视频上实时运行以进行行人检测,人脸检测以及其他的对象检测用例。
2.区域卷积神经网络(R-CNN)
我们已经将对象检测建模为一个分类问题,其效果取决于分类的准确性。深度学习兴起以后,通常的想法是用一个更准确的基于卷积神经网络(CNN)的分类器代替基于HOG的分类器。但是现在有一个问题:CNN运行太慢,计算上也较为昂贵。在滑动窗口检测器上产生的很多小块上运行卷积神经网络是不太可能的。R-CNN通过使用被称为选择性搜索(Selective Search)的对象候选算法解决了这一问题,该算法将送至分类器的边界框数量接近2000个候选框(Region Proposal)。选择性搜索使用局部提示(如纹理,强度,颜色和/或内部度量等)生成对象所在的所有可能位置。现在,我们将这些边界框送入基于CNN的分类器。请记住,CNN的全连接部分需要一个固定大小的输入,因此,我们调整(不保留宽高比)所有生成的边界框至一个固定大小(224*224的VGG),并送至CNN中。因此R-CNN有3个重要的部分:
(1)运行选择性搜索生成可能的对象;
(2)将这些小块送至CNN,然后用SVM预测每个小块的类别;
(3)分别训练边界框回归,优化小块。
3.空间金字塔池化网络(SPP-net)
然而,R-CNN运行由选择性搜索产生的2000个候选框需要大量的时间。SPP-net试图解决了这一问题:只需要计算一次整个图像的CNN representation,并且可以使用其计算由选择性搜索生成的每个块的CNN representation。这在和该区域对应的最后一个卷积层的特征映射部分中,通过执行池化类型操作来完成。可通过考虑在中间层发生的下采样(VGG中将坐标除以16),映射该区域到一个卷积层来计算与该区域对应的卷积层的矩形。
我们还面临另外一个挑战:我们需要为CNN的全连接层生成固定大小的输入。因此,SPP-net引入了更多的技巧:在最后一层的卷积层后使用了空间池化,而不是传统的最大池化。SPP-net层将一个任意大小的区域划分为恒定数量的箱(bins)并执行最大池化,产生了恒定大小的矢量,如下图所示:
然而,SPP-net有一个很大的缺点:通过空间池化层进行的反向传播并不能忽略。
4. Fast R-CNN
Fast R-CNN采用了SPP-net和RCNN算法的思想,并解决了SPP-net中的关键问题,即可以进行端到端的训练。为了通过空间池化来传播梯度,它使用一个反向传播进行计算,这与最大池化梯度计算非常相似,其区别在于池化区域重叠,因此一个单元可以从多个区域中抽取梯度。
Fast R-CNN还在神经网络训练中增加了边界框回归。因此网络中有两个头部:分类头部和边界框回归头部。多任务目标是Fast R-CNN的一个显著特点,因为它不再需要单独训练网络来分类和定位。CNN的端到端学习减少了整体训练时间,并且其准确性比SPP网络高。
5. Faster R-CNN
Faster RCNN有什么改进呢?它速度更快。Fast RCNN中最慢的部分是选择性搜索或边框(Edge boxes),Faster RCNN采用区域生成网络(RPN)这个非常小的卷积网络代替选择性搜索来生成感兴趣区域。
为了应对长宽比和对象大小的改变,Faster R-CNN引入了anchor boxes。在每个位置,原始图像使用3种比例的anchor boxes:128*128,256*256,512*512。同样,宽高比也有3种比例:1:1,2:1,1:2。因此,每个位置共有9个anchor boxes,RPN可在这9个anchor boxes上预测其为背景或前景的概率。我们用边界框回归改进每个位置的anchor boxes。因此,RPN给出了不同大小的边界框及其对应类别的概率。像Fast-RCNN一样,可通过空间池化进一步传输不同大小的边界框。Faster-RCNN比Fast-RCNN快十倍,Fast-RCNN的数据集类似于VOC-2007。Faster-RCNN一直都是最精确的对象检测算法之一的原因就在于此。下图是R-CNN各种版本之间的比较。
基于回归的对象检测器
上述方法都是通过建立一个传输途径(pipeline)产生第一个候选对象送至分类器或回归头部,将检测作为分类问题来处理。然而,有几种方法将检测作为回归问题,其中两个最流行的是YOLO和SSD。让我们来看一下:
6.YOLO
YOLO将检测看做一个简单的回归问题,它需要一张输入图像并学习类别概率和边界框坐标。YOLO将每张图像划分为S*S个网格,每个网格预测N个边界框和置信度。置信度反映了边界框的准确性及边界框是否真正包含了一个对象(不管是什么类)。针对训练中的每个类,YOLO预测了每个边界框的分类值。你可以结合两个类来计算每个类出现在预测框中的概率。
因此,YOLO共预测了S*S*N个边界框。然而,大部分边界框的置信度较低,如果我们设置一个阀值(30%置信度),则可以删除大部分边界框。
7. Single Shot Detectors(SSD)
SSD在运行速度和准确度间取得了较好的平衡。SSD在输入图像上仅仅运行一个卷积网络,并计算出一个特征映射。现在,我们在这个特征映射上运行一个3*3大小的卷积内核,来预测边界框和分类概率。SSD也使用了各种宽高比的anchor boxes(Faster-RCNN比较相似),并且学习了偏移量而不是学习边界框。SSD在多个卷积层后预测了边界框,因此能够检测出各种比例的对象。
面对这么多算法,你应该选择哪一种?如果您对追求准确性,应该选择Faster-RCNN;如果您更注重计算,SSD则是一个更好的建议;如果您想要较高的运行速度,而不要求精确度太高,YOLO将会是一个很好的选择。
下图为SSD,YOLO和Faster-RCNN在检测不同大小对象时的性能对比。当对象为大尺寸时,SSD的精确度似乎和Faster-RCNN较为类似;当尺寸较小时,二者精确度的差距就会扩大。
希望这篇文章能让您对当前最流行的对象检测算法有个直观的理解。
以上为译文。
本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。
文章原标题《object-detection》,译者:Mags,审校:袁虎。
文章为简译,更为详细的内容,请查看原文