目标检测(Object detection)

2018-08-27 17:47:45 浏览数 (1)

1.1 目标定位(Object localization)

这次我们学习构建神经网络的另一个问题,定位分类问题。这意味着我们不仅需要判断图片中是不是一辆车,还要在图片中将他标记出来。“定位”的意思是判断汽车在图片中的具体位置。 分类定位问题通常只有一个较大对象位于图片中间位置,我们要对它进行识别和定位。而在对象检测问题中,图片中可以含有多个对象。甚至单张图片中会有多个不同分类的对象。因此,图片分类的思路可以帮助学习分类定位,而对象定位的思路有助于学习对象检测。 图片分类问题:例如,输入一张图片到多层卷积神经网络,它会输出一个特征向量,并反馈给softmax单元来预测图片类型。

如果构建汽车自动驾驶系统,对象可能包括以下几类:行人,汽车,摩托车,和背景。 以上就是标准的分类过程,如果还想定位图片,可以让神经网络多输出几个单位,输出一个边界框。具体做法就是神经网络再多输出4个数字,标记为bx,by,bh,bw,这四个数字是被检测对象的边界框的参数化表示。

其中,b x 、b y 表示汽车中点,bh、bw 分别表示定位框的高和宽。以图片左上角为(0,0),以右下角为(1,1),这些数字均为位置或长度所在图片的比例大小。因此训练集不仅包含神经网络要预测的对象分类标签,还要表示边界框的这四个数字,接着采用监督学习算法,输出一个分类标签,还有四个参数值。 在上图中,bx的理想值是0.5,因为它表示汽车位于图片水平方向的中间位置;by大约是0.7,表示图片距离底部3/10的位置,bn约为0.3,因为红色方框的高度是图片高度0.3;bw约为0.4,红色方框的宽度是图片宽度的0.4倍。

定义目标标签y

请注意,这有四个分类,神经网络输出的是这四个数字和一个分类标签,或分类标签出现的概率。目标标签y的定义如下:

它是一个向量,第一个组件pc表示是否含有对象,如果对象属于前三类(行人、汽车、 摩托车),则pc= 1,如果是背景,则图片中没有要检测的对象,则pc= 0。我们可以这样 理解pc,它表示被检测对象属于某一分类的概率,背景分类除外。 我们再看几个样本,假如这是一张训练集图片,标记为x,即上图的汽车图片。而在y当 中,第一个元素pc= 1,因为图中有一辆车,bx 、by、bh和bw 会指明边界框的位置,所以标签训练集需要标签的边界框。图片中是一辆车,所以结果属于分类 2,因为定位目标不是行人或摩托车,而是汽车,所以c1 = 0,c2 = 1,c3 = 0,c1、c2和c3中最多只有一个等于 1。 这是图片中只有一个检测对象的情况,如果图片中没有检测对象呢?如果训练样本是右侧这样的一张图片呢? 这种情况下,pc = 0,y的其它参数将变得毫无意义,这里我全部写成问号,表示“毫无 意义”的参数,因为图片中不存在检测对象,所以不用考虑网络输出中边界框的大小,也不

用考虑图片中的对象是属于c1、c2和c3中的哪一类。针对给定的被标记的训练样本,不论图 片中是否含有定位对象,构建输入图片x和分类标签y的具体过程都是如此。这些数据最终定 义了训练集。 最后,我们介绍一下神经网络的损失函数,其参数为类别y和网络输出y^ 。则L(y^, y) = (y^1-y1) 2 (y^2-y2) 2 ... (y^8-y8) 2 ,损失值等于每个元素相应差值的平方和

  • 如果图片中存在定位对象,那么y1 = 1,所以y1 = pc,同样地,如果图片中存在定位对 象,pc = 1,损失值就是不同元素的平方和。
  • 另一种情况,y1 = 0, 也就是pc = 0,损失值是(y^1-y1) 2,因此对于这种情况,我们不用考虑其它元素,只需关注神经网络输出pc的准确度。
特征点检测

神经网络可以通过输出图片上特征点的(x,y)坐标来实现对目标特征的识别。

