YOLOv5改进——普通卷积和C3模块更换为GhostConvV2卷积和C3GhostV2模块

目录

一、GhostNetV2核心代码

二、修改common.py

三、修改yolo.py

三、建立yaml文件 

四、训练


一、GhostNetV2核心代码

在models文件夹下新建modules文件夹,在modules文件夹下新建一个py文件。这里为GhostV2.py。复制以下代码到文件里面。

# TODO: ghostnetv2
import math
import torch
import torch.nn as nn
import torch.nn.functional as Fdef autopad(k, p=None, d=1):"""Pads kernel to 'same' output shape, adjusting for optional dilation; returns padding size.`k`: kernel, `p`: padding, `d`: dilation."""if d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn p
class Conv(nn.Module):"""Applies a convolution, batch normalization, and activation function to an input tensor in a neural network."""default_act = nn.SiLU()  # default activationdef __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))
class Bottleneck(nn.Module):"""A bottleneck layer with optional shortcut and group convolution for efficient feature extraction."""def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):"""Initializes a standard bottleneck layer with optional shortcut and group convolution, supporting channelexpansion."""super().__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c_, c2, 3, 1, g=g)self.add = shortcut and c1 == c2def forward(self, x):"""Processes input through two convolutions, optionally adds shortcut if channel dimensions match; input is atensor."""return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
class C3(nn.Module):"""Implements a CSP Bottleneck module with three convolutions for enhanced feature extraction in neural networks."""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, groupconvolutions, and expansion."""super().__init__()c_ = int(c2 * e)  # hidden channelsself.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))
class DWConv(Conv):"""Implements a depth-wise convolution layer with optional activation for efficient spatial filtering."""def __init__(self, c1, c2, k=1, s=1, d=1, act=True):"""Initializes a depth-wise convolution layer with optional activation; args: input channels (c1), outputchannels (c2), kernel size (k), stride (s), dilation (d), and activation flag (act)."""super().__init__(c1, c2, k, s, g=math.gcd(c1, c2), d=d, act=act)class GhostConvV2(nn.Module):# Ghostv2 Convolution https://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/ghostnetv2_pytorchdef __init__(self, c1, c2, k=1, s=1, g=1, act=True, mode=None):  # ch_in, ch_out, kernel, stride, groupssuper(GhostConvV2, self).__init__()c_ = c2 // 2  # hidden channelsself.cv1 = Conv(c1, c_, k, s, None, g, act=act)self.cv2 = Conv(c_, c_, 5, 1, None, c_, act=act)self.mode = modeself.gate_fn = nn.Sigmoid()if mode in ['attn']:self.short_conv = nn.Sequential(nn.Conv2d(c1, c2, k, s, k // 2, bias=False),nn.BatchNorm2d(c2),nn.Conv2d(c2, c2, kernel_size=(1, 5), stride=1, padding=(0, 2), groups=c2, bias=False),nn.BatchNorm2d(c2),nn.Conv2d(c2, c2, kernel_size=(5, 1), stride=1, padding=(2, 0), groups=c2, bias=False),nn.BatchNorm2d(c2))def forward(self, x):y = self.cv1(x)if self.mode in ['attn']:res = self.short_conv(F.avg_pool2d(x, kernel_size=2, stride=2))# res=self.short_conv(x)out = torch.cat((y, self.cv2(y)), 1)return out * F.interpolate(self.gate_fn(res), size=(out.shape[-2], out.shape[-1]),mode='nearest')return torch.cat((y, self.cv2(y)), 1)class GhostBottleneckV2(nn.Module):# Ghostv2 Convolution https://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/ghostnetv2_pytorchdef __init__(self, c1, c2, k=3, s=1):  # ch_in, ch_out, kernel, stridesuper().__init__()c_ = c2 // 2self.conv = nn.Sequential(GhostConvV2(c1, c_, 1, 1, mode='attn'),  # pwDWConv(c_, c_, k, s, act=False) if s == 2 else nn.Identity(),  # dwGhostConvV2(c_, c2, 1, 1, act=False))  # pw-linearself.shortcut = nn.Sequential(DWConv(c1, c1, k, s, act=False), Conv(c1, c2, 1, 1, act=False)) if s == 2 else nn.Identity()def forward(self, x):return self.conv(x) + self.shortcut(x)class C3GhostV2(C3):# C3 module with Ghostv2Bottleneck()def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super().__init__(c1, c2, n, shortcut, g, e)c_ = int(c2 * e)  # hidden channelsself.m = nn.Sequential(*(GhostBottleneckV2(c_, c_) for _ in range(n)))

注意:很多改进教程都是将代码直接复制到common.py文件,如果改进机制多了容易造成混乱。建议创建一个modules文件夹,将改进机制放里面方便管理。

二、修改common.py

在common.py文件中,在前面的部分添加以下代码,导入GhostV2.py的内容:

from models.modules.Ghostv2 import *

三、修改yolo.py

在yolo.py文件中,在导入common模块的上面一行添加以下代码,导入GhostV2.py的内容:

from models.modules.Ghostv2 import *

注意:这里位置不要搞错,不然可能会找不到导入的模块。

如下图所示: 

找到parse_model函数,将GhostConvV2卷积和C3GhostV2模块加入,如下图所示:

​三、建立yaml文件 

在models文件夹下,新建yaml文件,这里命名为yolov5-GhostNetv2.yaml。

将以下代码复制进文件。

# YOLOv5  by Ultralytics, AGPL-3.0 license# 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, GhostConvV2, [128, 3, 2]], # 1-P2/4[-1, 3, C3GhostV2, [128]],[-1, 1, GhostConvV2, [256, 3, 2]], # 3-P3/8[-1, 6, C3GhostV2, [256]],[-1, 1, GhostConvV2, [512, 3, 2]], # 5-P4/16[-1, 9, C3GhostV2, [512]],[-1, 1, GhostConvV2, [1024, 3, 2]], # 7-P5/32[-1, 3, C3GhostV2, [1024]],[-1, 1, SPPF, [1024, 5]], # 9]# YOLOv5 v6.0 head
head: [[-1, 1, GhostConvV2, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, "nearest"]],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3GhostV2, [512, False]], # 13[-1, 1, GhostConvV2, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, "nearest"]],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3GhostV2, [256, False]], # 17 (P3/8-small)[-1, 1, GhostConvV2, [256, 3, 2]],[[-1, 14], 1, Concat, [1]], # cat head P4[-1, 3, C3GhostV2, [512, False]], # 20 (P4/16-medium)[-1, 1, GhostConvV2, [512, 3, 2]],[[-1, 10], 1, Concat, [1]], # cat head P5[-1, 3, C3GhostV2, [1024, False]], # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]

至此更改完成。

四、训练

由于更改了主干网络,weights权重选不选都是从头开始训练。

在data下打开coco.yaml文件,对路径进行修改。尽量用绝对路径,相对路径容易报错。

在yolov5下找到train.py文件,对里面参数的进行修改。

目前主要对--weight、--cfg、--data进行参数设置。其他默认即可。

--weight:先选用官方的yolov5.pt权重。自己训练完后可更换为自己的权重。

注意:这里由于更改了主干网络,weights权重选不选都是从头开始训练。

--cfg:选用刚刚在models下建立的yolov5-GhostNetv2.yaml。

--data:选用上面修改过路径的coco.yaml。

--batch-size:默认是16。如果出现以下问题,提示内存不足的情况,建议设置为8。(batch-size的设置一般为8的整数倍)

打开train.py。ctrl+shift+p 在弹出框窗口搜索Python:选择解释器,选择自己创建的Python虚拟环境,这里是yolo。

点击右上角运行程序。等待训练结束即可。

训练结果会保存在run文件夹下。

五、GFLOPs不显示

修改完后发现运行yolo.py时,发现GFLOPs指标无法显示。(yolo的运行和运行train一样,需修改cfg网络配置等参数)

解决方法如下:在utils文件夹下,打开torch_utils.py文件,找到model_info函数进行修改。YOLOv8 四可以在ultralytics/utils/torch utils.py中的get flops 函数中修改。

try:  # FLOPsp = next(model.parameters())stride = max(int(model.stride.max()), 32) if hasattr(model, 'stride') else 32  # max strideim = torch.empty((1, p.shape[1], stride, stride), device=p.device)  # input image in BCHW formatflops = thop.profile(deepcopy(model), inputs=(im, ), verbose=False)[0] / 1E9 * 2  # stride GFLOPsimgsz = imgsz if isinstance(imgsz, list) else [imgsz, imgsz]  # expand if int/floatfs = f', {flops * imgsz[0] / stride * imgsz[1] / stride:.1f} GFLOPs'  # 640x640 GFLOPs
except Exception as e:# print(e)im = torch.rand(1, 3, 640, 640).to(p.device)flops, parms = thop.profile(model, inputs=(im,), verbose=False)# print(f'Params: {parms}, GFLOPs: {flops * 2 / 1e9}')# fs=''fs = f', {flops * 2 / 1E9:.1f} GFLOPs'

 修改完后,再次运行。

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

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

相关文章

好用的免费录屏软件推荐,让软件操作教程制作不再困难

录屏软件就像是我们做教程或者玩游戏时的“小助手”,它能帮我们把屏幕上的东西都记录下来,让视频看起来更高大上。今天我就给你推荐三款免费的好货,用它们做教程,保证让你轻松又开心。 1. 福昕录屏大师 虫洞 https://www.foxits…

【读书笔记·VLSI电路设计方法解密】问题4:今天的设计环境中使用的主要工艺技术是什么

主流的工艺技术是互补金属氧化物半导体(CMOS)技术。其他技术还包括双极性、双极CMOS(biCMOS)、绝缘体上硅(SOI)和砷化镓(GaAs)。 在CMOS技术中,"互补对称"指的…

SD入门教程一:Stable Diffusion 基础(技术篇)

前言 在开篇的时候就大致讲了SD和VAE,那么今天我们具象化地再来讲讲Stable Diffusion(稳定扩散)。 严格说来它是一个由几个组件(模型)构成的系统,而非单独的一个模型。我以最常见的文生图为例,…

大型保险公司进行营销活动时,如何与外部客户实现文件安全外发?

大型保险公司为了吸引新客户、维护老客户、提升品牌形象以及推广特定的保险产品,会定期向外部客户或潜在客户发送营销文件。在客户签单后,保险公司会将客户相关的签单个人文件发送给客户。因此,大型保险公司内部存在较为频繁且重要的文件安全…

安装DNS

在 CentOS 7 上安装并配置 BIND 以实现 DNS 的正向和反向解析可以按照以下步骤进行: 安装 BIND 打开终端并运行以下命令来安装 BIND 及其工具: yum install bind bind-utils -y配置 BIND 编辑主配置文件: 使用文本编辑器打开 BIND 的主配…

电商价格监测的创新之路

在当今数字化高速发展的时代,电商如汹涌的浪潮席卷了商业的每一个角落。品牌们在这片广阔的电商海洋中奋力前行,而价格监测则成为了他们手中至关重要的罗盘。 力维网络以其专业的价格监测服务,为品牌在电商之海的航行点亮了一盏明灯。然而&a…

多节点网络流量监控与网络性能优化的利器——轻松实现高效管理

目录 为什么网络性能监控如此重要? 多节点网络流量监控如何优化网络性能? 实例:AnaTraf如何帮助企业解决网络故障 了解更多 随着企业网络规模的不断扩大,维护网络性能的复杂性日益增加。如何实时监控网络流量、快速排查网络故…

网安加·百家讲坛 | 潘继平:AI赋能DevOps平台:全面提升代码安全性

作者简介:潘继平,中国软协项目管理专委会专家,深圳市软件行业协会特聘专家。华为土耳其研究所外聘高级项目顾问,负责华为云应用生态圈产品线研发管理。曾为华为全球技术服务中心、华为制造IT以及华为流程IT解决方案提供等多个部门…

(二)、CT系统硬件构成

简单来说分为以下几个步骤来描述整个CT系统的运行流程: X射线管和探测器环绕被测物体,准直器进行高度准直X射线。X射线穿过被测物料时发生衰减,其中有两个探测器,一个是参考探测器记录和测量来自X射线管的辐射强度,另…

【C语言从不挂科到高绩点】28-数组综合运用

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 数组是我们在C语言学习过程中比较重要的一个知识点,也是在今后的学习与开发过程中经常会用到的技能,…

明达IO:赋能工业机器人新未来

摘要: 明达技术以其卓越的分布式IO(MR30)与一体式IO(MR20)产品,为工业机器人行业提供了完美的信号交互解决方案。在集群式机器人应用场景中,MR30分布式IO以其稳定性能和自由热插拔功能&#xf…

“跨时空拥抱”风靡TikTok,这款AI视频工具借势变现20万美金,你也来看看吧!

用AI生成跨时空拥抱最近悄悄在海外翻红,还带火了一款AI视频产品。 8月28日,TikTok博主“iammskira”发布了一条配文为“用AI实现了拥抱我的妈妈,因为她已经不在人世了”的短视频教程,在TikTok上走红。 视频中,AI不仅…

Java毕业设计:Java社区物品置换网站系统毕业设计源代码作品和开题报告

博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

xss-labs靶场第五关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、注入点寻找 2、使用hackbar进行payload测试 3、绕过结果 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.…

如何下载和安装CLion,图文详解

一、下载 登录JetBrains官网,下载最新版本的Clion,Clion目前没有社区版,都是专业版。 二、安装 1、启动Clion安装程序,下一步。 2、修改安装目录,下一步。 3、创建桌面快捷方式,更新PATH变量&#xff0…

【汇编语言】寄存器(CPU工作原理)(六)—— 修改CS,IP的指令以及代码段

文章目录 前言1. 修改CS、IP的指令2. 问题分析:CPU运行的流程3. 代码段小结结语 前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计…

Excel中多条件筛选问题解决方法

例题解析: 有雇员信息表如下所示&#xff1a; 查询出 Gender 为 Female&#xff0c;且 1970 年以前出生的员工&#xff1a; spl("E(?1).select(Gender""Female"" && Birthday<""1970-01-01"")",A1:O32)SPL桌面…

SpringBoot框架在服装制造业的应用案例

2 关键技术简介 2.1 JAVA技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0…

手写mybatis之数据源的解析、创建和使用

前言 在上一章节我们解析 XML 中的 SQL 配置信息&#xff0c;并在代理对象调用 DefaultSqlSession 中进行获取和打印操作&#xff0c;从整个框架结构来看我们解决了对象的代理、Mapper的映射、SQL的初步解析&#xff0c;那么接下来就应该是连库和执行SQL语句并返回结果了。 那么…

需求10——通过改一个小bug来学习如何定位问题

在浏览我之前完成的一些小需求时&#xff0c;我发现了一个非常有价值的需求。这个需求可以让我深入了解系统中关于故障上报的功能。通过完善这个需求&#xff0c;我能够全面掌握整个故障上报的流程。 这个需求主要是关于故障上报流程中出现的问题。当前的流程如下&#xff1a;…