YOLOV8-源码解读-SPP-SPPF

先给出YOLOV8中一键三连卷积模块


def autopad(k, p=None, d=1):  # kernel, padding, dilation"""Pad to 'same' shape outputs."""if d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn pclass Conv(nn.Module):"""Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""default_act = nn.SiLU()  # default activationdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):"""Initialize Conv layer with given arguments including activation."""super().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):"""Apply convolution, batch normalization and activation to input tensor."""return self.act(self.bn(self.conv(x)))

1、SPP

class SPP(nn.Module):"""Spatial Pyramid Pooling (SPP) layer https://arxiv.org/abs/1406.4729."""def __init__(self, c1, c2, k=(5, 9, 13)):"""Initialize the SPP layer with input/output channels and pooling kernel sizes."""super().__init__()c_ = c1 // 2  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)#卷积通道数减半self.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)#输出那里用卷积通道数调整self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])#池化def forward(self, x):"""Forward pass of the SPP layer, performing spatial pyramid pooling."""x = self.cv1(x)#通道数减半x = torch.cat([x] + [m(x) for m in self.m], 1)#不同规格的池化,进行拼接return self.cv2(x)#调整通道数输出

图解:

1.1SPP的步骤:

1、特征图通道数减半

2、使用不同大小的池化窗口进行池化

3、将其不同结果拼接

4、对输出结果进行1×1卷积通道数调整

1.2SPP源码解读:

其中可能看不懂的函数可能就只有2句

self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])
x = torch.cat([x] + [m(x) for m in self.m], 1)

ModuleList

这个ModuleList,他和sequential还有点区别,Sequential是一整个模块,一旦调用就要把里面的网络结构全走一遍。这个ModuleList更像是一个数组,只不过里面的元素对应的是网络结构,你可以随意选出每一层调用,比如代码中遍历整个ModuleList,每次只用里面的一个。

cat

还有一个就是cat,这个就是拼接了,后面的那个是维度,TensorFlow中数据同时是(Batch,H,W,channel)这种,而pytorch中则是(Batch,channel,H,W),拼接的话是把每一个特征图沿着通道维度拼接,因为是pytorch,通道维度在数据中的位置是1,在TensorFlow中用3或者-1

2、SPPF

