YOLOv5改进系列(二)结合轻量化网络GhostNet

双11提前购!买周边/年卡,一键领4重福利! 送200元神券包+10%红包返利+最高10年VIP!还能抽iPhone18Pro!仅限1次,速抢>> 阅读详情

YOLOv5源码(使用的是YOLOv5 6.1版本)地址:GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

参考笔记:

【魔改YOLOv5-6.x(上)】结合轻量化网络Shufflenetv2、Mobilenetv3和Ghostnet_yolov5 shufflenet-CSDN博客

YOLOv5改进系列(三) 更换backbone主干MobileNetV3,ShuffleNetV2,EfficientNetv2,GhostNet,SwinTransformer_yolov5 mobilenet-CSDN博客


目录

1.GhostNet

1.1 Ghost Module(Ghost Conv)

1.2 Ghost Bottleneck

1.3 YOLOv5源码中的实现

2.YOLOv5结合Ghost


1.GhostNet

GhostNet出自华为诺亚方舟实验室,作者发现在传统的深度学习网络中存在着大量冗余,但是又对模型的精度至关重要的特征图。这些特征图是由卷积操作得到,又输入到下一个卷积层进行运算,这个过程包含大量的网络参数,消耗了大量的计算资源

作者考虑到这些feature map中的冗余信息可能是一个成功模型的重要组成部分,正是因为这些冗余信息才能保证输入数据的全面理解,所以作者在设计轻量化模型的时候并没有试图去除这些冗余feature map,而是尝试使用更低成本的计算量来获取这些冗余feature map

注意:此文的Ghost Module、Ghost Bottleneck主要针对官方提供的YOLOv5源码中的实现作讲解,与原生的华为官方提供的源码简化了很多。关于GhostNet的更多细节可以看我的另一篇博客:

神经网络-GhostNet的网络结构、代码实现-CSDN博客

1.1 Ghost Module(Ghost Conv)

Ghost Module

Ghost Module将传统卷积操作分为两部分实现,从而实现轻量化:

(1)使用少量卷积核进行卷积操作(比如正常用64个,这里就用32个,从而减少一半计算量)
(2)使用
3×3 或 5×5 的卷积核进行逐通道卷积操作(Cheap operations)
最终将第一步的结果作为一份恒等映射(Identity),与第二步的结果进行Concat操作

1.2 Ghost Bottleneck

Ghost Bottleneck是GhostNet中的瓶颈结构,由Ghost Module组成。其结构有点类似ResNet的残差块,同样使用到残差连接

Ghost Bottleneck

Ghost Bottleneck有两种结构:

  • stride=1:不对特征图的尺寸作下采样,特征图的(H,W)不发生改变
  • stride=2,对特征图的尺寸作下采样,多出来一个步长为2的DWConv逐通道卷积操作,特征图的(H,W)减半。在残差边部分会添加逐通道卷积、1x1 传统卷积作用于原始输入 x 后再作残差连接

1.3 YOLOv5源码中的实现

YOLOv5中提供了Ghost Module、Ghost Bottlenck的源码实现,不过需要注意的是相比于华为的源码是简化版本

代码实现在models/common.py下

#GhostConv即GhostNet中的Ghost Module
class GhostConv(nn.Module):
    #Ghost Convolution https://github.com/huawei-noah/ghostnet
    def __init__(self, c1, c2, k=1, s=1, g=1, act=True):  # ch_in, ch_out, kernel, stride, groups
        super().__init__()
        '''
        c1: in_channel
        c2: out_channel
        k: kernel_size
        s: stride
        g: groups
        '''

        #中间通道数c_
        c_ = c2 // 2

        #先作通道数减半卷积,减少计算量
        self.cv1 = Conv(c1, c_, k, s, None, g, act)

        #逐通道卷积
        self.cv2 = Conv(c_, c_, 5, 1, None, c_, act)

    #前向传播
    def forward(self, x):
        #先作通道数减半卷积
        y1 = self.cv1(x)
        #再作逐通道卷积
        y2 = self.cv2(y1)
        #将两部分在通道在通道维度上作concat
        return torch.cat([y1,y2], 1)

