sppnet

1.Introduction

         R-CNN 作为CNN引入目标检测的开篇之作,后来又出现了sppnet ,fast R-CNN,faster R-CNN等一系列目标检测算法,本次主要学习的是sppnet

         首先介绍一下R-CNN的流程:

         每张图片通过selectivesearch选出大约2000张候选框,每个候选框单独输入CNN做卷积操作,在使用SVM分类,以及最后位置的精修。sppnet就提出能不能在整张图上提取候选框特征,这样在整幅图上只进行一次卷积。

         总的过程还是:使用selectivesearch得到候选区域---CNN提取候选区域特征---分类------位置的精修。其中一个亟待解决的就是如何将原始图像的候选区域映射到特征图,在后面我会说到这个问题。第二个问题就是特征区域在特征图上对应得维度不能满足全连接层的输入怎么办?

之前流行的cnn网络一般都需要一个固定的输入尺寸,例如:alexnet(224*224)。而固定的尺寸一般都是通过crop和warp得到,crop可能会获取不到完整的物体,warp可能会导致物体的扭曲,这两种方法都有可能导致识别精确率的下降。 cnn之所以需要一个固定的输入尺寸,是因为最后的全连接层,卷积层并不需要固定的图片尺寸。因此本文介绍了spp 层来去除神经网络对固定尺寸的限制。我们在最后一个卷积层之后加上spp层,然后是全连接层。这样在网络的开始就不需要对图片进行裁剪(crop)或者扭曲(warp)。

下面是spp-net网络结构:


 spp有几个突出的优点:

 (1)spp能在输入尺寸任意的情况下产生固定大小的输出。
 (2)spp使用多层次的空间箱(bin),而滑动窗口池化只用了一个窗口尺寸。多层次池化对物体的变形十分鲁棒

 (3)由于输入尺寸的灵活性,spp可以池化从各种尺度抽取出特征。

         spp-net不仅在测试阶段允许任意尺寸的输入能够产生表示,也允许在训练阶段有各种尺度,多尺寸训练可以提高缩放不变性以及减少过拟合。我们开发了一个简单的多尺度训练方法: 为了使一个单一网络可以接受不同尺寸的输入,我们通过共享所有参数的多个网络来近似它,这些网络中的每一个都是使用固定输入大小来训练。在每一个epoch,使用一个给定输入大小去训练网络,下一个epoch时切换到另一个输入大小。实验表明,这种多尺度训练比传统的但尺度训练一样收敛,并导致更好的测试精度。(我觉得应该就是同一个网络在不同的epoch切换不同的输入尺度)

 spp-net在图像检测方面也表现优异。目前领先的物体检测方法时R-CNN,但时R-CNN使用selctivesearch方式选择了多个候选区域,对于每个候选区域都会单独使用一次卷积神经网络,因此是费时的。而在本文中,我们只需要在整张图上运行一次卷积神经网络,然后使用spp-net在特征图上抽取特征,这个方法大大降低了耗时。


2.空间金字塔池化层( the spatial pooling layer )

要适应不同的尺寸输入,我们在最后的卷积层之后加上spp 层。因为对于不同的尺寸输入,在卷积层之后会有不同尺寸的输入,我们通过spp层替换掉最后的池化层,为全连接层获得固定的输入大小的向量。金字塔的输出是KM维向量,M代表块的数量,K代表最后一层卷积层的过滤器的数量,这个固定维度的向量就是全连接层的输入。



下面给出一个对空间金字塔具体解释的事例,如下图:


