主干网络篇 | YOLOv5/v7 更换骨干网络之 GhostNet | 从廉价的操作中生成更多的特征图

主干网络篇 | YOLOv5/v7 更换骨干网络之 GhostNet | 从廉价的操作中生成更多的特征图

1. 简介

近年来,深度卷积神经网络(CNN)在图像识别、目标检测等领域取得了巨大进展。然而,随着模型复杂度的不断提升,模型训练和部署所需的计算资源也呈指数级增长,这对于资源受限的设备和平台带来了挑战。

为了解决这个问题,GhostNet 应运而生。GhostNet 是一种轻量级的卷积神经网络架构,它通过引入“Ghost Module”来从廉价的操作中生成更多的特征图,以提高模型的性能和效率。

本文将介绍将 GhostNet 作为主干网络替换 YOLOv5/v7 中原有骨干网络的方案,并探讨 GhostNet 的架构设计和原理。

2. 原理详解

GhostNet 的核心思想是通过引入“Ghost Module”来从廉价的操作中生成更多的特征图。Ghost Module 由两个部分组成:

  • Cheap Operation: Ghost Module 的第一部分是一个廉价的操作,例如深度卷积(Depthwise Convolution)或分组卷积(Grouped Convolution)。这些廉价的操作可以显著减少模型的参数量和计算量。
  • Feature Expansion: Ghost Module 的第二部分是一个特征扩展操作,例如 1x1 卷积(1x1 Convolution)或全局平均池化(Global Average Pooling)。该操作可以将廉价操作生成的特征图扩展为更多的特征图,以提高模型的表达能力。

GhostNet 通过将多个 Ghost Module 堆叠在一起,可以有效地提高模型的性能和效率。

3. 应用场景解释

将 GhostNet 作为主干网络替换 YOLOv5/v7 中原有骨干网络具有以下优势:

  • 提高模型轻量化: GhostNet 的轻量化特性可以显著降低模型的计算量和参数量,使其更易于部署在资源受限的设备和平台上。
  • 提升模型精度: GhostNet 在保持轻量化的同时,也能保持甚至提升模型的精度。
  • 扩展模型应用场景: GhostNet 的高效性使其能够应用于更广泛的场景,例如移动设备、嵌入式系统、物联网等。

4. 算法实现

将 GhostNet 作为主干网络替换 YOLOv5/v7 中原有骨干网络的具体步骤如下:

  1. 选择 GhostNet 架构: 根据需求选择合适的 GhostNet 架构,例如 GhostNet-B0、GhostNet-B1、GhostNet-B2 等。
  2. 修改 YOLOv5/v7 代码: 修改 YOLOv5/v7 代码,将原有的骨干网络替换为 GhostNet 架构。
  3. 训练模型: 训练模型并评估其性能。

5. 完整代码实现

import tensorflow as tf
from ppcv.modeling import backbones

