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

相关文章
|
1月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
2月前
|
机器学习/深度学习 人工智能 算法
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic带你深入卷积神经网络(CNN)核心技术,从生物启发到数学原理,详解ResNet、注意力机制与模型优化,探索视觉智能的演进之路。
387 11
|
4月前
|
机器学习/深度学习 数据采集 算法
贝叶斯状态空间神经网络:融合概率推理和状态空间实现高精度预测和可解释性
本文将BSSNN扩展至反向推理任务,即预测X∣y,这种设计使得模型不仅能够预测结果,还能够探索特定结果对应的输入特征组合。在二元分类任务中,这种反向推理能力有助于识别导致正负类结果的关键因素,从而显著提升模型的可解释性和决策支持能力。
401 42
贝叶斯状态空间神经网络:融合概率推理和状态空间实现高精度预测和可解释性
|
2月前
|
机器学习/深度学习 传感器 数据采集
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
【故障识别】基于CNN-SVM卷积神经网络结合支持向量机的数据分类预测研究(Matlab代码实现)
208 0
|
4月前
|
机器学习/深度学习 人工智能 PyTorch
零基础入门CNN:聚AI卷积神经网络核心原理与工业级实战指南
卷积神经网络(CNN)通过局部感知和权值共享两大特性,成为计算机视觉的核心技术。本文详解CNN的卷积操作、架构设计、超参数调优及感受野计算,结合代码示例展示其在图像分类、目标检测等领域的应用价值。
278 7
|
5月前
|
机器学习/深度学习 数据采集 监控
基于CNN卷积神经网络和GEI步态能量提取的步态识别算法matlab仿真,对比不同角度下的步态识别性能
本项目基于CNN卷积神经网络与GEI步态能量提取技术,实现高效步态识别。算法使用不同角度(0°、45°、90°)的步态数据库进行训练与测试,评估模型在多角度下的识别性能。核心流程包括步态图像采集、GEI特征提取、数据预处理及CNN模型训练与评估。通过ReLU等激活函数引入非线性,提升模型表达能力。项目代码兼容Matlab2022a/2024b,提供完整中文注释与操作视频,助力研究与应用开发。
|
5月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本内容包含时间序列预测算法的相关资料,涵盖以下几个方面:1. 算法运行效果预览(无水印);2. 运行环境为Matlab 2022a/2024b;3. 提供部分核心程序,完整版含中文注释及操作视频;4. 理论概述:结合时间卷积神经网络(TCN)与鲸鱼优化算法(WOA),优化TCN超参数以提升非线性时间序列预测性能。通过因果卷积层与残差连接构建TCN模型,并用WOA调整卷积核大小、层数等参数,实现精准预测。适用于金融、气象等领域决策支持。
|
5月前
|
机器学习/深度学习 数据采集 并行计算
基于WOA鲸鱼优化的TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于TCN(Temporal Convolutional Network)与WOA(Whale Optimization Algorithm)的时间序列预测算法。TCN通过扩张卷积捕捉时间序列长距离依赖关系,结合批归一化和激活函数提取特征;WOA用于优化TCN网络参数,提高预测精度。算法流程包括数据归一化、种群初始化、适应度计算及参数更新等步骤。程序基于Matlab2022a/2024b开发,完整版含详细中文注释与操作视频,运行效果无水印展示。适用于函数优化、机器学习调参及工程设计等领域复杂任务。
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
262 17
|
11月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
221 10

热门文章

最新文章

下一篇
oss云网关配置