SPP-net论文笔记

 个人博客:http://www.chenjianqu.com/

原文链接:http://www.chenjianqu.com/show-74.html

论文:Kaiming He,etc. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition.2015

素质三连

1.论文贡献

提出SPP,使得CNN可以用不同分辨率的输入图像。

改进了RCNN,仅需要抽取一次特征,速度指数级提高。

2.实验结果

SPP-net达到RCNN的精度,但是速度比RCNN块38-270倍。获得了VOC2007的SOTA,以及ILSVRC2014目标检测第二名和图像分类第三名。

3.存在的问题

用于目标检测的SPP-net仍然不是端对端模型。

模型提出

    传统的CNN模型需要统一输入图像的分辨率,这有两种方法:一种是就像AlexNet里的一样,通过crop的方法得到固定的分辨率,但是这样会损失部分图片内容;另一种是RCNN的方法,将图片warp,这样会使图片形变。Crop和warp图片都会导致精度下降。下图的上半部分的传统的CNN模型:

2.jpg

    基本的CNN模型由两部分组成:卷积层和分类器。其实卷积层不需要固定分辨率输入,反正它就是滑动卷积核生成特征图,但是由FC层构成的分类器是需要固定长度的向量输入,因为它就是一个矩阵相乘的操作。

    因此这篇论文提出了Spatial Pyramid Pooling(SPP),将SPP放置于卷积层的顶端,执行信息的”aggregation”,可以池化不同大小特征图得到固定长度的向量,用于输入到分类器。由此,模型输入图片的分辨率可以变化了。如上面的Figure 1所示。

    SPP的思想来源于SPM,它将按层次划分为多块,然后每块提取聚合特征。SPP在CNN应用具有如下特点:1)SPP可以在不同分辨率大小的图片上产生固定长度的特征向量。  2)SPP使用多层级的空间块,而滑动窗口池化仅仅在单层级上进行,多层级池化对目标的形变更加鲁棒。  3)SPP可以池化不同大小的特征图。

    后面的内容作者设计了一系列控制变量实验来探究SPP对CNN的影响。SPP-net获得sota分类结果在Caltech101和VOC2007。此外,SPP-net大大加快了目标检测模型的速度。RCNN得到的每个region proposal都要通过CNN提取特征,这样计算量极大。而SPP-net仅需要进行一次CNN运算,速度大大提高。使用EdgeBoxes生成proposal的情况下,处理一张图片整个过程SPP-net仅需要0.5s。

SPP-net

    首先要知道,每个卷积核对不同特征的激活值是不一样的。以AlexNet为基础,下图中,b是a输入后第5层某通道的特征图,箭头是最强激活对应的位置,c该卷积核对应的激活值最高的图片,绿色框是最强激活对应的感受野。

3.jpg

    从不同分辨率的特征图中提取固定长度的特征向量,可以用Bow方法,而SPP是Bow的升级版。在传统的CNNs模型中加入SPP,就成了SPP-net。SPP通过将特征图划分为多个层级多个空间块,保留了空间信息。空间块的数量是固定的,大小随着特征图的变化而变化。将AlexNet中第五层的池化层替换为SPP,如下图:

4.jpg

    如上图所示,将特征图划分为三层金字塔,各层的空间块(bin)数量为:16,4,1。对每一空间块进行池化,这里采用最大池化。输出固定长度的kM维向量,其中M是特征块的数量,k是特征图的通道数。得到的向量就可以扔进全连接层进行分类了。可以看法,有一块覆盖整张特征图,这其实就是全局池化。

SPP-net的训练

    理论上SPP-net可以通过BP训练,但是实际中的GPU实现都要求固定分辨率的输入,那怎么办呢。

Single-size training

    单尺度输入训练,假设输入图片分辨率为224x224。对于给定的输入分辨率,可以预计算各空间块的大小。假设SPP层输入的特征图分辨率为a*a,空间块数量为n*n,可以采用滑动窗口池化的方法实现SPP,池化窗口大小为win=ceil(a/n),滑动步长为str=floor(a/n)。下图显示使用cuda-convnet实现的3级SPP (3x3 2x2 1x1)的后几层:

5.jpg

Multi-size training

    上面说的是单尺度的情况,但是我们想要我们的网络能输入不同的分辨率。可以同AlexNet一样,将图片裁剪到224x244,然后resize到180x180,这样就得到两种不同大小的分辨率。

    对于224x224和180x180的数据,先计算SPP的滑动窗口大小和步长。使用180x180训练模型,然后将该模型用于训练224x224,这相当于两个传统的CNN模型进行参数共享。这样通过共享两种不同分辨率的模型的参数,就相当于实现SPP-net。

    为了减少切换不同分辨率模型的开销,每个epoch选择一种分辨率。实验中作者发现这种multi-size和上面的single-size收敛速率差不多。除了224x224和180x180之外,作者将训练数据在每个epoch的数据都随机缩放至[180,224]大小。

    multi-size只在训练阶段,而在模型的推断阶段,图片直接输入。

