【导读】近日,CV-Tricks.com发布了一篇文章,使用SSD进行目标检测,SSD是当前最流行的目标检测算法之一。作者从检测的基本概念、滑动窗口检测、减少滑动窗口方法的冗余计算、修改后网络的训练方法、处理对象的尺度这几个方面出发,深入浅出地介绍SSD是如何一步步进行目标检测的,从理论角度总结了SSD的各个部分。通过阅读本文,相信你会对目标检测以及SSD原理有更深入的理解!专知内容组编辑整理。
专知公众号推出的深度学习目标检测从入门到精通:第一篇
bject Detection using Single Shot Multibox Detector
使用单次多框检测器(SSD)进行目标检测
在之前的文章中,我们介绍了使用深度学习的各种目标检测方法。在这个博客中,我将更详细地介绍单次多框检测器。由于其易于实现并且十分高效,SSD成为了最流行的目标检测算法之一。
由Christian Szegedy提出的工作在SSD论文https://arxiv.org/abs/1512.02325中以更易理解的方式进行了说明。即使这个方法比faster-rcnn,fast-rcnn(等等)更直观简单,其却是一个非常强大的算法。从GPU和深度学习框架的角度来看,SSD的实现更为直接,它能够在闪电般的速度下可以进行大批量的检测工作。此外,该算法的核心思想可以帮助更好地了解其它最先进的方法。
在这里,我将逐步介绍这个算法,这可以帮助你掌握整体的工作。
▌详细目录:
1.检测的基本概念
2.滑动窗口检测
3.减少滑动窗口方法的冗余计算
4.修改后网络的训练方法
5.处理对象的尺度
▌1. 目标检测及其与分类的关系
目标检测被建模为分类问题。分类是要预测图像中存在的物体的标签,而检测比这更进一步,其还需要发现那些对象的位置。在分类问题中,算法假定物体在图像中占据较大的部分。
如图2所示,当不同尺度/大小的多个物体出现在不同的位置时,检测成为了更为需要的手段。 因此,检测的目的是找到图像中的所有目标对象,预测它们的标签/类并为这些对象指定一个边界框。
在图像分类中,我们预测每个类别的概率,而在目标检测中,我们也预测包含该类别的目标的边界框。所以,网络的输出应该是:
1.类概率(如分类)
2边界框坐标。我们用cx(中心的x坐标),cy(中心的y坐标),h(物体的高度),w(物体的宽度)
类概率还应该包含一个表示背景的附加标签,因为图像中的许多位置不对应任何对象。
为了方便起见,我们假设我们有一个包含猫和狗的数据集。数据集中的图像可以包含任意数量的猫和狗。 所以,我们有3种可能的分类结果,即猫[1 0 0],狗[0 1 0],背景[0 0 1]。
目标检测作为图像分类问题
训练检测网络的简单策略是训练分类网络。 这个分类网络将有三个输出,每个输出表示猫,狗和背景的概率。对于训练分类器,我们需要物体位置适中的图片和相应的类别标签。
我们举一个例子(图3),看看如何准备分类网络的训练数据。
为了做到这一点,我们将首先从图像中裁剪出多个图像块。 下图显示了从图像裁剪的示例块。
对于准确包含目标的块2,我们用目标类别进行标记。 所以我们把类别“猫”分配给块2作为它的标签。 假定输出的概率向量依次对应猫,狗和背景,那么块2的标签就变成[1 0 0]。 然后,对于不包含任何目标对象的块(1和3),我们分配标签“背景”。因此,这些块的类别标签是[0 0 1]。
现在,我们需要为我们的数据集添加标签,这些数据集可以用来训练一个分类的卷积网络。
▌2.滑动窗口检测器:
分类网络训练完成后,可以用滑动窗口的方式对新图像进行检测。首先,我们把一个特定大小的窗口(蓝色框)在图像的不同的位置上滑动(如下图所示)。
然后,我们裁剪包含在框中的块,并将它们调整为卷积神经网络的输入大小。 接着,我们将这些块送入网络以获取目标对象的标签。 我们用较小的窗口大小重复这个过程,以便能够捕捉较小尺寸的对象。 所以这个想法是,如果图像中存在一个对象,我们将有一个适当包含对象的窗口,并可以生成对应于该对象的标签。 这里是一个动态图,显示了在图像上运行的滑动窗口:
但是,应该裁剪多少块以覆盖所有的物体?我们不仅需要在多个地方进行块裁剪,而且还要在多个尺度上裁剪,因为对象可以是任意大小的。这将相当于要产生数以千计的块,并将所有块输入到网络中。这种做法将导致在单个图像上进行预测需要大量的时间。
那么让我们来看看减少这个时间的方法。
▌3.减少冗余计算以缩短时间
现在让我们考虑在附近位置的不同颜色的框,如图5所示的多个裁剪框。
我们可以看到这两个块之间有很多重叠(由阴影区域描绘)。这意味着,当他们分开(经过裁剪和尺寸调整)输入到网络时,网络将对这个重复的部分进行一组相同的计算。这可以很容易地使用在SPP-Net中引入、并由Fast R-CNN普及的思想。我们举一个例子来详细的了解这个网络。
下面的图6显示了最初通过3个卷积层的尺寸为12X12的图像,每个卷积层具有3×3的滤波器尺寸(具有不同的步长和最大池化操作)。注意,在经过3个卷积层之后,我们得到一个大小为3×3×64的特征图,这个特征图被称为倒数第二个特征图,即应用在分类层之前的特征图。我们之所以这样命名,是因为我们会在后续内容中反复提及。在这个3X3特征图的基础上,我们应用了一个卷积核尺寸为3X3的卷积层。在这里使用三组这样的3X3滤波器来获得在网络末端输出的3个1X1的特征映射,其对应于三种类别的概率。
现在,我们将使用更大的图像来显示输入图像和特征图之间的直接映射。 让我们增加图像到14X14(图7)。 我们可以看到,左上象限(中心在6,6)的12X12块在倒数第二个特征图产生3×3的块(蓝色),最后在最终的特征图(蓝色)中得到1×1的分数。 位于右上象限(以红色显示,中心为8,6)的12X12大小的图像,其倒数第二个特征图相应地在最后一层产生1X1的得分(用红色标记)
正如你所看到的,不同的12X12块在倒数第二个特征图中会有不同的3X3表示,最后在输出层产生相应的分数。
卷积层在计算上是非常昂贵的,并且计算每个块将花费很长时间。但是,使用这个方案,我们可以避免重复计算不同块之间的公共部分。这里我们对整个图像的特征图只进行一次计算。然后,由于我们知道倒数第二个特征图上的不同部分映射到图像的不同区域,我们可以直接在其上进行分类(分类层)。这就像在卷积特征图上执行滑动窗口,而不是在输入图像上执行滑动窗口。所以这节省了大量的计算。
总而言之,我们一次性将整个图像输入到网络中,并在倒数第二个特征图上获取特征。然后我们在这个特征图的顶部运行一个3X3的滑动窗口进行检测,以获得不同的块的类别分数。
虽然有一个小问题。并非来自图像的所有块都能在输出中表示。在我们的例子中,12X12的块集中在(6,6),(8,6)等(在图中标出)。 (7,6)作为中心跳过,因为在网络中间存在池化。一会儿,我们将看看如何处理这些类型的对象/块。
默认框/锚框
在分类输出中直接表示的框被称为默认框或锚框。在上面的例子中,中心(6,6)和(8,6)处的框是默认框,其默认大小是12X12。请注意,默认框的位置和大小取决于网络结构。
▌4.修改后网络的训练方法
让我们看看如何通过另一个例子来训练这个网络。在这里,我们以一个更大的输入图像为例,一个包含猫的24X24图像(图8)。它首先通过类似于上面的例子的卷积层,并产生尺寸为6×6的输出特征图。
为了准备训练集,首先,我们需要为分类输出中的所有预测分配类别标签。让我们通过(i,j)对7,7格的输出图的位置进行索引。我们已经知道每个输出对应的默认框。作为参考,图中左上角和右下角的颜色标记了输出及其对应的结果。现在由于输出(6,6)对应的块上有一个猫,所以类标签变成[1 0 0]。由于位置(0,0),(0,1),(1,0)等区块中没有任何对象,所以它们的类标签是[0 0 1]。
其他输出的块只部分包含了猫。让我们看看他们的任务是如何完成的。
对于部分覆盖的图像块的类别标签指定
为了理解这一点,我们在(5,5)处输出一个块。图中显示了该块相对于类别猫的程度(洋红色)。我们可以看到对象稍微偏离了方框。方框并不完全包括猫,但有一个较大的重叠。
所以对于它的类别标签设定,我们有两个选择:或者把这个图像块标记为属于背景的块,或者把它标记为猫。将其标记为背景(bg)将意味着只有一个包含该对象的框是可以标记为正例的。而所有其他的框都会被标记为背景。这有两个问题。首先,训练将是高度不均衡的(物体和bg类之间的大的不平衡)。其次,如果对象不适合任何框,那么将意味着将不存在用于对象标记的框。
所以我们采取第二种解决方案,把这个图像块标记为猫。但是在这个解决方案中,我们需要从对象中心处理这个框中心的偏移量。比方说,在我们的例子中,cx和cy分别是沿着x和y方向从对象中心开始的框的中心偏移量(图中也显示出了)。我们需要设计一种方法,使得对于这个图像块,网络也可以预测这些偏移量,从而可以找到一个对象的真实坐标。
因此,对于每个位置,我们在网络中再次添加两个输出(除类概率外),代表中心的偏移量。我们把这个网络的预测称为“ox”和“oy”。为了使这些输出预测cx和cy,我们可以使用回归损失。平方误差损失可以用于这种类型的回归。检测的论文中通常使用平滑的L1损失形式。我们将跳过这个小讨论。
▌5.处理尺度变化
现在我们已经处理了不同位置的对象,让我们看看如何处理对象的尺度变化。
我们将讨论两种不同的技术来处理两种不同类型的对象。一种类型是指尺寸接近12×12像素(框的默认尺寸)的物体。另一种类型是指尺寸与12X12大不相同的物体。
对象的大小接近12X12
对于大小与12X12类似的对象,我们可以用类似于偏移量预测的方式来处理它们。假设对象的真实高度和宽度分别是h和w。所以我们再给输出添加两个维度来表示高度和宽度(oh,ow)。然后我们再次使用回归来使这些输出预测真实的高度和宽度。
物体远小于12X12
处理与12X12大小非常不同的对象是有点棘手的。为了论证方便,让我们假设我们只想处理远小于默认大小的对象。
对此的一个解决方案是在网络的每个特征图(在每个卷积层之后的输出)之上进行预测,如图9所示。预测层在图中显示为从基础网络的分支。这是Single Shot Multibox Detector中引入的关键思想。让我们详细了解这一点。
使用所有特征进行预测
早些时候,我们只使用倒数第二个特征图,并应用3X3的卷积核来得到输出(概率,中心,框的高度和宽度)。这里我们在网络的所有特征图上应用3X3卷积来预测它们的全部。来自较低层的预测有助于处理较小尺寸的物体。这是怎么回事?
请记住,特征图中的一个位置仅表示图像的一个片段/块。这就是所谓的感受野大小。我们已经在我们的示例网络中看到了这一点,倒数第二个特征图上的预测受到原图中12X12块的影响。
卷积网络本质上是分层的。而且每一个后续的层代表一个复杂性越来越高的实体,在这样做的时候,他们对输入图像的感受野越来越大。因此,在我们的网络倒数第二层之上的预测具有最大的感受野尺寸(12X12),因此它可以处理较大尺寸的物体。浅层的感受野尺寸较小,可以代表较小尺寸的物体。
在我们的示例网络中,第一个特征图顶部的预测具有5X5的感受野大小(图9中的标记的特征图1)。它可以很容易地使用简单的计算。在图中已经用图解说明了。类似地,在特征图之上的预测考虑了9X9的块。所以我们可以看到,随着深度的增加,感受野的尺寸也在增加。
这意味着我们可以通过使用感受野大小相似的层中的特征来处理大小不同的对象。
就像以前一样,我们将网络中不同特征图的默认框与不同的大小和位置关联起来。
现在,在训练阶段,我们将一个对象与默认大小最接近对象大小的特征图相关联。例如,如果对象的大小是6X6像素,我们将使用feat-map2来预测这样的对象。因此,我们首先根据对象的位置在feat-map2的输出中找到相关的默认框。然后我们把它的类别信息赋予这个框。这种技术可以确保任何特征图不必处理目标尺寸超出其承受范畴的对象。这样就给了网络更大的辨别能力。
因此,我们现在可以处理尺寸与12X12大小不同的物体。
▌结论
这篇博客从理论角度总结了SSD的概况。SSD还有更多的细节,例如为每个分类层添加更多的输出以处理形状不对称的对象(偏斜纵横比)。此外,SSD论文从VGG网络中开创出一个新的网络,其可以减少层的感受野大小(atrous算法)。我认为从SSD论文中可以很容易地理解这些细节。
原文链接:
http://cv-tricks.com/object-detection/single-shot-multibox-detector-ssd/
-END-
专 · 知
人工智能领域主题知识资料查看获取:【专知荟萃】人工智能领域26个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)
请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料!
请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!
请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!
点击“阅读原文”,使用专知