#Ghost Bottleneck
class GhostBottleneck(nn.Module):
    # Ghost Bottleneck https://github.com/huawei-noah/ghostnet
    def __init__(self, c1, c2, k=3, s=1):
        super().__init__()
        '''
        c1: in_channel
        c2: out_channel
        k: 逐通道卷积层的卷积核大小
        s: stride,若s=2,则在Ghost Bottleneck的主干部分增加一个逐通道卷积,残差部分添加逐通道卷积、普通1x1卷积
        '''

        #中间通道数c_
        c_ = c2 // 2

        #Ghost Bottleneck的主干部分,如果s=2,主干部分添加逐通道卷积
        self.conv = nn.Sequential(GhostConv(c1, c_, 1, 1),#第1个Ghost Module
                                  DWConv(c_, c_, k, s, act=False) if s == 2 else nn.Identity(),#逐通道卷积
                                  GhostConv(c_, c2, 1, 1, act=False))#第2个Ghost Module

        #Ghost Bottleneck的残差部分,如果s=2,残差部分添加逐通道卷积、普通1x1卷积
        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):
        return self.conv(x) + self.shortcut(x)

2.YOLOv5结合Ghost

YOLOv5中提供了结合Ghost的一种方式:将YOLOv5中的一些普通卷积层替换为Ghost Module(Ghost Conv)、C3模块中原先的瓶颈结构替换为Ghost Bottlenck,以此减少计算量和参数量

YOLOv5源码中C3Ghost的实现代码在models/common.py:

#继承C3类,C3Ghost是将原始C3模块中的瓶颈结构Bottleneck换成GhostBottleneck,其他部分没有改变
class C3Ghost(C3):
    # C3 module with GhostBottleneck()
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        super().__init__(c1, c2, n, shortcut, g, e)
        #中间通道数
        c_ = int(c2 * e)
        #替换瓶颈结构为GhostBottleneck
        self.m = nn.Sequential(*[GhostBottleneck(c_, c_) for _ in range(n)])

 结合步骤

  • 第1步:创建yolov5n_ghost.yaml存放于models目录下,并将原始yolov5n.yaml的内容拷贝
  • 第2步:修改yolov5n_ghost.yaml,将yolov5n_ghost.yaml中backbone和head的Conv、C3模块全部替换为GhostConv、C3Ghost,参数部分只有第0层需要作修改,其他层不用作任何修改

yolov5n_ghost.yaml

