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

2023-11-08

1、为什么需要SPP?

过去的卷积神经网络CNN由卷积层+全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求数据数据固定大小,例如著名的VGG模型则要求输入数据大小是(224×224)。

固定输入数据大小有两个问题:

1、很多场景所得到的数据并不是固定大小的,例如不同相机,不同手机,拍出来的图片其宽高比是不固定的;

2、有人说可以对图片进行切割,但是切割的话很可能会丢失到重要信息。

综上,SPP的提出就是为了解决CNN输入图像大小必须固定的问题,从而可以使得输入图像可以具有任意尺寸。

2、SPP原理

如图所示,对于选择的不同大小的区域对应到卷积之后的特征图上,得到的也是大小不一致的特征图区域,特征图通道数为256,对于每个区域,通过三种划分方式进行池化:

1)直接对整个整个区域池化,每层得到一个点,共256个点,构成一个1×256的向量;

2)将区域划分成2×2的格子,每个格子池化,得到一个1×256的向量,共2*2=4个格子,最终得到4个1×256的向量 ;

3)将区域划分成4×4的格子,每个格子池化,得到一个1×256的向量,共4*4=16个格子,最终得到16个1×256的向量 ;

将三种划分方式池化得到的结果进行拼接,得到(1+4+16)×246=21×256的特征。

SPP做到的效果为:不管输入的图片是什么尺度,都能够正确的传入网络。

代码实现

#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:样本数量 batch_size 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

 

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

