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

Spatial Pyramid Pooling空间金字塔池化)-变尺度CNN训练 1. 需求创造好的产品,产品拓宽原始的需求 当前的深度神经网络一般都需要固定的输入图像尺寸(如224*224). 这种需求很明显是人为的,潜在性的弊端会降低识别精度(为了使图像尺寸相同,一定会涉及到图像的比例/非比例放缩,这就引入了尺度误差和形变误差)。何凯明师兄的这项工作主要是讲多分辨率搜索的思想融入到了现有的深度网络中,从而实现了多尺度网络的训练以及识别,进而提升了图像分类和目标检测的精度(... 阅读详情

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

在SPPnet和Fast-RCNN中都用到了空间金字塔池化(Spatial Pyramid Pooling, SPP)来提高object detection的效率。SPP本质的目的是为了使得CNN可以接受任意尺寸的输入图片,从而避免了图像预处理中要将图片resize到统一尺寸这个限制。

SPPnet论文中给出了如下的图示:
在这里插入图片描述

给定一张任意尺寸的输入图片,首先经过一个网络,得到某卷积层的输出(即图中Conv5的输出);之后经过三个不同的池化层,分别得到16×25616\times 25616×256维、4×2564\times 2564×256维和1×2561\times 2561×256维的向量,将这些向量拼接起来,即得到固定长度的特征向量(fixed-length representation,这里长度为5376)。无论输入的图片是任何尺寸的,我们都可以得到长度为5376的特征向量。

卷积层实际上并不受限于输入图像的尺寸,无论给定什么尺寸的图,卷积都是可以进行的。然而后面的全连接层就不行了,必须接受固定尺寸的输入。所以通过上述的金字塔池化,就可以解决全连接层的输入问题。从而使得网络可以接受任意尺寸的输入图片。

单看论文还是不好理解,到底是如何操作的。我们从代码的角度来看下是如何实现的,最后再证明下这样确实是可行的。

import torch.nn as nn
import torch

def spatial_pyramid_pool(previous_conv, num_sample, previous_conv_size, out_pool_size):
    '''
    previous_conv: a tensor vector of previous convolution layer
    num_sample: an int number of image in the batch
    previous_conv_size: an int vector [height, width] of the matrix features size of previous convolution layer
    out_pool_size: a int vector of expected output size of max pooling layer
    
    returns: a tensor vector with shape [1 x n] is the concentration of multi-level pooling
    '''    
    print(previous_conv.size())
    for i in range(len(out_pool_size)):
        h_wid = int(math.ceil(previous_conv_size[0] / out_pool_size[i]))
        w_wid = int(math.ceil(previous_conv_size[1] / out_pool_size[i]))
        h_pad = int((h_wid*out_pool_size[i] - previous_conv_size[0] + 1)/2)
        w_pad = int((w_wid*out_pool_size[i] - previous_conv_size[1] + 1)/2)
        print (h_wid, w_wid,h_pad,w_pad)
        maxpool = nn.MaxPool2d((h_wid, w_wid), stride=(h_wid, w_wid), padding=(h_pad, w_pad))
        x = maxpool(previous_conv)
        if(i == 0):
            spp = x.view(num_sample,-1)
        else:
            spp = torch.cat((spp,x.view(num_sample,-1)), 1)
    return spp

假如这里输入的feature map即previous_conv的channel为512,out_pool_size=[4,2,1]。则经过这三个池化层,我们分别得到4×4×5124\times 4\times 5124×4×5122×2×5122\times 2\times 5122×2×5121×1×5121\times 1\times 5121×1×512的feature map。展开拼接后得到10752维度的特征向量。

根据上述代码,我们可以得到计算的公式:

  • 设输入尺寸为:Win×Hin×CinW_{in}\times H_{in}\times C_{in}Win×Hin×Cin
  • 设期望的池化层输出尺寸为:nnn。这里池化不改变channel,所以Cout=CinC_{out}=C_{in}Cout=Cin。即输出尺寸为n×n×Coutn\times n\times C_{out}n×n×Cout

池化层的kernel_size:

Fw=⌈Winn⌉Fh=⌈Hinn⌉ F_w=\left \lceil \frac{W_{in}}{n} \right \rceil \\ F_h=\left \lceil \frac{H_{in}}{n} \right \rceil Fw=nWinF

Spatial Pyramid Pooling 一、 前言 在目标检测系列文章的上一篇R-CNN中,我们知道R-CNN在当时虽然取得了不错的成绩,但是其需要改进的地方也很多,比如算法步骤比较繁琐,需要大量的时和内存去训练和测试模型等。除此之外,在训练和测试常见的CNN网络时,要求输入的图像有一个固定的大小,比如CNN要求图像的输入为224*224。(网络前面的卷积层不要求输入图像的大小,后面的全连接层的输入特征数是固定的,需要固定的输入)这... 阅读详情

相关推荐

空间金字塔池化Spatial Pyramid Pooling

上面这个图可以看出SPPnet和RCNN的区别,首先是输入不需要放缩到指定大小。其次是增加了一个空间金字塔池化层,还有最重要的一点是每幅图片只需要提取一次特征。SPPnet虽然解决了CNN输入任意大小图片的问题,但是还是需要重复为每个region proposal提取特征啊,能不能我们直接根据region proposal定位到他在卷积层特征的位置,然后直接对于这部分特征处理呢?答案是肯定的。

酒酿小圆子呀~ 4135

空间金字塔池化SPPSpatial Pyramid Pooling)系列