假设你正在构建一个人脸识别应用,出于某种原因,你希望算法可以给出眼角的具体位 置。眼角坐标为(x, y),你可以让神经网络的最后一层多输出两个数字lx和ly,作为眼角的坐标值。如果你想知道两只眼睛的四个眼角的具体位置,那么从左到右,依次用四个特征点来 表示这四个眼角。对神经网络稍做些修改,输出第一个特征点(l1x,l1y),第二个特征点 (l2x,l2y),依此类推,这四个脸部特征点的位置就可以通过神经网络输出了。依次类推,这四个脸部特征点的位置就可以通过神经网络输出了。 也许除了这四个特征点,你还想得到更多的特征点输出值,这些(图中眼眶上的红色特征点)都是眼睛的特征点,你还可以根据嘴部的关键点输出值来确定嘴的形状,从而判断人 物是在微笑还是皱眉,也可以提取鼻子周围的关键特征点。为了便于说明,你可以设定特征 点的个数,假设脸部有 64 个特征点,有些点甚至可以帮助你定义脸部轮廓或下颌轮廓。选 定特征点个数,并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征 点的位置。

具体做法

准备做法,准备一个卷积网络和一些特征集,将人脸识别图片输入卷积网络,输出1或0.1表示人脸,0表示没有人脸。然输出(l1x,l2y)......直到(l64x, l64y)。这里我用l代表一个特征,这里有129个输出单位。其中1表示图中有没有人脸。

最后一个例子,人体姿态检测,定义一些关键特征点,再输出这些标注过的特征点 ,就相当于输出人物的姿态动作。当然,要实现这个功能,你需要设定这些关键特征点,从胸部中心点(l1x,l1y)一直往下。

目标检测(object detection)

学过了对象定位和特征点检测,今天我们来构建一个对象检测算法。这节课,我们将学习如何通过卷积网络进行对象检测,采用的是基于滑动窗口的目标检测算法。

假如你想构建一个汽车检测算法,步骤是,首先创建一个标签训练集,也就是x和y表示 适当剪切的汽车图片样本,这张图片(编号 1)x是一个正样本,因为它是一辆汽车图片, 这几张图片(编号 2、3)也有汽车,但这两张(编号 4、5)没有汽车。出于我们对这个训练集的期望,你一开始可以使用适当剪切的图片,就是整张图片x几乎都被汽车占据,你可以照张照片,然后剪切,剪掉汽车以外的部分,使汽车居于中间位置,并基本占据整张图片。 有了这个标签训练集,你就可以开始训练卷积网络了,输入这些适当剪切过的图片(编号 6), 卷积网络输出y,0 或 1 表示图片中有汽车或没有汽车。训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,具体步骤如下。

假设这是一张测试图片,首先选定一个特定大小的窗口,比如图片下方这个窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。

滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,再次运行卷积网络, 然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个角落。 为了滑动得更快,我这里选用的步幅比较大,思路是以固定步幅移动窗口,遍历图像的 每个区域,把这些剪切后的小图像输入卷积网络,对每个位置按 0 或 1 进行分类,这就是所 谓的图像滑动窗口操作。 重复上述操作,不过这次我们选择一个更大的窗口,截取更大的区域,并输入给卷积神经网络处理,你可以根据卷积网络对输入大小调整这个区域,然后输入给卷积网络,输出 0或1。

再以某个固定步幅滑动窗口,重复以上操作,遍历整个图像,输出结果

然后第三次重复操作,这次选用更大的窗口。 如果你这样做,不论汽车在图片的什么位置,总有一个窗口可以检测到它。

这种算法叫作滑动窗口目标检测,因为我们以某个步幅滑动这些方框窗口遍历整张图片, 对这些方形区域进行分类,判断里面有没有汽车。 滑动窗口目标检测算法也有很明显的缺点,就是计算成本,因为你在图片中剪切出太多 小方块,卷积网络要一个个地处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗 口个数,但是粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给卷积 网络的小窗口会特别多,这意味着超高的计算成本。

卷积滑动窗口实现

为了构建滑动窗口的卷积应用,首先要知道如何把神经

网络的全连接层转化成卷积层

假设对象检测算法输入一个 14×14×3 的图像,图像很小,不过演示起来方便。在这里过 滤器大小为 5×5,数量是 16,14×14×3 的图像在过滤器处理之后映射为 10×10×16。然后通过 参数为 2×2 的最大池化操作,图像减小到 5×5×16。然后添加一个连接 400 个单元的全连接 层,接着再添加一个全连接层,最后通过 softmax 单元输出y。为了跟下图区分开,我先做 一点改动,用 4 个数字来表示y,它们分别对应 softmax 单元所输出的 4 个分类出现的概率。 这 4 个分类可以是行人、汽车、摩托车和背景或其它对象。

