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',然后就可以开始进行训练了。🎈🎈🎈


相关文章:
YOLOv5算法改进(10)— 替换主干网络之GhostNet
前言:Hello大家好,我是小哥谈。GhostNet是一种针对计算机视觉任务的深度神经网络架构,它于2020年由中国科学院大学的研究人员提出。GhostNet的设计目标是在保持高精度的同时,减少模型的计算和存储成本。GhostNet通过引入Ghost模块…...
Android Canvas的使用
android.graphics.Canvas 一般在自定义View中,重写 onDraw(Canvas canvas) 方法时用到。 /*** Implement this to do your drawing.** param canvas the canvas on which the background will be drawn*/Overrideprotected void onDraw(Canvas canvas) {super.onDra…...
AI批量写文章伪原创:基于ChatGPT长文本模型,实现批量改写文章、批量回答问题(长期更新)
import traceback import openai import osopenai.api_key = ""conversation=[{"role": "system", "content": "You are a helpful assistant."}] max_history_len = 20 first_message = Nonedir = rJ:\ai\input #要改写的文…...
git常用场景记录 | 拉取远程分支A合并到本地分支B - 删除上一次的commit
文章目录 git常用场景记录拉取远程分支A合并到本地分支B本地分支B存在未add与commit的代码 删除上一次的commit已经push到远程库 git常用场景记录 doing,最后更新9.5 拉取远程分支A合并到本地分支B 需求描述 在团队合作时,我自己的本地分支B功能已经实现…...
源码角度解析SpringBoot 自动配置
文章目录 前言一、了解相关注解1.Condition注解2.Enable注解 二、SpringBoot自动配置1.SpringBootApplication注解2.SpringBootConfiguration注解3.EnableAutoConfiguration注解4.Conditional注解 总结 前言 Spring Boot 自动配置是 Spring Boot 的核心特性之一,它…...
【原创】H3C路由器OSPF测试
网络拓扑图 路由器配置: 路由器1上接了4跟线,分别为这四个接口配置IP地址。 # interface GigabitEthernet0/0/0port link-mode routecombo enable copperip address 2.1.1.2 255.255.255.0 # interface GigabitEthernet0/0/1port link-mode routecombo…...
计算机视觉:轨迹预测综述
计算机视觉:轨迹预测综述 轨迹预测的定义轨迹预测的分类基于物理的方法(Physics-based)基于机器学习的方法(Classic Machine Learning-based)基于深度学习的方法(Deep Learning-based)基于强化学…...
三维跨孔电磁波CT数据可视化框架搭建
三维跨孔电磁波CT数据可视化框架搭建 文章目录 三维跨孔电磁波CT数据可视化框架搭建1、三维CT可视化结果2、matlab代码2.1、CT数据格式整理并保存2.2、三维可视化 利用matlab实现对跨孔电磁波CT实测数据反演,并搭建了三维CT数据可视化框架,可装填实测CT反…...
OC和Swift混编,导入头文件‘xxx-Swift.h‘ file not found
在OC的项目里加入Swift代码,创建完桥接文件后,需要倒入Swift头文件,头文件的格式为“项目名-Swift.h”。 如下图,我在Xcode上看到我的项目名为YichangPark,导入 #import "YiChangPark-Swift.h" 之后提示 “Y…...
一文读懂HOOPS Native平台:快速开发桌面端、移动端3D应用程序!
HOOPS Native Platform是用于在桌面和移动平台以及混合现实应用程序上构建3D工程应用程序的首要工具包。它由三个集成良好的软件开发工具包(SDK)组成:HOOPS Visualize、HOOPS Exchange、HOOPS Publish。HOOPS Visualize 是一个强大的图形引擎,适用于本机…...
Scrum工作模式及Scrum工具
Scrum工作模式是一种敏捷软件开发方法,其核心是团队合作和自我组织,旨在通过短周期的迭代开发,实现快速反馈和持续改进。 Scrum工作模式包括以下角色和活动: 1、产品负责人(Product Owner):负…...
[ros][ubuntu]ros在ubuntu18.04上工作空间创建和发布一个话题
构建catkin工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws/ catkin_make 配置环境变量 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 检查环境变量 echo $ROS_PACKAGE_PATH…...
我的区块链笔记
区块链 中心化的账本,个人节点和中心节点的地位不对等,中心节点说了算。去中心化,个人节点就是公平的,根据一套规则,叫做公比机制。 区块链的本质,就是数据存储方式 区块链使用密码学算法产生的区块&…...
Spring事务(ACID特性、隔离级别、传播机制、失效场景)
一、事务的ACID特性 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。一致性(Consistency) 事务前后数据的完整性必须保持一致。隔离性(Isola…...
机器学习笔记之最优化理论与方法(六)无约束优化问题——最优性条件
机器学习笔记之最优化理论与方法——无约束优化问题[最优性条件] 引言无约束优化问题无约束优化问题最优解的定义 无约束优化问题的最优性条件无约束优化问题的充要条件无约束优化问题的必要条件无约束优化问题的充分条件 引言 本节将介绍无约束优化问题,主要介绍无…...
E5061B/是德科技keysight E5061B网络分析仪
181/2461/8938产品概述 是德科技E5061B(安捷伦)网络分析仪在从5 Hz到3 GHz的宽频率范围内提供通用的高性能网络分析。E5061B提供ENA系列常见的出色RF性能,还提供全面的LF(低频)网络测量能力;包括内置1 Mohm输入的增益相位测试端口。E5061B从低频到高频的…...
2.4 PE结构:节表详细解析
节表(Section Table)是Windows PE/COFF格式的可执行文件中一个非常重要的数据结构,它记录了各个代码段、数据段、资源段、重定向表等在文件中的位置和大小信息,是操作系统加载文件时根据节表来进行各个段的映射和初始化的重要依据…...
Vue2项目练手——通用后台管理项目第五节
Vue2项目练手——通用后台管理项目 首页组件布局面包屑&tag面包屑使用组件使用vuex存储面包屑数据src/store/tab.jssrc/components/CommonAside.vuesrc/components/CommonHeader.vue tag使用组件文件目录CommonTag.vueMain.vuetabs.js 用户管理页新增功能使用的组件页面布局…...
软件工程学术顶会——ESEC/FSE 2022 议题(网络安全方向)清单、摘要与总结
总结 本次会议中网络安全相关议题涵盖区块链、智能合约、符号执行、浏览器API模糊测试等不同研究领域。 热门研究方向: 1. 基于深度学习的漏洞检测与修复 2. 基于AI的自动漏洞修复 3. 模糊测试与漏洞发现 冷门研究方向: 1. 多语言代码的漏洞分析 2. 代码审查中的软件安全 3. 浏…...
从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr
目录 1. 智能指针的引入_内存泄漏 1.1 内存泄漏 1.2 如何避免内存泄漏 2. RAII思想 2.1 RAII解决异常安全问题 2.2 智能指针原理 3. auto_ptr 3.1 auto_ptr模拟代码 4. unique_ptr 4.1 unique_ptr模拟代码 5. shared_ptr 5.1 shared_ptr模拟代码 5.2 循环引用 6.…...
5步打造个人数字图书馆:番茄小说下载器实战指南
5步打造个人数字图书馆:番茄小说下载器实战指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾在深夜追更小说时突然断网?是否想整理自己的阅读记录却无从…...
智慧树自动刷课插件:5步实现高效学习自动化,节省70%学习时间
智慧树自动刷课插件:5步实现高效学习自动化,节省70%学习时间 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的重复性视频学习…...
使用taotoken聚合api后c语言项目调用大模型的延迟与稳定性体验
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用taotoken聚合api后c语言项目调用大模型的延迟与稳定性体验 在开发基于C语言的服务器后台时,集成大模型能力常面临一…...
构建智能交易系统:高效掌握缠论量化实战技巧
构建智能交易系统:高效掌握缠论量化实战技巧 【免费下载链接】chan.py 开放式的缠论python实现框架,支持形态学/动力学买卖点分析计算,多级别K线联立,区间套策略,可视化绘图,多种数据接入,策略开…...
告别硬件依赖!用Qt和CanBusDevice库5分钟搭建你的软件ECU模拟器
告别硬件依赖!用Qt和CanBusDevice库5分钟搭建你的软件ECU模拟器 在汽车电子开发领域,硬件依赖常常成为效率瓶颈。想象这样一个场景:凌晨两点,你的算法逻辑已经调试完毕,却因为缺少物理ECU设备而无法验证;或…...
保姆级教程:手把手教你用Python搭建HTTP服务器,为安信可BL602模组OTA升级铺路
从零构建Python HTTP服务器:物联网开发者的OTA升级基石 在物联网设备开发中,固件升级(OTA)是产品生命周期管理的关键环节。想象一下这样的场景:当您需要为部署在数百公里外的设备更新功能时,无需物理接触设备,只需通过…...
别急着换件!汇川伺服报Er.136/Er.740编码器故障,先按这3步自查(附线缆选购建议)
汇川伺服编码器故障排查指南:从干扰溯源到线缆优化 工业现场最让人头疼的莫过于设备间歇性抽风——明明昨天还运行良好,今天却频繁报Er.136或Er.740编码器故障。作为经历过数十次类似案例的技术老兵,我必须强调:80%的编码器问题根…...
Ccursor安装使用
首先进入官文 https://cursor.com/下载,然后按照步骤进行安装,一般都是直接默认安装(修改软件位置的话可以修改下去,默认是在c盘,可能会后面用的多了造成卡顿),直到安装完成, 点击使…...
一文搞懂 MySQL:一条 SQL 语句的完整执行之旅
你是否每天都在写 SQL,却从未想过它在 MySQL 内部是如何一步步执行的?今天我们就通过这张经典的 MySQL 执行流程图,带你拆解一条 SQL 从客户端发送到结果返回的完整过程,搞懂这个过程,你就能轻松理解 SQL 优化、事务原…...
别再轮询了!Qt QSerialPort高效读取数据的正确姿势:理解缓冲区与readyRead触发机制
别再轮询了!Qt QSerialPort高效读取数据的正确姿势:理解缓冲区与readyRead触发机制 在嵌入式开发和硬件通信领域,串口通信作为最基础的通信方式之一,其稳定性和效率直接影响整个系统的性能表现。许多开发者在使用Qt的QSerialPort模…...
