SPP原理和代码

2023-10-31

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

 

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

固定输入数据大小有两个问题:
很多场景所得到数据并不是固定大小的,例如街景文字基本上其高宽比是不固定的,如下图示红色框出的文字。
在这里插入图片描述
2.可能你会说可以对图片进行切割,但是切割的话很可能会丢失到重要信息。

综上,SPP的提出就是为了解决CNN输入图像大小必须固定的问题,从而可以使得输入图像高宽比和大小任意。
二、SPP原理

更加具体的原理可查看原论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
在这里插入图片描述

上图是原文中给出的示意图,需要从下往上看:

  • 首先是输入层(input image),其大小可以是任意的

  • 进行卷积运算,到最后一个卷积层(图中是conv5)输出得到该层的特征映射(feature maps),其大小也是任意的

  • 下面进入SPP层

    我们先看最左边有16个蓝色小格子的图,它的意思是将从conv5得到的特征映射分成16份,另外16X256中的256表示的是channel,即SPP对每一层都分成16份(不一定是等比分,原因看后面的内容就能理解了)。

    中间的4个绿色小格子和右边1个紫色大格子也同理,即将特征映射分别分成4X256和1X256份

那么将特征映射分成若干等分是做什么用的呢? 我们看SPP的名字就是到了,是做池化操作,一般选择MAX Pooling,即对每一份进行最大池化。

我们看上图,通过SPP层,特征映射被转化成了16X256+4X256+1X256 = 21X256的矩阵,在送入全连接时可以扩展成一维矩阵,即1X10752,所以第一个全连接层的参数就可以设置成10752了,这样也就解决了输入数据大小任意的问题了。

注意上面划分成多少份是可以自己是情况设置的,例如我们也可以设置成3X3等,但一般建议还是按照论文中说的的进行划分。

三、SPP公式

理论应该理解了,那么如何实现呢?下面将介绍论文中给出的计算公式,但是在这之前先要介绍两种计算符号以及池化后矩阵大小的计算公式:
1. 预备知识
在这里插入图片描述
2.公式

假设

输入数据大小是(c,hin,win),分别表示通道数,高度,宽度
池化数量:(n,n)
  •  

那么则有

核(Kernel)大小: ⌈hinn,winn⌉=ceil(hinn,winn)
步长(Stride)大小: ⌊hinn,winn⌋=floor(hinn,winn)
  •  

我们可以验证一下,假设输入数据大小是(10,7,11), 池化数量(2,2):

那么核大小为(4,6), 步长大小为(3,5), 得到池化后的矩阵大小的确是2∗2。

3.公式修订

是的,论文中给出的公式的确有些疏漏,我们还是以举例子的方式来说明

假设输入数据大小和上面一样是(10,7,11), 但是池化数量改为(4,4):

此时核大小为(2,3), 步长大小为(1,2),得到池化后的矩阵大小的确是6∗5 ←[简单的计算矩阵大小的方法:(7=2+15, 11=3+24)],而不是4∗4。

那么问题出在哪呢?

我们忽略了padding的存在(我在原论文中没有看到关于padding的计算公式,如果有的话。。。那就是我看走眼了,麻烦提示我一下在哪个位置写过,谢谢)。

仔细看前面的计算公式我们很容易发现并没有给出padding的公式,在经过N次使用SPP计算得到的结果与预期不一样以及查找各种网上资料(尽管少得可怜)后,现将加入padding后的计算公式总结如下。
在这里插入图片描述
现在再来检验一下:
假设输入数据大小和上面一样是(10,7,11), 池化数量为(4,4):

Kernel大小为(2,3),Stride大小为(2,3),所以Padding为(1,1)。

利用矩阵大小计算公式:⌊h+2p−fs+1⌋*⌊w+2p−fs+1⌋得到池化后的矩阵大小为:4∗4。

四、代码实现

#coding=utf-8

import math
import torch
import torch.nn.functional as F

