物体检测-系列教程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, expansion
        super(BottleneckCSP, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.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卷积模块,返回输出

卷积模块中使用的激活函数是LeakyReLU,在Focus模块中使用的是Hardswish
在这里插入图片描述
如图所示,从input然后到concat一共有两条线,左边的就是一个比较短的线,在上面的代码中就是y2,y1就是有多个Bottleneck模块的堆叠再结合一些卷积的线,这实际上就是一个shortcut。

这个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, groups
        super(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, expansion
        super(Bottleneck, self).__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2

    def 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:则不进行残差连接
  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器学习杨卓越

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值