YOLOv8改进 | 融合模块 | 用Resblock+CBAM卷积替换Conv【轻量化网络】

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 在这个教程中,介绍了如何将YOLOv8的目标检测模型改进,用Resblock+CBAM替换原有的卷积层。Resblock基于ResNet的残差学习思想,减少信息丢失,而CBAM是通道和空间注意力模块,增强网络对特征的感知。教程详细解释了ResNet和CBAM的原理,并提供了代码示例展示如何在YOLOv8中实现这一改进。此外,还给出了新增的yaml配置文件示例以及如何注册模块和执行程序。作者分享了完整的代码,并对比了改进前后的GFLOPs计算量,强调了这种改进在提升性能的同时可能增加计算需求。教程适合深度学习初学者实践和提升YOLO系列模型的性能。


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

在目标检测领域内,尽管YOLO系列的算法傲视群雄,但在某些方面仍然存在改进的空间。在YOLOv8提取特征的时候,由于卷积的缘故,会导致很多信息的丢失。而凯明大神的神作resnet可以减少信息的丢失。本文给大家带来的教程是将原来的Conv替换为Resblock+CBAM。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址:YOLOv8改进——更新各种有效涨点方法

1.原理

image.png

ResNet的核心思想是残差学习,它建立在传统的深度卷积神经网络(CNN)的基础上,通过引入“跳跃连接”(skip connection)或者叫“快捷连接”(shortcut connection)的方式,将输入信息直接跳过几层,与后续的层相加,从而使得网络可以学习到残差信息。这种设计可以帮助网络更容易地学习到恒等映射(identity mapping),从而加速了网络的收敛,并且有效地解决了深度网络训练过程中的梯度消失和梯度爆炸问题。

ResNet的网络结构通常由若干个残差块(Residual Blocks)组成,每个残差块内部由若干个卷积层、批量归一化层和激活函数层组成。ResNet还引入了全局平均池化层(Global Average Pooling)来代替传统的全连接层,从而减少了模型参数数量,降低了过拟合风险,并且使得模型更具有泛化能力。

关于resnet的更详细内容,相信大家早已滚瓜烂熟,就不在此过多的介绍。

ResNet官方论文Deep Residual Learning for Image Recognition

CBAM官方论文CBAM: Convolutional Block Attention Module

CBAM,即通道注意力模块(Channel-wise Attention Module),是一种用于增强卷积神经网络(CNN)性能的注意力机制模块。CBAM旨在利用通道和空间注意力来提高网络对于不同特征的感知能力,从而提升模型在各种计算机视觉任务上的性能。

CBAM主要包括两个子模块:通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module)。这两个子模块分别用于对通道维度和空间维度的特征进行建模和加权,以提高模型对于重要特征的关注度。

将通道注意力模块和空间注意力模块结合起来,可以使得网络在处理特征时更加准确和高效。CBAM模块可以嵌入到各种不同的CNN架构中,用于提升模型性能,例如在图像分类、目标检测、语义分割等任务中都取得了显著的性能提升。

2. 代码实现

2.1 将resblock + CBAM添加到YOLOv8中

class ResBlock_CBAM(nn.Module):
    def __init__(self, in_places, places, stride=1, downsampling=False, expansion=1):
        super(ResBlock_CBAM, self).__init__()
        self.expansion = expansion
        self.downsampling = downsampling
​
        self.bottleneck = nn.Sequential(
            nn.Conv2d(in_channels=in_places, out_channels=places, kernel_size=1, stride=1, bias=False),
            nn.BatchNorm2d(places),
            nn.LeakyReLU(0.1, inplace=True),
            nn.Conv2d(in_channels=places, out_channels=places, kernel_size=3, stride=stride, padding=1, bias=False),
            nn.BatchNorm2d(places),
            nn.LeakyReLU(0.1, inplace=True),
            nn.Conv2d(in_channels=places, out_channels=places * self.expansion, kernel_size=1, stride=1,
                      bias=False),
            nn.BatchNorm2d(places * self.expansion),
        )
        # self.cbam = CBAM(c1=places * self.expansion, c2=places * self.expansion, )
        self.cbam = CBAM(c1=places * self.expansion)
​
        if self.downsampling:
            self.downsample = nn.Sequential(
                nn.Conv2d(in_channels=in_places, out_channels=places * self.expansion, kernel_size=1, stride=stride,
                          bias=False),
                nn.BatchNorm2d(places * self.expansion)
            )
        self.relu = nn.ReLU(inplace=True)
​
***********省略***********

*注:需要文件里已经添加了CBAM注意力机制

在本级目录的init.py中进行注册

  • 主要流程