现在我要演示的就是如何把这些全连接层转化为卷积层,画一个这样的卷积网络,它的前几层和之前的一样,而对于下一层,也就是这个全连接层,我们可以用 5×5 的过滤器来实现,数量是 400 个(编号 1 所示),输入图像大小为 5×5×16,用 5×5 的过滤器对它进行卷 积操作,过滤器实际上是 5×5×16,因为在卷积过程中,过滤器会遍历这 16 个通道,所以这 两处的通道数量必须保持一致,输出结果为 1×1。假设应用 400 个这样的 5×5×16 过滤器,输出维度就是 1×1×400,我们不再把它看作一个含有 400 个节点的集合,而是一个1×1×400的输出层。从数学角度看,它和全连接层是一样的,因为这 400 个节点中每个节点都有一个5×5×16 维度的过滤器,所以每个值都是上一层这些 5×5×16 激活值经过某个任意线性函数的 输出结果。

我们再添加另外一个卷积层(编号 2 所示),这里用的是 1×1 卷积,假设有 400 个 1×1的过滤器,在这 400 个过滤器的作用下,下一层的维度是 1×1×400,它其实就是上个网络中 的这一全连接层。最后经由 1×1 过滤器的处理,得到一个 softmax 激活值,通过卷积网络, 我们最终得到这个 1×1×4 的输出层,而不是这 4 个数字(编号 3 所示)。

假设向滑动窗口卷积网络输入 14×14×3 的图片,为了简化演示和计算过程,这里我们依然用 14×14 的小图片。和前面一样,神经网络最后的输出层,即 softmax 单元的输出是 1×1×4, 我画得比较简单,严格来说,14×14×3 应该是一个长方体,第二个 10×10×16 也是一个长方 体,但为了方便,我只画了正面。所以,对于 1×1×400 的这个输出层,我也只画了它 1×1 的 那一面,所以这里显示的都是平面图,而不是 3D 图像。

我们以上面训练好的模型,输入一个16×16×316times16times3大小的整幅图片,图中蓝色部分代表滑动窗口的大小。我们以2为大小的步幅滑动窗口,分别与卷积核进行卷积运算,最后得到4幅10×10×1610times10times16大小的特征图,然而因为在滑动窗口的操作时,输入部分有大量的重叠,也就是有很多重复的运算,导致在下一层中的特征图值也存在大量的重叠,所以最后得到的第二层激活值(特征图)构成一副12×12×1612times12times16大小的特征图。对于后面的池化层和全连接层也是同样的过程。 那么由此可知,滑动窗口在整幅图片上进行滑动卷积的操作过程,就等同于在该图片上直接进行卷积运算的过程。所以卷积层实现滑动窗口的这个过程,我们不需要把输入图片分割成四个子集分别执行前向传播,而是把他们作为一张图片输入到卷积神经网络中进行计算,其中的重叠部分(公共区域)可以共享大量的计算。

汽车目标检测:
Bounding Box 预测(Bounding box predictions)

学到了滑动窗口法的卷积实现,这个算法效率更高,但仍然存在问题,不能输出最精准的边界框。我们看看如何得到更精准的边界框。

在滑动窗口法中,你取这些离散的位置集合,然后在它们上运行分类器,在这种情况下,

这些边界框没有一个能完美匹配汽车位置,也许这个框(编号 1)是最匹配的了。还有看起 来这个真实值,最完美的边界框甚至不是方形,稍微有点长方形(红色方框所示),长宽比 有点向水平方向延伸,有没有办法让这个算法输出更精准的边界框呢?

YOLO算法

是这么做的,比如你的输入图像是 100×100 的,然后在图像上放一个网格。为了介绍起来简单一些,我用 3×3 网格,实际实现时会用更精细的网格,可能是 19×19。基本思路是使 用图像分类和定位算法,前几个视频介绍过的,然后将算法应用到 9 个格子上。(基本思路是,采用图像分类和定位算法,本周第一个视频中介绍过的,逐一应用在图像的 9 个格子中。)更具体一点,你需要这样定义训练标签,所以对于 9 个格子中的每一个指定一个标签y,,y是 8 维的,和之前一样,pc,bx,by,bh,bw,c1,c2,c3. 然后bx 、by、bh和bw 作用就是,如果那个格子里有对象,那么就给出边界框坐标。 然后c1、c2和c3就是你想要识别的三个类别,背景类别不算,所以你尝试在背景类别中识别 行人、汽车和摩托车,那么c1、c2和c3可以是行人、汽车和摩托车类别。这张图里有 9 个格 子,所以对于每个格子都有这么一个向量。

