【目标检测实验系列】YOLOv5创新点改进:融合高效轻量级网络结构GSConv,减轻模型复杂度的同时保持检测精度!(内含源代码,超详细改进代码流程)

       自我介绍:本人硕士期间全程放养,目前成果:一篇北大核心CSCD录用,两篇中科院三区已见刊,一篇中科院三区在投。如何找创新点,如何放养过程厚积薄发,如何写中英论文,找期刊等等。本人后续会以自己实战经验详细写出来,还请大家能够点个关注和赞,收藏一下,谢谢大家

1. 文章主要内容

       本篇博客主要涉及将GSConv融合到YOLOv5模型中。通过GSConv替换普通的卷积结构,减轻模型复杂度的同时保持检测精度。(通读本篇博客需要7分钟左右的时间)

2. GSConv原理

       简单的来讲是,GSConv能够降低计算量的同时提升模型检测的速度,和保持检测的精度,甚至可能涨点。具体的原理解析推荐博客:【论文笔记】Slim-neck by GSConv。

3 详细代码改进流程(含本人经验)

3.1 GSConv(与VoVGSCSP)源代码(大家自己创建GSConv.py文件)

import torch
from torch import nn

from models.common import Conv


class GSConv(nn.Module):
    # GSConv https://github.com/AlanLi1997/slim-neck-by-gsconv
    def __init__(self, c1, c2, k=1, s=1, g=1, act=True):
        super().__init__()
        c_ = c2 // 2
        self.cv1 = Conv(c1, c_, k, s, None, g, act)
        self.cv2 = Conv(c_, c_, 5, 1, None, c_, act)

    def forward(self, x):
        x1 = self.cv1(x)
        x2 = torch.cat((x1, self.cv2(x1)), 1)
        # shuffle
        b, n, h, w = x2.data.size()
        b_n = b * n // 2
        y = x2.reshape(b_n, 2, h * w)
        y = y.permute(1, 0, 2)
        y = y.reshape(2, -1, n // 2, h, w)
        return torch.cat((y[0], y[1]), 1)


class GSBottleneck(nn.Module):
    # GS Bottleneck https://github.com/AlanLi1997/slim-neck-by-gsconv
    def __init__(self, c1, c2, k=3, s=1):
        super().__init__()
        c_ = c2 // 2
        # for lighting
        self.conv_lighting = nn.Sequential(
            GSConv(c1, c_, 1, 1),
            GSConv(c_, c2, 1, 1, act=False))
        # for receptive field
        self.conv = nn.Sequential(
            GSConv(c1, c_, 3, 1),
            GSConv(c_, c2, 3, 1, act=False))
        self.shortcut = Conv(c1, c2, 3, 1, act=False)

    def forward(self, x):
        return self.conv_lighting(x) + self.shortcut(x)


class VoVGSCSP(nn.Module):
    # VoV-GSCSP https://github.com/AlanLi1997/slim-neck-by-gsconv
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        super().__init__()
        c_ = int(c2 * e)
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(2 * c_, c2, 1)
        self.m = nn.Sequential(*(GSBottleneck(c_, c_) for _ in range(n)))

    def forward(self, x):
        x1 = self.cv1(x)
        return self.cv2(torch.cat((self.m(x1), x1), dim=1))

3.2 建立一个yolov5-gsconv.yaml文件

       GSConv原论文中,是通过原理加实验的方式证明了将GSConv放到颈部结构效果更高,这里将YOLOv5的Neck部分Conv替换GSConv,一共四个地方。源代码如下:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 4  # 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  output_channel, kernel_size, stride, padding
   [-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 v6.0 head
head:
  [[-1, 1, GSConv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

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

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

   [-1, 1, GSConv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
  
   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

       注意到,yaml文件中的nc为数据集的类别数,需要改成自己数据集的类别。另外,也可以将源码中的VoVGSCSP结构替换掉Neck部分的C3,不过据本人实验,效果并不好,掉点有点多,可能是数据集的问题,大家可以自行尝试一下。另外,GSConv替换Neck部分几个普通的Conv效果最好,和数据集也有关系,多做下消融实验,将这种位置上的消融实验写进论文也是丰富了实验的内容,更加有说服力。

3.3 将GSConv和VoVGSCSP引入到common.py文件中

       在下图的位置处,引入相关的类即可。
在这里插入图片描述

3.4 修改train.py启动文件

       修改配置文件为yolov5-gsconv.yaml即可,如下图所示:
在这里插入图片描述

4. 总结

       本篇博客主要介绍了GSConv融合到YOLOv5模型,减轻模型计算量的同时提升检测速度、保持检测精度。另外,在修改过程中,要是有任何问题,评论区交流;如果博客对您有帮助,请帮忙点个赞,收藏一下;后续会持续更新本人实验当中觉得有用的点子,如果很感兴趣的话,可以关注一下,谢谢大家啦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stable diffusion webui之lora调用

1.触发词底模lora效果最好&#xff08;分数不一定要取到1&#xff0c;0.8也行&#xff09;&#xff1b; 2.引用时一定要使用<lora:>&#xff0c;例如<lora:C4D_geometry_bg_v2.5:0.8>&#xff1b; "prompt": "(masterpiece:1.3), (best quality:1.…

浅谈棉纺织厂电气防火措施及电气防火限流式保护器的应用

摘要&#xff1a;棉纺织厂属于火灾危险场所&#xff0c;在进行电气设计时要考虑并采取一定的防火措施。本文从接线、熔断器的选用、中性点接地方式的选择和接地等问题&#xff0c;介绍了电气防火的一些措施。并就引发火灾较严重的线路短路故障问题&#xff0c;介绍了电气防火限…

系统分析师(软考)知识点整理(二)

会计相关 会计是指记录、分类、汇总、计量和报告发送在企业经济活动中的财务数据的行为 #mermaid-svg-YBI5YPWzqWhRB4kI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YBI5YPWzqWhRB4kI .error-icon{fill:#552222…

http -- 跨域问题详解(浏览器)

参考链接 参考链接 1. 跨域报错示例 Access to XMLHttpRequest at http://127.0.0.1:3000/ from origin http://localhost:3000 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header…

鸿蒙原生应用再添新丁!喜马拉雅入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;喜马拉雅入局鸿蒙 来自 HarmonyOS 微博12月20日消息&#xff0c; #喜马拉雅正式完成鸿蒙原生应用版本适配#&#xff0c;作为音频业巨头的喜马拉雅 &#xff0c;将基于#HarmonyOS NEXT#创造更丰富、更智慧的全场景“声音宇宙”&#xff01;#鸿…

实验4.2 默认路由和浮动静态路由的配置

实验4.2 默认路由和浮动静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.路由器的基本配置。2.配置默认路由&#xff0c;实现全网互通。3.配置浮动静态路由&#xff0c;实现链路备份。 六、任务验收七、任务小结八、知识链接1&#xff0e;默认路…

【密码学】使用mkcert安装CA、自签名ssl证书,配置nginx的https 证书笔记

文章目录 证书&#xff08;CA证书&#xff0c;服务端证书&#xff0c;客户端证书&#xff09;1 安装CA1.1 下载mkcert1.2 mkcert安装和配置根证书1.3设备安装根证书 2 自签名ssl证书2.1 CA 证书过程:2.2 自签名流程2.3签发证书2.4给已有的证书请求&#xff08;.csr&#xff09;…

嵌入式中串口输入

学习目标 掌握串口初始化流程掌握串口接收逻辑了解中断接收逻辑熟练掌握串口开发流程学习内容 需求 串口接收PC机发送的数据。 串口数据接收 串口初始化 static void USART_config() {uint32_t usartx_tx_rcu = RCU_GPIOA;uint32_t usartx_tx_port = GPIOA;uint32_t usartx…

12.19_黑马数据结构与算法笔记Java

目录 203 排序算法 选择排序 204 排序算法 堆排序 205 排序算法 插入排序 206 排序算法 希尔排序 207 排序算法 归并排序 自顶至下 208 排序算法 归并排序 自下至上 209 排序算法 归并加插入 210 排序算法 单边快排 211 排序算法 双边快排 212 排序算法 快排 随机基准…

QT中网络编程之发送Http协议的Get和Post请求

文章目录 HTTP协议GET请求POST请求QT中对HTTP协议的处理1.QNetworkAccessManager2.QNetworkRequest3.QNetworkReply QT实现GET请求和POST请求Get请求步骤Post请求步骤 测试结果 使用QT的开发产品最终作为一个客户端来使用&#xff0c;很大的一个功能就是要和后端服务器进行交互…

视频号小店怎么做?起店全流程实操分享!

我是电商珠珠 视频号小店距今也不过才发展了一年时间&#xff0c;22年发展的电商平台&#xff0c;经过各种优化到了23年在电商圈激起了不小的火花。 很多想要入驻的新手&#xff0c;在前期并不了解视频号小店怎么做的&#xff0c;不知道开店之后该如何运营。 接下来&#xf…

AutoJS 实现抖音极速版福袋脚本

前言 好久没更新博客了&#xff0c;最近做了个抖音极速版福袋脚本&#xff0c;想看看能不能自动抢到&#xff0c;于是在仿照其他脚本功能做了一个&#xff0c;哈哈。利用上班时间让它自己跑&#xff0c;测试大概2-3天&#xff0c;一个福袋没抢到(也不知道是不是被检测到了)&am…

Linux学习(1)——初识Linux

目录 一、Linux的哲学思想 1.1 基础知识 1.2 根目录下的文件夹 二、Shell 1、Shell的定义 2、Shell的作用 三、Linux命令行 1、Linux通用命令行使用格式 四、Linux命令的分类 1、内部命令和外部命令的理解 2、内部命令和外部命令的区别 3、命令的执行过程 五、编辑…

C语言——内存函数的使用与模拟实现

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…

手把手教你在 windows 上安装 Docker

前言 大家好&#xff0c;我是潇潇雨声&#xff0c;今天为大家带来一篇关于在 Windows 环境下使用 Docker 的教程。对于 Docker&#xff0c;我们可以简单地将其看作一种方便的软件安装方式&#xff0c;而无需深入涉及其复杂的概念。选择使用 Docker 主要是为了省事&#xff0c;比…

【python】在线代码混淆方案及注意事项

▒ 目录 ▒ &#x1f6eb; 导读开发环境 1️⃣ 在线网站pyob混淆操作步骤编写测试代码混淆转pyc缺点中文路径问题&#xff1a;python: Cant reopen .pyc file 2️⃣ 反编译python文件格式对比uncompyle6 3️⃣ 其它方案cpythonpython-obfuscatorPyInstaller【不推荐】pyminifie…

数据结构与算法之美学习笔记:38 | 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

目录 前言如何理解分治算法&#xff1f;分治算法应用举例分析分治思想在海量数据处理中的应用解答开篇内容小结 前言 本节课程思维导图&#xff1a; MapReduce 是 Google 大数据处理的三驾马车之一&#xff0c;另外两个是 GFS&#xff08;hdfs&#xff09; 和 Bigtable(hbase)…

计算机提示vcruntime140.dll丢失的解决方法,多种修复教程分享

vcruntime140.dll是一个非常重要的动态链接库文件&#xff0c;它包含了许多运行时的函数和类。然而&#xff0c;有时候我们可能会遇到vcruntime140.dll无法继续执行代码的问题&#xff0c;这会给我们带来很大的困扰。那么&#xff0c;这个问题是什么原因导致的呢&#xff1f;又…

你知道跨站脚本攻击吗?一篇带你了解什么叫做XSS

1.XSS简介 &#xff08;1&#xff09;XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&#xff0c;本名应该缩写为CSS&#xff0c;但是由于CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式脚本&#x…

华清远见作业第十三天

1.使用多文件编辑&#xff0c; 定义商品信息:商品名称&#xff0c;商品单价&#xff0c;商品购买个数&#xff0c;商品描述&#xff0c;循环输入购买的商品&#xff0c;按单价排序&#xff0c;输出商品信息&#xff0c;计算最贵的商品以及一共花了多少钱? 在create函数&#x…