YOLOv5更换骨干网络之 GhostNet

news2024/11/16 7:47:22

在这里插入图片描述
在这里插入图片描述

论文地址:https://arxiv.org/abs/1911.11907
代码地址:https://github.com/huawei-noah/ghostnet

由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络(CNN)很困难。特征图中的冗余是那些成功的神经网络的重要特征,但在神经架构设计中很少研究。本文提出了一种新的Ghost模块,以从廉价的操作中生成更多的特征图。基于一组内在特征图,我们以低成本应用一系列线性变换来生成许多重影特征图,这些重影特征可以充分揭示内在特征的信息。所提出的Ghost模块可以作为即插即用组件来升级现有的卷积神经网络。Ghost瓶颈被设计为堆叠Ghost模块,然后可以轻松地建立轻量级GhostNet。在基准上进行的实验表明,所提出的Ghost模块是基线模型中卷积层的一个令人印象深刻的替代方案,并且我们的GhostNet可以在ImageNet ILSVRC2012分类数据集上以类似的计算成本实现比MobileNetV3更高的识别性能(例如,75.7%的前1精度)。代码可从https://github.com/huawei-noah/ghostnet获取。


GhostNet网络结构

在这里插入图片描述
将YOLOv5主干网络替换为GhostNet:

yolov5lGhost.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, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 9], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 20

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 5], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 24 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 20], 1, Concat, [1]], # cat head P4
   [-1, 3, C3, [512, False]],  # 27 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 16], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 30 (P5/32-large)

   [[23, 26, 29], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

在YOLOv5项目中添加方式:

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/ghostnet
    def __init__(self, c1, c2, midc, k=5, s=1, use_se = False):  # ch_in, ch_mid, ch_out, kernel, stride, use_se
        super().__init__()
        assert s in [1, 2]
        c_ = midc
        self.conv = nn.Sequential(GhostConv(c1, c_, 1, 1),              # Expansion
                                  Conv(c_, c_, 3, s=2, p=1, g=c_, act=False) if s == 2 else nn.Identity(),  # dw
                                  # Squeeze-and-Excite
                                  SeBlock(c_) if use_se else nn.Sequential(),
                                  GhostConv(c_, c2, 1, 1, act=False))   # Squeeze pw-linear

        self.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)

yolo.py中添加如下代码:在这里插入图片描述


本人更多YOLOv5实战内容导航🍀🌟🚀

  1. 手把手带你调参Yolo v5 (v6.2)(推理)🌟强烈推荐

  2. 手把手带你调参Yolo v5 (v6.2)(训练)🚀

  3. 手把手带你调参Yolo v5 (v6.2)(验证)

  4. 如何快速使用自己的数据集训练Yolov5模型

  5. 手把手带你Yolov5 (v6.2)添加注意力机制(一)(并附上30多种顶会Attention原理图)🌟强烈推荐🍀新增8种

  6. 手把手带你Yolov5 (v6.2)添加注意力机制(二)(在C3模块中加入注意力机制)

  7. Yolov5如何更换激活函数?

  8. Yolov5如何更换BiFPN?

  9. Yolov5 (v6.2)数据增强方式解析

  10. Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积)

  11. Yolov5如何更换EIOU / alpha IOU / SIoU?

  12. Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》

  13. YOLOv5应用轻量级通用上采样算子CARAFE

  14. 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC🚀

  15. 用于低分辨率图像和小物体的模块SPD-Conv

  16. GSConv+Slim-neck 减轻模型的复杂度同时提升精度🍀

  17. 头部解耦 | 将YOLOX解耦头添加到YOLOv5 | 涨点杀器🍀

  18. Stand-Alone Self-Attention | 搭建纯注意力FPN+PAN结构🍀

  19. YOLOv5模型剪枝实战🚀

  20. YOLOv5知识蒸馏实战🚀

  21. YOLOv7知识蒸馏实战🚀

  22. 改进YOLOv5 | 引入密集连接卷积网络DenseNet思想 | 搭建密集连接模块🍀

  23. YOLOv5更换骨干网络之 PP-LCNet🍀

  24. YOLOv5更换骨干网络之 EfficientNet-B0🍀

  25. YOLOv5 框架引入 Google 轻量化网络 MobileNet V3🍀


参考文献:

https://github.com/Gumpest/YOLOv5-Multibackbone-Compression

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

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

相关文章

年度征文 | 回顾2022,展望2023(我难忘的2022,我憧憬的2023)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

用javascript分类刷leetcode7.双指针(图文视频讲解)

双指针 普通指针:两指针同一方向或不同方向对撞指针:两指针互相靠拢快慢指针:一快一慢 141. 环形链表 (easy) 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再…

LeetCode字符串经典题目(四)

1. LeetCode344. 反转字符串 2. LeetCode541. 反转字符串 II 3. LeetCode剑指 Offer 05. 替换空格 4. LeetCode151. 反转字符串中的单词 5. LeetCode剑指 Offer 58 - II. 左旋转字符串 6. LeetCode28. 找出字符串中第一个匹配项的下标​ 7. LeetCode459. 重复的子字符串​…

Mac内存空间不足如何释放储存空间?深度清理Mac磁盘空间的方法教程

