轻量化YOLOv7系列:结合G-GhostNet | 适配GPU,华为诺亚提出G-Ghost方案升级GhostNet

在这里插入图片描述

轻量化YOLOv7系列:结合G-GhostNet | 适配GPU,华为诺亚提出G-Ghost方案升级GhostNet

  • 需要修改的代码
    • models/GGhostRegNet.py代码
  • 创建yaml文件
  • 测试是否创建成功

  本文提供了改进 YOLOv7注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获取到注意力加入的代码和使用经验,总有一种适合你和你的数据集。

🗝️YOLOv7实战宝典--星级指南:从入门到精通,您不可错过的技巧

  -- 聚焦于YOLO的 最新版本对颈部网络改进、添加局部注意力、增加检测头部,实测涨点

💡 深入浅出YOLOv7:我的专业笔记与技术总结

  -- YOLOv7轻松上手, 适用技术小白,文章代码齐全,仅需 一键train,解决 YOLOv7的技术突破和创新潜能

❤️ YOLOv8创新攻略:突破技术瓶颈,激发AI新潜能"

   -- 指导独特且专业的分析, 也支持对YOLOv3、YOLOv4、YOLOv5、YOLOv6等网络的修改

🎈 改进YOLOv7专栏内容《YOLOv7实战宝典》📖 ,改进点包括:    替换多种骨干网络/轻量化网络, 添加40多种注意力包含自注意力/上下文注意力/自顶向下注意力机制/空间通道注意力/,设计不同的网络结构,助力涨点!!!

在这里插入图片描述

  YOLOv7注意力系列包含不同的注意力机制

需要修改的代码

models/GGhostRegNet.py代码

  1. 新建这个文件,放入网络代码
