Yolov5改进算法之添加Res2Net模块

news2024/12/22 5:25:56

目录

1. Res2Net介绍

1.1 Res2Net的背景和动机

1.2 Res2Net的基本概念

2. YOLOV5添加Res2Net模块


Res2Net(Residual Resolution Network)是一种用于图像处理和计算机视觉任务的深度卷积神经网络架构。它旨在解决传统的ResNet(Residual Network)存在的问题,如对不同尺度和分辨率特征的建模不足以及网络深度受限的问题。Res2Net通过引入多分支的结构和逐级增加的分辨率来提高网络的表达能力,从而在各种视觉任务中取得了显著的性能提升。

1. Res2Net介绍

1.1 Res2Net的背景和动机

ResNet是一种非常成功的深度卷积神经网络,但它存在一些问题。其中最重要的问题之一是对不同尺度和分辨率特征的建模不足。传统的ResNet块只使用单一的残差连接来传递信息,这意味着网络可能无法有效地捕获不同层次的特征。

Res2Net的动机是通过引入多分支结构和逐级增加的分辨率来提高网络的表达能力。这使得网络能够更好地处理多尺度和多分辨率的特征,从而提高了其在各种计算机视觉任务中的性能。

1.2 Res2Net的基本概念

ResNet中的基本构建块,即残差块(Residual Block)。一个典型的残差块包含两个主要分支:一个跳跃连接(Identity Shortcut)和一个经过多个卷积层的主路径。跳跃连接用于绕过一些卷积层,以确保梯度能够顺畅地传播。

Res2Net的核心思想是将多个分支的信息融合在一个残差块中,以提高网络对不同分辨率的特征的表达能力。具体来说,Res2Net引入了多尺度子网络(Multi-Scale Sub-Networks)来处理不同分辨率的特征,然后将它们的输出级联在一起。这种级联结构允许网络同时学习低分辨率和高分辨率的特征表示,从而提高了网络的感知能力。

Res2Net的核心结构是一个多分支的残差块,每个分支都有自己的卷积层,负责处理不同分辨率的特征。这些分支的输出级联在一起,以获得最终的块输出。多个这样的块可以构建成深层网络,以处理更复杂的任务。

Res2Net的工作原理在前向传播过程中如下:

  1. 输入特征首先经过一个初始卷积层,用于提取低级别的特征表示。
  2. 接下来,输入特征被送入多个Res2Net块。每个块都包含多个分支,每个分支处理不同分辨率的特征。
  3. 每个分支内部包含卷积层、激活函数和规范化层等,用于提取和调整特征。
  4. 分支的输出级联在一起,形成块的最终输出。
  5. 这个块的输出可以传递到下一个块,也可以连接到网络的其他部分。

如下图:

2. YOLOV5添加Res2Net模块

在models/common.py文件中增加以下模块:

class Bottle2neck(nn.Module):
    expansion = 1

    def __init__(self, inplanes, planes, shortcut, baseWidth=26, scale=4):
        """ Constructor
        Args:
            inplanes: input channel dimensionality
            planes: output channel dimensionality
            baseWidth: basic width of conv3x3
            scale: number of scale.
        """
        super(Bottle2neck, self).__init__()

        width = int(math.floor(planes * (baseWidth / 64.0)))
        self.conv1 = Conv(inplanes, width * scale, k=1)

        if scale == 1:
            self.nums = 1
        else:
            self.nums = scale - 1
        convs = []
        for i in range(self.nums):
            convs.append(Conv(width, width, k=3))
        self.convs = nn.ModuleList(convs)

        self.conv3 = Conv(width * scale, planes * self.expansion, k=1, act=False)

        self.silu = nn.SiLU(inplace=True)
        self.scale = scale
        self.width = width
        self.shortcut = shortcut

    def forward(self, x):

        if self.shortcut:
            residual = x
        out = self.conv1(x)
        spx = torch.split(out, self.width, 1)
        for i in range(self.nums):
            if i == 0:
                sp = spx[i]
            else:
                sp = sp + spx[i]
            sp = self.convs[i](sp)
            if i == 0:
                out = sp
            else:
                out = torch.cat((out, sp), 1)
        if self.scale != 1:
            out = torch.cat((out, spx[self.nums]), 1)

        out = self.conv3(out)
        print(out.shape)
        if self.shortcut:
            out += residual
        out = self.silu(out)
        return out


class C3_Res2Block(C3):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__(c1, c2, n, shortcut, g, e)
        c_ = int(c2 * e)  # hidden channels
        self.m = nn.Sequential(*(Bottle2neck(c_, c_, shortcut) for _ in range(n)))

在models/yolo.py文件下里的parse_model函数将类名加入进去,如下图:

创建添加Res2Net模块的YOLOv5的yaml配置文件 

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3_Res2Block, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3_Res2Block, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3_Res2Block, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3_Res2Block, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3_Res2Block, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3_Res2Block, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3_Res2Block, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3_Res2Block, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

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

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

相关文章

在职博士|中国社科院-英国斯特灵创新与领导力管理博士之中方课程《变革领导力》

在职博士|中国社科院-英国斯特灵创新与领导力管理博士之中方课程《变革领导力》 在职博士|中国社科院-英国斯特灵创新与领导力管理博士之中方课程《变革领导力》 本次课程的主讲老师是现任中国社会科学院人口与劳动经济研究所研究员、人力资源研究室主任,中国社会科…

虹科产线实时数采检测方案——高速采集助力智能化升级

