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,一经查实,立即删除!

相关文章

全国区块链职业技能大赛样题第9套智能合约+数据库表设计

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 nice.sql /* Navicat MySQ…

分布式事务解决方案(一) 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…

wire和reg的区别

在 Verilog 中,wire 和 reg 是两种不同的数据类型,用于表示信号或变量。它们在 Verilog 中的使用场景和行为有一些区别: ### wire: - wire 类型用于连接组合逻辑电路中的信号,表示电路中的连线或信号传输线。 - wire …

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

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

Java NIO (一)

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

题解|2024暑期牛客多校04

【原文链接】 比赛链接:2024牛客暑期多校训练营4 A.LCT 题目大意 给定一棵有根树,问按顺序给定的前 i i i 条边组成的森林中,以 c i c_i ci​ 为根的树的深度。 解题思路 按步骤生成森林的过程,与并查集合并的过程一致。 …

Matlab freqz 代码简单实现

相关代码打开matlab源码也可以看到,这里做了简单实现,与源码并不完全一样。 实现代码 [h2 w2] freqzfir(data); [h1 w1] freqz(data); h2h2; h12 [h1, h2];[h4 w4] freqziir(b,a, 2001,true); [h3 w3] freqz(b,a, w4, whole); h4 h4; h34 h…

libtorch + cuda12.5 cmake配置

cmake_minimum_required(VERSION 3.28) project(OpenCV)set(CMAKE_CXX_STANDARD 17)find_package(Torch REQUIRED) find_package(libcudacxx REQUIRED)add_executable(Torch main.cpp) target_link_libraries(Torch ${TORCH_LIBRARIES})

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

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

函数返回类型后置

C11标准中的函数返回类型后置语法,可以让返回复杂类型的函数声明更加清晰易读。 auto foo()->int {return 42; } 以上代码中的函数声明等同于int foo(),只不过采用了函数返回类型后置的方法,其中auto是一个占位符,函数名后-&…

YOLOv8 目标跟踪、车速检测、车流量统计

原文:YOLOv8 目标跟踪、车速检测、车流量统计 - 知乎 (zhihu.com) 一、目标跟踪 YOLOv8_ ByteTrack目标跟踪、模型部署_yolov8-track-CSDN博客 二、车速检测、车流量统计 YOLO 车辆测速-CSDN博客 import cv2 import pandas as pd import numpy as np from ultralytics im…

100、Python 关于时间日期的一些操作

在Python中,我们用于处理时间和日期相关的类型最常用的模块是datetime模块。该模块提供了很多与时间日期相关的类,对我们处理时间日期变得很方便。 以下是一些常见的关于时间日期的操作。 一、datetime类 1、获取当前日期和时间(年、月、日…

leetcode10 -- 正则表达式匹配

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

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

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

Qt中QTcpServer处理客户端连接及通信步骤

qt中的QTcpServer是Qt中用于创建TCP服务器的类,它允许你在应用程序中实现TCP/IP服务器端。下面是使用QTcpServer的基本流程: 1. 包含头文件: #include <QTcpServer> #include <QTcpSocket> // 如果需要与客户端进行通信,也需要包含QTcpSocket 2. 创建…

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

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

Java排序算法练习 (2024.7.23)

sorts工具类&#xff08;里面是自己写的几个常用的排序算法&#xff09; package SortExercise20240723; import java.util.Scanner; public class Sorts {public static int[] creatArray() {Scanner sc new Scanner(System.in);System.out.println("请输入你想要多大的…