基于滑动窗口的目标检测

under 算法  tag CNN    Published on May 10th , 2019 at 11:06 pm

我们可以采用目标分类加定位的方法来检测图像中的单一目标,而当图像中含有多个目标时,我们就需要构建一个目标检测算法,使得图像中的所有目标同时被圈出来

滑动窗口(sliding window)是目标检测使用的常用思想
detection1.png
假设我们将构建一个汽车检测算法(把图像中的所有汽车圈出来),首先我们要把汽车图像(汽车占据图像的绝大中心部分)和无汽车图像作为训练集,训练一个CNN来判断图像中是否有车
detection2.png
之后我们选定不同大小的窗口,并将它们分别在图像上依次滑动来覆盖整个图像,对于每一次滑动我们将窗口内的图像剪切并输入训练好的CNN,倘若CNN判断图像内有车,我们就把这个窗口框作为一辆车的定位
但这样很明显将面临一个问题就是计算成本,分别的将剪切后的图片输入CNN的计算量太大,但是我们观察到分别计算中有很多计算是重复的,所以我们可以针对这个特点进行优化来减小计算成本

为了优化计算量,我们将把滑动窗口思想完全使用在卷积层上,为达到这一目的我们首先要将全连接层和softmax的预测向量都转化为卷积层

detection3.png

如上图所示,前面的卷积层和池化层都保持不变,全连接层应该有$5*5*16=400$个元素,其相应卷积层的维度为$1*1*400$。对于$5*5*16$的输入,为达到目的我们需要$400$个$5*5*16$的过滤器,而在下一层中类似的我们使用$400$个$1*1*400$的过滤器,最后通过$4$个$1*1*400$的过滤器得到$1*1*4$的预测输出
这样我们就可以把每个滑动窗口的分类结果都保存在最终输出的其中一个$1*1*4$的向量中

detection4.png

如上图所示,我们滑动窗口的大小为$14*14$,每次滑动的步长为$2$,则在一张$16*16$的图像上可以滑动四次。通过计算我们可知对于$14*14$的图像经过图中卷积与池化后的输出维度为$1*1*4$,则$16*16$的图像经相同的操作后的输出维度为$2*2*4$,其$2*2$个$1*1*4$向量分别对应的是左上,右上,左下,右下四个窗口的预测值,这样就可以同时将所有窗口的预测值同时输出
类似的,对于一张$28*28$的图像,依旧采用$14*14$的滑动窗口,最后可以同时输出$8*8$个位置的预测值
这样我们就降低了基于滑动窗口的目标检测的计算成本,让该方法变得可行


本文由 cxh 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:May 11th , 2019 at 12:02 am
分享到:Twitter  Weibo  Facebook