这张图有两个对象,YOLO 算法做的就是 取两对象的中点,然后将这个对象分配给包含对象中点的格子。所以左边的汽车就分配到这个格子上(编号 4),然后这辆 Condor(车型:神鹰)中点在这里,分配给这个格子(编号 6)。 所以即使中心格子(编号 5)同时有两辆车的一部分,我们就假装中心格子没有任何我们感兴趣的对象,所以对于中心格子,分类标签y和这个向量类似,和这个没有对象的向量类似 所以对于这里 9 个格子中任何一个,你都会得到一个 8 维输出向量,因为这里是 3×3 的网格,所以有 9 个格子,总的输出尺寸是 3×3×8,所以目标输出是 3×3×8。因为这里有 3×3格子,然后对于每个格子,你都有一个 8 维向量y,所以目标输出尺寸是 3×3×8。

如果你现在要训练一个输入为 100×100×3 的神经网络,现在这是输入图像,然后你有一 个普通的卷积网络,卷积层,最大池化层等等,最后你会有这个,选择卷积层和最大池化层, 这样最后就映射到一个 3×3×8 输出尺寸。所以你要做的是,有一个输入y,就是这样的输入图像,然后你有这些 3×3×8 的目标标签y。当你用反向传播训练神经网络时,将任意输入映 射到这类输出向量y。 所以这个算法的优点在于神经网络可以输出精确的边界框,所以测试的时候,你做的是 喂入输入图像x,然后跑正向传播,直到你得到这个输出y。然后对于这里 3×3 位置对应的 9 个输出,我们在输出中展示过的,你就可以读出 1 或 0(编号 1 位置),你就知道 9 个位置 之一有个对象。如果那里有个对象,那个对象是什么(编号 3 位置),还有格子中这个对象 的边界框是什么(编号 2 位置)。只要每个格子中对象数目没有超过 1 个,这个算法应该是 没问题的。一个格子中存在多个对象的问题,我们稍后再讨论。但实践中,我们这里用的是 比较小的 3×3 网格,实践中你可能会使用更精细的 19×19 网格,所以输出就是 19×19×8。这 样的网格精细得多,那么多个对象分配到同一个格子得概率就小得多。

交并比(Intersection over union)

并交比函数,可以用来评价对象检测算法。在下一个视频中,我们用它来插入一个分量来进一步改善检测算法。

在对象检测任务中,你希望能够同时定位对象,所以如果实际边界框是这样的,你的算 法给出这个紫色的边界框,那么这个结果是好还是坏?所以交并比(loU)函数做的是计算 两个边界框交集和并集之比。两个边界框的并集是这个区域,就是属于包含两个边界框区域 (绿色阴影表示区域),而交集就是这个比较小的区域(橙色阴影表示区域),那么交并比 就是交集的大小,这个橙色阴影面积,然后除以绿色阴影的并集面积。

一般约定,在计算机检测任务中,如果IoU≥ 0.5,就说检测正确,如果预测器和实际边 界框完美重叠,loU 就是 1,因为交集就等于并集。但一般来说只要IoU ≥ 0.5,那么结果是 可以接受的,看起来还可以。一般约定,0.5 是阈值,用来判断预测的边界框是否正确。 现在介绍了 loU 交并比的定义之后,在下一个视频中,我想讨论非最大值抑制,这个工具可以让 YOLO 算法输出效果更好,我们下一个视频继续。

非极大值抑制(Non-max suppression)

到目前为止你们学到的对象检测中的一个问题是,你的算法可能对同一个对象做出多次 检测,所以算法不是对某个对象检测出一次,而是检测出多次。非极大值抑制这个方法可以 确保你的算法对每个对象只检测一次,我们讲一个例子。

假设你需要在这张图片里检测行人和汽车,你可能会在上面放个 19×19 网格,理论上这辆车只有一个中点,所以它应该只被分配到一个格子里,左边的车子也只有一个中点,所以 理论上应该只有一个格子做出有车的预测。