# 构建SPP层(空间金字塔池化层)
class SPPLayer(torch.nn.Module):

    def __init__(self, num_levels, pool_type='max_pool'):
        super(SPPLayer, self).__init__()

        self.num_levels = num_levels
        self.pool_type = pool_type

    def forward(self, x):
        num, c, h, w = x.size() # num:样本数量 c:通道数 h:高 w:宽
        for i in range(self.num_levels):
            level = i+1
            kernel_size = (math.ceil(h / level), math.ceil(w / level))
            stride = (math.ceil(h / level), math.ceil(w / level))
            pooling = (math.floor((kernel_size[0]*level-h+1)/2), math.floor((kernel_size[1]*level-w+1)/2))

            # 选择池化方式 
            if self.pool_type == 'max_pool':
                tensor = F.max_pool2d(x, kernel_size=kernel_size, stride=stride, padding=pooling).view(num, -1)
            else:
                tensor = F.avg_pool2d(x, kernel_size=kernel_size, stride=stride, padding=pooling).view(num, -1)

            # 展开、拼接
            if (i == 0):
                x_flatten = tensor.view(num, -1)
            else:
                x_flatten = torch.cat((x_flatten, tensor.view(num, -1)), 1)
        return x_flatten
  •  

原文地址:https://www.cnblogs.com/marsggbo/p/8572846.html
原文中的代码:marsggbo/sppnet-pytorch

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPP原理和代码 的相关文章

  • 【深度学习基础】

    最终效果如上图所示 xff1a 真不知道这一路有多艰难 众所周知CHATGPT 可以做表格和 公式 xff0c 但它输出的文本是直接渲染好的 你是直接复制不了的 xff0c 你只能复制它出来的字体 于是我尝试了各种 想让它输出表格和文字的方
  • jittor框架

    sudo apt install python dev sudo pip install https github com Jittor jittor git python3 m jittor test test example http
  • vscode中mmgeneration的分布式训练的调试文件设置

    受知乎博主的启发 没弄软连接 直接把launch py的路径放到了program参数中了 还需要把train py中的参数设置为默认值 launch json文件的代码 使用 IntelliSense 了解相关属性 悬停以查看现有属性的描述
  • 深度学习基础--finetune

    finetune 就是用别人训练好的模型 加上我们自己的数据 来训练新的模型 finetune相当于使用别人的模型的前几层 来提取浅层特征 然后在最后再落入我们自己的分类中 finetune的好处在于不用完全重新训练模型 从而提高效率 因为
  • 深度学习基础--池化--空间金字塔池化(spatial pyramid pooling,SPP)

    空间金字塔池化 spatial pyramid pooling SPP 解决的问题 先前方法 输入图片会经过裁切 Crop 或者变形缩放 Warp 这都在一定程度上导致图片信息的丢失和变形 限制了识别精确度 SPP可以输入任意大小的图片 不
  • 语义分割代码阅读---评价指标mIoU的计算

    1 语义分割IoU的定义 传统意义上的IoU Intersection over Union 交并比 直观表示 公式 语义分割中的IoU 在语义分割的问题中 这两个集合为真实值 ground truth 和预测值 predicted seg
  • 理解机器学习/深度学习的正则化Regularization概念

    通过防止过拟合来优化预测模型 目录 前言 正文 L2正则化或岭回归 这是如何实现的 改变 值所带来的影响 如何选择lambda的值 多维数据集 L1 Regularization or LASSO regression 改变lambda的效
  • 目标检测——概述

    学习视觉与深度学习有一年了 想把以前看到的文章和资料整理一下 不知道从哪些开始 这个暑假 趁着刚刚开完题 稍微闲一些 把目标检测相关的经典论文逐一记录一下 有时间跑一下作者的原码 水平有限 如涉及的内容有误 恳请大家指出 前言 计算机视觉领
  • 空洞卷积aspp 学习笔记

    ASPP 以下内容转自 空洞空间卷积池化金字塔 atrous spatial pyramid pooling ASPP 对所给定的输入以不同采样率的空洞卷积并行采样 相当于以多个比例捕捉图像的上下文 上图为deeplab v2的ASPP模块
  • 机器学习基础(一)——人工神经网络与简单的感知器

    机器学习基础 一 人工神经网络与简单的感知器 2012 07 04 19 57 20 转载 标签 杂谈 分类 machine learning 从最开始做数据挖掘而接触人工智能的知识开始 就不断听学长 老师说起神经网络算法 从这个角度来讲
  • Expected more than 1 value per channel when training, got input size torch.Size

    Expected more than 1 value per channel when training got input size torch Size 训练的时候 batch size必须大于1 但是预测的时候 batch size可
  • 卷积神经网络的深入理解-归一化篇(Batch Normalization具体实例)

    卷积神经网络的深入理解 归一化篇 标准化 归一化 神经网络中主要用在激活之前 卷积之后 持续补充 归一化在网络中的作用 1 线性归一化 进行线性拉伸 可以增加对比度 2 零均值归一化 像素值 均值 方差 3 Batch Normalizat
  • 【深度学习基础】损失函数

    深度学习基础 性能评估指标 超参数介绍 损失函数 前言 本文主要总结一下常见目标检测的损失函数以及一些基础的函数 主要损失函数为mask rcnn涉及到的损失函数包括 MSE均方误差损失函数 Cross Entropy交叉熵损失函数 目标检
  • 深度学习09 -Transformer2 - 理论篇

    参考文档 详解Transformer 1 开局来一张Transformer的整体结构图 2 结构图每步分析 1 Encoder 1 Input Embedding 就是对输入的数据进行向量化编码 可能是one hot等等 2 Positio
  • 卷积层计算量(FLOPS)和参数量的计算

    1 卷积参数量的计算 若卷积层的输入featuremap的维度为Cin Hin Win 卷积核的大小为K1 K2 padding P1 P2 stride S1 S2 卷积核 filter 的数量为Cout 则输出特征图的大小为Cout H
  • 机器学习(一)——K-近邻(KNN)算法

    机器学习 一 K 近邻 KNN 算法 最近在看 机器学习实战 这本书 因为自己本身很想深入的了解机器学习算法 加之想学python 就在朋友的推荐之下选择了这本书进行学习 一 K 近邻算法 KNN 概述 最简单最初级的分类器是将全部的训练数
  • 深度学习入门基础CNN系列——卷积计算

    卷积计算 卷积是数学分析中的一种积分变换的方法 在图像处理中采用的是卷积的离散形式 这里需要说明的是 在卷积神经网络中 卷积层的实现方式实际上是数学中定义的互相关 cross correlation 运算 与数学分析中的卷积定义有所不同 这
  • 注意力&Transformer

    注意力 注意力分为两步 计算注意力分布 alpha 其实就是 打分函数进行打分 然后softmax进行归一化 根据 alpha 来计算输入信息的加权平均 软注意力 其选择
  • CNN中特征融合的一些策略

    Introduction 特征融合的方法很多 如果数学化地表示 大体可以分为以下几种 X Y textbf X textbf Y X Y X
  • 图像配准 CVPRW21 - 深度特征匹配 DFM

    本文转自 图像配准 CVPRW21 深度特征匹配 DFM 深度学习图像配准 CSDN博客 github地址 https github com ufukefe DFM 相识 图像配准 Image Registration 是计算机视觉领域中的

