首页 > 其他分享 >YOLOv5/YOLOV4中的SPP/SPPF

YOLOv5/YOLOV4中的SPP/SPPF

时间:2023-07-07 09:45:06浏览次数:58  
标签:__ YOLOv5 SPPF SPP self 13 池化

目录

一、SPP的应用的背景

二、SPP结构分析

三、SPPF结构分析

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


一、SPP的应用的背景

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

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

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

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

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

Note:

但是在yolov5中SPP/SPPF作用是:实现局部特征和全局特征的featherMap级别的融合。(感谢@qq_44622851博友的提醒)


二、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 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,SPPF,SPP,self,13,池化
From: https://www.cnblogs.com/chentiao/p/17533953.html

相关文章

  • yolov5中的图片自适应缩放
    自适应图片缩放-针对不同的目标检测算法而言,我们通常需要执行图片缩放操作,即将原始的输入图片缩放到一个固定的尺寸,再将其送入检测网络中。YOLO系列算法中常用的尺寸包括416*416,608*608等尺寸。原始的缩放方法存在着一些问题,因为在实际的使用中的很多图片的长宽比不同,所以......
  • yolov5中的s,m,l,x表示什么意思
    在YOLOv5中,S、M、L、X是用来表示不同的检测器尺寸或大小的标签。它们指的是YOLO检测器的不同变体,其主要区别在于其基础网络架构和输入图像的分辨率。以下是它们的具体含义:1.YOLOv5s(Small):这是YOLOv5中的最小尺寸变体。它具有相对较小的模型尺寸和输入图像分辨率,适用于低功耗设备......
  • [OSPP开源之夏-2023] 结合NWR实现Flexible Raft
    FeatureName:ImplementingFlexibleRaftwithNWRAuthor:yzw1294566108@qq.comDate:2023-06-28IssueLink:https://github.com/sofastack/sofa-jraft/issues/1003Summary我们希望在原始RAFT算法的基础上,让Leader选举和日志复制除了能需要获得多数派确认模型的支持之......
  • yolov5实战之模型剪枝
    续yolov5实战之二维码检测目录前沿为什么要做轻量化什么是剪枝稀疏化训练剪枝微调结语模型下载前沿  在上一篇yolov5的博客中,我们用yolov5训练了一个二维码检测器,可以用来检测图像中是否有二维码,后续可以接一个二维码解码器,就可以解码出二维码的信息了(后续可以聊聊)。这篇博客......
  • Yolov5代码解析(输入端、BackBone、Neck、输出端))
     【深度学习】总目录输入端:数据增强、锚框计算等。backbone:进行特征提取。常用的骨干网络有VGG,ResNet,DenseNet,MobileNet,EfficientNet,CSPDarknet53,SwinTransformer等。(其中yolov5s采用CSPDarknet53作为骨干网)应用到不同场景时,可以对模型进行微调,使其更适用于特定的场景。ne......
  • YOLOv5 COCO数据集 训练 | 【YOLOv5 训练】
    ......
  • yolov5 运行环境配置
    安装anaconda用来管理虚拟环境创建一个虚拟环境,创建虚拟环境的时候指定python版本我这里选择3.9将yolov5的python代码从github上搞下来,用pycharm打开-打开项目,打开之后用终端进入之前我们创建的那个虚拟环境里面pycharm不同的版本配置解释器的界面还不一样,多摸索摸索......
  • YOLOv5实现佩戴安全帽检测和识别(含佩戴安全帽数据集+训练代码)
    YOLOv5实现佩戴安全帽检测和识别(含佩戴安全帽数据集+训练代码)目录YOLOv5实现佩戴安全帽检测和识别(含佩戴安全帽数据集+训练代码)1.前言2.佩戴安全帽检测和识别的方法(1)基于目标检测的佩戴安全帽识别方法(2)基于头部检测+佩戴安全帽分类识别方法3.佩戴安全帽数据集说明(1)佩戴安全......
  • Yolov5训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法
    问题:train训练得出的P\R\map全部为0上网寻找寻找答案,大部分给出的原因解释如下:①文件夹格式(名称和架构)有问题,这属于基本内容,不应该出错的。②pytorch和cuda版本不对应。关于这部分可以参考链接:https://blog.csdn.net/jhsignal/article/details/111401628 和 https://www......
  • yolov5项目cuda错误解决
    CUDA报错解决#报错详情AssertionError:CUDAunavailable,invaliddevice0requested查看cuda版本先看一下电脑是否支持GPU,打开任务管理器就能查看(ctrl+shift+esc)#cmd命令nvcc--version#如果上面命令不是内部或外部命令,也不是可运行的程序,就输入下面的命令NVIDIA-......