Yolo v5实现细节

news2024/11/24 17:27:55

Yolo v5实现细节

SiLU激活函数

swish和SiLU激活函数:其中β是常量或者是可学习的参数

首先引入swish函数的表达形式:

在这里插入图片描述
f ( x ) = x ⋅ sigmoid ⁡ ( β x ) f(x)=x \cdot \operatorname{sigmoid}(\beta x) f(x)=xsigmoid(βx)

如果β = 1即SiLU激活函数:

f ( x ) = x ⋅ sigmoid ⁡ ( x ) f(x)=x \cdot \operatorname{sigmoid}(x) f(x)=xsigmoid(x)

如果β = 0, Swish 变成了 缩放线性函数 f(x) = x/2。如果β → ∞,sigmoid 分量接近 0-1 函数。

可以大致地把Swish 视为一个平滑函数,它在线性函数和ReLU函数之间进行非线性插值,如果将插
值程度设置为可训练参数,则模型可以控制β

hardswish ⁡ ( x ) = { 0 ,  if  x ≤ − 3 x ,  if  x ≥ 3 x ( x + 3 ) 6 ,  otherwise  \operatorname{hardswish}(x)=\left\{\begin{array}{ll} 0, & \text { if } x \leq-3 \\ x, & \text { if } x \geq 3 \\ \frac{x(x+3)}{6}, & \text { otherwise } \end{array}\right. hardswish(x)= 0,x,6x(x+3), if x3 if x3 otherwise 

Hardswish激活函数,在MobileNetV3架构中被提出,相较于swish函数,具有数值稳定性好,计算速度快等优点。

v5网络结构

在这里插入图片描述

6.0之后版本的改进部分:

  • 用Conv(k=6,s=2,p=2)代替Focus层,主要是为了方便模型导出
  • 使用SPPF代替SPP层
  • 减少P3主干层C3
  • 将SPPF放在主干的后面
  • 更新超参数

backbone部分:yolov5s的版本:(官方的yaml配置文件

  [
    [-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
    [-1, 1, Conv, [128, 3, 2]], # 1-P2/4
    [-1, 3, C3, [128]],
    [-1, 1, Conv, [256, 3, 2]], # 3-P3/8
    [-1, 6, C3, [256]],
    [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
    [-1, 9, C3, [512]],
    [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
    [-1, 3, C3, [1024]],
    [-1, 1, SPPF, [1024, 5]], # 9
  ]

关于YOLOv5的网络结构其实网上相关的讲解已经有很多了。网络结构主要由以下几部分组成:

  • Backbone: New CSP-Darknet53
  • Neck: SPPF, New CSP-PAN
  • Head: YOLOv3 Head

下面是我根据yolov5l.yaml绘制的网络整体结构,YOLOv5针对不同大小(n, s, m, l, x)的网络整体架构都是一样的,只不过会在每个子模块中采用不同的深度和宽度,分别应对yaml文件中的depth_multiplewidth_multiple参数。

CBL模块(ConvBNSiLU)

CONV模块是一个标准的卷积模块,卷积层+BN层+激活函数SiLU。

class Conv(nn.Module):
    # Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)
    default_act = nn.SiLU()  # default activation

    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
        """Initializes a standard convolution layer with optional batch normalization and activation."""
        super().__init__()
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()

    def forward(self, x):
        """Applies a convolution followed by batch normalization and an activation function to the input tensor `x`."""
        return self.act(self.bn(self.conv(x)))

    def forward_fuse(self, x):
        """Applies a fused convolution and activation function to the input tensor `x`."""
        return self.act(self.conv(x))

在这里插入图片描述

Bottleneck模块

Bottleneck1在backbone中使用带有残差的部分,Bottleneck2不带有残差的部分。(通过add变量来进行控制

class Bottleneck(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):
        """Initializes a standard bottleneck layer with optional shortcut and group convolution, supporting channel
        expansion.
        """
        super().__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):
        """Processes input through two convolutions, optionally adds shortcut if channel dimensions match; input is a
        tensor.
        """
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

在这里插入图片描述

C3模块

结构作用基本相同均为CSP架构,只是在修正单元的选择上有所不同,其包含了3个标准卷积层以及多个Botteneck模块。

之前的v6.0之前使用的是BottleneckCSP模块,在新版本中被替换为C3模块进行使用。

CSP结构是在CSPNet(Cross Stage Partial Network)论文中提出的

  • 每一个block按照特征图的channel维度拆分成两部分
  • 一份正常走网络,另一份直接concat到这个block的输出

在这里插入图片描述
在v4网络中的cspDarknet即为将csp网络结构与Darknet53网络结构进行结合所得到的一个新的网络架构。

给出v5中常用到的C3部分的网络结构图如下所示:

在这里插入图片描述

class C3(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        """Initializes C3 module with options for channel count, bottleneck repetition, shortcut usage, group
        convolutions, and expansion.
        """
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

    def forward(self, x):
        """Performs forward propagation using concatenated outputs from two convolutions and a Bottleneck sequence."""
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

之前部分的涉及到的模块信息主要是backbone主干部分的网络结构信息,后面spp部分和之后的部分是netual和head部分。

SPPF模块

使用1 * 1的CBL和maxpooling,对输入进行特征提取和特征融合与SPP不同之处在于增加特征由浅入深的提取过程。

Spp部分主要使用在yolo v3+spp的部分中和yolo v4的网络中。

在这里插入图片描述

在这里插入图片描述
SPPF的三个maxpooling之间使用了串联的连接方式,在进行连接之后再次进入CBL模块中进行使用。

class SPPF(nn.Module):
    # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
    def __init__(self, c1, c2, k=5):
        """
        Initializes YOLOv5 SPPF layer with given channels and kernel size for YOLOv5 model, combining convolution and
        max pooling.

        Equivalent to SPP(k=(5, 9, 13)).
        """
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

    def forward(self, x):
        """Processes input through a series of convolutions and max pooling operations for feature extraction."""
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")  # suppress torch 1.9.0 max_pool2d() warning
            y1 = self.m(x)
            y2 = self.m(y1)
            return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))

最后在给出YOLO v5的最终的网络特征图的过程中,需要注意的一点是v5给出的三个预测特征层的缩放倍数,都是8的整数倍(相比较与输入的图片来说)

在Neck部分另外一个不同点就是New CSP-PAN了,在YOLOv4中,Neck的PAN结构是没有引入CSP结构的,但在YOLOv5中作者在PAN结构中加入了CSP。详情见上面的网络结构图,每个C3模块里都含有CSP结构。

在这里插入图片描述

head部分网络结构

FPN网络结构

作用将Backbone上的不同特征图进行融合操作。

在这里插入图片描述
在主干网络的部分会使用到1x1的卷积核来调整特征图的通道数,便于进行融合的相关操作。而在head部分进行融合操作的时候要使用到,二倍的上采样操作来进行缩放便于进行进一步的特征融合操作。

在进行上采样的过程中并没有使用到转置卷积的相关操作,而是使用了邻近插值算法来进行实现的

在这里插入图片描述

给出一个更为具体使用FPN网络的结构模型:

在这里插入图片描述

PAN网络结构

PAN网络结构是在之前提出的FPN网络结构的基础上,进一步改进所得到的网络结构。在v4和v5的head部分都用到了PAN网络结构的思想来实现网络模型。

通过PAN得到最终的预测特征层的相关的信息。

在FPN的基础上又底层在反向低层进行一个融合的操作。

在这里插入图片描述

训练策略

在YOLOv5源码中使用到了很多训练的策略,这里简单总结几个我注意到的点,还有些没注意到的请大家自己看下源码:

  • Multi-scale training(0.5~1.5x),多尺度训练,假设设置输入图片的大小为640 × 640,训练时采用尺寸是在0.5× 640~ 1.5×640之间随机取值,注意取值时取得都是32的整数倍(因为网络会最大下采样32倍)。

  • AutoAnchor(For training custom data),训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成Anchors模板。

  • Warmup and Cosine LR scheduler,训练前先进行Warmup热身,然后在采用Cosine学习率下降策略。

  • EMA(Exponential Moving Average),可以理解为给训练的参数加了一个动量,让它更新过程更加平滑。

  • Mixed precision,混合精度训练,能够减少显存的占用并且加快训练速度,前提是GPU硬件支持。

  • Evolve hyper-parameters,超参数优化,没有炼丹经验的人勿碰,保持默认就好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1865425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 网络:网卡 promiscuous 模式疑云

文章目录 1. 前言2. 问题场景3. 问题定位和分析4. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 问题场景 调试 Marvell 88E6320 时,发现 eth0 出人意料的进入了 promis…

Linux源码阅读笔记05-进程优先级与调度策略-实战分析

基础知识 Linux 内核当中有 3 种调度策略: SCHED_OTHER 分时调度策略;SCHED_FIFO 实时调度策略,先到先服务;SCHED_RR 实时调度策略,时间片轮转。 如果有相同优先级的实时进程(根据优先级计算的调度权值是…

centos上快速搭建zfile文件网站

什么是zfile? zfile文件网站是最方便快捷的在线目录展示程序,支持将本地文件、FTP、SFTP、S3、OneDrive 等存储在网站上展示并浏览! 本教程参考: https://docs.zfile.vip/install/os-linux复现 今天的搭建环境是centos7.9 第一…

vscode中的字符缩进问题

问题描述: 如图当一行代码中出现不同类型的字符时,使用tab缩只是插入了固定数量(默认4)的空格或制表符,仍然无法对齐。 解决方法: vscode找到设置,搜索fontFamily,对应输入框写入mon…

Linux下安装搜狗拼音不能显示中文?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

这5款国内可用的宝藏AI视频工具,不允许有人还不知道!(建议收藏)

文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 前几天一位粉丝说给…

海外短剧系统:一扇窥探多元文化的奇妙之窗

随着全球化的推进,文化交流的壁垒逐渐消融,我们得以更加便捷地领略到世界各地的独特风情。在这一背景下,海外短剧系统应运而生,它如同一扇扇虚拟的窗户,将我们带入不同国家、不同民族、不同文化的世界,让我…

Navicat Premium Lite绿色免费版

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Navicat Premium Lite概述 Navicat 最近推出了一款名为 Navicat Premium Lite 的免费数据库管理开发工具,专为入门级用户设计。这款工具虽然在功能上与 Navicat…

内网安全【4】SSH隧道技术

1.四大隧道协议 (1)SMB协议 判断:445端口是否开放 (2)ICMP协议 判断:ping命令能通说明使用icmp协议 (3)DNS协议 判断:nslookup www.baidu.com 属于UDP iodine工作原理是 ,通过TAP虚拟网卡,在服…

北方银行 - HDFS 现代化快速案例研究

故事很重要,客户故事是最好的。他们提供令人瞠目结舌的统计数据或克服巨大障碍的那些是获得最佳头条新闻的那些。它们也是最难发表的。我们知道,因为我们将与您分享一些我们正在孜孜不倦地努力出版的内容 - 但现在它们将保持匿名。话虽如此,如…

Java:从嵌入式到云时代的编程语言传奇

Java,自1995年面世以来,已成为全球最受欢迎的编程语言之一。起初,Sun Microsystems公司为了解决嵌入式设备编程的难题,开发了Oak语言,这便是Java的前身。随着互联网的兴起,Oak更名为Java,并迅速…

11.异常(java版)

异常的概念 在日常开发时 代码在程序运行过程中 难免会出现一些其奇奇怪怪的问题 有时通过代码很难去控制 比如:数据格式不对、网络不流畅、内存报警等 在Java中 将程序执行过程中发生的不正常行为称为异常 比如我们之前写代码时经常会遇到的: 1.算术…

tldraw白板组件

tldraw 是一个开源的白板组件&#xff0c;10行代码就可以将其接入到 React 项目中&#xff1a; import { Tldraw } from tldraw import tldraw/tldraw.cssexport default function App() {return (<div style{{ position: fixed, inset: 0 }}><Tldraw /></div&…

C#与工业自动化结合还有搞头吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c#的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;当然有搞头&#xff01;C#是一…

自动化软件运行手机脚本需要用上的源代码!

在现今这个科技高速发展的时代&#xff0c;自动化软件运行手机脚本已经成为许多开发者、测试人员乃至普通用户提高工作效率的利器。 通过编写和执行手机脚本&#xff0c;我们可以实现自动化测试、数据抓取、任务批量处理等多种功能&#xff0c;本文将分享五段用于不同场景的自…

【LLM】一分钟带你了解Agent工作流四范式

文章目录 1. 大模型直接生成-generation2. 大模型充当工具使用-tool3. 大模型执行思维链-Planning4. 多大模型Agent合作-multiagent collaboration 1. 大模型直接生成-generation 通过提示词&#xff0c;大模型直接生成想要的结果&#xff1a; 2. 大模型充当工具使用-tool …

如何寻找暴利产品并通过整合产品资源变现

互联网上很多人都喜欢做暴利产品&#xff0c;这是人之常情&#xff0c;赚钱嘛&#xff0c;谁不希望一次多赚点。 说到暴利产品&#xff0c;那就不得不提微商&#xff0c;微商运营的本质是基于代理商进行用户的裂变&#xff0c;也就是说代理商越多&#xff0c;自然也就收割越多&…

24年了 直播带货的未来如何?

32 个国家在取消电商&#xff0c; 那我国的电商呢&#xff0c;首先电商是不会被取缔的。直播电商会被严格的控制&#xff0c;比如有一家饼店&#xff0c;它线下的销售是 3000 万&#xff0c;线上抖音的销售是 5, 000 万。 这一类型小而精又专业的品牌企业&#xff0c;未来在抖…

Excel 将某个序列随机重排 N 次

A 列是个随机序列&#xff0c;B2 格是参数&#xff0c;表示重排的次数。 AB1ItemsReplicates2A23B4C5D 要求将 A 列重拍 N 次 D1Result2C3D4B5A6D7A8B9C 使用 SPL XLL&#xff0c;输入公式&#xff1a; spl("?2.conj(?1.sort(rand()))",A2:A5,B2)"整数.()…

在数字化转型中,数字孪生技术的作用和价值几何?

引言&#xff1a;随着全球化和市场竞争的加剧&#xff0c;企业需要通过数字化转型来提高生产效率、优化产品质量、降低成本&#xff0c;以增强自身竞争力。企业需要通过数字化转型更好地理解客户需求&#xff0c;提供个性化、定制化的产品和服务&#xff0c;从而满足客户的多样…