随机推荐

  • 第63讲:Python编程案例之猴子吃桃

    文章目录 1 需求描述以及分析 2 递推方式实该该程序 3 递归方式实现该程序 1 需求描述以及分析 需求描述 猴子第一天摘了若干个桃子 第一天吃了若干个桃子中的一半 觉得不过瘾 又多吃了一个 第二天早上又将第一天剩下的桃子吃了一半 并且也
  • IDEA中修改workspace.xml内容,保存后自动被删除

    最近在做一个SpringBoot的分布式项目 由于项目里面有多个启动器 每次查找启动类文件来启动服务效率就很低 于是想到用Run Dashboard来管理启动类 由于是新的电脑装的IDEA没有自动开启这个工具 因此需要手动开启一下 开启方式
  • 【Docker】安装Presto连接Hive、mysql、oracle、postgresql、SQL server等7种类型数据库

    目录 1 简介 2 下载安装 1 下载镜像 2 下载presto客户端jar文件 3 将hadoop配置拷贝到容器 4 新增hive properties配置文件 5 重启容器 在linux命令行下 3 测试连接 4 其他类型数据库配置连接
  • Java 两点经纬度计算距离和角度

    角度 计算两点对于正北方向的朝向角度 0 360 param start format latitude 30 longitude 120 param end private static double bearing List
  • UEFI入门必读的12本书

    作者简介 罗冰 系统安全 特别是物理隔离领域 专家 主导开发网络隔离卡 双网隔离机 国产隔离系统 单向光传输等各类安全产品 拥有十几项发明和实用新型专利 致力于UEFI技术的研究 实践和推广 在CSDN和知乎上设有 UEFI开发探索 专栏
  • UE4(unreal engine4)蒙太奇动画删除不想要的帧数

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 问题原因 二 具体操作步骤 前言 UE4 unreal engine4 蒙太奇动画删除不想要的帧数 当我们在UE4中导入一个fbx骨骼动画 当我们想要截取动画中某些不想用的帧时 点
  • 软件版本号命名规范_产品版本命名的规范与规则

    上一篇文章我们对产品的版本迭代的方法进行了一些总结 本篇文章我会针对产品的版本命名 验收 发布这三个层面 来总结一下我自己的想法 希望能对大家有所帮助 01 产品版本命名的规范与规则 1 1 版本命名规范 软件版本号由主版本号 次版本号 修
  • springboot后台获取不到前台Vue日期问题解决

    一 实体类字段写法如下 JsonFormat pattern yyyy MM dd timezone GMT 8 private Date sendTime Vue使用element ui写法
  • 4.2、Flink任务怎样读取文件中的数据

    目录 1 前言 2 readTextFile 已过时 不推荐使用 3 readFile 已过时 不推荐使用 4 fromSource FileSource 推荐使用 1 前言 思考 读取文件时可以设置哪些规则呢 1 文件的格式 txt cs
  • (二)程序语言设计基础

    目录 1 程序设计语言概述 1 1 基本概念 1 1 1 低级语言和高级语言 1 1 2 编译程序和解释程序 1 1 3 程序设计语言的定义 1 1 4 程序设计语言的分类 1 2 程序设计语言的基本成分 1 2 1 数据成分 1 2 2
  • 2022最新android设备uuid、udid使用教程​

    前言 udid UDID是Unique Device Identifier的缩写 中文意思是设备唯一标识 uuid UUID是Universally Unique Identifier的缩写 中文意思是通用唯一识别码 简言之 udid对应某
  • elasticsearch 中text与keyword的区别

    创建索引 PUT ellis mappings properties name type text fields keyword type keyword ignore above 256 age type long 我们可以看到name类
  • VBA常用语法

    最近接触了一下VBA编程 才知道Excel还能编程 而且还如此强大 真的是惊呆了 话不多说 先了解一下VBA常用的语法吧 1 基础语法 高级for循环 Function deleteArrayByIndex list As String D
  • oracle获取随机记录

    oracle获取随机记录 select from select from ford car order by dbms random value where rownum lt 1001
  • 【vision transformer】DETR原理及代码详解(三)

    transformer 端到端目标检测DETR项目实践及代码详解 Paddle Detr git PaddleViT object detection DETR at develop BR IDL PaddleViT GitHub 数据集及
  • Redis SDS简单动态字符串

    结构体定义 本质上说就是用C语言来实现基本的面向对象 来对底层的字符串进行表示 方便上层使用 为调用者减少负担 typedef char sds struct sdshdr int len int free char buf 举例常用操作
  • 搭建JMeter分布式测试环境

    分布式测试概述 现在我们来了解如何使用多台机器来执行压力测试 也就是所谓的分布式测试 当我们模拟大量的并发虚拟用户时 比如我们要起10万 100万甚至更多的并发用户时 一台负载机器可能就满足不了我们需要的用户量 此时 就需要使用多台主机搭建
  • Git入门--自定义标签

    忽略特殊文件 忽略某些文件时 需要编写 gitignore gitignore文件本身要放到版本库里 并且可以对 gitignore做版本管理 配置别名 git config global alias co checkout 用co来代替c
  • FFmpeg源码分析:av_register_all()注册封装器与解封装器

    FFmpeg中av register all 函数用于注册所有muxers demuxers与protocols FFmpeg4 0以前是用链表存储muxer demuxer FFmpeg4 0以后改为数组存储 并且av register
  • SPP原理和代码

    空间金字塔池化 Spatial Pyramid Pooling SPP 原理和代码实现 Pytorch 一 为什么需要SPP 首先需要知道为什么需要SPP 我们都知道卷积神经网络 CNN 由卷积层和全连接层组成 其中卷积层对于输入数据的大小