前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >YOLOv8独家改进:轻量级原创自研 | 一种多尺度的GSConv卷积变体,轻量化的同时能够实现涨点 | 新颖的轻量级网络

YOLOv8独家改进:轻量级原创自研 | 一种多尺度的GSConv卷积变体,轻量化的同时能够实现涨点 | 新颖的轻量级网络

原创
作者头像
AI小怪兽
发布2024-02-09 14:44:55
1.3K05
代码可运行
发布2024-02-09 14:44:55
举报
文章被收录于专栏:YOLO大作战YOLO大作战
运行总次数:5
代码可运行

???本文独家改进:1)基于GSConv提出了一种Multi-Scale Ghost Conv的卷积变体,保证轻量级的同时实现涨点,2)同时结合Bottleneck,设计了一种新颖的轻量级网络。

???在多个数据集验证能够涨点,同时跟yolov8n、yolov8s进行参数量对比:

parameters、GFLOPs都有大幅度的降低

parameters

GFLOPs

yolov8s

11166560

28.8

yolov8s-MSGConv

10429727

27.3

yolov8s-lyolo

6625687

18.1

yolov8n

3011823

8.2

yolov8n-MSGConv

2838399

7.9

yolov8n-lyolo

2041436

6.3

1.原理介绍

摘要: 由于内存和计算资源的限制,在嵌入式设备商部署卷积神经网络CNN很困难。Deploying convolutional neural networks (CNNs)on embedded devices is difficulty due to the limited memory and computation resources. 特征图中的冗余是成功神经网络的重要特征,但在神经网络架构设计中很少研究,本文提出一种新的Ghost模块,从廉价的操作中生成更多的特征图。基于一组内在的特征图,以低成本应用一系列线性变换来生成许多ghost特征图,可以充分揭示内在特征的信息。所提出的Ghost模块可以作为即插即用的组件轻松升级现有的卷积神经网络,Ghost bottleneck被设计为堆叠Ghost模块 ,然后轻松建立轻量级GhostNet。

在主流的深度神经网络提取的特征图中,丰富甚至冗余的信息通常保证了对输入数据的全面理解。例如,图1展示了由ResNet-50生成的输入图像的一些特征图,并且存在许多相似的特征图对,就像彼此之间的幽灵一样

引入了一个新的 Ghost 模块,通过使用更少的参数来生成更多的特征。具体来说,深度神经网络中的一个普通卷积层会被分成两部分。第一部分涉及普通卷积,但它们的总数将受到严格控制。给定第一部分的内在特征图,然后应用一系列简单的线性操作来生成更多的特征图。在不改变输出特征图的大小的情况下,与普通卷积神经网络相比,这个 Ghost 模块所需的总体参数数量和计算复杂度有所降低。

基于 Ghost 模块,建立了一个高效的神经架构,即 GhostNet。首先替换基准神经架构中的原始卷积层以证明 Ghost 模块的有效性,然后验证 GhostNets 在几个基准视觉数据集上的优越性。

利用ghost模块的优势,介绍了专门为小模型设计Ghost bottlenck,如图3所示。Ghost bottleneck类似于ResNet中基本残差块,其中集成了几个卷积层和shortcuts。ghost bottleneck主要有堆叠的ghost module组成,第一个ghost模块充当增加通道数量的扩展层,将输出通道数和输入通道数之比成为扩展比。第二个ghost模块减少通道数量以匹配shortcuts,然后,shortcuts在这两个ghost模块的输入和输出之间。BN和ReLu在每一层之后应用,第二个ghost模块后不用ReLU。

1.1 多尺度GSConv

原始 GhostConv代码如下:

代码语言:python
代码运行次数:2
复制
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__()
        c_ = c2 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, k, s, None, g, act)
        self.cv2 = Conv(c_, c_, 5, 1, None, c_, act)

    def forward(self, x):
        y = self.cv1(x)
        return torch.cat([y, self.cv2(y)], 1)

2.如何将入到YOLOv8

核心代码:

代码语言:python
代码运行次数:3
复制
import torch
import torch.nn as nn
import math
from einops import rearrange


def autopad(k, p=None):  # kernel, padding
    # Pad to 'same'
    if p is None:
        p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-pad
    return p


class Conv(nn.Module):
    # Standard convolution
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super().__init__()
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

    def forward(self, x):
        return self.act(self.bn(self.conv(x)))

    def forward_fuse(self, x):
        return self.act(self.conv(x))


class DWConv(Conv):
    # Depth-wise convolution class
    def __init__(self, c1, c2, k=1, s=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super().__init__(c1, c2, k, s, g=math.gcd(c1, c2), act=act)

详见:

https://cv2023.blog.csdn.net/?type=lately

by CSDN AI小怪兽

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.原理介绍
    • 1.1 多尺度GSConv
    • 2.如何将入到YOLOv8
      • 核心代码:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com