今日coco玛奇朵将分享一些能够释放大量Mac内存空间的方法,以便大家能够优化Mac的运行速度外还能规避由于Mac空间不足而导致安装Ventura时出现的一系列问题。 大家都知道更新Macos都需要预备非常大的内存空间才能进行,当更新完Macos之后都会留下大量的备…

台大应用深度学习笔记

deep learning end-to-end training 1. 神经元 1.1 为什么需要bias? 为了给对应位置一个prior,给它一个初始值,b越大,σ(z)11e−z\sigma(z) \frac{1}{1e^{-z}}σ(z)1e−z1​越大,越趋向于1. 多层神经网络&#xff…

安装Windows和Ubuntu双系统

制作Ubuntu安装盘在Windows上查看磁盘格式 不同的磁盘格式,需要跟BIOS里面不同的引导模式配合来启动操作系统,如下图: 我的电脑是GPT格式: 准备好给Ubuntu的磁盘空间 在Windows系统中,在一个200G的清空数据的磁盘上…

【Flask-Web】基于layui前端模板搭建简易管理系统

1. JavaScript 1.1. 函数 var cars ["Saab", "Volvo", "BMW"]; var txt "string"; var b2new Boolean(1); var x Math.PI; // 返回PI var y Math.sqrt(16); // 返回16的平方根 var num new Number(value); try {adddlert("…

aws eks 理解和使用terrafrom创建eks集群(离线安装provider和module)

参考 使用 Terraform 在 AWS 中国区域实现自动化部署指南系列1使用 Terraform 在 AWS 中国区域实现自动化部署指南系列2https://lonegunmanb.github.io/introduction-terraform/加速 Terraform init terraform 相关概念 terraform是对标aws cloud formation的iac工具&#x…

Redis集群系列十一 —— 故障转移一

故障发现 Redis 集群内节点通过 ping/pong 消息实现节点通信,消息不但可以传播节点槽信息,还可以传播其他状态。当集群中某个节点出现问题时,需要识别出节点是否发生了故障,因此故障发现是通过Gossip 协议来广播自己的状态以及自…

日志系统:WAL和二阶段提交

1. 前言 一条更新语句在执行过程中不仅仅要操作不仅仅是通过数据库的组件(分析器、优化器、执行器、存储引擎等)操作表数据还涉及以下内容: 要操作日志系统的redo log、binlog和undo log, 更新操作也不是实时更新到磁盘的而是通过3.Write-A…

DDR3 数据传输 (五)

目录 引言 设计说明 参数说明 设计简图 IP配置说明 写FIFO IP

在linux上使用CMake构建和安装gtest

在linux上使用CMake构建和安装gtest一、准备工作二、构建并安装gtest的静态库三、构建并安装gtest的共享库一、准备工作 本机环境: 系统版本:RHEL 7.6GCC/G版本: 12.1.1googletest版本:1.12.1 注意,gtest的1.12.x分…

基于准则匹配的图像对准

一、概述 在图像处理相关的问题中,图像对准是一类典型的问题,也就是要将两幅图严丝合缝地对应起来。通常来讲,两幅图大小不一,一个是模板,一个是母图,也就是要在母图中搜寻定位到与模板图最为接近的区域。 …

QML教程(七) JavaScript

目录 一、对属性值使用 JavaScript 表达式 二、在 QML 中添加 JavaScript 函数 三、使用 JavaScript 文件 四、属性绑定中的 JavaScript 五、信号处理程序中的 JavaScript 六、将信号连接到 JavaScript 函数 七、启动执行 JavaScript QML 提供的 JavaScript 主机环境可以…

算法学习-并查集(持续更新中)

本文参考: 最容易理解的并查集详解 详解:并查集(Union-Find) 「代码随想录」684. 冗余连接:【并查集基础题目】详解! 并查集从入门到出门 并查集常常在做图相关的题目时冒出来,但是笔者经常去回避这样的解法…

Exynos_4412——轮询与中断

目录 一、CPU与硬件的交互方式 1.1轮询 1.2中断 1.3DMA 二、轮询方式的按键实验 三、GPIO中断相关寄存器 四、GPIO中断编程 五、小作业 一、CPU与硬件的交互方式 1.1轮询 CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需…

Android Jetpack Compose——一个简单的微信界面

一个简单的微信界面简述效果视频底部导航栏导航元素导航栏放入插槽绘制地图消息列表效果图实现聊天效果图实现气泡背景联系人界面效果图实现好友详情效果图实现发现效果图实现未读红点未读条数朋友圈效果图实现上拉加载个人设置效果图实现个人信息功能区钱包效果图实现切换主题…

【Vue】项目搭建规范

1. 集成editorconfig配置 EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。 VSCode需要安装一个插件:EditorConfig for VS Code 创建 .editorconfig 文件: # http://editorconfig.orgroot true[*] # 表示所有文…

js Proxy 的使用

文章目录一、什么是Proxy二、语法三、Proxy 方法1、get() 方法2、set() 方法3、apply() 方法4、has() 方法5、construct() 方法6、deleteProperty() 方法一、什么是Proxy Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问&#xff…

[Vulnhub] DC-2

Vlunhub下DC系列靶机第二台,难度与DC-1 差不多,为简单。共有五个Flag 下载地址:Vulnhub:DC-2 目录 信息搜集 cewl爬行网站字典&hydra爆破wordpress用户密码 -rbash逃逸 git提权 信息搜集 nmap -sP 192.168.236.0/24 扫描一下靶机i…