YOLOv8改进 | 模块缝合 | C2f 融合SCConv提升检测性能【CVPR2023】

11,097次阅读
没有评论

共计 9258 个字符,预计需要花费 24 分钟才能阅读完成。

秋招面试专栏推荐 深度学习算法工程师面试问题总结【百面算法工程师】—— 点击即可跳转


💡💡💡 本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录:《YOLOv8 改进有效涨点》专栏介绍 & 专栏目录 | 目前已有 110+ 篇内容,内含各种 Head 检测头、损失函数 Loss、Backbone、Neck、NMS 等创新点改进 —— 点击即可跳转


卷积神经网络(CNN)在计算机视觉任务中表现优异,但需大量计算资源。本文 介绍了 SCConv 模块,通过减少空间和通道冗余来压缩 CNN,提高效率 。SCConv 包含空间重构单元(SRU)和通道重构单元(CRU),分别减少空间和通道冗余。SCConv 能降低模型复杂性和计算成本,同时提升性能。文章在介绍主要的原理后,将 手把手教学如何进行模块的代码添加和修改 ,并将修改后的 完整代码放在文章的最后 ,方便大家一键运行, 小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测 YOLO 系列的挑战。

专栏地址YOLOv8 改进 —— 更新各种有效涨点方法 —— 点击即可跳转

目录