完整的yolov5_ghost.yaml如下:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 3  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # 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, GhostConv, [64, 5, 2]],  # 0-P1/2
   [-1, 1, GhostConv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3Ghost, [128]],
   [-1, 1, GhostConv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3Ghost, [256]],
   [-1, 1, GhostConv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3Ghost, [512]],
   [-1, 1, GhostConv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3Ghost, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, GhostConv, [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, GhostConv, [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, GhostConv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3Ghost, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, GhostConv, [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)
  ]
    •  第3步:在models/yolo.py脚本测试是否能够利用yolov5n_ghost.yaml搭建网络结构

     查看控制台打印的模型结构

    •  第4步:参数量、计算量的对比

    参数量对比

    • 第5步:精度对比

    上面是我用原始的yolov5n和结合GhostNet之后的yolov5n_ghost在我的数据集上跑10个epoch的结果(没有使用预训练权重),可以看到虽然计算量和参数量降低了很多,但是精度也掉了很多。精度掉了很多的原因是因为在轻量化方面“用力过猛”,下面是只在backbone部分结合GhostNet,而head部分用回原始的yolov5n中的结构的模型训练结果

    【魔改YOLOv5-6.x(上)】结合轻量化网络Shufflenetv2、Mobilenetv3和Ghostnet 文章目录前言一、Shufflenetv2论文简介模型概述加入YOLOv5二、Mobilenetv3论文简介模型概述深度可分离卷积逆残差结构SE通道注意力h-swish激活函数加入YOLOv5三、Ghostnet论文简介模型概述加入YOLOv5References 前言 本文使用的YOLOv5版本为v6.1,对YOLOv5-6.x网络结构还不熟悉的同学们,可以移步至:【YOLOv5-6.x】网络模型&源码解析 另外,本文所使用的实验环境为1个GTX 1080 GPU,数据集为VOC2007,超参数为h 阅读详情

    相关推荐

    【魔改YOLOv5-6.x(下)】YOLOv5s+Ghostconv+BiFPN+CA

    文章目录前言模型组合Ghost+BiFPNGhost+CAGhost+BiFPN+CA实验记录结果分析 前言 【魔改YOLOv5-6.x(上)】:结合轻量化网络Shufflenetv2、Mobilenetv3和Ghostnet 【魔改YOLOv5-6.x(中)】:加入ACON激活函数、CBAM和CA注意力机制、加权双向特征金字塔BiFPN 本文使用的YOLOv5版本为v6.1,对YOLOv5-6.x网络结构还不熟悉的同学,可以移步至:【YOLOv5-6.x】网络模型&源码解析 训练设置: $ pyt

    weixin_43799388的博客 3万+

    ghost使用详解

    ghost使用详解 让你更快的了解ghost运行及使用

    YOLOv5改进实战 | 更换主干网络Backbone(一)之轻量化网络Ghostnet

    w94ghz的博客 1万+

    YOLOV5目标检测换多种主干的方法(含shufflenet,ghost net,mobilenet,resnet等)

    其实换主干是一个较为简单的操作方法,但是很多新手可能不太会,或者其中可能会出现一些问题,那我对这些问题归纳出三步走换主干的方法,以便和大家分享交流。我们这里以yolov5s为例。

    weixin_57111012的博客 7731

    YOLOv5改进系列(三) 更换backbone主干MobileNetV3,ShuffleNetV2,EfficientNetv2,GhostNet,SwinTransformer

    文章目录MobileNetV3一、MobileNetV3原理**1.1 MobileNetV3简介**1.2 **MobileNetV3相关技术**二、YOLOv5结合MobileNetV3_small2.1 添加顺序2.2 具体添加步骤**第①步:在common.py中添加**MobileNetV3**模块****第②步:在yolo.py文件里的parse_model函数加入类名****第③步:创建自定义的yaml文件**第④步:验证是否加入成功**第⑤步:修改train.py中 ‘--cfg’默认参数*

    专注于人工智能学习,总结 3616

    YOLOv5改进系列(10)——替换主干网络之GhostNet

    手把手教你学会YOLOv5替换主干网络之GhostNet

    路人贾的博客 6512

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

    卷积层和建议的 Ghost 模块的图示,用于输出相同数量的特征图。Φ 代表廉价操作深度卷积神经网络通常由大量卷积组成,这会导致巨大的计算成本。尽管 MobileNet 和 ShuffleNet 等最近的工作引入了深度卷积或洗牌操作,以使用较小的卷积滤波器(浮点数操作)构建高效的 CNN,但剩余的 1 × 1 卷积层仍然会占用大量内存和失败。其中*是卷积运算,b是偏置项,Y ∈ Rh′×w′×n是n个通道的输出特征图,f ∈ Rc×k×k×n是该层的卷积滤波器。

    kay_545 4939

    改进YOLOv8:结合轻量化骨干,华为顶刊IJCV2022:G-GhostNet!

    这篇论文讨论了如何为具有有限内存和计算资源的异构设备(如CPU和GPU)设计高效的神经网络。作者提出了两个模块,C-Ghost和G-Ghost,以利用特征图中的冗余并使用廉价操作生成更多特征。C-Ghost模块是为类似CPU的设备设计的,可以轻松地集成到现有的卷积神经网络中。C-Ghost模块的设计思路是,通过在特征图中引入一些“幽灵”(Ghost)特征,即通过廉价的操作(如线性变换)生成的特征,来增加特征图的数量,从而提高网络的表达能力。

    qq_44224801的博客 3148

    目标检测算法——YOLOv5/YOLOv7改进结合轻量型Ghost模块

    将轻量型的Ghost模块与YOLOv5算法相结合,进一步降低网络参数量,使模型轻量化的同时加快网络推理速度。

    加勒比海带66——【YOLO魔法搭配&论文投稿咨询&Python科研绘图】 2万+

    实测改进YOLOv5轻量化:结合华为CV顶刊!更适用于GPU等设备的 G-GhostNet。

    本文主要针对于以往的网络结构特征冗余而设计一种新的网络,通过一些更轻量的操作来出来冗余的特征。本文针对网络部署时面临的内存和资源有限的问题,提出两种不同的Ghost模块,旨在利用成本低廉的线性运算来生成Ghost特征图。C-Ghost模块被应用于CPU等设备,并通过简单的模块堆叠实现C-GhostNet。适用于GPU等设备的G-Ghost模块利用阶段性特征冗余构建。最终实验结果表明两种模块分别实现了对应设备上精度和延迟的最佳权衡。

    qq_44224801的博客 5848

    目标检测YOLO实战应用案例100讲-结合YOLOv5神经网络轻量化改进的视觉SLAM(续)

    (1)首先对应backbone部分,使用轻量级的模型进行替换,传统选择有 EfficientNet B0、ShuffleNet V2、MobileNet V3等,这些模型不仅具有较少的参 数量,还可以在保持较高准确率的情况下,实现较快的推理速度。个可选的残差链接组成,1x1卷积层可以有效地在不改变特征图尺寸的情况下 进行通道间的信息融合,3x3卷积层是卷积神经网络中的常见组件,可以在保 持较低计算复杂度的同时提取丰富的特征信息,残差连接有助于梯度在网络中。的传播,提高训练稳定性。的设计结构相结合完成改进。

    qq_36130719的博客 2138

    Slim (二)

    针对yolo的轻量化第二阶段

    weiyuhaodashabi的博客 664

    YOLOv5改进系列(三) 本文(7万字) | 更换主干backbone | MobileNetV3 | ShuffleNetV2 | EfficientNetv2 | GhostNet | 等 |

    《人工智能专栏》 Python与Python | 机器学习 | 深度学习 | 目标检测 | YOLOv5及其改进 | YOLOv8及其改进 | 关键知识点 | 各种工具教程MobileNetV3,是谷歌在2019年3月21日提出的轻量化网络架构,在前两个版本的基础上,加入神经网络架构搜索(NAS)和h-swish激活函数,并引入SE通道注意力机制,性能和速度都表现优异,受到学术界和工业界的追捧。引用大佬的描述:MobileNet V3 = MobileNet v2 + SE结构 + hard

    专注于人工智能学习,总结 4763

    YOLOv8/YOLOv7/YOLOv5系列算法改进[NO.14]主干网络C3替换为轻量化网络Ghostnet

    ​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv5的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。解决问题:YOLOv5主干特征提取网络采用C3结构,带来较大的参数量,检测速度较慢,应用受限,在某些真实的应用场景如移动或者嵌入式设备,如此大而复杂的模型时难以被应用的。...

    m0_70388905的博客 1万+

    YOLOv5改进实战 | 更换主干网络Backbone之轻量化网络Ghostnet

    精度损失 | -1.3 | -2.1 | -1.4 | -2.1 | -1.9 || 模型 | mAP@0.5 | mAP@0.5:0.95 | 小目标AP | 中目标AP | 大目标AP || 阶段 | 输入尺寸 | 重复次数 | 输出通道数 | 幻影系数s |- **幻影生成**:对每个特征图应用3×3深度可分离卷积,生成s-1个幻影。| 操作类型 | 标准卷积 | Ghost模块 | 压缩比 |

    Loving_enjoy的博客 720

    改进YOLOv5:涨点必备 | 创新实用 | 轻量化骨干网络大一统,包含FastNet、ShuffleNet、mobileNet、Ghostnet等

    本文实现了YOLOv8结合各种轻量化骨干网络,实现一篇文章助你实现YOLOv8轻量化。本文不仅实现了YOLOv8结合各种骨干网络,并且给出的多种结合形式,如替换轻量化卷积PConv、替换轻量化Block以及替换轻量化骨干。

    qq_44224801的博客 4267

    [YOLOv7/YOLOv5系列改进NO.44]融入适配GPU的轻量级 G-GhostNet

    G-GhostNet 是适配 GPU 端的轻量级 GhostNet

    m0_70388905的博客 7843

    YOLOv12改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构

    本文记录的是基于的YOLOv12网络模型轻量化方法研究。GhostNet中的Ghost模块和Ghost瓶颈结构是其轻量化的关键。Ghost模块克服了传统卷积层计算资源需求大的问题,Ghost瓶颈则合理设计了通道数量的变化以及与捷径连接的方式,能更好地在减少计算成本的同时保持较高性能,从而提升模型在移动设备上的应用能力和效率。

    Limiiiing的博客 955
    上一篇: 神经网络-GhostNet的网络结构、代码实现
    下一篇: YOLOv5改进系列(三)更换空间金字塔池化改进 SPP / SPPF / SimSPPF / SPPCSPC / SPPFCSPC
    倒霉蛋老马
    博客等级 码龄6年 990粉丝 134原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值