YOLOv5算法改进(10)— 替换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是一种针对计算机视觉任务的深度神经网络架构,它于2020年由中国科学院大学的研究人员提出。GhostNet的设计目标是在保持高精度的同时,减少模型的计算和存储成本。GhostNet通过引入Ghost模块来实现高效的网络设计,Ghost模块是一种新颖的特征重用机制,它可以在网络中引入更多的轻量级子网络,这些子网络与主干网络以并行的方式连接,通过共享卷积核来提高计算效率。GhostNet在ImageNet图像分类任务上取得了较好的性能,并且在计算和存储方面比一些流行的网络模型如MobileNetV3和EfficientNet要更高效。因此,GhostNet被认为是一种具有潜力的轻量级神经网络架构,在计算资源有限的设备上具有广泛的应用前景。🌈 

 前期回顾:

           YOLOv5算法改进(1)— 如何去改进YOLOv5算法

           YOLOv5算法改进(2)— 添加SE注意力机制

           YOLOv5算法改进(3)— 添加CBAM注意力机制

           YOLOv5算法改进(4)— 添加CA注意力机制

           YOLOv5算法改进(5)— 添加ECA注意力机制

           YOLOv5算法改进(6)— 添加SOCA注意力机制

           YOLOv5算法改进(7)— 添加SimAM注意力机制

           YOLOv5算法改进(8)— 替换主干网络之MobileNetV3

           YOLOv5算法改进(9)— 替换主干网络之ShuffleNetV2

            目录

🚀1.论文

🚀2.GhostNet网络架构及原理

💥💥2.1 Ghost Module

💥​​​​​​​💥2.2 Ghost Bottlenecks

💥​​​​​​​💥2.3 Ghostnet的构建

🚀3.YOLOv5结合Ghostnet

💥💥步骤1:在common.py中添加Ghostnet模块

💥💥步骤2:在yolo.py文件中加入类名 

💥💥步骤3:创建自定义yaml文件 

💥💥步骤4:验证是否加入成功

💥💥步骤5:修改train.py中的'--cfg'默认参数

🚀1.论文

GhostNet是2019年由华为诺亚方舟实验室发布的轻量级网络,速度和MobileNetV3相似,但是识别的准确率比MobileNetV3高,在ImageNet ILSVRC-2012分类数据集的达到了75.7%的top-1精度。该论文提除了Ghost模块,通过廉价操作生成更多的特征图。基于一组原始的特征图,作者应用一系列线性变换,以很小的代价生成许多能从原始特征发掘所需信息的“Ghost”特征图(Ghost feature maps)。Ghost模块是一种即插即用的模块,通过堆叠Ghost模块得出Ghost bottleneck,进而搭建轻量级神经网络——GhostNet🍃

论文题目:《GhostNet: More Features from Cheap Operations》目:

论文地址:  https://arxiv.org/abs/1911.11907

代码实现:  https://github.com/huawei-noah/Efficient-AI-Backbones/releases/tag/GhostNetV2


🚀2.GhostNet网络架构及原理

💥​​​​​​​💥​​​​​​​2.1 Ghost Module

通过上述的介绍,我们了解到了,GhostNet的核心思想就是使用一些计算量更低(Cheap Operations)的操作去生成这些冗余的特征图。在论文中,作者设计了一个名为Ghost Module的模块,他的功能是代替普通卷积。📚

Ghost Module将普通卷积分为两部分:

首先,进行一个普通的1x1卷积,这是一个少量卷积,比如正常使用32通道的卷积,这里就用16通道的卷积,这个1x1卷积的作用类似于特征整合,生成输入特征层的特征浓缩。

然后,我们再进行深度可分离卷积,这个深度可分离卷积是逐层卷积,它也就是论文上面提到的Cheap Operations。它利用上一步获得的特征浓缩生成Ghost特征图。

因此,如果我们从整体上去看这个Ghost Module,它其实就是两步简单思想的汇总

💞(1)利用1x1卷积获得输入特征的必要特征浓缩。

💞(2)利用深度可分离卷积获得特征浓缩的相似特征图(Ghost)。

Ghost-Module分成三个步骤:

🍀(1)先通过普通的conv生成一些特征图。
🍀(2)对生成的特征图进行cheap操作生成冗余特征图,这步使用的卷积是DW 卷积。
🍀(3)将conv生成的特征图与cheap操作生成的特征图进行concat操作。

如下图(b)所示,展示了Ghost模块和普通卷积的过程。👇

💥​​​​​​​💥2.2 Ghost Bottlenecks

实现了Ghost 模块,接下来开始搭建 Ghost Bottlenecks。

Ghost Bottlenecks是由Ghost Module组成的瓶颈结构,其实本质上就是用Ghost Module,来代替瓶颈结构里面的普通卷积。

Ghost Bottlenecks可以分为两个部分,分别是主干部分残差边部分,包含Ghost Module的,我们称它为主干部分。

Ghost Bottlenecks有两个种类,如下图所示,当我们需要对特征层的宽高进行压缩的时候,我们会设置这个Ghost Bottlenecks的Stride=2,即步长为2。此时我们会Bottlenecks里面多添加一些卷积层,在主干部分里,我们会在两个Ghost Module中添加一个步长为2x2的深度可分离卷积进行特征层的宽高压缩。在残差边部分,我们也会添加上一个步长为2x2的深度可分离卷积和1x1的普通卷积。🌹

接下来实现GhostNet。🔖

💥​​​​​​​💥2.3 Ghostnet的构建

GhostNet的参数结构参考论文中的图,如下图:

可以看到,整个Ghostnet都是由Ghost Bottlenecks进行组成的。

当一张图片输入到Ghostnet当中时,我们首先进行一个16通道的普通1x1卷积块(卷积+标准化+激活函数)。之后我们就开始Ghost Bottlenecks的堆叠了,利用Ghost Bottlenecks,我们最终获得了一个7x7x160的特征层(当输入是224x224x3的时候)。然后我们会利用一个1x1的卷积块进行通道数的调整,此时我们可以获得一个7x7x960的特征层。之后我们进行一次全局平均池化,然后再利用一个1x1的卷积块进行通道数的调整,获得一个1x1x1280的特征层。然后平铺后进行全连接就可以进行分类了。🌿


🚀3.YOLOv5结合Ghostnet

💥💥步骤1:在common.py中添加Ghostnet模块

将下面Ghostnet模块的代码复制粘贴到common.py文件的末尾。

