yolov5组件笔记

2023-11-03

深度学习模型组件 ------ 深度可分离卷积、瓶颈层Bottleneck、CSP瓶颈层BottleneckCSP、ResNet模块、SPP空间金字塔池化模块

目录

1、标准卷积: Conv + BN + activate

2、DWConv深度可分离卷积

3、Bottleneck瓶颈层

4、BottleneckCSP-CSP瓶颈层

5、ResNet模块

6、SPP空间金字塔池化模块

7、focus

8、PAN特征融合

9、GIOU DIOU CIOU



yolov5的融合采用的是一个普通的CBL(conv–bn–leakyrelu)。

新版:CBL(conv–bn–SiLU)。

1、标准卷积: Conv + BN + activate

class Conv(nn.Module):
    # Standard convolution
    # ch_in, ch_out, kernel, stride, padding, groups
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):
        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.Hardswish() if act is True else (act if isinstance(act, nn.Module) 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))

参数说明:

  • g:groups,通道分组的参数,输入通道数、输出通道数必须同时满足被groups整除;

    groups: 如果输出通道为6,输入通道也为6,假设groups为3,卷积核为 1x1 ; 则卷积核的shape为2x1x1,即把输入通道分成了3份;那么卷积核的个数呢?之前是由输出通道决定的,这里也一样,输出通道为6,那么就有6个卷积核!这里实际上是将卷积核也平分为groups份,在groups份特征图上计算,以输入、输出都为6为例,每个2xhxw的特征图子层就有且仅有2个卷积核,最后相加恰好是6。这里可以起到的作用是不同通道分别计算特征!

    参数的参考资料1参考资料2

Top  ---  Bottom


2、DWConv深度可分离卷积

def DWConv(c1, c2, k=1, s=1, act=True):
    # Depthwise convolution
    return Conv(c1, c2, k, s, g=math.gcd(c1, c2), act=act)

这里的深度可分离卷积,主要是将通道按输入输出的最大公约数进行切分,在不同的通道图层上进行特征学习!

关于深度可分离卷积的更早资料参考:我的github

3、Bottleneck瓶颈层

class Bottleneck(nn.Module):
    # Standard bottleneck
    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))

参数说明:

  • c1:bottleneck 结构的输入通道维度;
  • c2:bottleneck 结构的输出通道维度;
  • shortcut:是否给bottleneck 结构添加shortcut连接,添加后即为ResNet模块;
  • ggroups,通道分组的参数,输入通道数、输出通道数必须同时满足被groups整除;
  • e:expansion: bottleneck 结构中的瓶颈部分的通道膨胀率,使用0.5即为变为输入的1212;

模型结构:

image-20210112125749812

这里的瓶颈层,瓶颈主要体现在通道数channel上面!一般1x1卷积具有很强的灵活性,这里用于降低通道数,如上面的膨胀率为0.5,若输入通道为640,那么经过1x1的卷积层之后变为320;经过3x3之后变为输出的通道数,这样参数量会大量减少!

这里的shortcut即为图中的红色虚线,在实际中,shortcut(捷径)不一定是上面都不操作,也有可能有卷积处理,但此时,另一支一般是多个ResNet模块串联而成!这里使用的shortcut也成为identity分支,可以理解为恒等映射,另一个分支被称为残差分支(Residual分支)

我们常使用的残差分支实际上是1x1+3x3+1x1的结构!

Top  ---  Bottom


4、BottleneckCSP-CSP瓶颈层

class BottleneckCSP(nn.Module):
    # CSP Bottleneck https://github.com/WongKinYiu/CrossStagePartialNetworks
    # ch_in, ch_out, number, shortcut, groups, expansion
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  
        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))))

参数说明:

  • c1:BottleneckCSP 结构的输入通道维度;
  • c2:BottleneckCSP 结构的输出通道维度;
  • n:bottleneck 结构 结构的个数;
  • shortcut:是否给bottleneck 结构添加shortcut连接,添加后即为ResNet模块;
  • ggroups,通道分组的参数,输入通道数、输出通道数必须同时满足被groups整除;
  • e:expansion: bottleneck 结构中的瓶颈部分的通道膨胀率,使用0.5即为变为输入的1212;
  • torch.cat((y1, y2), dim=1):这里是指定在第11个维度上进行合并,即在channel维度上合并;
  • c_:BottleneckCSP 结构的中间层的通道数,由膨胀率e决定。

模型结构:

image-20210112143157341

CSP瓶颈层结构在Bottleneck部分存在一个可修改的参数n,标识使用的Bottleneck结构个数!这一条也是我们的主分支,是对残差进行学习的主要结构,右侧分支nn.Conv2d实际上是shortcut分支实现不同stage的连接。

Top  ---  Bottom


5、ResNet模块

残差模块是深度神经网络中非常重要的模块,在创建模型的过程中经常被使用。

残差模块结构如其名,实际上就是shortcut的直接应用,最出名的残差模块应用这样的:

image-20210112152834753 image-20210112153216025

左边这个结构即Bottleneck结构,也叫瓶颈残差模块!右边的图片展示的是基本的残差模块!

Top  ---  Bottom


6、SPP空间金字塔池化模块

class SPP(nn.Module):
    # Spatial pyramid pooling layer used in YOLOv3-SPP
    def __init__(self, c1, c2, k=(5, 9, 13)):
        super(SPP, self).__init__()
        c_ = c1 // 2  # hidden channels
        self.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):
        x = self.cv1(x)
        return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))

SPP即为空间金字塔池化模块!上面的代码是yolov5的模型代码,可视化为:

​ image-20210112161311151

三种池化核,padding都是根据核的大小自适应,保证池化后的特征图[H, W]保持一致!

7、focus

yolov5中focus的定义如下:

class Focus(nn.Module):
    # Focus wh information into c-space
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super().__init__()
        self.conv = Conv(c1 * 4, c2, k, s, p, g, act)
        # self.contract = Contract(gain=2)

    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
        # return self.conv(self.contract(x))

从图像上能够更加直观地理解

4 * 4 * 3  变成 2 * 2 * 12

x[..., ::2, ::2]意义如下图

...  :表示所有通道(图中为3通道)

::2 :表示第一行开始到最后一行结束,步长为2的所有值(图中第一行,第三行所有值)

::2 :表示第一列开始到最后一列结束,步长为2的所有值(图中第一列,第三列所有值)

最终交集为图中标1的方块(图中红底标出)

 

torch.cat( )的用法

如果我们有两个tensor是A和B,想把他们拼接在一起,需要如下操作:

C = torch.cat( (A,B),0 )  #按维数0拼接(竖着拼)
 
C = torch.cat( (A,B),1 )  #按维数1拼接(横着拼)
————————————————
版权声明:本文为CSDN博主「ynxdb2002」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ynxdb2002/article/details/113963263

8、PAN特征融合

Neck-路径聚合网络(PANET)

Neck主要用于生成特征金字塔。特征金字塔会增强模型对于不同缩放尺度对象的检测,从而能够识别不同大小和尺度的同一个物体。在PANET出来之前,FPN一直是对象检测框架特征聚合层的State of the art,直到PANET的出现。在YOLO V4的研究中,PANET被认为是最适合YOLO的特征融合网络,因此YOLO V5和V4都使用PANET作为Neck来聚合特征。

PANET基于 Mask R-CNN 和 FPN 框架,同时加强了信息传播。该网络的特征提取器采用了一种新的增强自下向上路径的 FPN 结构,改善了低层特征的传播。第三条通路的每个阶段都将前一阶段的特征映射作为输入,并用3x3卷积层处理它们。输出通过横向连接被添加到自上而下通路的同一阶段特征图中,这些特征图为下一阶段提供信息。同时使用自适应特征池化(Adaptive feature pooling)恢复每个候选区域和所有特征层次之间被破坏的信息路径,聚合每个特征层次上的每个候选区域,避免被任意分配。


作者:william
链接:https://www.zhihu.com/question/399884529/answer/1343439934
 

9、GIOU DIOU CIOU

YOLOv5学习总结(持续更新)_dididi的博客-CSDN博客_yolov5

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yolov5组件笔记 的相关文章

  • C++ 入门算法,你必须懂的“顺序表”

    顺序表简介 顺序表是简单的一种线性结构 他们可以说是连续存储元素的 也可以称之为数组 顺序表可以快速定位到第几个元素的位置 中间不允许有空值 插入 删除时需要移动大量的元素 顺序表的三个要素 用elems记录存储位置的基地址 分配一段连续的
  • 数字信号处理综合实验——Matlab实现DTMF信号的产生与提取

    数字信号处理综合实验 一 实验内容及要求 实验内容 综合运用课程所学相关知识 根据实际信号的频谱特性 确定数字滤波器设计技术指标 设计相应的数字滤波器 实现DTMF信号的提取 设计要求 1 通过查阅资料 自学电话中DTMF信号的产生与检测方