实践中当你运行对象分类和定位算法时,对于每个格子都运行一次,所以这个格子(编号 1)可能会认为这辆车中点应该在格子内部,这几个格子(编号 2、3)也会这么认为。对 于左边的车子也一样,所以不仅仅是这个格子,如果这是你们以前见过的图像,不仅这个格(编号 4)子会认为它里面有车,也许这个格子(编号 5)和这个格子(编号 6)也会,也许其他格子也会这么认为,觉得它们格子有车。 我们分步介绍一下非极大抑制是怎么起效的,因为你要在 361 个格子上都运行一次图 像检测和定位算法,那么可能很多格子都会举手说我的pc,我这个格子里有车的概率很高,而不是 361 个格子中仅有两个格子会报告它们检测出一个对象。所以当你运行算法的时候, 最后可能会对同一个对象做出多次检测,所以非极大值抑制做的就是清理这些检测结果。这样一辆车只检测一次,而不是每辆车都触发多次检测。

所以具体上,这个算法做的是,首先看看每次报告每个检测结果相关的概率pc,在本周 的编程练习中有更多细节,实际上是pc乘以c1、c2或c3。现在我们就说,这个pc检测概率,首先看概率最大的那个,这个例子(右边车辆)中是 0.9,然后就说这是最可靠的检测,所以我们就用高亮标记,就说我这里找到了一辆车。这么做之后,非极大值抑制就会逐一审视 剩下的矩形,所有和这个最大的边框有很高交并比,高度重叠的其他边界框,那么这些输出就会被抑制。所以这两个矩形pc分别是 0.6 和 0.7,这两个矩形和淡蓝色矩形重叠程度很高,所以会被抑制,变暗,表示它们被抑制了。

我们来看看算法的细节,首先这个 19×19 网格上执行一下算法,你会得到 19×19×8 的输 出尺寸。不过对于这个例子来说,我们简化一下,就说你只做汽车检测,我们就去掉c1、c2 和c3,然后假设这条线对于 19×19 的每一个输出,对于 361 个格子的每个输出,你会得到这 样的输出预测,就是格子中有对象的概率(pc),然后是边界框参数(bx 、by、bh和 bw)。 如果你只检测一种对象,那么就没有c1、c2和c3这些预测分量。

  • 现在要实现非极大值抑制,你可以做的第一件事是,去掉所有边界框,我们就将所有的 预测值,所有的边界框pc小于或等于某个阈值,比如pc ≤ 0.6的边界框去掉。 我们就这样说,除非算法认为这里存在对象的概率至少有 0.6,否则就抛弃,所以这就 抛弃了所有概率比较低的输出边界框。所以思路是对于这 361 个位置,你输出一个边界框, 还有那个最好边界框所对应的概率,所以我们只是抛弃所有低概率的边界框。
  • 接下来剩下的边界框,没有抛弃没有处理过的,你就一直选择概率pc最高的边界框,然 后把它输出成预测结果,这个过程就是上一张幻灯片,取一个边界框,让它高亮显示,这样 你就可以确定输出做出有一辆车的预测。
  • 接下来去掉所有剩下的边界框,任何没有达到输出标准的边界框,之前没有抛弃的边界 框,把这些和输出边界框有高重叠面积和上一步输出边界框有很高交并比的边界框全部抛弃

在这张幻灯片中,我只介绍了算法检测单个对象的情况,如果你尝试同时检测三个对象, 比如说行人、汽车、摩托,那么输出向量就会有三个额外的分量。事实证明,正确的做法是 独立进行三次非极大值抑制,对每个输出类别都做一次。

但结束我们对 YOLO 算法的介绍之前,最后我还有一个细节想给大家分享,可以进一步改善算法效果,就是 anchor box 的思路

Anchaor Boxes

到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象,如果你想让 一个格子检测出多个对象,你可以这么做,就是使用 anchor box 这个概念

而 anchor box 的思路是,这样子,预先定义两个不同形状的 anchor box,或者 anchor box 形状,你要做的是把预测结果和这两个 anchor box 关联起来。一般来说,你可能会用更 多的 anchor box,可能要 5 个甚至更多,但对于这个视频,我们就用两个 anchor box,这样 介绍起来简单一些。