空间金字塔池化的作用是解决输入图片大小不一造成的缺陷,同时在目标识别中增加了精度。空间金字塔池化可以使得任意大小的特征图都能够转换成固定大小的特征向量,下面针对一些典型的进行盘点。

m0_73832962的博客 4571

空间金字塔池化 spatial pyramid poolingspp

空间金字塔池化spatial pyramid pooling)是把经过CNN(提特征)之后形成的任意不同尺寸的feature map转变成相同大小的特征向量,然后送入全连接网络fc中 整体过程:Image -->cnn(进行提特征)–>spp -->fc ...

mn08290125的博客 1028

空间金字塔池化Spatial Pyramid PoolingSPP

一、为什么需要SPP 卷积神经网络(CNN)是由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求输入数据固定大小,例如著名的VGG模型则要求输入数据大小是(224*224) 固定输入数据大小有两个问题: 很多场景所得到数据并不是固定大小的,例如街景文基本上其宽高比是不固定的,如下图所示红色框出的文。 可能你会说可以对图片进行切割,但是切割的话很可能会丢失重要信息。 综上,SPP的提出就是为了解决CNN输入图像大小必

学无止境、积少成多、厚积薄发 5338

空间金字塔池化Spatial Pyramid Pooling, SPP)原理和代码实现

上图是原文中给出的示意图,需要从下往上看: 首先是输入层(input image),其大小可以是任意的 进行卷积运算,到最后一个卷积层(图中是conv5)输出得到该层的特征映射(feature maps),其大小也是任意的 下面进入SPP层 我们先看最左边有16个蓝色小格子的图,它的意思是将从conv5得到的特征映射分成16份,另外16X256中的256表示的是channel,即SPP对每一层都分成16份(不一定是等比分,原因看后面的内容就能理解了)。 中的4个绿色小格子和右边1个紫色大格子也同理,即将.

Viraha_的博客 1811

SPP空间金字塔池化spatial pyramid pooling, SPP)原理与pytorc实现

1、为什么需要SPP? 过去的卷积神经网络CNN由卷积层+全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求数据数据固定大小,例如著名的VGG模型则要求输入数据大小是(224×224)。 固定输入数据大小有两个问题: 1、很多场景所得到的数据并不是固定大小的,例如不同相机,不同手机,拍出来的图片其宽高比是不固定的; 2、有人说可以对图片进行切割,但是切割的话很可能会丢失到重要信息。 综上,SPP的提出就是为了解决CNN输入图

shuijinghua的博客 2810

SPP Net 空间金字塔池化(Spatial Pyramid Pooling, SPP)原理

