2.5 SPPNet

news/2024/8/26 5:27:36

目录

  • 2.5 SPPNet
    • 2.5.1 SPP 的目的
    • 2.5.2 SPP 架构
    • 2.5.3 SPP 用于目标检测
    • 2.5.4 候选区域映射
    • 参考资料

2.5 SPPNet

SPP(Spatial Pyramid Pooling,空间金字塔池化) 由何凯明团队在 ILSVEC 2014 中提出,利用空间金字塔池化方法可以提高已存在的一些 CNN 架构对于图像分类任务或目标检测任务的识别精度。

2.5.1 SPP 的目的

对于典型的 CNN 架构在图像处理上,我们一般要求图像的输出具有固定的尺寸大小,例如 224 × 224 224\times 224 224×224,对于不满足该尺寸的图像,我们一般会通过图像裁剪或拉伸等变化形式进行处理,如图 1 所示。
【图 1】

对于裁剪的区域可能不包含整个对象,造成数据信息丢失以及拉伸操作带来的几何失真等,都会对我们任务的识别精度造成影响。因此,SPP 的提出最主要的目的就是要解决这个问题,使之适用于任意尺寸及比例的图像。

2.5.2 SPP 架构

在早期经典的一些 CNN 架构上,一般采用卷积层+池化层+全连接层的组合形式。实际上,卷积操作和池化操作(池化操作可以看作为一种特殊的卷积,下文将只考虑卷积)是可以在任意尺寸及比例的图片上进行的,对于一个固定的卷积核,卷积的输出是随输入的变换而近似同比例变换,卷积部分的网路参数只与卷积核的大小及个数有关,与输入输出尺度无关。

而我们之所以需要固定图片的输出尺度大小,是因为全连接层的存在,全连接层网络的网络参数与输入的神经元个数有关,因此,一旦网络架构确定,无论图片尺寸比例如何变化,在输入到全连接层前的大小必须固定。这就是 SPP 架构的设计点所在。

具体来说,SPP 层是在最后一个卷积层的顶部对卷积后的特征层进行池化操作,并使得池化后的结果长度固定,并将其池化后的结果输入到全连接层。

【图 2】

如图 2 所示,假定最后一个卷积层共有 256 个卷积核,即输出通道为 256,由于采用 SPP 结构,网络的输入尺寸可变,因此卷积后的特征图大小不等。但我们可以通过多个不同大小的网格化局部池化进行处理并重组,以上图为例,我们分别采用 , 4 × 4 , ,4\times 4, 4×4 2 × 2 2\times 2 2×2 1 × 1 1\times 1 1×1 的网格对特征图进行池化,在空间上犹如金字塔一般,故取名 SPP。

SPP 结构理论上的确对于任意大小的图像都有效,都可以通过反向传播算法进行训练,然而对于 GPU 加速硬件而言,若想得到较好的加速性能,仍然需要将其固定的图像大小上进行。

2.5.3 SPP 用于目标检测

SPP 当然是可以用于图像分类任务的,在本系列中,我们更加关注目标检测任务。在上一篇内容中,我们曾介绍过 R-CNN 算法,它是当时最先进的目标检测方法,在此我们先回顾一下 R-CNN 的主要流程:

  1. 对输入图像进行选择性搜索, 产生 ~2K 个区域提案
  2. 采用各向异性变形手段将候选区域缩放到 227 × 227 227×227 227×227
  3. 利用 CNN 网络特征提取器对放缩后的数据进行提取特征
  4. 输出经过 SVM 分类判定, 得到一些不同类别的置信度
  5. 经过非极大值抑制处理筛选此时的保留的建议区域, 得到最终的置信度最高的不相邻的提案区域
  6. 利用框回归处理, 进一步提升预测框的准确度.

在这里除了第 2 步简单粗暴的图片缩放劣势外,R-CNN 最大的劣势在于第 3 步,每一个候选区域都需要经过一遍 CNN 特征提取,不同候选区域间没有共享计算。而 SPP 则不同,对于一张图像,CNN 特征提取操作只尽心一次,而候选框的选择是直接基于特征图而不是原始图像,这使得 SPP 在测试时相对于 R-CNN,加速了 10 到 100 倍。如图 3 和 图 4 所示。

【图 3】 【图 4】

2.5.4 候选区域映射

在 R-CNN 中,我们可以根据给你的候选区域直接在原始图像上进行裁剪,再进行特征提取,然而在 SPP 架构中,我们是先进行 CNN 特征提取,候选区域的选择必须在特征图上进行,这就涉及到如何将基于原始图像的候选区域选择转化为基于特征图的区域选择?

【图 5】