import torch
import torch.nn as nn
import torch.nn.functional as F
def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1):"""3x3 convolution with padding"""return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,padding=dilation, groups=groups, bias=False, dilation=dilation)def conv1x1(in_planes, out_planes, stride=1):"""1x1 convolution"""return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False)class GHOSTBottleneck(nn.Module):expansion = 1__constants__ = ['downsample']def __init__(self, inplanes, planes, stride=1, downsample=None, group_width=1,dilation=1, norm_layer=None):super(GHOSTBottleneck, self).__init__()if norm_layer is None:norm_layer = nn.BatchNorm2dwidth = planes * self.expansion# Both self.conv2 and self.downsample layers downsample the input when stride != 1self.conv1 = conv1x1(inplanes, width)self.bn1 = norm_layer(width)self.conv2 = conv3x3(width, width, stride, width // min(width, group_width), dilation)self.bn2 = norm_layer(width)self.conv3 = conv1x1(width, planes)self.bn3 = norm_layer(planes)self.relu = nn.SiLU(inplace=True)self.downsample = downsampleself.stride = stridedef forward(self, x):identity = xout = self.conv1(x)out = self.bn1(out)out = self.relu(out)out = self.conv2(out)out = self.bn2(out)out = self.relu(out)out = self.conv3(out)out = self.bn3(out)if self.downsample is not None:identity = self.downsample(x)out += identityout = self.relu(out)return out# class LambdaLayer(nn.Module):
#     def __init__(self, lambd):
#         super(LambdaLayer, self).__init__()
#         self.lambd = lambd
#
#     def forward(self, x):
#         return self.lambd(x)class Stage(nn.Module):def __init__(self, block, inplanes, planes, group_width, blocks, stride=1, dilate=False, cheap_ratio=0.5):super(Stage, self).__init__()norm_layer = nn.BatchNorm2ddownsample = Noneself.dilation = 1previous_dilation = self.dilationself.inplanes = inplanesif dilate:self.dilation *= stridestride = 1if stride != 1 or self.inplanes != planes:downsample = nn.Sequential(conv1x1(inplanes, planes, stride),norm_layer(planes),)self.base = block(inplanes, planes, stride, downsample, group_width,previous_dilation, norm_layer)self.end = block(planes, planes, group_width=group_width,dilation=self.dilation,norm_layer=norm_layer)group_width = int(group_width * 0.75)raw_planes = int(planes * (1 - cheap_ratio) / group_width) * group_widthcheap_planes = planes - raw_planesself.cheap_planes = cheap_planesself.raw_planes = raw_planesself.merge = nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Conv2d(planes + raw_planes * (blocks - 2), cheap_planes,kernel_size=1, stride=1, bias=False),nn.BatchNorm2d(cheap_planes),nn.SiLU(inplace=True),nn.Conv2d(cheap_planes, cheap_planes, kernel_size=1, bias=False),nn.BatchNorm2d(cheap_planes),)self.cheap = nn.Sequential(nn.Conv2d(cheap_planes, cheap_planes,kernel_size=1, stride=1, bias=False),nn.BatchNorm2d(cheap_planes),)self.cheap_relu = nn.SiLU(inplace=True)layers = []# downsample = nn.Sequential(#     LambdaLayer(lambda x: x[:, :raw_planes])# )layers = []layers.append(block(raw_planes, raw_planes, 1, downsample, group_width,self.dilation, norm_layer))inplanes = raw_planesfor _ in range(2, blocks - 1):layers.append(block(inplanes, raw_planes, group_width=group_width,dilation=self.dilation,norm_layer=norm_layer))self.layers = nn.Sequential(*layers)def forward(self, input):x0 = self.base(input)m_list = [x0]e = x0[:, :self.raw_planes]for l in self.layers:e = l(e)m_list.append(e)m = torch.cat(m_list, 1)m = self.merge(m)c = x0[:, self.raw_planes:]c = self.cheap_relu(self.cheap(c) + m)x = torch.cat((e, c), 1)x = self.end(x)return xclass GGhostRegNet(nn.Module):def __init__(self, block, layers, widths, layer_number, num_classes=1000, zero_init_residual=True,group_width=8, replace_stride_with_dilation=None,norm_layer=None):super(GGhostRegNet, self).__init__()# ---------------------------------self.layer_number = layer_number# --------------------------------------if norm_layer is None:norm_layer = nn.BatchNorm2dself._norm_layer = norm_layerself.inplanes = widths[0]self.dilation = 1if replace_stride_with_dilation is None:# each element in the tuple indicates if we should replace# the 2x2 stride with a dilated convolution insteadreplace_stride_with_dilation = [False, False, False, False]if len(replace_stride_with_dilation) != 4:raise ValueError("replace_stride_with_dilation should be None ""or a 4-element tuple, got {}".format(replace_stride_with_dilation))self.group_width = group_width# self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=2, padding=1,#                        bias=False)# self.bn1 = norm_layer(self.inplanes)# self.relu = nn.ReLU(inplace=True)if self.layer_number in [0]:self.layer1 = self._make_layer(block, widths[0], layers[0], stride=1,dilate=replace_stride_with_dilation[0])if self.layer_number in [1]:self.inplanes = widths[0]if layers[1] > 2:self.layer2 = Stage(block, self.inplanes, widths[1], group_width, layers[1], stride=1,dilate=replace_stride_with_dilation[1], cheap_ratio=0.5)else:self.layer2 = self._make_layer(block, widths[1], layers[1], stride=1,dilate=replace_stride_with_dilation[1])if self.layer_number in [2]:self.inplanes = widths[1]self.layer3 = Stage(block, self.inplanes, widths[2], group_width, layers[2], stride=1,dilate=replace_stride_with_dilation[2], cheap_ratio=0.5)if self.layer_number in [3]:self.inplanes = widths[2]if layers[3] > 2:self.layer4 = Stage(block, self.inplanes, widths[3], group_width, layers[3], stride=1,dilate=replace_stride_with_dilation[3], cheap_ratio=0.5)else:self.layer4 = self._make_layer(block, widths[3], layers[3], stride=1,dilate=replace_stride_with_dilation[3])# self.avgpool = nn.AdaptiveAvgPool2d((1, 1))# self.dropout = nn.Dropout(0.2)# self.fc = nn.Linear(widths[-1] * block.expansion, num_classes)for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)):nn.init.constant_(m.weight, 1)nn.init.constant_(m.bias, 0)def _make_layer(self, block, planes, blocks, stride=1, dilate=False):norm_layer = self._norm_layerdownsample = Noneprevious_dilation = self.dilationif dilate:self.dilation *= stridestride = 1if stride != 1 or self.inplanes != planes:downsample = nn.Sequential(conv1x1(self.inplanes, planes, stride),norm_layer(planes),)layers = []layers.append(block(self.inplanes, planes, stride, downsample, self.group_width,previous_dilation, norm_layer))self.inplanes = planesfor _ in range(1, blocks):layers.append(block(self.inplanes, planes, group_width=self.group_width,dilation=self.dilation,norm_layer=norm_layer))return nn.Sequential(*layers)def _forward_impl(self, x):if self.layer_number in [0]:x = self.layer1(x)if self.layer_number in [1]:x = self.layer2(x)if self.layer_number in [2]:x = self.layer3(x)if self.layer_number in [3]:x = self.layer4(x)return xdef forward(self, x):return self._forward_impl(x)

