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能够提供更好的特征学习和增强机制,从而显著提升了深度神经网络在各种计算机视觉任务中的性能和表现。

相关文章
|
1天前
|
机器学习/深度学习 安全 网络安全
云计算与网络安全:技术融合的未来
【7月更文挑战第14天】在数字化浪潮的推动下,云计算已成为现代信息技术的核心。然而,伴随其快速发展的同时,网络安全问题也日益凸显。本文将深入探讨云计算服务中的网络安全挑战,并分析信息安全技术如何为云环境提供保护。通过案例分析和最新研究,我们将揭示云计算和网络安全之间的协同效应,以及它们如何共同塑造未来的技术景观。
|
2天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
【7月更文挑战第13天】在当今信息化社会,云计算作为一种新兴的技术,为我们的生活带来了诸多便利。然而,随之而来的网络安全问题也日益凸显。本文将从云服务、网络安全、信息安全等方面,探讨云计算在带来便利的同时,如何应对网络安全的挑战。
|
4天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
随着信息技术的飞速发展,云计算已成为企业和个人存储、处理数据的首选方式。然而,随之而来的网络安全问题也日益凸显。本文将深入探讨云计算环境下的网络安全挑战,分析云服务模型中的安全风险,并提出相应的信息安全策略。通过对比传统网络环境与云计算环境的安全差异,揭示云计算特有的安全威胁,并讨论如何通过技术和政策手段加强安全防护。文章旨在为读者提供云计算与网络安全交叉领域的全面视角,促进更安全的云计算应用环境的构建。
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
探索人工智能的未来:深度学习与神经网络的融合
【7月更文挑战第11天】随着科技的不断进步,人工智能(AI)领域正迎来前所未有的发展机遇。本文将深入探讨深度学习和神经网络这两大技术如何相互融合,共同推动AI的未来走向。我们将从基础概念出发,逐步解析它们在实际应用中的协同效应,并预测未来可能的发展趋势。
|
1天前
|
网络协议 Python
在Python中,我们使用`socket`模块来进行网络通信。首先,我们需要导入这个模块。
在Python中,我们使用`socket`模块来进行网络通信。首先,我们需要导入这个模块。
4 0
|
4天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的信息安全挑战与对策
在数字化浪潮的推动下,云计算已成为现代企业不可或缺的技术支柱。然而,随之而来的网络安全问题却成为制约其发展的关键因素。本文将深入探讨云计算服务中的安全威胁,分析当前云环境下的安全挑战,并提出相应的安全策略和最佳实践,以期为企业在享受云计算带来的便利的同时,确保数据和信息的安全性提供指导。
|
5天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
在数字化时代,云计算已成为企业和个人存储、处理和访问数据的关键技术。然而,随着云服务的普及,网络安全问题也日益凸显。本文将探讨云计算与网络安全之间的技术融合与挑战,包括云服务的安全性、网络安全的重要性以及信息安全的技术领域。我们将分析云计算环境下的安全威胁和防御策略,并讨论如何通过技术创新和政策制定来提高云计算的安全性。
12 0
|
1月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
48 1
|
3天前
|
Linux
linux网络统计信息和端口占用情况基本语法
linux网络统计信息和端口占用情况基本语法
|
10天前
|
网络协议 安全 Ubuntu
7 个有用的免费 Linux 网络隧道
【7月更文挑战第4天】
46 0
7 个有用的免费 Linux 网络隧道

热门文章

最新文章