物体检测-系列教程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 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@