【YOLOv8改进 - 注意力机制】GC Block: 全局上下文块,高效捕获特征图中的全局依赖关系

简介: YOLOv8专栏探讨了目标检测的创新改进,如整合NLNet和SENet优势的GCBlock,用于高效全局上下文建模。GCNet在多个识别任务中表现优越,同时降低了计算成本。文章提供了论文、代码链接及详细实现,包括特征的全局建模、变换和融合步骤。核心GCBlock代码展示了其结构。更多实战案例和配置见相关链接。

YOLOv8目标检测创新改进与实战案例专栏

专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLOv8基础解析+创新改进+实战案例

介绍

image-20240718164344690

摘要

非局部网络(NLNet)通过聚合特定查询位置的全局上下文,为捕捉长程依赖性提供了开创性的方法。然而,通过严格的实证分析,我们发现非局部网络在同一图像的不同查询位置所建模的全局上下文几乎相同。在本文中,我们利用这一发现,创建了一个基于与查询无关公式的简化网络,该网络在保持NLNet准确性的同时,大幅减少了计算量。我们进一步观察到,这种简化设计在结构上与挤压-激励网络(SENet)相似。因此,我们将它们统一到一个三步通用框架中,用于全局上下文建模。在这一通用框架内,我们设计了一个更好的实例,称为全局上下文(GC)块,它轻量化且能有效建模全局上下文。由于其轻量化特性,我们可以将其应用于骨干网络的多个层次,构建一个全局上下文网络(GCNet),该网络在各种识别任务的主要基准测试中普遍优于简化的NLNet和SENet。代码和配置发布在:https://github.com/xvjiarui/GCNet。

文章链接

论文地址:论文地址

代码地址:代码地址

参考代码代码地址

基本原理

GC Block 详细介绍

全局上下文块(Global Context Block, GC Block)是Global Context Network(GCNet)的核心组件,设计用来高效捕获特征图中的全局依赖关系。它结合了非局部网络(NLNet)和挤压-激励网络(SENet)的优势,具体结构如下:

1. 上下文建模模块(Context Modeling Module)

这个模块的主要目的是聚合所有位置的特征形成全局上下文特征,具体步骤如下:

  • 输入特征图:假设输入特征图为 $X \in \mathbb{R}^{C \times H \times W}$,其中 $C$ 表示通道数,$H$ 和 $W$ 分别表示特征图的高度和宽度。
  • 空间维度压缩:通过全局平均池化操作将空间维度压缩为单个向量,得到全局上下文特征 $z \in \mathbb{R}^C$:
    $$ z = \frac{1}{H \times W} \sum_{i=1}^H \sum_{j=1}^W X_{ij} $$
  • 注意力权重计算:使用一个全连接层或1x1卷积层,将全局上下文特征变换为注意力权重 $W_z \in \mathbb{R}^{C}$:
    $$ W_z = \sigma(W_1 z) $$
    其中,$W_1$ 是可学习的权重矩阵,$\sigma$ 是激活函数(通常为softmax)。

2. 特征变换模块(Feature Transform Module)

这个模块用于捕获特征图中通道之间的依赖关系:

  • 瓶颈变换:使用两层1x1卷积和ReLU激活函数,进行瓶颈变换以减少计算复杂度:
    $$ y = W_2 (\delta(W_1 X)) $$
    其中,$W_1$ 和 $W_2$ 是可学习的权重矩阵,$\delta$ 是ReLU激活函数。

3. 特征融合模块(Feature Fusion Module)

这个模块的目的是将全局上下文特征融合到每个查询位置的特征中:

  • 特征融合:通过加法操作,将全局上下文特征 $z$ 融合到每个位置的特征 $X_{ij}$ 中,得到增强的特征图 $Y \in \mathbb{R}^{C \times H \times W}$:
    $$ Y_{ij} = X_{ij} + z $$

GC Block 流程总结

  1. 输入特征图:$X \in \mathbb{R}^{C \times H \times W}$。
  2. 全局上下文建模:通过全局平均池化和全连接层计算全局上下文特征 $z$。
  3. 特征变换:使用瓶颈变换模块对特征图进行变换。
  4. 特征融合:将全局上下文特征 $z$ 融合到每个位置的特征 $X_{ij}$ 中。

总结

GC Block 通过上下文建模、特征变换和特征融合三个模块,高效地捕获并利用图像中的全局上下文信息。这种设计不仅显著提高了模型在各种视觉识别任务中的性能,还保持了较低的计算成本和内存消耗。因此,GC Block 在实际应用中具有很高的实用价值。

核心代码

import torch
from mmcv.cnn import constant_init, kaiming_init
from torch import nn


def last_zero_init(m):
    if isinstance(m, nn.Sequential):
        constant_init(m[-1], val=0)
    else:
        constant_init(m, val=0)


