深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

目录

一、SPP的应用的背景

二、SPP结构分析

三、SPPF结构分析

四、YOLOv5中SPP/SPPF结构源码解析(内含注释分析)


一、SPP的应用的背景

在卷积神经网络中我们经常看到固定输入的设计,但是如果我们输入的不能是固定尺寸的该怎么办呢?

通常来说,我们有以下几种方法:

(1)对输入进行resize操作,让他们统统变成你设计的层的输入规格那样。但是这样过于暴力直接,可能会丢失很多信息或者多出很多不该有的信息(图片变形等),影响最终的结果。

(2)替换网络中的全连接层,对最后的卷积层使用global average pooling,全局平均池化只和通道数有关,而与特征图大小没有关系

(3)最后一个当然是我们要讲的SPP结构啦~


二、SPP结构分析

SPP结构又被称为空间金字塔池化,能将任意大小的特征图转换成固定大小的特征向量。

接下来我们来详述一下SPP是怎么处理滴~

输入层:首先我们现在有一张任意大小的图片,其大小为w * h。

输出层:21个神经元 -- 即我们待会希望提取到21个特征。

分析如下图所示:分别对1 * 1分块,2 * 2分块和4 * 4子图里分别取每一个框内的max值(即取蓝框框内的最大值),这一步就是作最大池化,这样最后提取出来的特征值(即取出来的最大值)一共有1 * 1 + 2 * 2 + 4 * 4 = 21个。得出的特征再concat在一起。

而在YOLOv5中SPP的结构图如下图所示:

其中,前后各多加一个CBL,中间的kernel size分别为1 * 1,5 * 5,9 * 9和13 * 13。


三、SPPF结构分析

(x,y1这些是啥请看下面的代码)

CBL(conv+BN+Leaky relu)改成CBS(conv+BN+SiLU)哈,之前没注意它的名称变化。


四、YOLOv5中SPP/SPPF结构源码解析(内含注释分析)

代码注释与上图的SPP结构相对应。

class SPP(nn.Module):def __init__(self, c1, c2, k=(5, 9, 13)):#这里5,9,13,就是初始化的kernel sizesuper().__init__()c_ = c1 // 2  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)#这里对应第一个CBLself.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)#这里对应SPP操作里的最后一个CBLself.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])#这里对应SPP核心操作,对5 * 5分块,9 * 9分块和13 * 13子图分别取最大池化def forward(self, x):x = self.cv1(x)with warnings.catch_warnings():warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning忽略警告return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))#torch.cat对应concat

SPPF结构

class SPPF(nn.Module):# Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocherdef __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))super().__init__()c_ = c1 // 2  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c_ * 4, c2, 1, 1)self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)def forward(self, x):x = self.cv1(x)#先通过CBL进行通道数的减半with warnings.catch_warnings():warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warningy1 = self.m(x)y2 = self.m(y1)#上述两次最大池化return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))#将原来的x,一次池化后的y1,两次池化后的y2,3次池化的self.m(y2)先进行拼接,然后再CBL

欢迎大家批评指正,谢谢~

YOLOv5中的SPP/SPPF结构详解相关推荐

  1. class字节码文件中的常量池结构详解

    文章目录 前言 方法区 常量池基本结构 JVM 所定义的11种常量 常量池元素的复合结构 常量池的结束位置 常量池元素总数量 第一个常量池元素 父类常量 变量型常量池元素 自己的学习笔记,部分节选自& ...

  2. JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche

    JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedu ...

  3. Windows GPT磁盘GUID结构详解

    前一篇 Windows磁盘MBR结构详解 中我们介绍了Basic Disk中的Master Boot Record结构.GPT Disk作为Windows 2003以后引入的分区结构.使用了GUID分 ...

  4. STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解

    一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的. Corte ...

  5. TEXTMETRIC 结构详解

    TEXTMETRIC 结构详解 函数GetTextMetrics可以获取一个字体文本度量并将它放入一个类型为TEXTMETRIC的数据结构中,该结构如下所示: typedef struct ta TE ...

  6. 微信小程序01【目录结构详解、视图与渲染、事件、input、scroll-view】

    学习地址:https://www.bilibili.com/video/BV1sx411z77P 笔记01:https://blog.csdn.net/weixin_44949135/article/ ...

  7. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  8. angular 标准目录结构_Angular-cli新建项目目录结构详解

    Angular-cli新建项目目录结构详解 在上一篇博客中我们已经通过Angular CLI命令行工具创建出来一个全新的Angular项目,要想写项目,首先我们要先搞清楚项目的目录结构是怎样的,每个文 ...

  9. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

最新文章

  1. 2022-2028年中国聚硫橡胶行业市场研究及前瞻分析报告
  2. MSMQ 安装问题的解决过程
  3. Java EE开发三剑客现状及发展浅析
  4. PHP-代码审计-文件读取(下载)
  5. 思维革命:交换两个变量的值
  6. 【记录】C++中的位域
  7. 小程序 ---- (自定义头部导航)
  8. 广州地铁14号线新市墟站开建,白云区居民即将开启双线换乘模式!
  9. 日本铁路“猫站长”走红
  10. linux mysqldump 备份所有数据库,mysqldump导出所有数据库
  11. 两个日期区间跨度是否超过一年,开始日期距当前日期是否超过一年——js实现
  12. Impala集群搭建报错,主节点启动成功,但是worker节点的impalad启动失败
  13. Ubuntu系统中清理DNS缓存
  14. android opop状态栏透明,oppo状态栏美化
  15. Python-mne库使用教程
  16. linux多字节错误,在Linux中解压缩时遇到多字节字符的问题
  17. 哈工大软件构造Lab2
  18. mysql的id生成uuid
  19. 计算机的智能计算方向,多媒体与智能计算研究方向
  20. 移动办公软件,VIP163邮箱手机版的登陆方式有哪些?

热门文章

  1. Go Modules详解
  2. 浏览器常用的尺寸,ui看过来
  3. 百度ting!正式发布beta版Android手机客户端
  4. STM32微控制器 | 复习七 | 定时器原理及应用
  5. fscanf()函数基本用法
  6. 英雄联盟大师预测赛方案分享-模型融合
  7. java metadata 使用_java 查询oracle数据库所有表DatabaseMetaData的用法(详解)
  8. linux如何中断硬盘检测程序,Linux检测硬盘坏道 与 修复
  9. java浮点数数转二进制的数吗_都工作两年了,还不知道浮点数如何转二进制?...
  10. 华为鸿蒙西北,华为联合西北工业大学开设“鸿蒙生态菁英班”: 50 人左右,锁定终端软件领域...