(2)SPPNet

        RCNN使用CNN作为特征提取器,首次使得目标检测跨入深度学习的阶段。但是RCNN对于每一个区域候选都需要首先将图片放缩到固定的尺寸(224*224),然后为每个区域候选提取CNN特征。容易看出这里面存在的一些性能瓶颈:

        1、重复为每个region proposal提取特征是极其费时的,Selective Search对于每幅图片产生2K左右个region proposal,也就是意味着一幅图片需要经过2K次的完整的CNN计算得到最终的结果,重复为每个region proposal提取特征是极其费时的.

        2、同时对于所有的region proposal防缩到固定的尺寸会导致我们不期望看到的几何形变,影响准确率。如图

    

(2)SPPNet_第1张图片
对原始图片的裁剪和缩放

        CNN之所以需要固定的输入,是因为CNN网络可以分解为卷积网络部分以及全连接网络部分。卷积网络的参数主要是卷积核,完全能够适用任意大小的输入,并且能够产生任意大小的输出。但是全连接层部分不同,全连接层部分的参数是神经元对于所有输入的连接权重,也就是说输入尺寸不固定的话,全连接层参数的个数都不能固定。

        基于以上性能分析和原因探究,何凯明14年提出了SPPNet。(空间金字塔池化网络)

    (1)首先是不同尺度图像的适应问题

            既然只有全连接层需要固定的输入,那么我们在全连接层前加入一个网络层,让他对任意的输入产生固定的输出不就好了。常见的想法是对于最后一层卷积层的输出pooling一下,但是这个pooling窗口的尺寸及步伐设置为相对值,也就是输出尺寸的一个比例值,这样对于任意输入经过这层后都能得到一个固定的输出。如下图:


(2)SPPNet_第2张图片
SPPNet用于目标检测

            思路是对于任意大小的BBox首先分成16、4、1个块,然后在每个块上最大池化,池化后的特征拼接得到一个固定维度的输出。以满足全连接层的需要。

        假设原图输入是224x224,对于conv5出来后的输出是13x13x256的,可以理解成有256个这样的filter,每个filter对应一张13x13的reponse map。如果像上图那样将reponse map分成1x1(金字塔底座),2x2(金字塔中间),4x4(金字塔顶座)三张子图,分别做max pooling后,出来的特征就是(16+4+1)x256 维度。如果原图的输入不是224x224,出来的特征依然是(16+4+1)x256维度。这样就实现了不管图像尺寸如何 池化n 的输出永远是 (16+4+1)x256 维度。 

        与R_CNN的对比如图:


(2)SPPNet_第3张图片
R-CNN与SPPNet

        将conv5的pool层改为SPP之后就不必把每一个都ROI抠出来送给CNN做繁琐的卷积了,整张图像做卷积一次提取所有特征再交给SPP即可。

(2)我们可以看出,是在第5个卷积层后接了SPP结构,在其特征图上的bbox去提取特征的,那么这里的bbox是如何生成的呢。

        首先看一下卷积5次后的可视化结果。

        

(2)SPPNet_第4张图片
卷积5次后的特征图的可视化

        SPPNet通过可视化Conv5层特征,发现卷积特征其实保存了空间位置信息。可通过相应的数学方法得到其在原图中的位置。因此,这里的方法就是现在原图通过selective search的方法找到对应的bbox,在映射到第五次卷积的特征图上的。映射方法为:,S 表示之前卷积和池化缩放的比例。

(3)最后

        训练SVM,BoundingBox回归。这里和RCNN是一致的。

    

    

你可能感兴趣的:((2)SPPNet)