在出现Bounding box预测之前,一般都是通过滑动窗口进行目标检测。本文前两部分介绍滑动窗口算法,这样是为了更好介绍 bounding box如何引出、为了解决什么问题而引出的。也可直接跳跃到第三部分看有关bounding box内容。
一、滑动窗口
简单来说,就是那个框,在图片上移动,就看框里面有没有你要找的目标
其实就是用不同大小的图,在图片上从左到右,从上到下的搜索,找到你要的目标,因为目标的大小不一样,所以很多时候你看你需要很多个尺寸的框来搜索,所以基本是属于穷举法啦,找到适合的为止。
然后将每个尺寸的框input到网络中进行预测。假设向滑动窗口卷积网络输入14x14x3的图片,经过卷积、池化、全连接(通过卷积层代替的全连接层,参考论文:Sermanet, Pierre, et al. “OverFeat: Integrated Recognition, Localization and
Detection using Convolutional Networks.” Eprint Arxiv (2013). )神经网络最后的输出层,即softmax单元的输出是1×1×4。
滑动窗口目标检测算法也有很明显的缺点,就是计算成本,因为你在图片中剪切出太多小方块,卷积网络要一个个地处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。
二、卷积滑动窗口的实现
以前的滑动窗口是用很多不同大小的窗口进行移动(根据步长来移动),把图片分成很多个小窗口(如:14x14),然后把每个窗口喂给分类器,如果给出较高的分类分数,那就说明这个窗口有物体,那就留着,这样处理完所有窗口。
假设输入给卷积网络的图片大小是14x14x3,测试图片是16x16x3,现在给输入图片加一个黄色条块,在最初的算法中,会将蓝色区域输入给卷积网络,生成0或1分类。接着窗口步幅为2像素,向右滑动2像素变成绿色方框,然后输入卷积网络,生成0或1分类。下面以此类推,,,我们在这个 16×16×3 的小图像上滑动窗口,卷积网络运行了 4 次,于是输出了了 4 个标签。
结果发现,这4次操作很多计算是重复的。所以在执行滑动窗口卷积的卷积网络中,可以使卷积网络在这4次向前传播中共享很多权值。从一开始操作中,卷积网络运行同样的参数,使得相同的5x5X16的过滤器进行卷积操作,得到12x12x16的输出层,然后进行2x2x16的最大池化,输出6x6x16,,,最后经过1x1x4的卷积得到2x2x4的输出层。最终,输出层的蓝色方块是图像左上角14x14的输出,右上角的方块是图像右上14x14的输出。
所以该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算,就像这里我们看到的这个 4 个 14×14 的方块一样。
以上就是在卷积层上应用滑动窗口算法的内容,它提高了整个算法的效率。不过这种算法仍然存在一个缺点,就是边界框的位置可能不够准确。因此提出了Bounding box预测。
三、Bounding Box预测(Bounding box predictions)
比如你的输入图像是 100×100 的,然后在图像上放一个网格。为了介绍起
来简单一些,我用 3×3 网格,实际实现时会用更精细的网格,可能是 19×19。
你需要这样定义训练标签,所以对于 9 个格子中的每一个指定一个标签
𝑦,𝑦是 8 维的,和你之前看到的一样,
𝑦 = [𝑝𝑐 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 𝑐1 𝑐2 𝑐3 ]T ,
𝑝𝑐等于 0 或 1 取决于这个绿色格子中是否有图像。然后𝑏𝑥、𝑏𝑦、𝑏ℎ和𝑏𝑤作用就是,如果那个格子里有对象,那么就给出边界框坐标。然后𝑐1、𝑐2和𝑐3就是你想要识别的三个类别,背景类别不算,所以你尝试在背景类别中识别行人、汽车和摩托车,那么𝑐1、𝑐2和𝑐3可以是行人、汽车和摩托车类别。这张图里有 9 个格
子,所以对于每个格子都有这么一个向量。
我们看看左上方格子,这里这个(编号 1),里面什么也没有,所以左上格子的标签向量
𝑦 = [0 ? ? ? ? ? ? ?]T
然后这个格子(编号 2)的输出标签𝑦也是一样,这个格子(编号 3),还有其他
什么也没有的格子都一样。
现在这个格子呢?讲的更具体一点,这张图有两个对象,YOLO 算法做的就是,取两个对象的中点,然后将这个对象分配给包含对象中点的格子。所以左边的汽车就分配到这个格子上(编号 4),然后右边车分配给这个格子(编号 6)。所以即使中心格子(编号 5)同时有两辆车的一部分,我们就假装中心格子没有任何我们感兴趣的对象,所以对于中心格子,分类标签𝑦和这个向量类似,和这个没有对象的向量类似,即
𝑦 = [0 ? ? ? ? ? ? ?]
而对于这个格子,这个用绿色框起来的格子(编号 4),目标标签就是这样的,
这里有一个对象,𝑝𝑐 = 1,然后你写出𝑏𝑥、𝑏𝑦、𝑏ℎ和𝑏𝑤来指定边界框位置,然后还有类别 1是行人,那么𝑐1 = 0,类别 2 是汽车,所以𝑐2 = 1,类别 3 是摩托车,则数值𝑐3=0,即
𝑦 =[1 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 0 1 0 ]T
右边这个格子(编号 6)也是类似的,因为这里确实有一个对象,它的向量应该是这个样子的,
𝑦 =[1 𝑏𝑥 𝑏𝑦 𝑏ℎ 𝑏𝑤 0 1 0 ]T
作为目标向量对应右边的格子。 所以对于这里 9 个格子中任何一个,你都会得到一个 8 维输出向量,因为这里是 3×3 的网格,所以有 9 个格子,总的输出尺寸是 3×3×8,所以目标输出是 3×3×8。因为这里有 3×3格子,然后对于每个格子,你都有一个 8 维向量𝑦,所以目标输出尺寸是 3×3×8。
参考:
Bounding Box是怎么得到的-RCNN目标检测初探
卷积神经网络
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)