ResBlock结合CBAM的流程可以总结如下:

  1. 输入特征:输入特征经过初始卷积层,如3x3卷积层,进行特征提取和降维处理,得到特征图。

  2. Residual Block(ResBlock):特征图通过一个或多个残差块(Residual Block),其中每个残差块包含了多个卷积层、批量归一化层和激活函数层。在ResBlock内部,特征图通过跳跃连接(shortcut connection)直接加到残差块输出上,从而得到残差学习的特征表示。

  3. 通道注意力模块(Channel Attention Module,CAM):残差块的输出特征图通过通道注意力模块(CAM),其中全局平均池化操作用于捕捉每个通道的重要性,然后通过全连接层和激活函数对池化后的特征进行建模,得到通道注意力权重向量。这个权重向量用来对残差块的输出特征图的通道维度进行加权。

  4. 空间注意力模块(Spatial Attention Module,SAM):残差块的输出特征图也通过空间注意力模块(SAM),其中最大池化和平均池化操作用于捕捉空间维度上的重要性,然后通过卷积操作生成空间注意力图。这个空间注意力图用来对残差块的输出特征图的空间维度进行加权。

  5. 加权特征融合:通过将通道注意力模块和空间注意力模块得到的权重与残差块的输出特征图相乘,实现通道维度和空间维度的特征加权融合。

  6. 输出:最终加权融合后的特征图作为ResBlock的输出,可以继续传递给下一个ResBlock或其他后续层进行处理,如全局平均池化和全连接层,最终得到网络的输出结果。

这样的ResBlock结合CBAM的流程,利用了残差学习和通道空间注意力机制,可以使得网络更加关注重要的特征,提高了模型的性能和泛化能力,在各种计算机视觉任务中取得了显著的效果提升。

image.png

2.2 新增yaml文件

# 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: 1  # 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, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f, [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, [512]]  # 12
  - [-1, 1, ResBlock_CBAM, [512]]
​
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f, [256]]  # 16 (P3/8-small)
  - [-1, 1, ResBlock_CBAM, [256]]
​
........此处省略........
​
  - [[17, 21, 25], 1, Detect, [nc]]  # Detect(P3, P4, P5)

温馨提示:因为本文只是对yolov8基础上添加swin模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。或者指定某个模型即可

# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple

# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple

# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple

# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple

# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.3 注册模块

并且需要在每一级init.py中注册模块

2.4 执行程序
在ultralytics文件中新建train.py,将model的参数路径设置为yolov8-res-block.yaml的路径即可

# 简单的例子
from ultralytics import YOLO
​
# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8l-res-cbam.yaml')  # build from YAML and transfer weights
​
# Train the model
model.train()

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

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

3. 完整代码分享

YOLOv8改进 | 融合模块 | 用Resblock+CBAM卷积替换Conv【轻量化网络】——点击即可跳转

提取码: eg3f

4. GFLOPs对比

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

未改进版本
image.png

改进后

image.png

增加残差网络无疑会增加计算量,但是也会改变特征提取的能力。

5.进阶

6.总结

当ResBlock与CBAM结合时,它们共同构成了一种强大的特征学习和增强机制。ResBlock通过残差学习实现更深层次的特征学习,而CBAM引入的通道注意力机制和空间注意力机制则使网络更关注重要特征,从而提高了特征表达能力和感知能力。这种结合不仅提升了网络性能,在图像分类、目标检测等任务中取得显著效果,而且减少了过拟合风险,增强了网络的鲁棒性和参数效率。综上所述,ResBlock结合CBAM能够提供更好的特征学习和增强机制,从而显著提升了深度神经网络在各种计算机视觉任务中的性能和表现。

相关文章
|
13天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
167 55
|
23天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
129 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
26天前
|
机器学习/深度学习 资源调度 算法
图卷积网络入门:数学基础与架构设计
本文系统地阐述了图卷积网络的架构原理。通过简化数学表述并聚焦于矩阵运算的核心概念,详细解析了GCN的工作机制。
72 3
图卷积网络入门:数学基础与架构设计
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN): 从理论到实践
本文将深入浅出地介绍卷积神经网络(CNN)的工作原理,并带领读者通过一个简单的图像分类项目,实现从理论到代码的转变。我们将探索CNN如何识别和处理图像数据,并通过实例展示如何训练一个有效的CNN模型。无论你是深度学习领域的新手还是希望扩展你的技术栈,这篇文章都将为你提供宝贵的知识和技能。
185 7
|
29天前
|
机器学习/深度学习 自然语言处理 算法
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
39 1
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
探索深度学习中的卷积神经网络(CNN)及其在现代应用中的革新
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
1月前
|
机器学习/深度学习 人工智能 网络架构
深入理解深度学习中的卷积神经网络(CNN)
深入理解深度学习中的卷积神经网络(CNN)
47 1
|
1月前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)入门
【10月更文挑战第41天】在人工智能的璀璨星空下,卷积神经网络(CNN)如一颗耀眼的新星,照亮了图像处理和视觉识别的路径。本文将深入浅出地介绍CNN的基本概念、核心结构和工作原理,同时提供代码示例,带领初学者轻松步入这一神秘而又充满无限可能的领域。

热门文章

最新文章