物体检测-系列教程22:YOLOV5 源码解析12 (BottleneckCSP类、Conv类、Bottleneck类)

本文主要是介绍物体检测-系列教程22:YOLOV5 源码解析12 (BottleneckCSP类、Conv类、Bottleneck类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

😎😎😎物体检测-系列教程 总目录

有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
点我下载源码

16、BottleneckCSP类

16.1 BottleneckCSP类

位置:yolov5/models/common.py/BottleneckCSP类
CSP Bottleneck 项目地址

CSP (Cross Stage Partial) 网络结构中的BottleneckCSP模块,CSPNet是一种有效的卷积神经网络架构,它通过部分连接不同阶段的特征来减少计算成本,同时保持或提高模型的性能,该架构在目标检测等计算机视觉任务中表现优异

class BottleneckCSP(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansionsuper(BottleneckCSP, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)self.cv4 = Conv(2 * c_, c2, 1, 1)self.bn = nn.BatchNorm2d(2 * c_)  # applied to cat(cv2, cv3)self.act = nn.LeakyReLU(0.1, inplace=True)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])def forward(self, x):y1 = self.cv3(self.m(self.cv1(x)))y2 = self.cv2(x)return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
  1. 继承nn.module
  2. 构造函数,传入6个参数:输入通道c1、输出通道c2、当前模块重复次数n、shortcut残差连接、分组卷积的组数g、扩展比例e(用于计算隐藏层通道数)
  3. 初始化
  4. 计算隐藏层的通道数c_,通过输出通道数c2乘以扩展比例e得到
  5. cv1 ,定义第1个卷积模块,包含二维卷积、批归一化、激活函数,将输入通道数从c1降维到c_,使用1x1卷积核,步长为1
  6. cv2 ,定义第2个卷积模块,和cv1一样,但是没有偏执
  7. cv3,定义第3个卷积模块,和cv2一样
  8. cv4,定义第4个卷积模块,用于将合并后的特征图从2 * c_降维到最终的输出通道数c2,使用1x1卷积核,步长为1
  9. bn,定义批归一化层
  10. act,激活函数为LeakyReLU,斜率为0.1,并使用就地操作以节省内存
  11. m,通过循环构建一个序列模块m,包含n个Bottleneck模块,每个模块的输入和输出通道数相同,都为c_,可以选择使用残差连接,分组数为g,扩展系数固定为1.0
  12. 前向传播,输入图像
  13. y1,经过cv1卷积模块后再经过n个Bottleneck模块,再经过cv3卷积模块
  14. y2,经过cv2卷积模块
  15. 将y1和y2的输出在第二个维度拼接后经过一个批归一化,在经过Leakyrelu激活函数,在经过cv4卷积模块,返回输出

这个BottleneckCSP类通过组合不同的卷积、激活和归一化层,以及巧妙的分割与合并特征图的策略,构建了一个BottleneckCSP模块,这种结构旨在提高模型的计算效率和表现力,常用于深度学习中的图像识别和处理任务中

16.2 Conv类

位置:yolov5/models/common.py/Conv类
这是一个标准的CNN,卷积、批归一化、激活函数,即卷积模块

class Conv(nn.Module):def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groupssuper(Conv, self).__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = nn.LeakyReLU(0.1, inplace=True) if act else nn.Identity()def forward(self, x):return self.act(self.bn(self.conv(x)))def fuseforward(self, x):return self.act(self.conv(x))
  1. 继承自nn.Module
  2. 构造函数,接收7个参数:c1输入通道、c2输出通道、k卷积核大小、s卷积步长、p卷积填充、g分组卷积的组数、act是否激活函数
  3. 定义一个二维卷积层,使用指定的输入输出通道数、卷积核大小、步长、填充和分组。调用autopad函数,根据卷积核大小和提供的填充参数计算自动填充的值
  4. 定义一个批归一化层
  5. 根据act值决定是否使用激活函数。如果act为True,则使用LeakyReLU激活函数,负斜率设置为0.1,并使用inplace=True以减少内存占用
  6. 前向传播
  7. 输入x通过卷积层、批量归一化层、激活函数,并返回结果
  8. 定义一个额外的前向传播函数fuseforward,其他都一样,不经过批量归一化层

16.3 Bottleneck类

位置:yolov5/models/common.py/Bottleneck类
这是一个Standard bottleneck,这种bottleneck结构在深度神经网络中广泛使用,特别是在卷积神经网络中,它可以有效减少参数数量,降低运算复杂度,同时尽可能保持网络性能

class Bottleneck(nn.Module):# def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansionsuper(Bottleneck, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c_, c2, 3, 1, g=g)self.add = shortcut and c1 == c2def forward(self, x):return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
  1. 继承nn.module
  2. 构造函数,传入输入通道c1、输出通道c2、是否进行残差连接shortcut、卷积层的分组数g、扩展因子e
  3. 初始化
  4. c_,计算中间层的通道数,这样做可以在不大幅增加计算量的前提下增加网络的宽度
  5. cv1,定义第1个卷积模块,卷积核为1*1,步长为1
  6. cv2,定义第2个卷积模块,将通道数返回至c2,使用3*3卷积核,步长为1,并根据g参数进行分组卷积操作。这样的设计有助于增强网络的表达能力,同时通过分组卷积减少计算量
  7. add,判断是否执行残差连接,根据shortcut的值和c1和c2通道数是否相等来决定是否进行残差连接
  8. 前向传播
  9. 如果add值为true:输入数据经过cv1后再经过cv2后直接进行残差连接,返回输出;如果为False:则不进行残差连接

这篇关于物体检测-系列教程22:YOLOV5 源码解析12 (BottleneckCSP类、Conv类、Bottleneck类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/782386

相关文章

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本