在这里插入图片描述

  1. yolo里引用
    在这里插入图片描述

在这里插入图片描述

创建yaml文件

# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# anchors
anchors:- [12,16, 19,36, 40,28]  # P3/8- [36,75, 76,55, 72,146]  # P4/16- [142,110, 192,243, 459,401]  # P5/32# yolov7_MY backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [32, 3, 1]],  # 0[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2      [-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [128, 3, 2]],  # 3-P2/4  [-1, 1, Conv, [48, 1, 1]],
#   [-2, 1, Conv, [64, 1, 1]],
#   [-1, 1, Conv, [64, 3, 1]],
#   [-1, 1, Conv, [64, 3, 1]],
#   [-1, 1, Conv, [64, 3, 1]],
#   [-1, 1, Conv, [64, 3, 1]],
#   [[-1, -3, -5, -6], 1, Concat, [1]],
#   [-1, 1, Conv, [256, 1, 1]],  # 11[-1, 1, GGhostRegNet, [48, 0]], # 5[-1, 1, MP, []],[-1, 1, Conv, [48, 1, 1]],[-3, 1, Conv, [48, 1, 1]],[-1, 1, Conv, [48, 3, 2]],[[-1, -3], 1, Concat, [1]],  # 16-P3/8  [-1, 1, Conv, [96, 1, 1]],
#   [-2, 1, Conv, [128, 1, 1]],
#   [-1, 1, Conv, [128, 3, 1]],
#   [-1, 1, Conv, [128, 3, 1]],
#   [-1, 1, Conv, [128, 3, 1]],
#   [-1, 1, Conv, [128, 3, 1]],
#   [[-1, -3, -5, -6], 1, Concat, [1]],
#   [-1, 1, Conv, [512, 1, 1]],  # 24[-1, 3, GGhostRegNet, [96, 1]], # 12[-1, 1, MP, []],[-1, 1, Conv, [96, 1, 1]],[-3, 1, Conv, [96, 1, 1]],[-1, 1, Conv, [96, 3, 2]],[[-1, -3], 1, Concat, [1]],  # 29-P4/16  [-1, 1, Conv, [240, 1, 1]],
#   [-2, 1, Conv, [256, 1, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [[-1, -3, -5, -6], 1, Concat, [1]],
#   [-1, 1, Conv, [1024, 1, 1]],  # 37[-1, 5, GGhostRegNet, [240, 2]], # 19[-1, 1, MP, []],[-1, 1, Conv, [240, 1, 1]],[-3, 1, Conv, [240, 1, 1]],[-1, 1, Conv, [240, 3, 2]],[[-1, -3], 1, Concat, [1]],  # 42-P5/32  [-1, 1, Conv, [528, 1, 1]],
#   [-2, 1, Conv, [256, 1, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [-1, 1, Conv, [256, 3, 1]],
#   [[-1, -3, -5, -6], 1, Concat, [1]],
#   [-1, 1, Conv, [1024, 1, 1]],  # 50[-1, 7, GGhostRegNet, [528, 3]], # 26]# yolov7_MY head
head:[[-1, 1, SPPCSPC, [512]], # 27[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[19, 1, Conv, [256, 1, 1]], # route backbone P4[[-1, -2], 1, Concat, [1]],[-1, 1, Conv, [256, 1, 1]],[-2, 1, Conv, [256, 1, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],[-1, 1, Conv, [256, 1, 1]], # 39[-1, 1, Conv, [128, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[12, 1, Conv, [128, 1, 1]], # route backbone P3[[-1, -2], 1, Concat, [1]],[-1, 1, Conv, [128, 1, 1]],[-2, 1, Conv, [128, 1, 1]],[-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [64, 3, 1]],[[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],[-1, 1, Conv, [128, 1, 1]], # 51[-1, 1, MP, []],[-1, 1, Conv, [128, 1, 1]],[-3, 1, Conv, [128, 1, 1]],[-1, 1, Conv, [128, 3, 2]],[[-1, -3, 39], 1, Concat, [1]],[-1, 1, Conv, [256, 1, 1]],[-2, 1, Conv, [256, 1, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[-1, 1, Conv, [128, 3, 1]],[[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],[-1, 1, Conv, [256, 1, 1]], # 64[-1, 1, MP, []],[-1, 1, Conv, [256, 1, 1]],[-3, 1, Conv, [256, 1, 1]],[-1, 1, Conv, [256, 3, 2]],[[-1, -3, 27], 1, Concat, [1]],[-1, 1, Conv, [512, 1, 1]],[-2, 1, Conv, [512, 1, 1]],[-1, 1, Conv, [256, 3, 1]],[-1, 1, Conv, [256, 3, 1]],[-1, 1, Conv, [256, 3, 1]],[-1, 1, Conv, [256, 3, 1]],[[-1, -2, -3, -4, -5, -6], 1, Concat, [1]],[-1, 1, Conv, [512, 1, 1]], # 77[51, 1, RepConv, [256, 3, 1]],[64, 1, RepConv, [512, 3, 1]],[77, 1, RepConv, [1024, 3, 1]],[[78,79,80], 1, IDetect, [nc, anchors]],   # Detect(P3, P4, P5)]

测试是否创建成功

在这里插入图片描述

在这里插入图片描述

这里是引用

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Facebook开源时间序列数据预测模型Prophet

文章目录 一、简介二、项目的文件解读三、Prophet类主要方法和参数3.1 主要参数3.2 主要方法 四、用法示例 一、简介 Prophet 是由 Facebook 开发的一个开源工具,用于时间序列数据的预测。它特别适用于处理具有强季节性和趋势的时间序列数据,并且对节假…

大数据之Oracle同步Doris数据不一致问题

数据同步架构如下: 出现的问题: doris中的数据条数 源库中的数据条数 总数完全不一致。 出现问题的原因: 在Dinky中建立表结构时,缺少对主键属性的限制 primary key(ID) not enforced 加上如上语句,数据条数解决一致 …

App Instance 架构示例

前言 在Unity程序设计过程中,我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理,次要职责是管理在内部的子系统生命周期。其他职责,提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…

51单片机嵌入式开发:18、STC89C52RC嵌入式DS1302实时时钟实验及数码管显示

STC89C52RC嵌入式DS1302实时时钟实验及数码管显示 STC89C52RC嵌入式DS1302实时时钟实验及数码管显示1 概述1.1 DS1302简介1.2 DS1302功能和特点1.3 DS1302工作原理1.4 DS1302应用领域 2 DS1302设计原理2.1 引脚说明2.2 寄存器说明及使用(1)命令cmd字节说…

【PPT把当前页输出为图片】及【PPT导出图片模糊】的解决方法(sci论文图片清晰度)

【PPT把当前页输出为图片】及【PPT导出图片模糊】的解决方法 内容一:ppt把当前页输出为图片:内容二:ppt导出图片模糊的解决方法:方法:步骤1:打开注册表编辑器步骤2:修改注册表: 该文…

【BUG】已解决:SyntaxError:positional argument follows keyword argument

SyntaxError:positional argument follows keyword argument 目录 SyntaxError:positional argument follows keyword argument 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰&#xff0c…

jupyter_contrib_nbextensions安装失败问题

目录 1.文件路径长度问题 2.jupyter不出现Nbextensions选项 1.文件路径长度问题 问题: could not create build\bdist.win-amd64\wheel\.\jupyter_contrib_nbextensions\nbextensions\contrib_nbextensions_help_item\contrib_nbextensions_help_item.yaml: No su…

西蒙学习法

西蒙学习法 一根筋,挖死坑;会思考,持续不断的思考;会问问题,有深度的问题;一直想一个问题的解决办法; 资料 《世界十大学习方法》之西蒙学习法

创建线程的几种方式

严格来讲,创建线程只有一种方式,就是实现Runnable接口,其他创建线程的方式也是对其封装。 继承Thread方式 public class Thread extends java.lang.Thread {Overridepublic void run() {super.run();} } 进入Thread可以看到,也是…

数学建模学习(112):FAHP模糊层次分析法

文章目录 一、FAHP方法由来二、模糊层次分析法原理2.1 AHP缺陷2.2 模糊集理论2.3 模糊层次分析法(FAHP)三、模糊层次分析法步骤3.1 问题定义与层次结构建立3.2 构造模糊判断矩阵3.2.1 计算模糊判断矩阵的列和向量3.2.2 计算模糊综合向量3.2.3 计算模糊权重向量3.3 解模糊数3.…

2个案例区分是平行眼还是交叉眼,以及平行眼学习方法

案例一: 交叉眼:看到凸出的“灌水”,是交叉眼。PS:看的时候,眼是斗鸡眼,眼睛易疲劳 平行眼:看到凹陷的“灌水”,是平行眼。PS:看的时候眼睛是平视,不容易疲…

centos系统mysql数据库压缩备份与恢复

文章目录 压缩备份一、安装 xtrabackup二、数据库中创建一些数据三、进行压缩备份四、模拟数据丢失,删库五、解压缩六、数据恢复 压缩备份 一、安装 xtrabackup 确保已经安装了 xtrabackup 工具。可以从 Percona 的官方网站 获取并安装适合你系统的版本。 # 添加…

一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置

原文链接:一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置 本期教程 获得本期教程文本文档,在后台回复:20240724。请大家看清楚回复关键词,每天都有很多人回复错误关键词&#xf…

Redisson分布式锁使用详解

引言 日常开发中,难免遇到一些并发的场景,为了保证接口执行的一致性,通常采用加锁的方式,因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized这些就先放到一边了,Redis的setnx锁存在无法抱保证原…

git 使用教程

注意⚠️:如果是公司仓库一定要注意,先新建自己的分支,修改后提交到自己分支,认真测试后再合并到master 一、已有远程仓库 1、配置git 的全局用户信息,提及时进行标识和记录 git config --global user.name "yo…

麦歌恩MT6521-第三代汽车磁性角度传感器芯片

磁性编码芯片 -在线编程角度位置IC 描述: MT6521是麦歌恩微电子推出的新一代基于水平霍尔及聚磁片(IMC)技术原理的磁性角度和位置检测传感器芯片。该芯片内部包含了两对互成90放置的水平霍尔阵列及聚磁片,能够根据不同的型号配置来实现对XY&#xff0…

外卖霸王餐系统架构怎么选?

在当今日益繁荣的外卖市场中,外卖霸王餐作为一种独特的营销策略,受到了众多商家的青睐。然而,要想成功实施外卖霸王餐活动,一个安全、稳定且高效的架构选择至关重要。本文将深入探讨外卖霸王餐架构的选择,以期为商家提…

linux自动化构建工具--make/makefile

目录 1.make/makefile介绍 1.1基本认识 1.2依赖关系、依赖方法 1.3具体操作步骤 1.4进一步理解 1.5默认设置 1.6make二次使用的解释 1.7两个文件的时间问题 1.8总是被执行 1.9特殊符号介绍 1.make/makefile介绍 1.1基本认识 make是一个指令,makefile是一…

【C++BFS算法】2192. 有向无环图中一个节点的所有祖先

本文涉及知识点 CBFS算法 LeetCode2192. 有向无环图中一个节点的所有祖先 给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。 给你一个二维整数数组 edges ,其中 edges[i]…

MQ传递用户信息

theme: nico 你们好,我是金金金。 场景 购物车里面有5个商品,用户勾选了并且提交订单了,此时需要删除购物车对应勾选的商品,mq的话涉及到传递用户信息~因为删除对应的购物车商品是需要传递用户信息来知晓对应用户的 生产者 消费者…