class ContextBlock(nn.Module):

    def __init__(self,
                 inplanes,
                 ratio,
                 pooling_type='att',
                 fusion_types=('channel_add', )):
        super(ContextBlock, self).__init__()
        assert pooling_type in ['avg', 'att']
        assert isinstance(fusion_types, (list, tuple))
        valid_fusion_types = ['channel_add', 'channel_mul']
        assert all([f in valid_fusion_types for f in fusion_types])
        assert len(fusion_types) > 0, 'at least one fusion should be used'
        self.inplanes = inplanes
        self.ratio = ratio
        self.planes = int(inplanes * ratio)
        self.pooling_type = pooling_type
        self.fusion_types = fusion_types
        if pooling_type == 'att':
            self.conv_mask = nn.Conv2d(inplanes, 1, kernel_size=1)
            self.softmax = nn.Softmax(dim=2)
        else:
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
        if 'channel_add' in fusion_types:
            self.channel_add_conv = nn.Sequential(
                nn.Conv2d(self.inplanes, self.planes, kernel_size=1),
                nn.LayerNorm([self.planes, 1, 1]),
                nn.ReLU(inplace=True),  # yapf: disable
                nn.Conv2d(self.planes, self.inplanes, kernel_size=1))
        else:
            self.channel_add_conv = None
        if 'channel_mul' in fusion_types:
            self.channel_mul_conv = nn.Sequential(
                nn.Conv2d(self.inplanes, self.planes, kernel_size=1),
                nn.LayerNorm([self.planes, 1, 1]),
                nn.ReLU(inplace=True),  # yapf: disable
                nn.Conv2d(self.planes, self.inplanes, kernel_size=1))
        else:
            self.channel_mul_conv = None
        self.reset_parameters()

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/140528152

相关文章
|
2月前
|
机器学习/深度学习 移动开发 自然语言处理
【YOLOv8改进 - 注意力机制】ContextAggregation : 上下文聚合模块,捕捉局部和全局上下文,增强特征表示
【YOLOv8改进 - 注意力机制】ContextAggregation : 上下文聚合模块,捕捉局部和全局上下文,增强特征表示
|
2月前
|
机器学习/深度学习 存储 测试技术
【YOLOv10改进-注意力机制】iRMB: 倒置残差移动块 (论文笔记+引入代码)
YOLOv10专栏介绍了融合CNN与Transformer的iRMB模块,用于轻量级模型设计。iRMB在保持高效的同时结合了局部和全局信息处理,减少了资源消耗,提升了移动端性能。在ImageNet等基准上超越SOTA,且在目标检测等任务中表现优秀。代码示例展示了iRMB的实现细节,包括自注意力机制和卷积操作的整合。更多配置信息见相关链接。
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【YOLOv8改进 - 注意力机制】GAM(Global Attention Mechanism):全局注意力机制,减少信息损失并放大全局维度交互特征
YOLO目标检测专栏探讨了模型创新,如注意力机制,聚焦通道和空间信息的全局注意力模组(GAM),提升DNN性能。GAM在ResNet和MobileNet上优于最新方法。论文及PyTorch代码可在给出的链接找到。核心代码展示了GAM的构建,包含线性层、卷积和Sigmoid激活,用于生成注意力图。更多配置详情参阅相关博客文章。
【YOLOv8改进 - 注意力机制】GAM(Global Attention Mechanism):全局注意力机制,减少信息损失并放大全局维度交互特征
|
2月前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进 - 注意力机制】SENetV2: 用于通道和全局表示的聚合稠密层,结合SE模块和密集层来增强特征表示
【YOLOv8改进 - 注意力机制】SENetV2: 用于通道和全局表示的聚合稠密层,结合SE模块和密集层来增强特征表示
|
2月前
|
机器学习/深度学习 计算机视觉
【YOLOv8改进 - 注意力机制】DoubleAttention: 双重注意力机制,全局特征聚合和分配
YOLOv8专栏探讨了该目标检测模型的创新改进,如双重注意力块,它通过全局特征聚合和分配提升效率。该机制集成在ResNet-50中,在ImageNet上表现优于ResNet-152。文章提供了论文、代码链接及核心代码示例。更多实战案例与详细配置见相关CSDN博客链接。
|
2月前
|
机器学习/深度学习 算法 计算机视觉
【YOLOv8改进 - 注意力机制】RCS-OSA :减少通道的空间对象注意力,高效且涨点
YOLOv8专栏探讨了YOLO系列的创新改进,提出RCS-YOLO模型,它在脑肿瘤检测中超越YOLOv6/v7/v8,精度提升1%,速度增快60%(达到114.8 FPS)。RCS-OSA模块结合RepVGG/ShuffleNet优点,通过通道重参数化和混洗优化卷积,提升速度和准确性。代码和论文可在提供的链接获取。
|
3月前
|
机器学习/深度学习 计算机视觉
YOLOv8改进 | 注意力机制 | 添加混合局部通道注意力——MLCA【原理讲解】
YOLOv8专栏介绍了混合局部通道注意力(MLCA)模块,它结合通道、空间和局部信息,提升目标检测性能,同时保持低复杂度。文章提供MLCA原理、代码实现及如何将其集成到YOLOv8中,助力读者实战深度学习目标检测。[YOLOv8改进——更新各种有效涨点方法](https://blog.csdn.net/m0_67647321/category_12548649.html)
|
编解码 算法 数据可视化
【多重信号分类】超分辨率测向方法——依赖于将观测空间分解为噪声子空间和源/信号子空间的方法具有高分辨率(HR)并产生准确的估计(Matlab代码实现)
【多重信号分类】超分辨率测向方法——依赖于将观测空间分解为噪声子空间和源/信号子空间的方法具有高分辨率(HR)并产生准确的估计(Matlab代码实现)
|
4月前
|
机器学习/深度学习 存储 计算机视觉
YOLOv5改进 | 2023 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)
YOLOv5改进 | 2023 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)
149 0
|
4月前
|
机器学习/深度学习 存储 计算机视觉
YOLOv8改进 | 2023 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)
YOLOv8改进 | 2023 | RCS-OSA替换C2f实现暴力涨点(减少通道的空间对象注意力机制)
159 0