所谓金字塔池化,就是沿着金字塔的底端向顶端一层一层做池化。对于一个给定尺寸的图像,我们先计算空间金字塔池化所需要的块的大小,试想一个尺寸是a*a(也就是13*13)的conv5之后的特征图,对于n*n块的金字塔级,我们实现一个滑动窗口池化的过程,windows=上取整[a/n],  stride=下取整[a/n],对于L层金字塔,我们实现 L个这样的层,然后将L个层的输出进行连接输出给全连接层。

        下图中是一个3层金字塔(分别是1*1块,2*2块,3*3块)的实例,一个conv5后特征图尺寸为13*13*256,如果像下图这样将feature map分成1*1(金字塔底座),2*2(金字塔中间),3*3(金字塔顶)三张子图,分别做max pooling后,当然每个池化的stride和filter大小可能不同,出来的特征是(1*1+2*2+3*3)*256 =3584维,单个窗口将产生输出向量3584维。 这个表示将传递给全连接层。无论输入尺度是多大,都得到固定的输出尺度,即3584,只不过每次窗口大小可能不同,就像之前所说的那样。输入是a*a,输出是n*n,windows=上取整[a/n],  stride=下取整[a/n],

  



3.训练网络

        我们实现了但尺度的训练和多尺度训练,但尺度训练是224*224大小,多尺度训练先考虑了两个尺寸:180*180,224*224,我们使用的是缩放,而不是裁剪,即把224*224缩放到180*180,这样不同尺度的区域仅仅是分辨率的不同,内容和布局上并没有不同。对于180*180的网络,我们实现了另一个固定尺寸的网络,conv5输出的特征图是a*a=10*10,windows=上取整[a/n],  stride=下取整[a/n],因此,最终180网络的空间金字塔的输出大小和224*224网络的金字塔输出大小相同。多尺度训练时,为了降低一个从一个网络到另一个网络的开销,我们再每个网络上训练一个完整的epoch(权重保留),实验中,我们发现多尺度训练的收敛速度和但尺寸差不多。

       多尺度训练主要是 为了保证充分利用已经优化好的固定尺寸网络的同时,模拟不同的输入尺寸。除了上述两个尺度的实现,我们还在每个epoch中测试了不同的输入大小,从180到224均匀选取。

       当然,上述单尺度或者多尺度只是针对于训练。在测试阶段,是直接对各种尺寸的图像应用spp-net的。


4.实验结果:

  (1)多层次池化提升准确率

 (2)多尺寸训练提升准确率

        (3)全图像表示提升准确率


5.目标检测

      使用spp进行目标检测,先用selectiveserach的fast模式对每张图片获取2000个候选区域。不过,不像R-CNN把每个候选区域送入神经网络提取特征,而是把整张图提一次特征,再把候选框映射到conv5层上,由于候选框的大小不同,映射到conv5后仍有不同,因此需要spp层提取相同的维度,再进行分类和回归,后面的与R-CNN类似。由于spp-net只需要对整张图提取一次特征,剩下的只需要再conv5层上操作就可以了。

        回答开头的第一个问题,如何将原始图像的候选区域映射到特征图?

此处的映射概念跟overfeat网络是一样的,overfeat也是从卷积特征图中抽取特征,不同的是overfeat需要预定义好窗口尺寸,而spp-net的特征抽取可以在任意尺寸的深度卷积特征图上。

这里我对映射的概念做出解释,如下图:

  第一行中对14*14*3的图片进行卷积,池化,最后获得了1*1*4,也就是整张图被提取相应的特征维度为1*1*4

          第二行中对16*16*3的图片检测,先使用14*14卷积核卷积,经过一系列步骤获得2*2*4,对于左上角蓝色的部分,最终被映射为2*2*4的左上角的1*1*4部分, 也就是它对应的特征图。步长为2,窗口向右滑动,蓝色的部分最终被映射为右上角1*1*4部分。。。。

         由于第二行对一张16*16的图片 分成了4部分,每部分分别进行了运行了一次卷积神经网络,这样是非常耗时的。

         第三行就引出了我们不需要把图片分成多个子集,而是把他们作为整张图输入给卷积神经网络进行计算,这样输入图片的区域还是会对应feature map上相应的区域,这种映射是一一对应的。也就产生了为什么sppnet中可以对整张图进行卷积,而不同的候选区域可以映射到conv5层(特征图)的不同位置了。


     




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章