01 产线数采检测相关技术背景 1.1 典型场景 对于产线数采检测,让我们从典型的工厂场景开始介绍。 每个工位都有上位机监控下方的PLC控制器。指令、执行单元和作用对象的状态通过内置传感器进行采集和测量,反馈给PLC实现闭环控制。 工业4.0和智能制…

快速学会git版本管理——上传gitee仓库

首先在gitee右上角有一个新建仓库 创建之后打开自己想要上传的文件 右键打开 Git Bash Here 接下来会弹出git的窗口 首先先初始化仓库 用git命令 git init 然后用git add . 上传所有文件上传到暂存区(上一篇文章说过add是单个文件,add . 是所有文件) 没有显示错误 …

内存泄漏分析

一、什么是内存泄漏? 内存泄漏是指在程序运行过程中,分配给程序的内存空间在不需要时没有被正确释放或回收的情况。 二、Java层内存泄漏。 Android应用程序中Java层常见的内存泄漏情况: Context引用泄漏:Android中的Context是…

【Flutter】Flutter 使用 flutter_rating_bar 实现评分条指示器

【Flutter】Flutter 使用 flutter_rating_bar 实现评分条指示器 文章目录 一、前言二、简介三、安装和基本使用四、实际业务中的用法五、完整示例六、总结 一、前言 大家好,我是小雨青年,很高兴与大家分享 Flutter 中的一个非常实用的组件:f…

马斯克谈 Facebook 不开源算法

导读虽然马斯克与扎克伯格的 “八角笼中” 之约没有达成,但很显然,马斯克并不打算就此罢休。既然没能在线下大战一场,那自然不会错过在线上 “出招” 的机会。 他转发了一则推文,并说道:“在地球上,Facebo…

STM32调试时卡在B 0x20000000

分析原因,发现sw下,硬件接reset管脚,所以需要设置debug reset 选择 hw reset

Excel中将文本格式的数值转换为数字

在使用excel时,有时需要对数字列进行各种计算,比如求平均值,我们都知道应该使用AVERAGE()函数,但是很多时候结果却“不尽如人意”。 1 问题: 使用AVERAGE函数: 结果: 可以看到单元格左上角有个…

2023年9月重庆/上海/深圳NPDP产品经理国际认证火热招生

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

锐捷BGP【基础二】--尚文网络敏姐

BGP协议 这节主要学习IBGP和IGP之间的区别与联系, BGP 路由信息交互,了解BGP的安全性,BGP协议的基本配置,如何建立IBGP、EBGP对等体,引入与传递路由。 目录 BGP协议 BGP基础概念 IBGP和IGP的不同 BGP 路由信息交…

优化 | 带有未知评估成本和预算约束的多步贝叶斯优化

论文解读者:胡明杰 编者按: 贝叶斯优化是一种处理黑盒函数优化的常用方法. 大多数的贝叶斯优化方法假设评估成本是同质的. 然而, 在实际问题中,评估成本往往是异质且未知的. 此外,现有的考虑异质评估成本的方法并不能很好地处理…

Ansible之变量

一)Ansible变量介绍 我们在PlayBook⼀节中,将PlayBook类⽐成了Linux中的shell。 那么它作为⼀⻔Ansible特殊的语⾔,肯定要涉及到变量定义、控 制结构的使⽤等特性。 在这⼀节中主要讨论变量的定义和使⽤ 二)变量命名规则 变量的…

软件设计师(二)程序设计语言基础知识

程序设计语言是为了书写计算机程序而人为设计的符号语言,用于对计算过程进行描述、组织和推导。 一、程序设计语言概述 1、基本概念 (1)低级语言和高级语言 计算机硬件只能识别由 0、1 组成的机器指令序列,即机器指令程序&…

ssm+vue开放式教学评价管理系统源码和论文

ssmvue开放式教学评价管理系统源码和论文121 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身…

如何炒伦敦金

由于疫情的影响,目前世界上多个国家降低存款利率,以推动经济发展,由此也引发了比较严重的通胀问题,尤其是在俄乌冲突之后,国际油价不断上涨,加大了这种通货膨胀的影响。进行伦敦金投资是一种规避通胀的好方…

一文速学-让神经网络不再神秘,一天速学神经网络基础(六)-基于数值微分的反向传播

前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…

电脑耳机没声音怎么解决?教你5个方法!

“刚在电脑上插上耳机准备听歌,但是为什么一直都没有声音呢?这是怎么回事呢?自己捣鼓了很久还是没有找到解决方法,有没有大佬可以指点我一下呀?” 有时候我们可能会在电脑上听音乐、看视频等。如果是在公共场合&#x…

【狂神】Spring5笔记(四)之Mybatis和事物的整合

一、整合Mybatis方式一 目录结构: 大致内容结构: 主要难点就在于applicationContext.xml中相关配置的理解 代码图片如下 这个类就专门用于对象的创建就可以了 测试类: 实现类: SqlSessionTemplate 二、整合Mybatis方式二 相关代码…

作为一家游戏开发公司,有哪些经验可以分享?

在竞争激烈的游戏开发行业中,成功的游戏开发公司需要不断学习、创新和积累经验。作为一家经验丰富的游戏开发公司,我们愿意分享一些我们认为对于取得成功至关重要的经验和教训。这些经验涵盖了游戏开发的各个方面,从创意构思到发布和营销。希…

图片懒加载指令

场景和指令用法: 电商网站的首页通常会很长,用户不一定能访问到页面靠下面的图片,这类图片通过懒加载优化手段可以做到只有进入视口区域才发送图片请求 在vue官网中查看的 将一个自定义指令全局注册到应用层级(常见的做法&#xf…