[1. 原理](#1. 原理)

[2. 将 C2f_SCConv 添加到 yolov8 网络中](#2. 将 C2f_SCConv 添加到 yolov8 网络中)

[2.1 C2f_SCConv 代码实现](#2.1 C2f_SCConv 代码实现)

[2.2 C2f_SCConv 的神经网络模块代码解析](#2.2 C2f_SCConv 的神经网络模块代码解析)

[2.3 更改 init.py 文件](#2.3 更改 init.py 文件)

[2.4 添加 yaml 文件](#2.4 添加 yaml 文件)

[2.5 注册模块](#2.5 注册模块)

[2.6 执行程序](#2.6 执行程序)

[3. 完整代码分享](#3. 完整代码分享)

[4. GFLOPs](#4. GFLOPs)

[5. 进阶](#5. 进阶)

[6. 总结](#6. 总结)


1. 原理

YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

论文地址: SCConv: Spatial and Channel Reconstruction Convolution for Feature Redundancy—— 点击即可跳转

官方代码: 官方代码仓库 —— 点击即可跳转

SCConv(空间和通道重构卷积)是一个卷积模块,减少卷积神经网络(CNN)中空间和通道维度的特征冗余。其主要目的是降低计算成本,在不牺牲性能的情况下改善特征表示。该模块由两个主要组件组成:

  1. 空间重构单元(SRU):该单元通过使用组归一化缩放因子将特征图分为信息量大的部分和信息量小的部分来解决空间冗余问题。它通过组合这两个部分来重构特征,以创建空间细化特征,减少冗余并增强空间特征表示。

  2. 通道重构单元(CRU):该单元通过将特征图分成两组并应用不同的卷积运算(如分组和点卷积)来处理通道冗余。然后,它自适应地融合转换后的特征,减少通道维度的冗余并提高特征提取效率。

同时,SRU 和 CRU 被依次应用,以减少空间和通道冗余。SCConv 可以集成到现有的 CNN 架构中,取代标准卷积,以提高性能,同时减少参数数量和 FLOP(浮点运算)。

2. 将 C2f_SCConv 添加到 yolov8 网络中

2.1 C2f_SCConv代码实现

关键步骤一: 将下面代码粘贴到在 /ultralytics/ultralytics/nn/modules/block.py 中,并在该文件的__all__中添加 ”C2f_SCConv”

python
复制代码

class GroupBatchnorm2d(nn.Module):
    def __init__(self, c_num:int, 
                 group_num:int = 16, 
                 eps:float = 1e-10
                 ):
        super(GroupBatchnorm2d,self).__init__()
        assert c_num    >= group_num
        self.group_num  = group_num
        self.gamma      = nn.Parameter(torch.randn(c_num, 1, 1))
        self.beta       = nn.Parameter(torch.zeros(c_num, 1, 1))
        self.eps        = eps

    def forward(self, x):
        N, C, H, W  = x.size()
        x           = x.view(N, self.group_num, -1)
        mean        = x.mean(dim = 2, keepdim = True)
        std         = x.std (dim = 2, keepdim = True)
        x           = (x - mean) / (std+self.eps)
        x           = x.view(N, C, H, W)
        return x * self.gamma + self.beta

class SRU(nn.Module):
    def __init__(self,
                 oup_channels:int, 
                 group_num:int = 16,
                 gate_treshold:float = 0.5 
                 ):
        super().__init__()
        
        self.gn             = GroupBatchnorm2d(oup_channels, group_num = group_num)
        self.gate_treshold  = gate_treshold
        self.sigomid        = nn.Sigmoid()

    def forward(self,x):
        gn_x        = self.gn(x)
        w_gamma     = self.gn.gamma/sum(self.gn.gamma)
        reweigts    = self.sigomid(gn_x * w_gamma)
        # Gate
        info_mask   = reweigts>=self.gate_treshold
        noninfo_mask= reweigts

2.2 C2f_SCConv 的神经网络模块代码解析

C2f_ScConv 是一个自定义神经网络模块,它通过合并 ScConv 来扩展 C2f 架构,ScConv 是两个单元的组合:空间重构单元 (SRU) 和通道重构单元 (CRU)。

空间和通道重构 (ScConv)

ScConv 模块集成了 SRU 和 CRU,以解决特征图中的空间和通道冗余。

  • SRU:使用组批量归一化 (GroupBatchnorm2d) 分离空间冗余特征,并通过门控机制重构信息和非信息部分。

  • CRU:将通道分为两部分(高信息通道和低信息通道),并应用轻量级卷积操作(分组和点卷积)来有效地转换和融合这些特征。

Bottleneck_ScConv : 在 C2f_ScConv 块中,每个瓶颈层都被 Bottleneck_ScConv 替换,后者使用 ScConv 作为其转换层的一部分。这为标准瓶颈结构添加了特征重构能力,增强了特征表示,同时减少了冗余。

C2f 结构 : C2f_ScConv 块继承了 C2f 的核心结构,它使用模块列表 (self.m) 堆叠多个瓶颈层(现在使用 ScConv)。此设置允许模型以更精细的方式处理特征,利用 ScConv 提供的空间和通道优化。

C2f_ScConv 的主要目标是通过减少不必要的计算来改进特征学习,使其在保持或提高性能的同时更加高效。

YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

2.3 更改 init.py 文件

** 关键步骤二:** 修改 modules 文件夹下的__init__.py 文件,先导入函数

YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

然后在下面的__all__中声明函数

YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

2.4 添加 yaml 文件

** 关键步骤三:** 在 /ultralytics/ultralytics/cfg/models/v8 下面新建文件 yolov8_C2f_SCConv.yaml 文件,粘贴下面的内容

python
复制代码

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
  - [-1, 3, C2f_ScConv, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f_ScConv, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f_ScConv, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f_ScConv, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]]  # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C2f_ScConv, [512]]  # 12

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f_ScConv, [256]]  # 15 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f_ScConv, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f_ScConv, [1024]]  # 21 (P5/32-large)

  - [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)

python
复制代码

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4
  - [-1, 3, C2f_ScConv, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f_ScConv, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f_ScConv, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f_ScConv, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]]  # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 6], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C2f_ScConv, [512]]  # 12

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f_ScConv, [256]]  # 15 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f_ScConv, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f_ScConv, [1024]]  # 21 (P5/32-large)

  - [[15, 18, 21], 1, Segment, [nc, 32, 256]] # Segment(P3, P4, P5)

温馨提示:因为本文只是对 yolov8 基础上添加模块,如果要对 yolov8n/l/m/ x 进行添加则只需要指定对应的 depth_multiple 和 width_multiple。不明白的同学可以看这篇文章:yolov8yaml 文件解读 —— 点击即可跳转


python
复制代码

# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
max_channels: 1024 # max_channels
 
# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
max_channels: 1024 # max_channels
 
# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
max_channels: 512 # max_channels
 
# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
max_channels: 768 # max_channels
 
# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
max_channels: 512 # max_channels

2.5 注册模块

** 关键步骤四:** 在 task.py 的 parse_model 函数中注册

YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

2.6 执行程序

在 train.py 中,将 model 的参数路径设置为 yolov8_C2f_SCConv.yaml 的路径

建议大家写绝对路径,确保一定能找到

python
复制代码

from ultralytics import YOLO
import warnings
warnings.filterwarnings('ignore')
from pathlib import Path
 
if __name__ == '__main__':
 
 
    # 加载模型
    model = YOLO("ultralytics/cfg/v8/yolov8.yaml")  # 你要选择的模型 yaml 文件地址
    # Use the model
    results = model.train(data=r"你的数据集的 yaml 文件地址",
                          epochs=100, batch=16, imgsz=640, workers=4, name=Path(model.cfg).stem)  # 训练模型

🚀运行程序,如果出现下面的内容则说明添加成功🚀

python
复制代码

                   from  n    params  module                                       arguments
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]
  1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]
  2                  -1  1      5536  ultralytics.nn.modules.block.C2f_ScConv      [32, 32, 1, True]
  3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]
  4                  -1  2     35008  ultralytics.nn.modules.block.C2f_ScConv      [64, 64, 2, True]
  5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]
  6                  -1  2    138880  ultralytics.nn.modules.block.C2f_ScConv      [128, 128, 2, True]
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]
  8                  -1  1    342656  ultralytics.nn.modules.block.C2f_ScConv      [256, 256, 1, True]
  9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]
 10                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 11             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 12                  -1  1    118848  ultralytics.nn.modules.block.C2f_ScConv      [384, 128, 1]
 13                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']
 14             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 15                  -1  1     29920  ultralytics.nn.modules.block.C2f_ScConv      [192, 64, 1]
 16                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]
 17            [-1, 12]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 18                  -1  1     94272  ultralytics.nn.modules.block.C2f_ScConv      [192, 128, 1]
 19                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]
 20             [-1, 9]  1         0  ultralytics.nn.modules.conv.Concat           [1]
 21                  -1  1    375424  ultralytics.nn.modules.block.C2f_ScConv      [384, 256, 1]
 22        [15, 18, 21]  1    897664  ultralytics.nn.modules.head.Detect           [80, [64, 128, 256]]