随机推荐

  • python处理wrf气象数据_气象数据处理:NetCDF文件处理

    NetCDF文件是自描述的二进制数据格式 所谓自描述就是自带属性信息 这和一般的雷达基数据格式不同 一般的雷达数据也是二进制的 但不是自描述的 而是需要额外的数据格式文档来说明数据格式 而NetCDF文件中包含了描述变量和维度的元数据信息
  • Edge被2345浏览器劫持 解决方法

    Edge 被 hao123 劫持解决方法 edge被hao123锁定改不了 小子宝丁的博客 CSDN博客
  • 无法加载文件 C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1

    无法加载文件 C Users xxx Documents WindowsPowerShell profile ps1 本次尝试解决方法 使用管理远打开 windows powershell 运行以下内容 Set ExecutionPolic
  • mysql time类型解析_mysql时间数据类型解析

    1 MySQL的五种日期和时间类型 MySQl中有多种表示日期和时间的数据类型 其中YEAR表示年份 DATE表示日期 TIME表示时间 DATETIME和TIMESTAMP表示日期和实践 它们的对比如下 TEAR 字节数为1 取值范围为
  • SpringMVC(十三) RequestMapping 使用servlet原生API作为参数

    SpringMVC支持以下Servlet方法 HttpServletRequest HttpServletResponse HttpSession Writer Reader Locale InputStream OutputStream
  • 内核(kernel)的链接脚本

    1 链接脚本的产生 kernel的链接脚本和uboot的不同 uboot的链接脚本是源文件的一部分 而kernel的链接脚本在源文件中是找不到的 要经过编译才会产生 链接脚本的名字是vmlinux lds 由汇编文件vmlinux lds
  • 【多模态】15、MobileSAM

    文章目录 一 背景 二 方法 2 1 耦合蒸馏 2 2 从半蒸馏到解耦蒸馏 三 效果 论文 FASTER SEGMENT ANYTHING TOWARDS LIGHTWEIGHT SAM FOR MOBILE APPLICATIONS 代码
  • 实现strcpy功能

    实现strcpy的功能 运行结果
  • QT编译FreeType和Little CMS

    一 FreeType FreeType是个开源字体引擎 可以移植到arm中 也可以在桌面软件中使用 下载FreeType 这里使用FreeType 2 10 4版本 使用QT Creator新建工程 工程名为FreeType 解压后 只取出
  • yarn创建vite项目——遇见的错误及解决方法

    今天尝试做一个vue3 vite的组件库项目 没想到第一步就开始出现问题 改了整整一天 那么我们开始 首先 目录中间包含空格 导致报错 会出现这种错误时因为 c program files 这里 中间有一个空格 很显然yarn帮并不能通过这
  • mac安装mysql workbench,Mac OS X 上的“MySQLWorkbench quit unexpectly.”问题

    今天 在我的Mac OS X 10 8 4 系统上使用MySQLWorkbench 6 0 7 在启动之时 就遇到问题不能启动 提示对话框为 MySQLWorkbench quit unexpectly 然后 有 ignore report
  • 软件测试之检查产品说明书

    场景 学习 软件测试 第4章节 检查产品说明书 关于黑盒测试和白盒测试 黑盒测试只需要知道软件要做什么 而无法看到盒子里的软件是怎么运行的 只要进行一些输入 然后输出结果 目前我们做的基本上是这种测试 我们知道输入和预计输出 只要把按操作输
  • GCC编译选项补充

    一 出错检查和警告提示选项 pedantic error 允许发出ANSIC标准所列的全部错误信息 w 关闭所有警告 Wall 允许发出GCC提供的所有有用的报警信息 Werror 把所有的告警信息转化为错误信息 并在告警发生时终止编译过程
  • vue---制作表格+分页功能

    小白第一次尝试使用vue制作分页功能 分为两个部分 一个是表格部分 一个是下面分页的按钮部分 表格部分用最熟悉的html标签table table tr th 字母 th tr tr td td td td tr table
  • 移动端H5页面返回并且刷新页面(BFcache)

    项目中的需求 点击浏览器中的返回按钮 要让页面重新加载资源 因为这部分的资源每次去加载的内容都不一样 如果返回的时候 还是看到原先的内容 那做这个内容块的意义就很小了 而如果用户看完了这部分内容 再返回来的时候 这个地方换成了新的内容 这样
  • Could not resolve all dependencies for configuration ':app:_debugApk'

    问题 FAILURE Build failed with an exception What went wrong A problem occurred configuring project app gt Could not resolv
  • mysql常用命令,mysql数据类型和Java数据类型对应

    一 创建数据库 1 dos命令打开数据库 mysql u root pok 2 查看数据库 show databases 3 创建数据库 假设数据库表名abc create database abc 4 删除数据库 drop databas
  • 刷脸支付让用户与商家距离更进一步

    商业世界中 支付 往往不仅是支付 正如支付宝的诞生让网络交易变得可靠 线下二维码直接带动了移动支付的兴起 刷脸支付则让用户与商家的距离更进一步 以友宝 留夫鸭为代表的线下零售企业正成为这次支付变革中的首批获益者 率先完成了自身零售模式的进化
  • netdiscover使用

    介绍 Netdiscover是一种网络扫描工具 通过ARP扫描发现活动主机 可以通过主动和被动两种模式进行ARP扫描 通过主动发送ARP请求检查网络ARP流量 通过自动扫描模式扫描网络地址 对此我们可以对其网段进行获取存活主机进行信息收集
  • yolov5组件笔记

    深度学习模型组件 深度可分离卷积 瓶颈层Bottleneck CSP瓶颈层BottleneckCSP ResNet模块 SPP空间金字塔池化模块 目录 1 标准卷积 Conv BN activate 2 DWConv深度可分离卷积 3 Bo