2分钟了解卷积的滑动窗口实现过程

1介绍

sliding window (滑动窗口) 在深度学习中得到了极其广泛的运用。从卷积层到池化层,都能看见它的身影。

2卷积操作

如下图,在二维图像上,下面显示了其中一个通道的像素集合,卷积就是将滤波器(F11、F12、F21、F22)在图像上滑动,对应位置相乘求和得到卷积的结果,假如一张3×3的特征图,经过2×2的卷积操作后,会得到一张2×2的特征图。】

卷积操作

当输入为多维图像(或者多通道特征图)时,多通道卷积如下图所示(图片来自链接),图中输入图像尺寸为6×6,通道数为3,卷积核有2个,每个尺寸为3×3,通道数为3(与输入图像通道数一致),卷积时,仍是以滑动窗口的形式,从左至右,从上至下,3个通道的对应位置相乘求和,输出结果为2张4×4的特征图。一般地,当输入为m×n×c时,每个卷积核为k×k×c,即每个卷积核的通道数应与输入的通道数相同(因为多通道需同时卷积),输出的特征图数量与卷积核数量一致

多维图像的卷积

对应卷积运算过程(对应位置相乘,再相加)如下图。

卷积操作

3卷积的滑动窗口实现过程

假设对象检测算法输入一个 14×14×3 的图像,在这里如果#滤波#器(卷积核)大小为 5×5,数量是 16个, 14×14×3 的图像在过滤器处理(卷积)之后映射为 10×10×16的特征图。然后通过 2×2 的最大池化操作,图像减小到 5×5×16。然后添加一个连接 400 个单元的全连接层,接着再添加一个全连接层,最后通过 softmax 单元输出。这里用 4 个数字来表示y,它们分别对应 softmax 单元所输出的 4 个类别出现的概率。这 4 个类别可以是行人、汽车、摩托车和背景或其它对象(预先设定)。

卷积神经网络

现在我要把这些全连接层转化为全卷积来实现,画一个这样的卷积网络,它的前两层和之前的一样,都是5×5的卷积层和2×2的池化层(如上)。而对于下一层,也就是这个全连接层,我们可以用 5×5 过滤器(卷积核)卷积来实现,数量是 400 个。这时候,同样输入一个 14×14×3 的图像,经过第一、二层的卷积和池化操作后,同样得到一个5×5×16的特征图,这时如果通过一个滤波器大小为5×5×16(16是通道数,同原特征图一致)、数量为400个的卷积层(而不是全连接层),输出结果为 1×1×400。全连接层我们可以看成是一个含有 400 个节点输入和400个节点输出的神经网络;而如今我们把它看成是一个全卷积网络,不再把它看作含有 400 个节点的输出,而是一个 1×1×400的输出层。从数学角度看,它和全连接层是一样的,因为这 400 个节点中每个节点都有一个5×5×16 维度的滤波器,所以每个值都是上一层这些 5×5×16 激活值经过某个任意线性函数的输出结果。

图1

如上图,假设向滑动窗口卷积网络输入 14×14×3 的图片,和前面一样,神经网络最后的输出层,即 softmax单元的输出是 1×1×4。

图2

假设输入给卷积网络训练的图片大小是 14×14×3,而测试集图片是 16×16×3,现在给这个输入图片加上黄色条块(2格是16对比14多出来的)。在最初的滑动窗口算法中,你会把这片蓝色区域输入卷积网络(上图左边第一个图的红色笔标记)输出一个1×1×4的softmax结果( 对应4个类别的概率)。接着滑动窗口,步幅为 2 个像素,向右滑动 2 个像素,将这个绿框区域(上图左边第二个图的绿色笔标记)输入给卷积网络,运行整个卷积网络,得到另外一个1×1×4的softmax结果。继续将橘色区域(上图左边第三个图的橘色笔标记)输入给卷积网络,卷积后得到另一个标签,最后对右下方的紫色区域进行最后一次卷积操作。我们在这个 16×16×3 的小图像上滑动窗口,卷积网络运行了 4 次,于是输出了了 4 个(1×1×4)标签。

图3

结果发现,这4次卷积操作中很多计算都是重复的(有很多重叠区域的重复计算)。所以执行滑动窗口的卷积时使得卷积网络在这 4 次的前向传播过程中共享很多计算,卷积网络运行同样的参数,使得相同的 5×5×16 过滤器进行卷积操作,得到 12×12×16 的输出层。然后执行同样的最大池化操作,输出结果 6×6×16。照旧应用 400 个 5×5 的过滤器,得到一个 2×2×400 的输出层,现在输出层为 2×2×400,而不是 1×1×400。应用 1×1 过滤器得到另一个 2×2×400 的输出层。再做一次全连接的操作,最终得到2×2×4 的输出层,而不是 1×1×4。最终,在输出层这 4 个子方块中,蓝色的是图像左上部分14×14 的输出(红色箭头标识),右上角方块是图像右上部分(绿色箭头标识)的对应输出,左下角方块是输入层左下角(橘色箭头标识),也就是这个 14×14 区域经过卷积网络处理后的结果,同样,右下角这个方块是卷积网络处理输入层右下角 14×14 区域(紫色箭头标识)的结果。

所以该卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算,就像这里我们看到的这个 4 个 14×14 的方块一样。

图4

再看一个更大的图片样本,假如对一个 28×28×3 的图片应用滑动窗口操作,如果以同样的方式运行前向传播,最后得到 8×8×4 的结果。跟上一个范例一样,以 14×14 区域滑动窗口,首先在这个区域应用滑动窗口,其结果对应输出层的左上角部分。接着以大小为2 的步幅不断地向右移动窗口,直到第 8 个单元格,得到输出层的第一行。然后向图片下方移动,最终输出这个 8×8×4 的结果。因为最大池化参数为 2,相当于以大小为 2 的步幅在原始图片上应用神经网络。

总结一下滑动窗口的实现过程,在图片上剪切出一块区域(如上图是14×14),假设它的大小是 14×14,把它输入到卷积网络。继续输入下一块区域(向右移动2位),大小同样是 14×14,重复操作,直到某个区域识别到汽车。

我们不能依靠连续的卷积操作来识别图片中的#汽车#,比如,我们可以对大小为 28×28 的整张图片进行卷积操作,一次得到所有预测值,如果足够幸运(区域大小恰好包括整台汽车),#神经网络#便可以识别出汽车的位置。不过这种算法仍然存在一个缺点,就是边界框的位置可能不够准确(只有当窗口大小恰好包括汽车的时候最准确,其他情况下都不准确)。

以上是我对滑动窗口的一点粗浅认识,不足之处欢迎批评指正。

(0)

相关推荐