最近从头捋一下R-CNN系列的目标检测算法,在R-CNN首次将CNN与目标检测练习到一起之后,为了弥补它效率慢、不是端到端的神经网络、输入图片大小resize不准确等问题,各路神仙在后面陆续推出了SPP Net、Fast R-CNN、Faster R-CNN、R-FCN等R-CNN系列的模型。 在我将R-CNN弄清楚原理及流程之后就开始学习何凯明团队推出的SPP Net的网络模型。SPP Net的核心思想是空间金字塔池化(Spatial Pyramid Pooling, S...

4388

深度学习-空间金字塔池化(Spatial Pyramid Pooling SPP)

文章目录1、介绍2、SPP显著特点3、什么是层 参考:https://blog.csdn.net/qqliuzihan/article/details/81217766 1、介绍 在一般的CNN结构中,在卷积层后面通常连接着全连接。而全连接层的特征数是固定的,所以在网络输入的时候,会固定输入的大小(fixed-size)。但在现实中,我们的输入的图像尺寸总是不能满足输入时要求的大小。然而通常的手法就是裁剪(crop)和拉伸(warp)。 这样做总是不好的:图像的纵横比(ratio aspect)

Tc、zyh的博客 7397

空间金字塔池化SPPSpatial Pyramid Pooling

前言 何凯明大神于2014年在《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》,这篇paper主要的创新点在于提出了空间金字塔池化。这个方法对于目前很多任务非常实用,尤其是现在的神经网络算法叠加的情况下(即前一个神经网络输出的结果是下一个神经网络的输入),很多输出的图片尺寸或者说b...

g11d111的博客 1万+

(Spatial Pyramid PoolingSPP)空间金字塔池化讲解及代码实现

一、引言 问题:现存的CNN要求固定尺寸的输入图片,需要通过对原图进行裁剪或者变形来实现,这两种方式可能出现不同的问题:(i)裁剪的区域可能没法包含物体的整体;(ii)变形操作造成目标无用的几何失真。如果识别目标尺寸变多样,那么提前定义好的尺寸就可能不太适合。 产生原因:CNN主要由卷积层和全连接层组成,其中卷积层输出尺寸为一个关于输入大小的变量,而全连接层则产生固定大小的输出,也需要固定大小的权重和输入,所以CNN网络的限制在全连接层需要固定长度的输入。 解决方案:SPP,Spytial Pyram

haosen 6159

空间金字塔池化Spatial Pyramid Pooling, SPP)原理和代码实现(Pytorch)

一、为什么需要SPP 首先需要知道为什么需要SPP。 我们都知道卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求输入数据固定大小,例如著名的VGG模型则要求输入数据大小是 (224*224) 。 固定输入数据大小有两个问题: 很多场景所得到数据并不是固定大小的,例如街景文基本上其高宽比是不...

qq_42052229的博客 6777

SPP(Spatial Pyramid Pooling)详解

一直对Fast RCNN中ROI Pooling层不解,不同大小的窗口输入怎么样才能得到同样大小的窗口输出呢,今天看到一篇博文讲得挺好的,摘录一下,方便查找。 Introduction 在一般的CNN结构中,在卷积层后面通常连接着全连接。而全连接层的特征数是固定的,所以在网络输入的时候,会固定输入的大小(fixed-size)。但在现实中,我们的输入的图像尺寸总是不能满足输入时要求的大小。然而...

weixin_34242509的博客 2128

ASPP - 空间金字塔池化

文章目录1 洞卷积1.1 洞卷积的理解1.1.1 一维1.1.2 二维1.2 洞卷积的优劣2. ASPP3. 代码 1 洞卷积 1.1 洞卷积的理解 1.1.1 一维 (a) 正常卷积:输入特征 Input feature,kernel = 3,stride = 1,pad = 1,输出特征 Output feature。 (b) 洞卷积:与图 (a) 不同之处在于 pad = 2,同时引入一个 rate = 2(表示卷积核中参数隔的超参)。   还可通过下图进一步理解普通卷积与洞卷

晓野豬 2万+

Spatial Pyramid PoolingSPP)原理简介

b站这个Up主讲的挺好,就是莫名其妙搞个背景音乐怪怪的。。。视频讲解 Spatial Pyramid PoolingSPP)中文叫空间金字塔池化 这个原理要解决的是传统CNN网络对输入图片尺寸要固定这个限制,比如AlexNet中的输入图片都有固定此村224×224,RCNN中为了讲Proposals 做CNN卷积提取特征也得先将不同大小的Proposal经过wrap缩放成同一大小。 那为什么CNN要求输入的图片尺寸固定呢? 因为CNN中的最后的全连接层的输入尺寸是固定的(别问我全连接层为什么输入尺寸是固定

yanghao201607030101的博客 2918

空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC

汇总一些SPP结构

Coding... 15万+

spatial pyramid pooling(spp)

没有spp的网络的缺点 1,现有的dcnn需要固定尺寸的图片作为输入,这样对图片的宽高比和尺寸大小作出了限制。 2,如果图片尺寸是任意的,在输入之前需要做裁剪或图像扭曲(crop or warp(resize))来适应网络的固定尺寸输入。剪切后的图片可能不能包含整个物体。扭曲后的内容可能会导致几何变形。识别准确率会因为物体内容缺失或变形而减低。 使用spp的好处 1,spp能生成一个固定长度的输出,不管输入图片大小是否相同。 2,spp使用多级spatial bins,而sliding window poo

AliceH1226的博客 1834
上一篇: Category-level Adversaries for Semantics Consistent Domain Adaptation
cassiePython
博客等级 码龄12年 303粉丝 135原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值