作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun

以前的CNNs都要求输入图像尺寸固定,这种硬性要求也许会降低识别任意尺寸图像的准确度。为避免这个问题,何凯明等人在该论文中提出了一种池化策略,“spatial pyramid pooling(SSP)“,即空间金字塔池化。带有该池化层的网络被称为SPPnet,对任何尺寸的输入图像都能生成固定长度的特征表示。由此可见,理论上SPPnet可以改进所有基于CNN的图像分类等方法中。在性能上,SPPnert能够大幅提升CNN的准确度。同样,在object detection方面也有重要应用。使用SPPnet时可以只计算一次整个图像的feature maps,然后在featrue maps中选择任意region(sub-images)进行pooling以产生固定长度的特征给后面的detectors。这样就可以避免重复地计算卷积特征。因此,使用SPPnet的话可以大幅降低网络的训练和测试时间。

以下对论文部分内容进行记录:

2.2 The Spatial Pyramid Pooling Layer

卷积层的输入是任意size的,输出的尺寸会与之对应,因为也是一个变化的size。但是分类器(SVM/softmax)或者全连接层的输入需要是fixed-length vectors。这样的vectors可以使用Bag-of-Words(BoW)法池化特征得到,但是该方法会带来空间信息丢失的问题,而论文中提出的空间金字塔则可以通过在本地空间容器中池化从而保留空间信息。那些容器与图像的size成正比,且不管图像的尺寸如何变化,容器的数量都是固定的。

在CNN中使用Spatial Pyramid Pooling Layer时需要将网络的最后一个池化层换成一个空间金字塔池化层。Figure 3说明了具体的方法。

从图中可以看出,在每个容器(bin, 每个含多通道的小方格,图中有21个bins)中我们池化每个filter(Figure 3中单通道的小方格)的响应(论文中使用的都是max pooling);空间池化的输出是kM-dimentional vectors,其中M是bins的数量,k是最后一个卷积层中filters的数量,即通道数;fixed-dimentional vectors被输入到全连接层。

上图中最终提取的特征长度为16x256+4x256+256,即16c+4c+c

4. SPP-net for Object Detection

作者回顾了最近在目标检测领域最顶尖的R-CNN算法,发现由于R-CNN重复将深度卷积网络应用于每幅图像的数千个windows,导致R-CNN在训练和测试时耗时较长。SPPnet正好可以有效地缓解该问题。方法大致如下:先计算一次整幅图像的feature maps(可能是多通道),然后对每个candidate window在feature maps中的映射区域进行空间金字塔池化,以得到该window的固定长度特征(Figrure)。由此可见,卷积网络只进行一次耗时的卷积计算,这让R-CNN快几个数量级。

论文中的方法从feature maps(可能是multi-scale,即多通道)的rigion中得到windows的features,而R-CNN直接从所有Image regions中提取。

4.1 Detection Algorithm

算法过程:

  • 使用selective search的‘fast’模式从每一幅图像产生大约2000个candidate windows
  • 调整图像的大小使得min(w,h)=s,即图像的最短边长度为s,并且计算整幅图像的feature maps
  • 暂时使用single-size trained(指输入图像是固定尺寸的,还有一种multi-size训练),在每个candidate window中使用4级空间金字塔进行池化(1x1,2x2,3x3,6,x6,总共有50 bins),得到一个12800-d(256x50)的representation。
  • 将上一步得到的所有candidate windows的representations提供给网络的全连接层(R-CNN也有全连接层)计算得到features
  • 使用线性SVMs根据features给candidate windows打分,然后对scored windows使用非极大值抑制,阈值取0.3(每一类的二值线性SVM classifier是使用上一步得到的features训练的)
  • 利用features进行bounding-box regression

SVMs的训练:将ground-truth windows标记为Positive examples,将与一个positive example交叉比最多0.3的candidate Windows标记为negative examples。和R-CNN中SVMs的训练类似,IoU大于0.3且不是positive examples的windows会被忽略。同时,那些与另一个negative example的IoU大于0.7的negative examples会被移除,不再被视为negative examples。论文中训练SVMs使用的是standard hard negative mining。在测试时,SVMs classifier被用来给candidate windows打分,然后对打过分的windows使用非极大值抑制。

multi-scale feature extraction 能够进一步改善算法:论文中将image 尺度调整为min(w,h)=s,s属于{480,576,688,864,1200},并且计算每个scale的feature maps。可以通过逐个通道池化的方法结合从每个尺度提取到的特征,也就是训练的时候在epoch中首先训练一个尺寸产生一个Model,然后加载该Model训练第二个尺度,直到训练完所有的尺寸为止。但是作者根据经验发现了另一种可以带来更好效果的方法:先将image resize到五个尺度:480,576,688,864,1200,加自己6个。然后在map window to feature map一步中,选择ROI框尺度在{6个尺度}中大小最接近224x224的那个尺度下的feature maps中提取对应的roi feature。这样做可以提高系统的准确率。同样,该方法也只需要在每个scale上计算一次卷积,不管candidate Windows的数量。

window 到Feature maps的映射关系:

假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关: (x,y)=(S*x’,S*y’)。那么通过(x,y)坐标求解(x’,y’)的计算公式如下:

式中S就是CNN中所有的strides的乘积,包含了池化、卷积的stride

SPPnet与R-CNN的相同点:它们都遵循着提取候选框、提取特征、分类几个步骤;在提取特征后都使用了SVM进行分类;训练都分为多个阶段,复杂且耗时;features都需要写入硬盘。