SPP空间金字塔池化(spatial pyramid pooling, SPP)原理与pytorc实现 的相关文章

  • 阿里实习offer成功上岸,这几点至关重要

    Hello 大家好 欢迎大家来到CSDN云原生计划 考生说 栏目 本期采访的是近期成功获得阿里巴巴暑假实习offer的CSDN云原生专业工程师计划学员的中南大学大三电子信息工程专业的刘贝同学和大家分享成功申请阿里巴巴暑假实习的经验以及面试经
  • 【Mysql】MySQL体系结构,InnoDB、MyISAM存储引擎,索引结构、分类、语法、性能分析

    1 MySQL体系结构 连接层 主要完成一些类似于连接处理 授权认证 及相关的安全方案 在该层上引入了线程池的概念 为通过认证安全接入的客户端提供线程 同样在该层上可以实现基于SSL的安全链接 服务器也会为安全接入的每个客户端验证它所具有的
  • JS实现直接插入排序

    直接插入排序 插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴 但它的原理应该是最容易理解的了 因为只要打过扑克牌的人都应该能够秒懂 插入排序是一种最简单直观的排序算法 它的工作原理是通过构建有序序列 对于未排序数据 在已排序序列中
  • 浅谈BCrypt算法

    文章目录 前言 一 BCrypt算法是什么 二 使用步骤 1 对明文进行加密 2 验证 总结 前言 BCrypt算法是一种基于哈希算法的算法 所以 这种算法是不可逆的 一 BCrypt算法是什么 BCrypt算法是一种基于哈希算法的算法 所
  • 重复代码(克隆代码)的几个概念与类型

    本文内容来源于以下两篇参考文献 1 Chanchal K Roy James R Cordy Rainer Koschke Comparison and Evaluation of Code Clone Detection Techniqu
  • C++中的生命周期

    类A 含构造函数和析构函数 普通函数fun 函数体里新建了类A的局部自动对象FunObj和局部静态对象InStaObj main方法新建了类A的局部自动对象MainObj 调用fun方法 外面新建了A的的外部静态对象ExStaObj和外部对
  • echarts图环形图带百分比

    前言 整理一些echarts中比较有个性的 效果图 实现代码 option tooltip trigger item formatter a br b c d legend orient vertical left 10 data 直达 营
  • 计算机电缆外径相差太大,DJYPVP计算机电缆标准外径

    计算机电缆用途 本产品适用于额定电压30 500v及以下防干扰性能要求较高的电子计算机 检测仪器 仪表的连接 使用条件 计算机电缆 电压等级 0 45 0 75KV 企标 本产品使用于交流额定电压为300 500及以下 对于防干扰性能要求高
  • Could not get a resource from the pool 错误解决

    Could not get a resource from the pool 错误解决 错误信息 Could not get a resource from the pool 可能造成错误原因 1 没关闭Linux防火墙 查看防火墙状态 s
  • 10 个最适合开发人员的 GitHub 代码库 ✅

    在 GitHub 的帮助下 开发人员可以轻松访问并与他人共享他们的代码 它已成为开发人员在项目上进行协作并了解最新开发趋势的重要工具 对于开发人员而言 GitHub 是寻找最佳存储库以帮助他们完成开发项目的宝贵资源 有这么多可用的存储库 可
  • Intellij IDEA 中的 Debug 控制台/ Debug 控制台的 out 窗口不见了

    1 问题 Debug 控制台 Debug 控制台的 out 窗口不见了 2 问题解决方法 显示debug窗口 3 点击后 4 如果要恢复默认窗口布局 重新启动tomcat
  • 基于java车辆监管系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java车辆监管系统计算机毕业设计源码 系统 lw文档 mysql数据库 调试部署 基于java车辆监管系统计算机毕业设计源码 系统 lw文档 mysql数据库 调试部署 本源码技术栈 项目架构 B S架构 开发语言 Java语言 开发
  • git. 常用操作总结

    TOC GIT指南 在GIT中任何已经提交的东西几乎总是可以恢复的 甚至那些被删除的分支中的提交或使用 amend选项覆盖的提交也可以恢复 然而任何你未提交的东西丢失后很可能再也找不到 git pull会抓取所有的远程引用 Git在进行提交
  • 【通原】采样频率往往高于原信号的2倍的原因

    采样信号不是理想冲激信号 在采样前 需要添加一个抗混叠滤波器以避免频谱混叠 带宽越低越难设计 因此采样频率设计为原信号的3 5倍
  • paddleoc onnx转换推理

    目录 paddle 文字识别验证代码 onnx c 推理 python onnx识别部分推理示例 感谢博客 PaddleOCR转ONNX模型 推理部分 favorxin的博客 CSDN博客 paddleocr转onnx paddle 文字识
  • 2023年场外个股期权研究报告

    第一章 概况 场外个股期权 Over the Counter Equity Option 是指由交易双方根据自己的需求和意愿 通过协商确定行权价格 行权日期等条款的股票期权 与交易所交易的标准化期权不同 场外个股期权的合同内容可以根据交易双
  • .NET MVC标签扩展(checkbox,radio)

    NET MVC里面自动绑定form表单功能 如 Html TextBox Name Html Hidden hide 名称会自动与后台就行绑定ViewBag Name ViewBag hide 很实用 但是感觉不足的就是 Html Chec
  • Redis学习笔记(转尚硅谷周阳)

    教学视频 Redis官网 Redis中文官网 一 NoSQL入门概述 上 1 互联网时代背景下大机遇 为什么用NoSQL 1 1 单机MySQL的美好年代 在90年代 一个网站的访问量一般都不大 用单个数据库完全可以轻松应付 在那个时候 更
  • 整形提升和数据截断

    整形提升和截断 1 整形提升 2 截断 1 整形提升 提升是将占字节小的元素赋给占字节大的元素时出现的补位现象 截断是将所占字节大的元素赋给所占字节小的元素时会出现数值的舍去现象 下面看代码来分析 include
  • html的日期选择插件

    1 效果 2 文档 https layui gitee io v2 docs 3 引入 官网地址 https layui gitee io v2 引入 在官网下载 jquery 1 7 2 min js layui layui js 4 使

