【YOLOv8改进 - Backbone主干】ShuffleNet V2:卷积神经网络(CNN)架构

简介: 【YOLOv8改进 - Backbone主干】ShuffleNet V2:卷积神经网络(CNN)架构

YOLOv8目标检测创新改进与实战案例专栏

专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLOv8基础解析+创新改进+实战案例

介绍

image-20240613151657343

摘要

在ShuffleNet v2的文章中作者指出现在普遍采用的FLOPs评估模型性能是非常不合理的,因为一批样本的训练时间除了看FLOPs,还有很多过程需要消耗时间,例如文件IO,内存读取,GPU执行效率等等。作者从内存消耗成本,GPU并行性两个方向分析了模型可能带来的非FLOPs的行动损耗,进而设计了更加高效的ShuffleNet v2。ShuffleNet v2的架构和DenseNet[4]有异曲同工之妙,而且其速度和精度都要优于DenseNet。

文章链接

论文地址:论文地址

代码地址代码地址

参考代码代码地址

基本原理

ShuffleNet V2是一种新颖的卷积神经网络(CNN)架构,旨在实现高效和准确的图像分类和目标检测任务。

  1. 构建模块:ShuffleNet V2的架构由构建模块组成,这些模块被堆叠起来构建整个网络。这些构建模块被设计为高效,允许使用更多的特征通道和更大的网络容量[T2]。

  2. 空间下采样:在ShuffleNet V2中,通过修改单元并将输出通道数量加倍来实现空间下采样。这种修改增强了网络的效率,同时保持准确性[T2]。

  3. 感受野增强:为了改善ShuffleNet V2在检测任务上的性能,通过在每个构建模块的逐点卷积之前引入额外的3x3深度卷积来扩大网络的感受野。这种增强被标记为ShuffleNet V2*,可以在几乎不增加计算成本的情况下提高准确性[T1]。

ShuffleNet v2结构

image-20240613151915287

观察 (c) 和 (d) 对网络的改进,我们发现了以下几点:

  1. 在 (c) 中,ShuffleNet v2 使用了通道分割(Channel Split)操作。这个操作将 (c) 个输入特征分成 (c - c') 和 (c') 两组,一般情况下 (c' = \frac{c}{2})。这种设计目的是为了尽量控制分支数,满足 G3。
  2. 分割后的两个分支中,左侧是一个直接映射,右侧是一个输入通道数和输出通道数均相同的深度可分离卷积,以满足 G1。
  3. 右侧的卷积中,1×1 卷积没有使用分组卷积,以满足 G2。
  4. 最后在合并时,使用拼接操作,以满足 G4。
  5. 在堆叠 ShuffleNet v2 时,通道拼接、通道洗牌和通道分割可以合并成一个 element-wise 操作,这也是为了满足 G4。

最后,当需要降采样时,通过不进行通道分割的方式来实现通道数量的加倍,如图 6(d) 所示,这个方法非常简单。

核心代码

# 定义 ShuffleNetV2 模块
class ShuffleNetV2(nn.Module):
    def __init__(self, inp, oup, stride):  # inp: 输入通道数, oup: 输出通道数, stride: 步长
        super().__init__()

        self.stride = stride

        # 计算每个分支的通道数
        branch_features = oup // 2
        # 确保步长为1时输入通道数是分支通道数的两倍
        assert (self.stride != 1) or (inp == branch_features << 1)

        if self.stride == 2:
            # 定义 branch1,当步长为2时
            self.branch1 = nn.Sequential(
                # 深度卷积,输入通道数等于输出通道数,步长为2
                nn.Conv2d(inp, inp, kernel_size=3, stride=self.stride, padding=1, groups=inp),
                nn.BatchNorm2d(inp),
                # 1x1 卷积,输出通道数等于 branch_features
                nn.Conv2d(inp, branch_features, kernel_size=1, stride=1, padding=0, bias=False),
                nn.BatchNorm2d(branch_features),
                nn.ReLU(inplace=True))
        else:
            # 步长为1时,branch1 为空
            self.branch1 = nn.Sequential()

        # 定义 branch2
        self.branch2 = nn.Sequential(
            # 1x1 卷积,步长为1,输出通道数等于 branch_features
            nn.Conv2d(inp if (self.stride == 2) else branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(branch_features),
            nn.ReLU(inplace=True),
            # 深度卷积,步长为 stride,输出通道数等于 branch_features
            nn.Conv2d(branch_features, branch_features, kernel_size=3, stride=self.stride, padding=1, groups=branch_features),
            nn.BatchNorm2d(branch_features),
            # 另一个 1x1 卷积,步长为1
            nn.Conv2d(branch_features, branch_features, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(branch_features),
            nn.ReLU(inplace=True),
        )

    def forward(self, x):
        if self.stride == 1:
            # 当步长为1时,将输入在通道维度上分成两部分
            x1, x2 = x.chunk(2, dim=1)
            # 连接 x1 和 branch2 处理后的 x2
            out = torch.cat((x1, self.branch2(x2)), dim=1)
        else:
            # 当步长为2时,连接 branch1 和 branch2 的输出
            out = torch.cat((self.branch1(x), self.branch2(x)), dim=1)

        # 进行通道混洗
        out = self.channel_shuffle(out, 2)

        return out

    def channel_shuffle(self, x, groups):
        # 获取输入张量的形状信息
        N, C, H, W = x.size()
        # 调整张量的形状,并交换通道维度
        out = x.view(N, groups, C // groups, H, W).permute(0, 2, 1, 3, 4).contiguous().view(N, C, H, W)
        return out

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/139655578

相关文章
|
7天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
10天前
|
机器学习/深度学习 监控 自动驾驶
卷积神经网络有什么应用场景
【10月更文挑战第23天】卷积神经网络有什么应用场景
13 2
|
10天前
|
机器学习/深度学习 自然语言处理 算法
什么是卷积神经网络
【10月更文挑战第23天】什么是卷积神经网络
17 1
|
13天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
54 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
4天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
10天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深度学习中的卷积神经网络(CNN)及其应用
【10月更文挑战第26天】在这篇文章中,我们将深入探讨卷积神经网络(CNN)的基本原理、结构和应用。CNN是深度学习领域的一个重要分支,广泛应用于图像识别、语音处理等领域。我们将通过代码示例和实际应用案例,帮助读者更好地理解CNN的概念和应用。
|
12天前
|
机器学习/深度学习 算法 计算机视觉
深度学习与生活:如何利用卷积神经网络识别日常物品
【10月更文挑战第24天】在这篇文章中,我们将探索深度学习如何从理论走向实践,特别是卷积神经网络(CNN)在图像识别中的应用。通过一个简单的示例,我们将了解如何使用CNN来识别日常生活中的物体,如水果和家具。这不仅是对深度学习概念的一次直观体验,也是对技术如何融入日常生活的一次深刻反思。文章将引导读者思考技术背后的哲理,以及它如何影响我们的生活和思维方式。
|
8天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
5天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
7天前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
24 3
下一篇
无影云桌面