一、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这些是啥请看下面的代码)

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

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

class SPP(nn.Module):
    def __init__(self, c1, c2, k=(5, 9, 13)):#这里5,9,13,就是初始化的kernel size
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)#这里对应第一个CBL
        self.cv2 = Conv(c_ * (len(k)   1), c2, 1, 1)#这里对应SPP操作里的最后一个CBL
        self.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 Jocher
    def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.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() warning
            y1 = 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结构源码详析的文章就介绍到这了,更多相关YOLOv5 SPP/SPPF结构内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

YOLOv5中SPP/SPPF结构源码详析(内含注释分析)的更多相关文章

  1. YOLOv5改进教程之添加注意力机制

    注意力机制最先被用在NLP领域,Attention就是为了让模型认识到数据中哪一部分是最重要的,为它分配更大的权重,获得更多的注意力在一些特征上,让模型表现更好,这篇文章主要给大家介绍了关于YOLOv5改进教程之添加注意力机制的相关资料,需要的朋友可以参考下

  2. 浅析Objective-C的程序结构及面向对象的编程方式

    这篇文章主要介绍了Objective-C的程序结构及面向对象的编程方式,面向对象部分中简单地讲解了Objective-C中的类、对象和方法几大面向对象编程的要素,需要的朋友可以参考下

  3. YOLOV5超参数介绍以及优化策略

    yolov5提供了一种超参数优化的方法,这篇文章主要给大家介绍了关于YOLOV5超参数介绍以及优化策略的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或工具有一定的参考学习价值,需要的朋友可以参考下

  4. 深入了解Java中循环结构的使用

    Java中有三种主要的循环结构:while 循环、do…while 循环和for 循环。本文将来和大家一起讲讲Java中这三个循环的使用,需要的可以参考一下

  5. Python Pandas 中的数据结构详解

    这篇文章主要介绍了Python Pandas 中的数据结构详解,Pandas有三种数据结构Series、DataFrame和Panel,文章围绕主题展开更多相关内容需要的小伙伴可以参考一下

  6. 实现树状结构的两种方法

    递归法递归是指在函数中显式的调用它自身。利用递归法实现树状结构的特点是写入数据速度较快,显示速度较慢。/*数据库连接*/mysql_connect();mysql_select_db;/*树状显示的递归函数*/functiontree{/*执行sql查询,获取记录的标题和id*/$sql="selecttopic,idfromtree1whereparentid=$parentidorderbyidasc";$rs=mysql_query;/*缩进*/echo;while{/*显示记录标题*/echo;/

  7. JS实现树形结构与数组结构相互转换并在树形结构中查找对象

    这篇文章介绍了JS实现树形结构与数组结构相互转换并在树形结构中查找对象的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. Java链表数据结构及其简单使用方法解析

    这篇文章主要介绍了Java链表数据结构及其简单使用方法解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

  9. 树型结构列出指定目录里所有文件的PHP类

    //以树型结构列出指定目录里的所有文件,如果你想知道自己某个目录里有哪些子目录和文件,可以调用这个类来查看,很方便的。#演示的例子:$t=newTreeClimber;//新建物件,设置需要列出的目录:在此为asp目录echoarrayValuesToString;functionarrayValuesToString{//调用函数$str="";reset($ar);$size=sizeof($ar);$i=1;while{if{if{$str.=$ar[$k].$nl;}else{$str.=$ar[

  10. 实例讲解JSP Model2体系结构(下)

    由servlet依次决定适当的动作,然后处理要加入的物品的请求参数。然后它例示一个新的CDBean表示所选物品,并在会话内更新购物车对象。注意观察,控制servlet一直在完全掌握着对资源的支配权,它决定在对特定动作的响应中调用哪些资源。例如,购物车状态的改动,如添加或删除,会使控制servlet把处理过的请求送至Eshop.jsp页。由于默认的会话有效期是30分钟,所以在高负荷的系统上,这种情

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部