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

本文涉及的产品
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频资源包5000点
简介: 在这个教程中,介绍了如何将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能够提供更好的特征学习和增强机制,从而显著提升了深度神经网络在各种计算机视觉任务中的性能和表现。

相关文章
|
21天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的双刃剑
在数字化浪潮中,云计算如同一股不可阻挡的力量,推动着企业和个人用户步入一个高效、便捷的新时代。然而,随之而来的网络安全问题也如影随形,成为制约云计算发展的阿喀琉斯之踵。本文将探讨云计算服务中的网络安全挑战,揭示信息保护的重要性,并提供实用的安全策略,旨在为读者呈现一场技术与安全的较量,同时指出如何在享受云服务带来的便利的同时,确保数据的安全和隐私。
25 6
|
20天前
|
存储 人工智能 安全
云计算与网络安全:技术融合与挑战
在数字化时代的浪潮中,云计算和网络安全已成为推动社会进步的两大关键技术。本文将探讨云计算服务的发展,网络安全的重要性,以及信息安全技术的演进。我们将通过实例分析,揭示云服务如何增强数据保护,网络安全措施如何应对新兴威胁,以及信息安全技术的创新如何为企业带来竞争优势。文章旨在为读者提供对云计算和网络安全领域的深入理解,并展示它们如何共同塑造我们的未来。
|
21天前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
|
23天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
随着云计算技术的飞速发展,越来越多的企业和个人开始使用云服务。然而,云计算的广泛应用也带来了一系列网络安全问题。本文将从云服务、网络安全、信息安全等方面探讨云计算与网络安全的关系,分析当前面临的挑战,并提出相应的解决方案。
53 3
|
18天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的挑战与机遇
随着云计算技术的飞速发展,网络安全问题也日益凸显。本文将探讨云计算环境下的网络安全挑战,以及如何通过技术创新来应对这些挑战。我们将分析云服务的安全特性,讨论信息安全的最佳实践,并展望未来云计算与网络安全的发展趋势。
|
8天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
46 17
|
19天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
20天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
40 10
|
21天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
46 10
|
23天前
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。

热门文章

最新文章