SPP-net图像分类

在ImageNet2012分类数据集上

    数据增强:水平翻转,颜色改变。数据预处理:和AlexNet差不多,先将图片短边缩放至256,然后在四个角和中间随机裁剪到224x224。将图片减去imagenet数据集像素均值。在VOC2007和Caltech101上减去的是128。

    训练配置:在两个全连接层使用dropout。学习率0.01,当误差停滞时将学习率除以10,这都跟AlexNet差不多。在cuda-convnet和Caffe上实现,用一个GeForce GTX Titan GPU(6G)训练两个星期。

    SPP可以加在不同的CNN上面,下面是ZF-5,Convnet*-5,Overfeat-5/7:

6.jpg

    下图的(a)是作者未加SPP时的结果,其中ZF-5训练了70epoch,其它的训练了90epoch。下图(b)是single-size的结果,训练和测试都用224x224分辨率,使用了4级金字塔,{6x6 3x3 2x2 1x1},共50块。下图(c)是multi-size的结果,使用224x244和180x180分辨率训练,测试使用224x244。

7.jpg

    上面结果显示SPP的加入使得模型的精度得到一定的提升。

    值得注意的是SPP精度的提高并不是简单的由参数增多,而是因为它对目标的尺度更加鲁棒得到的。为了证明这点,作者训练了另一个ZF-5网络,使用4级金字塔{4x4 3x3 2x2 1x1},共30bins,总的参数少于no-SPP的ZF-5。结果和50bins的ZF-5差不多,由于no-SPP的ZF-5。

    除了使用224和180训练之外,作者尝试随机缩放至[180,224],结果为:The top-1/5 error of SPP-net (Overfeat-7) is 30.06%/10.96%。这个结果甚至比使用两种分辨率的组要差,这可能是为了测试使用的是固定224分辨率,而训练时使用224分辨率训练的比较少原文[possibly because the size of 224 (which is used for testing) is visited less]。

评估方法

使用full-image进行评估

    在模型评估阶段,可以直接输入整张图片,也可以先crop再输入。对于整张图片是将其各向缩放至短边为256的分辨率;对于crop是将图片短边缩放至256,再在中间裁剪出224x224作为输入,评估对比结果如下:

8.jpg

    结果显示虽然模型在训练时使用crop作为输入,但是它对其它尺度也泛化的很好。表2中的multi-views评估结果是优于表3中single full-image view的。但是使用full-image评估也很好,理由如下:

First, we empirically find that even for the combination of dozens of views,the additional two full-image views (with flipping) can still boost the accuracy by about 0.2%. 

Second,the full-image view is methodologically consistent with the traditional methods [15], [17], [19] where the encoded SIFT vectors of the entire image are pooled together. 

Third, in other applications such as image retrieval [37], an image representation, rather than a classification score, is required for similarity ranking.A full-image representation can be preferred.

使用multi-view进行评估

    对于得到的特征图,我们映射到窗口到特征图上,映射的方法和目标检测用的一样,然后对对应的特征图窗口进行SPP,将池化得到的向量喂入fc层,得到softmax分数。最后将所有的分数进行平均,得到结果。标准的,使用10-view,s=256,窗口大小是224x224,在原图的四个角和中间去窗口,这样就跟AlexNet中使用的评估方法差不多了。

    也可以对不同尺度的图片使用multi-views。这里resize图片到6个尺度{224 256 300 360 448 560},然后计算特征图。每个尺度的图片上取18个窗口(当224尺度时取6个窗口),使用窗口大小=224x224,位置:一个在中间,四个在角落,四个每个边的中间,以及翻转的。总共有18x5+6=96个窗口,最终可以减少到top-5错误率为9.14%。

结果

在ImageNet2012上:

9.jpg

在ILSVRC2014上:

10.jpg

    恺明大佬很牛逼了,可惜ILSVRC2014上出现了VGG和GoogLeNet这两巨牛逼的模型。

在VOC 2007数据集上

    模型在ImageNet上预训练,对Pascal VOC 2007数据集抽取特征,训练SVM进行分类,使用mAP进行评估。结果如下:

11.jpg

在ImageNet2012分类数据集上

12.jpg

SPP-net目标检测

    目标检测领域中,RCNN算是里程碑式的算法,精度较之传统算法大幅提升。但是因为RCNN需要对对每张图片的两千个Proposal Region使用CNN抽取特征,这使得其速度那真的是慢。

    SPP-net也可以用于目标检测。从整张图片中抽取特征,然后对每个候选区域使用SPP得到固定长度的向量,再扔进分类器进行分类就好了。如下:

13.jpg

    只需要进行一次特征抽取,因此速度相比于RCNN得到指数级的提升。

算法实现

    首先对原始图片使用”fast”模型的SS算法产生2000个候选窗口。然后将图片缩放至min(w,h)=s,使用ZF-5(single-size trained)抽取特征得到特征图。候选窗口是在输入图片上生成的,需要将其映射到最后一层特征图上。

    映射方法:首先要知道输入图片(比如224x224)被CNN几次下采样,需要将候选窗口在特征图上进行对齐。作者的想法是将原始窗口的某个点投影到特征图上的某个点。为了简化投影的过程,需要在每层卷积层padding=floor(p/2),这样原始图片的大小就是特征图的整数倍了。在作者使用的模型中,ZF-5的conv5的下采样倍数S=16,overfeat-5/7的conv5/7的S=12。给定一个窗口,投影它的左/上边界为x’=floor(x/S)+1,右下边界为x’=ceil(x/S)。如果在卷积过程中不增加padding的话,这里还需要增加偏置。

    SPP实现:设特征图的分辨率为wxh,该级金字塔是nxn块,对于第(i,j)个块,池化范围为:

14.jpg

    对每个候选窗口,使用4级空间金字塔(1x1 2x2 3x3 6x6 共50bins)得到固定长度的特征向量,特征图有256个通道,故向量长度为50x256=12800。得到的特征向量输入到FC层里。最后训练一个线性SVM分类器。

    SVM分类器的训练:使用ground-truth窗口产生正样本,负样本是与ground-truth的IoU小于0.3的候选窗口,当负样本与另一个负样本的IoU超过0.7时会被移除。使用难例挖掘的方法训练SVM。训练好的SVM用于候选窗口的打分,最后执行NMS。

    Multi-scale:可以使用multi-scale特征抽取的方法提高精度。缩放图片至min(w,h)∈ S={480,567,688,864,1200},然后使用CNN运算得到特征图。首先在原图上使用SS产生候选窗口,然后这里的策略是:选择某个尺度使其候选窗口的大小最接近224x224,在对应的特征图窗口上进行SSP得到向量。

    Fine-tuning:像RCNN一样,这里也对预训练的模型进行了fine-tuning,只微调fc层。在RCNN提到,微调FC层对模型精度的提升很大,但是加入FC层会使计算量和参数量大大增加。在这里,fc6和fc7使用预训练的参数,fc8是新的21-way输出层。Fc8使用高斯分布初始化,sigma=0.01。微调学习率为先1e-4后1e-5。微调使用的正样本是与ground-truth的iou为[0.5,1]之间的候选窗口,负样本是[0,0.5]的候选窗口。在每个mini-batch由25%的正样本,先用学习率1e-4训练250k批次,再1e-5训练50k批次。

    Bounding box:同RCNN一样,也用bounding box回归器对预测窗口进行后处理。训练回归器使用的是与ground-truth的iou大于0.5的候选窗口。

目标检测结果

    在VOC 2007上进行评估。结果如下:

15.jpg

    下面是RCNN也使用ZF-5时所做的比较:

16.jpg

    详细的对比:

17.jpg

复杂度和运行时间

    RCNN的卷积网络的复杂度是O(n*227^2),其中n是候选窗口的数量。SPP-Net的复杂度是O(r*s^2),s是某个尺度,r是缩放比例。假设r是3/4,s=688,则SPP-Net的复杂度是RCNN的1/160。如果是5个尺度的情况下,是1/24。从上面的表10中可以看到,SPP-Net的速度比RCNN快270或49或38倍。

SS算法在每张图片运行需要花费1-2s在CPU上,而EdgeBoxes[论文:Edge boxes: Locating object proposals from edges]在每张图片上运行花费0.2s。在测试阶段仅仅使用EdgeBoxes。在训练阶段使用SS和EdgeBox。每张图片运行时间总共~0.5s,包括所有步骤。这在当时已经很快了。

模型集成

    Model combination是提高模型评估精度的策略,作者提出了一种简单的提高目标检测精度model combination方法。在ImageNet上预训练另一个相同架构不同初始化的模型。然后重复上面的检测算法,下表显示这个模型SPP-net(2)的结果:

18.jpg

    两个模型的联合使用:首先使用两个模型对所有的候选区域进行打分,然后对两组候选区域使用NMS。如上表12,联合两个模型后mAP提升到60.9%,这表明两个模型在一定程度上互补的。

    作者还发现互补性主要来自卷积网络,尝试将相同卷积模型的两个随机初始化的微调结果合并在一起,结果发现没有任何软用。

    在VOC2007上的结果:

19.jpg

ILSVRC 2014目标检测

    过程:略。结果如下:

20.jpg

参考文献

[0]Kaiming He,etc. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition.2015

发布了74 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37394634/article/details/103976540