假设原始图像中候选框左上角坐标为 ( x , y ) (x,y) (x,y),在特征图中对应为 ( x ′ , y ′ ) (x',y') (x,y),则二者之间的关系是什么?

对于卷积操作, p i = S i ⋅ p i + 1 + ( ( K i − 1 ) / 2 − P ) p_i=S_i\cdot{p_{i+1}}+((K_i-1)/2-P) pi=Sipi+1+((Ki1)/2P),其中 p i p_i pi p i + 1 p_{i+1} pi+1 分别表示原图中坐标位置及特征图中的坐标位置, K , S , P K,S,P K,S,P 分别为卷积核大小,卷积步长以及填充像素数。如果令每一层的 P = ⌊ K i / 2 ⌋ P=\lfloor{K_i/2}\rfloor P=Ki/2,则当 K i K_i Ki 为奇数时(通常卷积核大小为奇数), ( ( K i − 1 ) / 2 − ⌊ K i / 2 ⌋ = 0 ((K_i-1)/2-\lfloor K_i/2\rfloor=0 ((Ki1)/2Ki/2=0,因此, p i = S i ⋅ p i + 1 p_i=S_i\cdot p_{i+1} pi=Sipi+1

因此对于映射前后,左上角的点 x ′ = ⌊ x / S ⌋ + 1 x' = \lfloor{x/S}\rfloor+1 x=x/S+1,对于右下角的点, x ′ = ⌈ x / S ⌉ − 1 x' = \lceil{x/S}\rceil-1 x=x/S1

参考资料

  1. [2014 ECCV] [SPPNet]
    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  2. [2015 TPAMI] [SPPNet]
    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  3. sppnet_ilsvrc2014
  4. 目标检测2 - SPPNet

http://www.niftyadmin.cn/n/3657469.html

相关文章

e时代的精灵-----Web Service

e时代的精灵-----Web ServiceInternet/Intranet改变了世界,也改变了你和我的生活方式。 从Darpanet诞生的第一天起,便注定了这个精灵的出现。 我们不得不感谢NASA,因为它的一个偶然,导致了如此深刻而美妙的历史必然。 ---世界真美…

2.6 Fast R-CNN

目录2.6 Fast R-CNN2.6.1、Fast R-CNN 整体架构概览图2.6.2、Fast R-CNN 架构2.6.2.1 RoI 池化层2.6.2.2 多任务损失参考资料2.6 Fast R-CNN Fast R-CNN 是 rgb 完成的 R-CNN 家族中的第二篇重要作品,在 R-CNN 以及 SPPNet 的基础上做了许多优化工作,在…

1.7 BN-Inception

目录1.7 BN-Inception1.7.1 背景1.7.2 BN 计算过程1.7.3 BN 的优势参考资料Next1.7 BN-Inception 2015 年 2 月 Google 又发表了新的文章,在 GoogLeNet 中加入一个 Batch-normalized 层,习惯于将改进后的网络称为 BN-Inception。Batch-normalized 层的主…

脚本引流是什么?其实很好理解,就是利用软件脚本来引流,这种软件我们通常叫引流脚本

脚本引流是什么?其实很好理解,就是利用脚本来引流,这种软件我们通常叫引流脚本,引流脚本的研发就是结合了以往的那些加人软件,从中吸取了长处并且升级了功能,而且通过不断的测试改进,在今年的7月…

web Service

Web Service是什么 Web Service是一种以SOAP为轻量型传输协议、以XML为数据封装标准、基于HTTP的组件集成技术。 目前流行的主流组件技术大致有如下几种:Corba、Dcom/Com、EJB等。似乎每一种技术诞生之日起,便号称是最具延展性和开放性的技术&#xff0c…

1、C 语言简介

C 语言简介 C 是一种编程语言。最初是由 Dennis Ritchie 在 1969 年到 1973 年期间开发的。它主要是作为一种系统编程语言开发操作系统的。C 语言的主要特定包括,可直接操作内存的低级编程语言,简单的关键字集合,清晰的数据类型,…

回答朋友关于DBExpress的问题

朋友,你好DBExpress是Borland公司推出的基于单向数据集的数据库引擎技术。因为是单向数据集,因此连接数据库非常的快。在Borland看来,DBExpress被期望用来取代BDE和ADO。到目前为止,DBExpress支持如下数据库,至于更新的…

2、C 语言编程标准

C 语言编程标准 这篇文章的内容主要是介绍 C 标准。 当一个 C 语言程序在两个不同的编译器下得到两个不同的结果时,以哪个为准呢? 例如,下面这个简单的 C 语言程序: void main() { }上面的程序当主函数的返回类型是 void 时&a…