SPPnet与R-CNN的不同点:R-CNN要对每个缩放后的region proposal计算卷积,而SPPnet只需要计算一次整幅图像的卷积,因此SPPnet的效率比R-CNN高得多

SPPnet明显的缺陷:与R-CNN一样,SPPnet的训练分为多个阶段,涉及到提取特征、微调网络、训练SVMs和最后的bounding-box regressors拟合;特征需要写入硬盘;另外,不像R-CNN,SPPnet在微调时不能更新空间金字塔池化层之前的卷积层参数,这一点限制了深度网络的精度。关于最后一点其实不准确,SPPnet也可以反向传播,但是会很复杂,可以参见知乎。本文作者给出的解释如下图:

而Ross Girshick在论文《Fast R-CNN》中认为SPPnet在微调时不能更新卷积层参数,给出的解释如下:

显然,Ross Girshick其实是认为当训练来自不同图像的ROIs时反向传播经过SPP 层的效率非常低下,这时更新卷积层参数耗时较长,不能更新卷积层参数,而不是不可以更新。

至于Ross Girshick为什么说SPP层反向时效率非常低,网上的解释如下:

SPP-Net中fine-tuning的样本是来自所有图像的所有RoI打散后均匀采样的,即RoI-centric sampling,这就导致SGD的每个batch的样本来自不同的图像,需要同时计算和存储这些图像的Feature Map,过程变得expensive. Fast R-CNN采用分层采样思想,先采样出N张图像(image-centric sampling),在这N张图像中再采样出R个RoI,具体到实际中,N=2,R=128,同一图像的RoI共享计算和内存,也就是只用计算和存储2张图像,消耗就大大减少了

完整的SPPnet模型示意图:

参考链接:

目标检测(二)SSPnet--Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognotion的更多相关文章

  1. 目标检测--Spatial pyramid pooling in deep convolutional networks for visual recognition(PAMI, 2015)

    Spatial pyramid pooling in deep convolutional networks for visual recognition 作者: Kaiming He, Xiangy ...

  2. Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition Kaiming He, Xiangyu Zh ...

  3. 深度学习论文翻译解析(九):Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    论文标题:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 标题翻译:用于视觉识别的深度卷积神 ...

  4. SPPNet论文翻译-空间金字塔池化Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    http://www.dengfanxin.cn/?p=403 原文地址 我对物体检测的一篇重要著作SPPNet的论文的主要部分进行了翻译工作.SPPNet的初衷非常明晰,就是希望网络对输入的尺寸更加 ...

  5. 论文阅读笔记二十五:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition(SPPNet CVPR2014)

    论文源址:https://arxiv.org/abs/1406.4729 tensorflow相关代码:https://github.com/peace195/sppnet 摘要 深度卷积网络需要输入 ...

  6. SPP Net(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)论文理解

    论文地址:https://arxiv.org/pdf/1406.4729.pdf 论文翻译请移步:http://www.dengfanxin.cn/?p=403 一.背景: 传统的CNN要求输入图像尺 ...

  7. 论文解读2——Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

    背景 用ConvNet方法解决图像分类.检测问题成为热潮,但这些方法都需要先把图片resize到固定的w*h,再丢进网络里,图片经过resize可能会丢失一些信息.论文作者发明了SPP pooling ...

  8. SPP NET (Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)

    1. https://www.cnblogs.com/gongxijun/p/7172134.html (SPP 原理) 2.https://www.cnblogs.com/chaofn/p/9305 ...

  9. 空间金字塔池化(Spatial Pyramid Pooling,SPP)

    基于空间金字塔池化的卷积神经网络物体检测 原文地址:http://blog.csdn.net/hjimce/article/details/50187655 作者:hjimce 一.相关理论 本篇博文 ...

随机推荐

  1. MySQL技术内幕读书笔记(七)——锁

    锁 ​ 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch ​ 使用命令 ...

  2. 【转载】VMware虚拟机NAT模式网络配置图文教程

    原文:https://blog.csdn.net/dingguanyi/article/details/77829085 一.引言 在Windows上搭建集群实验环境时,为能够让集群结点之间相互通信, ...

  3. python(61):str 和 bytes 转换

    str 和 bytes 转换 b = b"example" # str object s = "example" # str to bytes bytes(s, ...

  4. Linux下C语言执行shell命令

    有时候在代码中需要使用到shell命令的情况,下面就介绍一下怎么在C语言中调用shell命令: 这里使用popen来实现,关于popen的介绍,查看 http://man7.org/linux/man ...

  5. js快速排序算法

    真正的快速排序算法一: function quickSort(array){ function sort(prev, numsize){ var nonius = prev; var j = nums ...

  6. python学习小记

    python HTTP请求示例: # coding=utf-8 # more materials: http://docs.python-requests.org/zh_CN/latest/user/ ...

  7. fiddler使用指南

    fiddler使用指南 fiddler 设置 如果要手机抓包的话,需要设置fiddler, 允许远程设备连接 tools/fiddler options/connection/allow remote ...

  8. xib view frame 大小调整

    1.IOS - xib(Interface Builder,view) - can't change view size(view不能改变大小问题) 很多时候,我们自定义tableview.colle ...

  9. mac xmind 激活

    下载地址 https://www.jb51.net/softjc/624167.html 打开压缩包中的[K].zip  按里面的READ ME!.rtf 文件来操作 嗯,就这样

  10. 9. Oracle DataGuard的介绍

    一. Oracle DataGuard简介 Oracle DataGuard:简称DG.是由一个Primary Database(主库)和一个或者多个Standby Database(备库)组成.对O ...