你要做的是定义类别标签,用的向量不再是上面这个: [pc bx by bh bw c1 c2 c3]T 而是重复两次: y = [pc bx by bh bw c1 c2 c3 pc bx by bh bw c1 c2 c3]T

所以我们来看一个具体的例子,对于这个格子(编号 2),我们定义一下y,: y = [pc bx by bh bw c1 c2 c3 pc bx by bh bw c1 c2 c3]T

YOLO算法目标检测

假设我们要在图片中检测三种目标:行人、汽车和摩托车,同时使用两种不同的Anchor box。 训练集:

  • 输入X:同样大小的完整图片;
  • 目标Y:使用网格划分,输出大小,或者对不同格子中的小图,定义目标输出向量Y。

我们先看看如何构造你的训练集,假设你要训练一个算法去检测三种对象,行人、汽车 和摩托车,你还需要显式指定完整的背景类别。这里有 3 个类别标签,如果你要用两个 anchor box,那么输出 y 就是 3×3×2×8,其中 3×3 表示 3×3 个网格,2 是 anchor box 的数量,8 是 向量维度,8 实际上先是 5(pc, bx , by , bℎ , bw)再加上类别的数量(c1, c2, c3)。你可以将它看成是 3×3×2×8,或者 3×3×16。要构造训练集,你需要遍历 9 个格子,然后构成对应的目标 向量y。

所以先看看第一个格子(编号 1),里面没什么有价值的东西,行人、车子和摩托车, 三 个 类 别 都 没 有 出 现 在 左 上 格 子 中 , 所 以 对 应 那 个 格 子 目 标 y就 是 这 样 的 , y= [0 ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ?]T,第一个 anchor box 的 pc 是 0,因为 没什么和第一个 anchor box 有关的,第二个 anchor box 的 pc 也是 0,剩下这些值是 don’t care-s。

所以你这样遍历 9 个格子,遍历 3×3 网格的所有位置,你会得到这样一个向量,得到一 个 16 维向量,所以最终输出尺寸就是 3×3×16。和之前一样,简单起见,我在这里用的是 3×3 网格,实践中用的可能是 19×19×16,或者需要用到更多的 anchor box,可能是 19×19×5×8, 即 19×19×40,用了 5 个 anchor box。这就是训练集,然后你训练一个卷积网络,输入是图 片,可能是 100×100×3,然后你的卷积网络最后输出尺寸是,在我们例子中是 3×3×16 或者3×3×2×8。

模型预测: 输入与训练集中相同大小的图片,同时得到每个格子中不同的输出结果:

接下来我们看看你的算法是怎样做出预测的,输入图像,你的神经网络的输出尺寸是这个 3××3×2×8,对于 9 个格子,每个都有对应的向量。对于左上的格子(编号 1),那里没有 任何对象,那么我们希望你的神经网络在那里(第一个pc)输出的是 0,这里(第二个pc) 是 0,然后我们输出一些值,你的神经网络不能输出问号,不能输出 don’t care-s,剩下的我 输入一些数字,但这些数字基本上会被忽略,因为神经网络告诉你,那里没有任何东西,所 以输出是不是对应一个类别的边界框无关紧要,所以基本上是一组数字,多多少少都是噪音(输出 y 如编号 3 所示)。

运行非最大值预测(NMS)

最后你要运行一下这个非极大值抑制,为了让内容更有趣一些,我们看看一张新的测试

图像,这就是运行非极大值抑制的过程。如果你使用两个 anchor box,那么对于 9 个格子中 任何一个都会有两个预测的边界框,其中一个的概率pc很低。但 9 个格子中,每个都有两个 预测的边界框,比如说我们得到的边界框是是这样的,注意有一些边界框可以超出所在格子 的高度和宽度(编号 1 所示)。接下来你抛弃概率很低的预测,去掉这些连神经网络都说, 这里很可能什么都没有,所以你需要抛弃这些(编号 2 所示)。

最后,如果你有三个对象检测类别,你希望检测行人,汽车和摩托车,那么你要做的是,对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框,用非极大值抑制来 处理行人类别,用非极大值抑制处理车子类别,然后对摩托车类别进行非极大值抑制,运行三次来得到最终的预测结果。所以算法的输出最好能够检测出图像里所有的车子,还有所有 的行人(编号 3 所示)。

候选区域(可选)

这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,所以这里不再针对每个滑动窗运行检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器。

0 人点赞