class SPPF(nn.Module):"""Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher."""def __init__(self, c1, c2, k=5):"""Initializes the SPPF layer with given input/output channels and kernel size.This module is 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):"""Forward pass through Ghost Convolution block."""x = self.cv1(x)#降低通道数print(x.size())y1 = self.m(x)#池化print(y1.size())y2 = self.m(y1)#池化print(y2.size())return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))#拼接

图解:

这个和SPP的区别就是,他没有把池化放到不同大小池化窗口的池化层来用,而是只用一个5*5的池化窗口,进行了3次池化,然后进行拼接。

注意啊,这里的3次池化,池化窗口是相同的。

2.1SPPF的步骤:

1、1×1卷积调整通道数

2、进行3步池化,每一步都是在上一步的基础上。

3、将所有步骤中的特征图沿着通道维度拼接

4、1×1卷积调整通道数

2.2sppf的源码是比较简单和常规的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/51544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式事务解决方案(一) 2PC、3PC、TCC、Sega

目录 1.绪论 2.2PC 2.1 基本原理 2.1.1 组成 2.1.2 步骤 1.prepare阶段 2.commit阶段 2.2 2PC 存在的问题 2.2.1 阻塞问题 2.2.2 单点故障问题 1. 事务协调器宕机 2.部分数据不一致问题 2.资源管理器宕机 3. 事务协调器和资源管理管理器同时宕机 2.2 实现 2.2.1…

怎么将几个pdf合成为一个pdf?pdf合成为一个的常用方法

在现代的职场和学术环境中,如何将多个独立的PDF文档合并成一个统一的文件已经成为提高工作效率、优化文档管理和促进信息共享的重要手段。PDF格式以其卓越的跨平台兼容性、强大的数据保护能力以及清晰易读的版面设计,在全球范围内得到了广泛的应用和认可…

2-45 基于matlab的递归最小二乘法(RLS)对声音信号去噪

基于matlab的递归最小二乘法(RLS)对声音信号去噪,并对消噪前后的信号进行FFT分析,对比消噪前后的效果。可替换自己的声音信号进行分析。程序已调通,可直接运行。 2-45 递归最小二乘法(RLS) FFT分析 - 小红书…

系统移植(七)u-boot移植 ④ trusted版本

文章目录 一、U-boot源码适配(一)执行make stm32mp15_trusted_defconfig命令进行配置,生成.config文件(二)执行make menuconfig命令,对u-boot源码进行重新配置1. 对u-boot源码进行配置,移除pmic…

【C++进阶学习】第十弹——哈希的原理与实现——链地址法的原理与讲解

开放地址法:【C进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解-CSDN博客 前言: 哈希的整体思想就是建立映射关系,前面的开放地址法的讲解中,也对哈希的原理做了详细的讲解,今天就来讲解一下实现哈希的另一…

Java NIO (一)

因工作需要我接触到了netty框架,这让我想起之前为夺高薪而在CSDN购买的Netty课程。如今看来,这套课程买的很值。这套课程中关于NIO的讲解,让我对Tomcat产生了浓厚的兴趣,于是我阅读了Tomcat中关于服务端和客户端之间连接部分的源码…

如何快速获取全网精准客流?揭秘不为人知的5大运营策略!

有同行所在的地方,就一定拥有咱们需要的客户。客户看的是结果,搜索的是问题,寻找的是答案。 如果没有付费流量,单纯靠搞免费流量,很多大厂的运营也会变得一文不值。一个牛逼的运营,不仅是会做付费流量&…

leetcode10 -- 正则表达式匹配

题目描述: 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 示例 1&#xff1…

PDF转Word后不能修改怎么办?是什么原因呢?

平时在生活中,很多朋友都会有将PDF转换成Word文档的需求,因为一般情况下PDF文件是不能直接编辑修改的,所以只能通过这种方式来解决问题。但是近期,有部分用户在后台反馈说PDF转Word后不能修改怎么办呢?其实这个问题也是…

第1-3章Excel数据分析基础

文章目录 第1章:使用统计函数做数据分析1-1常用统计函数应用1-2条件统计函数1-3多条件统计函数1-4条件统计函数中的通配符1-5将条件统计函数中的条件数组化1-6单条件文本合并-新增函数1-7多条件与模仿通配符的文本合并 第2章:数据分析之合并计算2-1合并计…

备忘录系统

目录 一、 系统简介 1.简介 2需求分析 3 编程环境与工具 二、 系统总体设计 1 系统的功能模块图。 2 各功能模块简介 3项目结构 4 三、 主要业务流程 (1)用户及管理员登录流程图 (2)信息添加流程 &#xff0…

攻防世界 re 新手模式 2

IgniteMe 32位无壳 一些简单信息&#xff0c;看关键函数 可以得到v7[i]的值 比较简单的逆向 #include<stdio.h> #include<string.h> int main() {char flag[40];char s[40];char str[]"GONDPHyGjPEKruv{{pj]XrF";char ch[] {0x0D, 0x13, 0x17, 0x11,…

8、ViKings

难度 低->中 目标 root 2个flag 进行主机发现 netdiscover -i eth0 -r 192.168.189.0/24 kali 192.168.189.58 靶机 192.168.189.158 进行信息收集 nmap -T4 -sV -p- -A 192.168.189.158 开启了80和22&#xff0c;先探索web服务&#xff0c;没有思路再考虑ssh爆破 直…

react css module 不生效问题记录

背景&#xff1a;自己使用webpackreactcssless配置的项目框架&#xff0c;在使用过程中发现css module引入不生效。 import React from react import styles from ./index.module.less console.log(styles)//输出 undefinedwebpack配置了css-loader,less-loader,webpack默认cs…

Executable Code Actions Elicit Better LLM Agents

Executable Code Actions Elicit Better LLM Agents Github: https://github.com/xingyaoww/code-act 一、动机 大语言模型展现出很强的推理能力。但是现如今大模型作为Agent的时候&#xff0c;在执行Action时依然还是通过text-based&#xff08;文本模态&#xff09;后者JSO…

全网独一份!AI大模型学习训练资源...

国内AI赛道又爆了&#xff01; 继科大讯飞、阿里、华为等巨头公司发布AI产品后&#xff0c; 很多中小企业也陆续进场&#xff01; 人才市场上AI大模型工程师“一将难求”&#xff01; 甚至开出80k*16的高薪&#xff0c;挖掘AI大模型人才&#xff01; 如今大厂老板们&#…

arduino程序-变量操作(基础知识)

arduino程序-变量操作&#xff08;基础知识&#xff09; 1-7 arduino程序-变量操作太极创客网站类型资料变量类型范围超过上限会从下限开始长整型变量作用域&#xff08;全局变量&#xff0c;局部变量&#xff09;全局变量局部变量最后作业 1-7 arduino程序-变量操作 大家好这…

Ubuntu、centos、openEuler安装docker

目录 1.在 Ubuntu 上安装 Docker 1. 1 更新软件包 1. 2 安装必要的依赖 1.3 添加 Docker 的 GPG 密钥 1.4 添加 Docker 仓库 1.5 更新软件包 1.6 安装 Docker 1.7 启动并启用 Docker 服务 1.8 验证安装 1.9 运行测试容器 1.10 非 root 用户运行 Docker 2.在 CentOS…

多节点网络流量对比分析在业务性能分析中的应用

在现代企业网络环境中&#xff0c;网络流量分析已成为确保业务连续性和优化性能的关键工具。特别是多节点网络流量对比分析&#xff0c;通过对比不同节点间的流量&#xff0c;能有效发现潜在问题&#xff0c;提高网络运维效率。本文将探讨多节点网络流量对比分析在业务性能分析…

【数据结构】哈希表二叉搜索树详解

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f48e;所属专栏&#xff1a;数据结构与算法学习 &#x1f341;1. 二叉搜索树 二叉搜索树也称为二叉查找树或二叉排序树&#xff0c;是一种特殊的二叉树结构&#xff0c;它的特点是&#xff1a; 1. 若左树不为空&am…