class SeBlock(nn.Module):def __init__(self, in_channel, reduction=4):super().__init__()self.Squeeze = nn.AdaptiveAvgPool2d(1)self.Excitation = nn.Sequential()self.Excitation.add_module('FC1', nn.Conv2d(in_channel, in_channel // reduction, kernel_size=1))  # 1*1卷积与此效果相同self.Excitation.add_module('ReLU', nn.ReLU())self.Excitation.add_module('FC2', nn.Conv2d(in_channel // reduction, in_channel, kernel_size=1))self.Excitation.add_module('Sigmoid', nn.Sigmoid())def forward(self, x):y = self.Squeeze(x)ouput = self.Excitation(y)return x * (ouput.expand_as(x))class G_bneck(nn.Module):# Ghost Bottleneck https://github.com/huawei-noah/ghostnetdef __init__(self, c1, c2, midc, k=5, s=1, use_se = False):  # ch_in, ch_mid, ch_out, kernel, stride, use_sesuper().__init__()assert s in [1, 2]c_ = midcself.conv = nn.Sequential(GhostConv(c1, c_, 1, 1),              # ExpansionConv(c_, c_, 3, s=2, p=1, g=c_, act=False) if s == 2 else nn.Identity(),  # dw# Squeeze-and-ExciteSeBlock(c_) if use_se else nn.Sequential(),GhostConv(c_, c2, 1, 1, act=False))   # Squeeze pw-linearself.shortcut = nn.Identity() if (c1 == c2 and s == 1) else \nn.Sequential(Conv(c1, c1, 3, s=s, p=1, g=c1, act=False), \Conv(c1, c2, 1, 1, act=False)) # 避免stride=2时 通道数改变的情况def forward(self, x):# print(self.conv(x).shape)# print(self.shortcut(x).shape)return self.conv(x) + self.shortcut(x)

具体如下图所示:

💥💥步骤2:在yolo.py文件中加入类名 

首先在yolo.py文件中找到parse_model函数这一行,加入G_bneck模块

💥💥步骤3:创建自定义yaml文件 

models文件夹中复制yolov5s.yaml,粘贴并重命名为yolov5s_Ghostnet.yaml

然后根据Ghostnet的网络架构来修改配置文件。

yaml文件修改后的完整代码如下:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # 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# Ghostnet backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [16, 3, 2, 1]],            # 0-P1/2  ch_out, kernel, stride, padding, groups[-1, 1, G_bneck, [16, 16, 3, 1]],        # 1  ch_out, ch_mid, dw-kernel, stride[-1, 1, G_bneck, [24, 48, 3, 2]],        # 2-P2/4[-1, 1, G_bneck, [24, 72, 3, 1]],        # 3[-1, 1, G_bneck, [40, 72, 3, 2, True]],  # 4-P3/8[-1, 1, G_bneck, [40, 120, 3, 1, True]], # 5[-1, 1, G_bneck, [80, 240, 3, 2]],        # 6-P4/16[-1, 3, G_bneck, [80, 184, 3, 1]],        # 7[-1, 1, G_bneck, [112, 480, 3, 1, True]],[-1, 1, G_bneck, [112, 480, 3, 1, True]],[-1, 1, G_bneck, [160, 672, 3, 2, True]], # 10-P5/32[-1, 1, G_bneck, [160, 960, 3, 1]],       # 11[-1, 1, G_bneck, [160, 960, 3, 1, True]],[-1, 1, G_bneck, [160, 960, 3, 1]],[-1, 1, G_bneck, [160, 960, 3, 1, True]],[-1, 1, Conv, [960]],]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [480, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 9], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [480, False]],  # 19[-1, 1, Conv, [240, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 5], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3, [240, False]],  # 23 (P3/8-small)[-1, 1, Conv, [240, 3, 2]],[[-1, 20], 1, Concat, [1]], # cat head P4[-1, 3, C3, [480, False]],  # 26 (P4/16-medium)[-1, 1, Conv, [480, 3, 2]],[[-1, 15], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [960, False]],  # 29 (P5/32-large)[[23, 26, 29], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

💥💥步骤4:验证是否加入成功

yolo.py文件里,配置我们刚才自定义的yolov5s_Ghostnet.yaml

然后运行yolo.py,得到结果。

这样就算添加成功了。🎉🎉🎉  

💥💥步骤5:修改train.py中的'--cfg'默认参数

train.py文件中找到 parse_opt函数,然后将第二行 '--cfg的default改为 'models/yolov5s_Ghostnet.yaml',然后就可以开始进行训练了。🎈🎈🎈


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

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

相关文章

深入理解Python中的多进程和多线程

前言 此篇文章将深入的讲解Python中的多进程和多线程 📝个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列: ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python系列专栏 - 从零开始学python 第一部分:多进程 多进程是指在操作系统中…

ssm学生公寓管理系统的设计与实现

ssm学生公寓管理系统的设计与实现106 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归…

mongodb 分片集群部署

文章目录 mongodb 分片部署二进制安装三台config 配置shard 分片安装shard1 安装shard2 安装shard3 安装mongos 安装数据库、集合启用分片创建集群认证文件创建集群用户部署常见问题 mongodb 分片部署 二进制安装 mkdir -p /data/mongodb tar xvf mongodb-linux-x86_64-rhel7…

算法 -汉诺塔,哈夫曼编码

有三个柱子,分别为 from、buffer、to。需要将 from 上的圆盘全部移动到 to 上,并且要保证小圆盘始终在大圆盘上。 这是一个经典的递归问题,分为三步求解: ① 将 n-1 个圆盘从 from -> buffer ② 将 1 个圆盘从 from -> to ③ 将 n-1 个圆盘从 buffer -> to 如果…

opencv android sdk 使用中的问题

Plugin with id ‘kotlin-android’ not found 在build.gradle(:app)中添加以下内容 buildscript {ext {Kotlin_Verion "1.9.10"}dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$Kotlin_Verion"}repositories {mavenCentral()} …

论文浅尝 | 利用对抗攻击策略缓解预训练语言模型中的命名实体情感偏差问题...

笔记整理:田家琛,天津大学博士,研究方向为文本分类 链接:https://ojs.aaai.org/index.php/AAAI/article/view/26599 动机 近年来,随着预训练语言模型(PLMs)在情感分类领域的广泛应用&#xff0c…

数据结构--树4.2.2(二叉树--遍历)

目录 一、二叉树的建立 二、二叉树的遍历算法 一、二叉树的建立 CreateBitree(Bitree *t){char c;scanf("%c",&c);if( c){*t NULL;}else{*t(Bitnode*)malloc(sizeof(Bitnode));(*t)->data c;CreateBitree(&(*t)->lchild);CreateBitree(&(*t)-&…

打造个人的NAS云存储-通过Nextcloud搭建私有云盘实现公网远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

模拟电子技术基础学习笔记二 杂质半导体

通过扩散工艺,在本征半导体中掺入少量合适的杂质元素,可得到杂质半导体。 按掺入的杂质元素不同,可形成N型半导体和P型半导体 控制掺入杂质元素的浓度,可以控制杂质半导体的导电性能。 一、N型半导体(negative Semic…

ui网页设计实训心得

ui网页设计实训心得篇一 通过这次实训对这门课程的学习,做好网页,并不是一件容易的事,它包括网页的选题、 内容采集整理、 图片的处理、 页面的排版设置、 背景及其整套网页的色调等很多东西。 所以我得出一下总结: 一、 准备资…

CUBLAS库入门教程(从环境配置讲起)

文章目录 前言一、搭建环境二、简单介绍三、 具体例子四、疑问 前言 CUBLAS库是NVIDIA CUDA用于线性代数计算的库。使用CUBLAS库的原因是我不想去直接写核函数。 (当然,你还是得学习核函数该怎么写。但是人家写好的肯定比我自己写的更准确!&…

[PyTorch][chapter 54][Variational Auto-Encoder 实战]

前言: 这里主要实现: Variational Autoencoders (VAEs) 变分自动编码器 其训练效果如下 训练的过程中要注意调节forward 中的kle ,调参。 整个工程两个文件: vae.py main.py 目录: vae main 一 vae 文件名: vae…

typora使用

1.主题配置 先打开主题文件夹, 文件–>>偏好设置–>>外观–>>打开主题文件夹 1.1字体 修改字体需要修改css文件,确定当前所用主题,可以在typora菜单点击主题,看看当前勾选的是哪个主题,比如gith…

iPhone 15 Pro与iPhone 13 Pro:最大的预期升级

如果你在2021年首次发布iPhone 13 Pro时就抢到了它,那么你的合同很可能即将到期。虽然距离iPhone 15系列还有几周的时间,但你可能已经在想:是时候把你的旧iPhone升级为iPhone 15 Pro了吗? 我们认为iPhone 13 Pro是你现在能买到的最好的手机之一。但如果你想在2023年晚些时…

微信小程序 趣味学习与益智游戏系统APP

管理员、用户可通过HBuilder系统手机打开系统,注册登录后可进行管理员后端;首页、个人中心、用户管理、学生分类管理、学一学管理、玩一玩管理、听一听管理、试题管理、练一练管理、系统管理、考试管理,用户前端;首页、学一学、玩…

音视频入门基础理论知识

文章目录 前言一、视频1、视频的概念2、常见的视频格式3、视频帧4、帧率5、色彩空间6、采用 YUV 的优势7、RGB 和 YUV 的换算 二、音频1、音频的概念2、采样率和采样位数①、采样率②、采样位数 3、音频编码4、声道数5、码率6、音频格式 三、编码1、为什么要编码2、视频编码①、…

同一台电脑测.Net和Mono平台浮点运算的差异

float speed 0.1f;float distance 2.0f;long needTime (long)(distance / speed);Log.Debug($"needTime{needTime}"); 结果: .Net平台算出20 Mono平台算出19

【传输层】网络基础 -- UDP协议 | TCP协议

再谈端口号端口号范围划分netstatpidof UDPUDP的特点面向数据报UDP的缓冲区 基于UDP的应用层协议 TCP认识TCP协议的报头理解封装解包理解可靠性TCP工作模式16位窗口大小6位标志位URGACKPSHRSTSYNFIN 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/I…

力扣92. 局部反转链表

92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&am…

计算机网络 | TCP 三次握手四次挥手 |半关闭连接

本来是不愿意写的&#xff0c;可是在实际场景&#xff0c;对具体的描述标志还是模糊不清&#xff0c;基础不扎实&#xff0c;就得承认&#xff01;&#xff01;&#xff01; TCP 连接建立需要解决三大问题&#xff1a; 知道双方存在约定一些参数&#xff0c;如最大滑动窗口值、…