物体检测-系列教程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

相关文章

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Java解析JSON的六种方案

《Java解析JSON的六种方案》这篇文章介绍了6种JSON解析方案,包括Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点... 目录前言1. 使用 Jackson:业界标配功能特点代码示例高级功能优缺点2. 使用 Gson:轻量

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines