滑动窗口的卷积实现、Bounding Box 预测
1 滑动窗口的卷积实现(Convolutional implementation of sliding windows)
为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层。假设对象检测算法输入一个 14×14×3 的图像,过滤器大小为 5×5,数量是 16,14×14×3 的图像在过滤器处理之后映射为 10×10×16。然后通过参数为 2×2 的最大池化操作,图像减小到 5×5×16。然后添加一个连接 400 个单元的全连接层,接着再添加一个全连接层,最后通过 softmax 单元输出y。
如何把这些全连接层转化为卷积层呢?前几层和之前的一样,而对于下一层,也就是这个全连接层,我们可以用 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 所示)。这就是用卷积层代替全连接层的过程,结果这几个单元集变成了 1×1×400 和 1×1×4 的维度。
2 Bounding Box 预测(Bounding box predictions)
在滑动窗口法中,你取这些离散的位置集合,然后在它们上运行分类器,在这种情况下,这些边界框没有一个能完美匹配汽车位置,有没有办法让这个算法输出更精准的边界框呢?能更精准边界框的算法是 YOLO 算法,YOLO(You only look once)意思是你只看一次。基本思路是,采用图像分类和定位算法,逐一应用在划分图像的 9 个格子中,对于 9 个格子中的每一个指定一个标签y,y是 8 维的:
pc等于 0 或 1 取决于某个格子中是否有图像。然后bx、by、bh和bw作用就是,如果那个格子里有对象,那么就给出边界框坐标。然后c1、c2和c3就是你想要识别的三个类别,背景类别不算,所以你尝试在背景类别中识别行人、汽车和摩托车,那么c1、c2和c3可以是行人、汽车和摩托车类别。这张图里有 9 个格子,所以对于每个格子都有这么一个向量。如果某个格子里面有一个对象,pc = 1,然后你写出bx、by、bh和bw指定边界框位置,然后还有类别 1是行人,那么c1 = 0,类别 2 是汽车,所以c2 = 1,类别 3 是摩托车,则数值c3 = 0,即:
如果某个格子里面没有对象,则pc = 0,y的值如下1,但是在实际过程中,我们不会直接写?,我们是写一些不相关的值,可以当作噪声点。
所以对于这里 9 个格子中任何一个,你都会得到一个 8 维输出向量,因为这里是 3×3 的网格,所以有 9 个格子,总的输出尺寸是 3×3×8,所以目标输出是 3×3×8。因为这里有 3×3
格子,然后对于每个格子,你都有一个 8 维向量y,所以目标输出尺寸是 3×3×8。所以这个算法的优点在于神经网络可以输出精确的边界框,所以测试的时候,你做的是喂入输入图像x,然后跑正向传播,直到你得到这个输出y。在 YOLO 算法中,对于这个方框(编号 1 所示),我们约定左上这个点是(0,0),然后右下这个点是(1,1) ,要指定中点的位置。
本文来自博客园,作者:zhang-X,转载请注明原文链接:https://www.cnblogs.com/YY-zhang/p/15077158.html