随机推荐

  • 绘制坐标轴:Python实现

    绘制坐标轴 Python实现 在数据可视化领域 坐标轴是一种重要的图形元素 用于显示数据的分布和趋势 Python提供了多种库和工具 可以方便地绘制坐标轴和相关图表 本文将介绍如何使用Python实现绘制坐标轴的功能 并提供相应的源代码示例
  • qt5.10 串口通信 QSerialPort 的使用

    在qt5中 使用QSerialPort进行串口通信 主要用到的QSerialPort 使用步骤 步骤一 在 pro文件中进行声明 QT serialport 在 pro文件中添加这个声明 步骤二 实例化 QSrerialPort QSeri
  • 实现itoa()和atoi()

    atoi 将字符串转换为整型值 实现代码 enum Status valid unvalid int status valid 全局变量标记输入是否非法 long long AtoI const char str bool minus lo
  • ZYNQ #5 - 从vivado工程开始,从emmc启动Linux

    本文从最简单的petalinux需求的vivado工程开始 建立一个能跑起来linux的vivado工程 同时将linux kernel 根文件系统部署在接到SD1接口上的emmc中 qspi flash中放置BOOT BIN uboot唤
  • vite和webpack的区别

    vite和webpack的区别 从底层原理上来说 Vite是基于esbuild预构建依赖 而esbuild是采用go语言编写 因为go语言的操作是纳秒级别 而js是以毫秒计数 所以vite比用js编写的打包器快10 100倍 Vite和We
  • 成为合格管理者的几个关键词

    http www csdn net article 2014 05 05 2819612 Management 职业通路是狭窄的 金字塔 结构很好地描绘了每个人在职场将要走过的路 在职位与薪酬待遇紧密挂钩的当今职场 芸芸技术专家总有一天会面
  • 【Neo4j】第 10 章:图嵌入 - 从图到矩阵

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Linux 如何查看文件夹的大小(du、df、ls、find)

    Linux 如何查看文件夹的大小 du df ls find 参考链接 https blog csdn net Cappuccino jay article details 125168388 一 du 命令 查看当前目录和子目录文件夹 文
  • 微信小程序中下载app的方法

    微信小程序中下载app的方法 因为微信小程序本身是不推荐引流到外部的 所以正规的方法其实都是被禁止掉的 大致方向是打开内部浏览器 进入应用宝下载页面 如果app接入应用宝 或者是通过右上角的在系统浏览器中打开 自动跳转到App Store中
  • XML中常用转义符

    编写XML代码常用转译符 逻辑与 amp lt 小于 lt gt 大于 gt 双引号 quot XML实体中不允许出现 lt gt 等特殊字符 否则XML语法检查时将出错 如果编写的XML文件必须包含这些字符 则必须分别写成 amp lt
  • vue实现前端人机验证

    最简单的一个例子 安装插件 npm install vue puzzle vcode save
  • 微信模板消息,动态配置

    微信模板消息 扫码关注公众号 模板消息配置数据库表设计 SET NAMES utf8mb4 SET FOREIGN KEY CHECKS 0 Table structure for kl b template msg DROP TABLE
  • js设置全屏显示和取消全屏显示,实现F11功能

    点击后
  • 通讯协议022——全网独有的OPC AE知识四之接口(六)

    本文简单介绍OPC AE规范的接口IConnectionPointContainer的相关知识 更多通信资源请登录网信智汇 wangxinzhihui com OPC AE规范描述了OPC事件服务器应该实现的对象和接口 实现在多个OPC客户
  • 计算机视觉——利用openCV调用本地摄像头采集图片并截图保存

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 采集方式 二 代码部分 三 效果演示 前言 由于本人研究生课题是深度学习目标检测方向 因此需要大量的数据集 在本地采样时 可以利用openCV提供的库函数
  • Failed to create SubnetManager: error retrieving pod spec for ‘kube-system/kube-flannel-ds-amd64-xxx

    kubelet报错如下 kubelet 3807 E1215 18 01 25 516905 3807 aws credentials go 77 while getting AWS credentials NoCredentialProv
  • 从UE4到UE5:工程及资产迁移的原理和一般方法

    按照官方建议 明年早些时候发布UE5正式版本 UE5EA仅用于新技术探索和尝鲜 项目开发还是应该在UE4上进行 现在迁移只是为了解新的features 提前规划哪些可能用于现在的工程 2022 4 8更新 UE5正式版已经发布 喜大普奔 赶
  • Java线程:新特征-有返回值的线程

    本文转载至 http lavasoft blog 51cto com 62575 222082 在Java5之前 线程是没有返回值的 常常为了 有 返回值 破费周折 而且代码很不好写 或者干脆绕过这道坎 走别的路了 现在Java终于有可返回
  • pandas数据处理基础——筛选指定行或者指定列的数据

    pandas主要的两个数据结构是 series 相当于一行或一列数据机构 和DataFrame 相当于多行多列的一个表格数据机构 本文为了方便理解会与excel或者sql操作行或列来进行联想类比 1 重新索引 reindex和ix 上一篇中
  • SPP空间金字塔池化(spatial pyramid pooling, SPP)原理与pytorc实现

    1 为什么需要SPP 过去的卷积神经网络CNN由卷积层 全连接层组成 其中卷积层对于输入数据的大小并没有要求 唯一对数据大小有要求的则是第一个全连接层 因此基本上所有的CNN都要求数据数据固定大小 例如著名的VGG模型则要求输入数据大小是