YOLOv8_C2f_ScConv summary: 305 layers, 2780624 parameters, 2780608 gradients, 7.9 GFLOPs

3. 完整代码分享

python
复制代码

https://pan.baidu.com/s/1ltsFj8LsgeseaVbvqY_GBw?pwd=cy7t

提取码: cy7t

4. GFLOPs

关于 GFLOPs 的计算方式可以查看 百面算法工程师 | 卷积基础知识 ——Convolution

未改进的 YOLOv8nGFLOPs

YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

改进后的 GFLOPs

YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

5. 进阶

可以与其他的注意力机制或者损失函数等结合,进一步提升检测效果

6. 总结

SCConv(空间与通道重建卷积)通过同时减少卷积神经网络(CNN)中的空间和通道冗余,提升计算效率和特征表达能力。SCConv 模块由两部分组成:空间重建单元(SRU)和通道重建单元(CRU)。SRU 通过基于权重的分离和重构操作,分离出空间冗余较少的特征,并通过交叉重构增强有信息的特征,同时抑制空间冗余。CRU 采用 ” 分割 - 变换 - 融合 ” 的策略,先将特征图通道划分为两部分,再分别应用高效的卷积操作(如组卷积和点卷积),以减少通道冗余。最后,通过自适应融合机制结合两类特征,进一步提升特征表达能力。SCConv 可以无缝嵌入各种现有的 CNN 架构,代替标准卷积操作,在减少模型参数和计算量的同时,提升性能,尤其适用于在资源受限环境下的模型部署。

文章来源: YOLOv8 改进 | 模块缝合 | C2f 融合 SCConv 提升检测性能【CVPR2023】

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-19发表,共计9258字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)