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

简介: 在这个教程中,介绍了如何将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天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
【6月更文挑战第20天】本文旨在探讨云计算环境下的网络安全问题,分析云服务模型中的安全挑战,并提出相应的信息安全策略。通过研究当前云服务供应商的安全措施和存在的漏洞,文章强调了在设计、部署及运维阶段应用最佳实践的必要性。此外,还讨论了加密技术和身份管理在提升云环境安全性中的作用,以及如何通过合规性框架来确保数据保护和隐私。
|
1天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的双刃剑
【6月更文挑战第20天】在数字化浪潮推动下,云计算服务已成为企业IT架构的核心。然而,随着云服务的普及,网络安全威胁也日益增多。本文将探讨云计算环境下的网络安全挑战,分析信息安全技术如何应对这些挑战,并讨论云服务提供商和企业在保障数据安全方面的责任与策略。通过技术性案例分析,揭示云计算与网络安全之间的微妙平衡,为读者提供深入的行业见解。
|
1天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的挑战与机遇
【6月更文挑战第20天】随着云计算技术的迅猛发展,企业和个人越来越依赖云服务来存储和处理数据。然而,这也带来了新的网络安全挑战。本文将从技术角度深入探讨云计算环境下的网络安全问题,包括云服务的安全性、网络攻击的演变以及信息安全的最佳实践。我们将分析当前云服务中存在的安全漏洞,探讨如何通过技术和策略的结合来提高云环境的安全性,并预测未来云计算与网络安全领域的发展趋势。
|
1天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
随着云计算技术的迅速发展,其安全性问题也日益凸显。本文从云服务、网络安全和信息安全三个角度出发,探讨了云计算与网络安全的关联性及其面临的挑战。首先,介绍了云计算的基本概念和服务模型,然后分析了网络安全的重要性以及在云计算环境下的安全威胁,最后提出了加强云计算环境下的信息安全策略和技术的建议。通过深入分析,本文旨在为读者提供对云计算与网络安全关系的全面理解,以及应对策略的参考。
7 0
|
1天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战应对
当今数字化时代,云计算和网络安全已经成为科技领域的热门话题。本文将探讨云计算和网络安全在技术融合中的重要性以及面临的挑战,从云服务、网络安全、信息安全等多个角度进行分析,并提出相应的解决方案。
|
1天前
|
存储 安全 网络安全
云计算与网络安全的融合:现代信息技术的双刃剑
在云计算广泛应用的今天,网络安全成为不可忽视的重要议题。本文将探讨云服务的优势与挑战,并深入分析如何通过先进的网络安全技术来保障信息安全。
7 0
|
1天前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】MSFN(Multi-Scale Feed-Forward Network):多尺度前馈网络
**HCANet: 高光谱图像去噪新方法**\n混合卷积与注意力网络(Hybrid Convolutional and Attention Network)是针对HSI去噪的创新模型,结合CNN和Transformer,强化全局与局部特征。它使用卷积注意力融合模块捕获长距离依赖和局部光谱相关性,多尺度前馈网络提升多尺度信息聚合。代码可在[GitHub](https://github.com/summitgao/HCANet)获取。
|
1月前
|
消息中间件 Java Linux
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
2024年最全BATJ真题突击:Java基础+JVM+分布式高并发+网络编程+Linux(1),2024年最新意外的惊喜
|
15天前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
31 1
|
17天前
|
Linux 数据安全/隐私保护 Windows
linux 搭建cloudreve win映射网络驱动器WebDav
linux 搭建cloudreve win映射网络驱动器WebDav