YOLOv5 | 鬼魅(幽灵)卷积 | 改进Ghost卷积轻量化网络

2024-03-29 15:36

本文主要是介绍YOLOv5 | 鬼魅(幽灵)卷积 | 改进Ghost卷积轻量化网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

原理简介

代码实现

yaml文件实现

检查是否添加执行成功 

完整代码分享 

论文创新必备

启动命令


由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难。特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究。一种新颖的 Ghost 模块,可以通过廉价的操作生成更多的特征图。基于一组内在特征图,以低廉的成本应用一系列线性变换来生成许多鬼特征图,这些特征图可以充分揭示内在特征背后的信息。Ghost 模块可以作为即插即用组件来升级现有的卷积神经网络。 Ghostbottleneck旨在堆叠Ghost模块,然后可以轻松建立轻量级的GhostNet。Ghost 模块是基线模型中卷积层的令人印象深刻的替代品,并且GhostNet 可以比 MobileNetV3 实现更高的识别性能,并且在 ImageNet ILSVRC2012 分类数据集上具有相似的计算成本。

 ⭐欢迎大家订阅我的专栏一起学习⭐

🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀

       YOLOv5涨点专栏:http://t.csdnimg.cn/CNQ32

YOLOv8涨点专栏:http://t.csdnimg.cn/tnoL5

YOLOv7专栏:http://t.csdnimg.cn/HsyvQ

💡魔改网络、复现论文、优化创新💡 

首先引入 Ghost 模块,利用一些小过滤器从原始卷积层生成更多特征图,然后开发一个具有极其高效架构和高性能的新 GhostNet。

原理简介
卷积层和建议的 Ghost 模块的图示,用于输出相同数量的特征图。 Φ 代表廉价操作

深度卷积神经网络通常由大量卷积组成,这会导致巨大的计算成本。尽管 MobileNet 和 ShuffleNet 等最近的工作引入了深度卷积或洗牌操作,以使用较小的卷积滤波器(浮点数操作)构建高效的 CNN,但剩余的 1 × 1 卷积层仍然会占用大量内存和失败。

其中*是卷积运算,b是偏置项,Y ∈ Rh′×w′×n是n个通道的输出特征图,f ∈ Rc×k×k×n是该层的卷积滤波器。另外,h′和w′分别是输出数据的高度和宽度,k×k分别是卷积滤波器f的内核大小。在这个卷积过程中,所需的 FLOP 数量可以计算为 n·h′·w′·c·k·k,由于滤波器数量 n 和通道数量 c 通常为数十万,因此该数量通常高达数十万。非常大(例如 256 或 512)。

利用 Ghost 模块的优点,我们引入了专为小型 CNN 设计的 Ghost 瓶颈(G-bneck)。如图 3 所示,Ghost 瓶颈似乎类似于 ResNet [16] 中的基本残差块,其中集成了多个卷积层和快捷方式。所提出的 Ghost 瓶颈主要由两个堆叠的 Ghost 模块组成。第一个 Ghost 模块充当扩展层,增加通道数量。我们将输出通道数与输入通道数之比称为扩展比。第二个 Ghost 模块减少了通道数量以匹配快捷路径。然后将快捷方式连接在这两个 Ghost 模块的输入和输出之间。批量标准化(BN)[25]和ReLU非线性在每一层之后应用,除了按照MobileNetV2的建议在第二个Ghost模块之后不使用ReLU。上述Ghost瓶颈是针对步长=1的情况。对于stride=2的情况,捷径由下采样层实现,并在两个Ghost模块之间插入stride=2的深度卷积。实际上,这里的 Ghost 模块中的主要卷积是逐点卷积,以提高其效率。 

代码实现
class C3Ghost(C3):"""C3 module with GhostBottleneck()."""def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):"""Initialize 'SPP' module with various pooling sizes for spatial pyramid pooling."""super().__init__(c1, c2, n, shortcut, g, e)c_ = int(c2 * e)  # hidden channelsself.m = nn.Sequential(*(GhostBottleneck(c_, c_) for _ in range(n)))class GhostBottleneck(nn.Module):"""Ghost Bottleneck https://github.com/huawei-noah/ghostnet."""def __init__(self, c1, c2, k=3, s=1):"""Initializes GhostBottleneck module with arguments ch_in, ch_out, kernel, stride."""super().__init__()c_ = c2 // 2self.conv = nn.Sequential(GhostConv(c1, c_, 1, 1),  # pwDWConv(c_, c_, k, s, act=False) if s == 2 else nn.Identity(),  # dwGhostConv(c_, c2, 1, 1, act=False),  # pw-linear)self.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):"""Applies skip connection and concatenation to input tensor."""return self.conv(x) + self.shortcut(x)

ghost模型的整个结构照搬了mobilenetv3,只是把基本单元给替换掉了,将原本的一步卷积变为两步卷积,第一步首先进行常规卷积,但是减少了输出通道数,第二步在第一步的基础上进行深度可分离卷积(仅取第一步),这里深度可分离卷积跟常规深度可分离卷积有点区别,常规深度可分离卷积(仅取第一步)的输入输出通道数完全相等,卷积核数量也等于输入通道数,这里输出通道数可能是输入通道数的整数倍,卷积核数量等于输出通道数。此外,第二步卷积还有并行的一个连接分支,这个分支直接就是第一步卷积的输出。ghost卷积模块的输出通道数等于第一步卷积后的通道数c加上第二步卷积后的通道数n*c,所以最终通道数为(n+1)*c。此操作的依据是经过观察,发现大部分卷积操作后,输出的特征图很多通道之间存在很高的相似性,那我们就可以经过第一步卷积得到那些没有相似性的通道,然后经过第二步卷积得到剩余那些有相似性的通道

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# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]],  # 1-P2/4[-1, 3, C3Ghost, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 6, C3Ghost, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3Ghost, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 3, C3Ghost, [1024]],[-1, 1, SPPF, [1024, 5]],  # 9]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3Ghost, [512, False]],  # 13[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]],  # cat backbone P3[-1, 3, C3Ghost, [256, False]],  # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 14], 1, Concat, [1]],  # cat head P4[-1, 3, C3Ghost, [512, False]],  # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 10], 1, Concat, [1]],  # cat head P5[-1, 3, C3Ghost, [1024, False]],  # 23 (P5/32-large)[[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]
检查是否添加执行成功 

出现的网络结构变成C3变成C3ghost,则说明添加成功

完整代码分享 

链接: https://pan.baidu.com/s/1N3-7dEdVoMC-QuIGUFpASg?pwd=dwey 提取码: dwey 复制这段内容后打开百度网盘手机App,操作更方便哦

如果报错,请看

解决Yolov5的RuntimeError: result type Float can‘t be cast to the desired output type long int 问题_yolov5 runtimeerror: result type float can't be ca-CSDN博客

启动命令
python train.py model=/path/yolov5_ghost.yaml ...
论文创新必备

这篇关于YOLOv5 | 鬼魅(幽灵)卷积 | 改进Ghost卷积轻量化网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858965

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依