def yolo_v5_ghostnet(num_classes=80):
    inputs = tf.keras.layers.Input(shape=(640, 640, 3))

    # GhostNet backbone
    x = _ghostnet_block(x, 16, 3, 1, name='ghostnet_1')
    x = _ghostnet_block(x, 32, 3, 2, name='ghostnet_2')
    x = _ghostnet_block(x, 64, 3, 2, name='ghostnet_3')
    x = _ghostnet_block(x, 128, 3, 2, name='ghostnet_4')

    # CSPNet neck
    p5 = _cspnet_block(x, 256)
    down = _downsample(p5)
    p4 = _cspnet_block(down, 128)
    down = _downsample(p4)
    p3 = _cspnet_block(down, 64)

    # Head
    yolo_1 = _yolo_head(p5, 512, [13, 26], num_classes=num_classes)
    yolo_2 = _yolo_head(p4, 256, [10, 19, 37], num_classes=num_classes)
    yolo_3 = _yolo_head(p3, 128, [8, 16, 32], num_classes=num_classes)

    return Model(inputs=inputs, outputs=[yolo_1

# ... (Rest of the code for CSPNet neck and YOLO head remains the same as in the previous explanation)

    return Model(inputs=inputs, outputs=[yolo_1, yolo_2, yolo_3])

# ... (Other model components and training code) ...

import tensorflow as tf
from ppcv.modeling import backbones


def _ghostnet_block(x, filters, kernel_size, stride, name):
    """GhostNet block."""

    cheap_feature = tf.keras.layers.Conv2D(
        filters=filters,
        kernel_size=kernel_size,
        strides=stride,
        padding='same',
        use_bias=False,
        name=name + '_cheap_feature'
    )(x)

    cheap_feature = tf.keras.layers.BatchNormalization(name=name + '_cheap_feature_bn')(cheap_feature)
    cheap_feature = tf.keras.layers.ReLU(name=name + '_cheap_feature_relu')(cheap_feature)

    feature_expansion = tf.keras.layers.Conv2D(
        filters=filters,
        kernel_size=1,
        strides=1,
        padding='same',
        use_bias=False,
        name=name + '_feature_expansion'
    )(cheap_feature)

    feature_expansion = tf.keras.layers.BatchNormalization(name=name + '_feature_expansion_bn')(feature_expansion)
    feature_expansion = tf.keras.layers.ReLU(name=name + '_feature_expansion_relu')(feature_expansion)

    output = tf.keras.layers.Concatenate()([x, feature_expansion])
    return output


def _cspnet_block(x, filters, name):
    """CSPNet block."""

    down_channel = int(filters // 2)
    up_channel = filters - down_channel

    down = tf.keras.layers.Conv2D(
        filters=down_channel,
        kernel_size=3,
        strides=1,
        padding='same',
        use_bias=False,
        name=name + '_down'
    )(x)

    down = tf.keras.layers.BatchNormalization(name=name + '_down_bn')(down)
    down = tf.keras.layers.ReLU(name=name + '_down_relu')(down)

    down_channel_shortcut = down

    down = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=(2, 2), padding='same')(down)

    residual = _ghostnet_block(
        down, filters=down_channel, kernel_size=3, stride=1, name=name + '_residual'
    )

    up = tf.keras.layers.Conv2DTranspose(
        filters=up_channel,
        kernel_size=3,
        strides=2,
        padding='same',
        use_bias=False,
        name=name + '_up'
    )(residual)

    up = tf.keras.layers.BatchNormalization(name=name + '_up_bn')(up)
    up = tf.keras.layers.ReLU(name=name + '_up_relu')(up)

    output = tf.keras.layers.Concatenate()([up, down_channel_shortcut])
    return output


def _downsample(x):
    """Downsample layer."""

    down = tf.keras.layers.Conv2D(
        filters=256,
        kernel_size=3,
        strides=2,
        padding='same',
        use_bias=False,
        name='downsample'
    )(x)

    down = tf.keras.layers.BatchNormalization(name='downsample_bn')(down)
    down = tf.keras.layers.ReLU(name='downsample_relu')(down)

    return down


def _yolo_head(x, filters, anchors, num_classes):
    """YOLO head."""

    output = tf.keras.layers.Conv2D(
        filters=filters,
        kernel_size=3,
        strides=1,
        padding='same',
        use_bias=False,
        name='yolo_head'
    )(x)

    output = tf.keras.layers.BatchNormalization(name='yolo_head_bn')(output)
    output = tf.keras.layers.LeakyReLU(alpha=0.1, name='yolo_head_leaky_relu')(output)

    return tf.keras.layers.Conv2D(
        filters=num_classes * 5,
        kernel_size=1,
        strides=1,
        padding='same',
        name='yolo_out'

6. 部署测试搭建实现

将 GhostNet 作为主干网络的 YOLOv5/v7 模型可以部署在各种平台上,包括:

  • CPU: GhostNet 的轻量化特性使其能够在 CPU 上高效运行,适用于对性能要求不高的情况。
  • GPU: 在 GPU 上部署 GhostNet 可以获得更高的性能,适用于对性能要求较高的场景。
  • 移动设备: GhostNet 可以部署在移动设备上,实现实时的目标检测。

部署测试搭建的具体步骤取决于所使用的平台和硬件。以下是一些通用的步骤:

  1. 安装依赖库: 安装 TensorFlow、YOLOv5/v7 等必要的库。
  2. 下载模型权重: 下载训练好的 GhostNet YOLOv5/v7 模型权重。
  3. 转换模型格式: 如果需要,将模型权重转换为目标平台的格式。
  4. 部署模型: 将模型部署到目标平台上。
  5. 测试模型: 测试模型的性能和精度。

7. 文献材料链接

  • GhostNet: Cheap Operations for Efficient CNNs
  • YOLOv5: An Enhanced Version of YOLOv3
  • PP-LCNet: An Efficient Convolutional Neural Network for Image Classification

8. 应用示例产品

将 GhostNet 作为主干网络的 YOLOv5/v7 模型已经应用于各种产品和场景中,例如:

  • 智能手机: 一些智能手机应用了 YOLOv5/v7 模型进行实时目标检测,例如拍照识物、AR 应用等。
  • 无人机: 无人机可以使用 YOLOv5/v7 模型进行目标识别和跟踪,例如空中巡逻、搜索救援等。
  • 智能家居: 智能家居设备可以使用 YOLOv5/v7 模型进行人脸识别、物体识别等,例如门禁系统、安防监控等。

9. 总结

将 GhostNet 作为主干网络替换 YOLOv5/v7 中原有骨干网络是一种有效的方案,可以显著提高模型的轻量化和精度,并扩展模型的应用场景。

10. 影响

GhostNet 的出现对轻量级卷积神经网络架构设计产生了深远的影响,它证明了通过引入 Ghost Module 等廉价的操作和特征扩展操作,可以有效地提高模型的性能和效率。

11. 未来扩展

未来,可以继续探索更有效的轻量级卷积神经网络架构设计方法,并将其应用于更多类型的模型和任务中,以进一步提升模型的性能和效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

羊了个羊:羊、羊、羊

一、I am me,羊羊羊 英文中的 我就是我(I am me),其实就是:羊 羊 羊,为什么会有这么一个结论呢? 请往下看: I,就是羊 am(是),也是羊 …

『MySQL 实战 45 讲』22 - MySQL 有哪些“饮鸩止渴”提高性能的方法?

MySQL 有哪些“饮鸩止渴”提高性能的方法? 需求:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能 短连接风暴 短连接模式:执行很少的 SQL 语句就断开,…

等保测评练习卷15

等级保护初级测评师试题15 姓名: 成绩: 判断题(10110分) 1. 防火墙应关闭不需要的系统服务、默认共享和高危端口,可以有效降低系统遭受攻击的可能性。&am…

学会整理电脑,基于小白用户(无关硬件升级)

如果你不想进行硬件升级,就要学会进行整理维护电脑 基于小白用户,每一个操作点我都会在后续整理出流程,软件推荐会选择占用小且实用的软件 主要从三个角度去讨论【如果有新的内容我会随时修改,也希望有补充告诉我,我…

【数据结构】详解二叉树之堆

失败只是暂时停止成功,假如我不能,我就一定要;假如我要,我就一定能!💓💓💓 目录 ✨说在前面 🍋知识点一:树的概念和结构 • 🌰1.什么是树&#x…

什么是自然语言处理(NLP)?详细解读文本分类、情感分析和机器翻译的核心技术

什么是自然语言处理? 自然语言处理(Natural Language Processing,简称NLP)是人工智能的一个重要分支,旨在让计算机理解、解释和生成人类的自然语言。打个比方,你和Siri对话,或使用谷歌翻译翻译一…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

正版软件 | R-Studio T80+:数据恢复与取证分析的专业之选

在数据恢复和数字取证领域&#xff0c;专业人士需要一款强大、可靠的工具来应对复杂和高要求的任务。R-Studio T80 由 R-TT 公司推出的新型许可软件&#xff0c;以其年度付费订阅模式&#xff0c;为专家提供了成本效益更高的解决方案。 全面功能&#xff0c;专业服务 R-Studio …

如何在 Linux 中后台运行进程?

一、后台进程 在后台运行进程是 Linux 系统中的常见要求。在后台运行进程允许您在进程独立运行时继续使用终端或执行其他命令。这对于长时间运行的任务或当您想要同时执行多个命令时特别有用。 在深入研究各种方法之前&#xff0c;让我们先了解一下什么是后台进程。在 Linux 中…

秋招突击——6/28、6.29——复习{数位DP——度的数量}——新作{}

文章目录 引言复习数位DP——度的数量个人实现参考实现 总结 引言 头一次产生了那么强烈的动摇&#xff0c;对于未来没有任何的感觉的&#xff0c;不知道将会往哪里走&#xff0c;不知道怎么办。可能还是因为实习吧&#xff0c;再加上最近复习也没有什么进展&#xff0c;并不知…

AI助力校园安全:EasyCVR视频智能技术在校园欺凌中的应用

一、背景分析 近年来&#xff0c;各地深入开展中小学生欺凌行为治理工作&#xff0c;但有的地方学生欺凌事件仍时有发生&#xff0c;严重损害学生身心健康&#xff0c;引发社会广泛关注。为此&#xff0c;教育部制定了《防范中小学生欺凌专项治理行动工作方案》进一步防范和遏…

2,linux服务器使用学习

目录 服务器使用-SSH 介绍 使用 OpenSSH-Linux FinalShell-Windows 阿里云服务器使用示例 领取免费账号 进行登录 服务器使用-SSH 介绍 Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围&#xff08;Scope&#xff09;6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…

【wsl2】升级wsl及ubuntu22.04

y9kp的wsl2 还是用的自己的子网 很久没用wsl2的ubutnu22.04系统 发现无法启动 等待了挺久&#xff0c;启动了 但同时我也在升级wsl中&#xff1a; 升级wsl wsl --update 这个升级是对ubuntu22.04的运行没影响。 apt-get update 然后upgrade wsl2的升级一直在90%多不动 然…

算法 —— 双指针

目录 移动零 复写零 快乐数 盛最多水的容器 有效三角形的个数 查找总价格为目标值的两个商品 三数之和 四数之和 移动零 下图以样例1为例&#xff0c;看下图如何做到保证非零元素相对顺序前提下&#xff0c;移动零元素。 代码实现如下&#xff1a; class Solution {…

数据结构—判断题

1.数据的逻辑结构说明数据元素之间的顺序关系&#xff0c;它依赖于计算机的存储结构。 答案&#xff1a;错误 2.(neuDS)在顺序表中逻辑上相邻的元素&#xff0c;其对应的物理位置也是相邻的。 答案&#xff1a;正确 3.若一个栈的输入序列为{1, 2, 3, 4, 5}&#xff0c;则不…

加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签

文章目录 国际算法基础概念常见的加密算法及分类签名和验签基础概念常见的签名算法应用场景 国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; Code方式一 使用B…

3、Redis集群原理分析

槽定位 (Slot Mapping): Redis Cluster 将所有数据划分为 16384 个槽位&#xff08;slots&#xff09;&#xff0c;每个槽位由一个或多个节点负责管理。Redis 集群通过 CRC16 哈希算法来计算每个 key 的哈希值&#xff0c;并对 16384 取模以确定该 key 应该存储在哪个槽位上。…

Maven基础学习

一、Why? 1.真的需要吗? 2.究竟为什么? 二、What? 1.Maven简介 2.什么是构建 3.构建过程的几个主要环节 4.自动化构建 5.Maven核心概念 6.安装Maven 三、How? 四、约定的目录结构