YOLO11 改进 – 注意力机制 _ Gather-Excite 聚集-激发注意力:空间上下文聚合与重校准优化多尺度目标检测
前言
本文介绍了Gather-Excite(GE)框架及其在YOLOv11中的应用。GE框架旨在增强卷积神经网络(CNNs)对上下文的利用能力,引入gather和excite操作符,解决传统CNN捕捉长距离依赖关系的局限性。gather操作符聚合特征响应,excite操作符重新分配信息。该框架轻量且易于整合到现有CNN架构中。我们将GE操作符引入YOLOv11,在检测头部分的不同尺度特征图上应用。实验表明,改进后的YOLOv11在目标检测任务中表现良好,证明了GE框架在提升模型性能方面的有效性。
文章目录: YOLOv11改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总
专栏链接: YOLOv11改进专栏
文章目录
[TOC]
介绍
摘要
虽然卷积神经网络(CNNs)中采用的自下而上局部操作符能够有效匹配自然图像的统计特性,但这种设计限制了模型对长程上下文特征交互的捕获能力。本研究提出了一种简洁而轻量化的方法,旨在增强CNNs对上下文信息的利用效率。该方法通过引入一对互补操作符实现:聚集(gather)操作符能够高效聚合大空间范围内的特征响应,而激发(excite)操作符则将汇集的信息重新分配至局部特征。这些操作符在参数数量和计算复杂度方面均具有较低开销,且可直接集成到现有网络架构中以提升性能。多数据集实验结果表明,聚集-激发操作符能够产生类似于增加网络深度的性能增益,但计算成本显著降低。具体而言,配备聚集-激发操作符的ResNet-50在ImageNet数据集上的表现超越了其101层对应模型,且无需引入额外可学习参数。此外,我们还提出了一对参数化聚集-激发操作符变体,进一步提升了模型性能,并与近期提出的挤压-激励网络(Squeeze-and-Excitation Networks)建立了理论联系,同时系统分析了这些改进对CNN特征激活统计特性的影响。
文章链接
论文地址: 论文地址
代码地址: 代码地址
基本原理
Gather-Excite(简称GE)框架旨在增强卷积神经网络(CNNs)中对上下文的利用能力。它引入了两个主要操作符:gather和excite,这两个操作符协同工作,提高了网络捕获长距离特征交互的能力。
技术原理
1. 动机
传统的卷积神经网络主要使用局部操作符,这些操作符虽然高效,但在捕捉长距离依赖关系方面存在局限性。这是因为它们的感受野是局部的。尽管更深的层理论上具有更大的感受野,但实际上有效感受野要小得多。这一限制妨碍了CNN利用整个图像中分布的上下文信息。
2. Gather操作符 (ξG)
Gather操作符用于从较大的空间范围内聚合特征响应。它通过汇集广泛区域的信息,使网络能够收集上下文信息。这个操作符可以通过不同的池化方法实现,如平均池化,它对指定范围内的特征值进行平均。
3. Excite操作符 (ξE)
Excite操作符将聚合的信息重新分配给局部特征。这种重新分配通过根据聚合的上下文信息重新缩放原始输入特征来实现。Excite操作符使用门控机制(通常是sigmoid函数)来调整输入特征,使其受到聚合上下文的调节。
4. 在CNN中的整合
GE操作符轻量且易于整合到现有的CNN架构中。它们被插入到ResNet等网络的残差块中,就在与恒等分支求和之前。这样的整合提高了网络的表示能力,而不会显著增加计算负担。
实现细节
1. 无参数配对
在基础实现(GE-θ−)中,gather操作符使用平均池化来聚合特征,excite操作符使用sigmoid函数来调整这些聚合。这种方法不引入额外的可学习参数,并且显著提高了性能。
2. 参数化配对
为了进一步增强框架,参数化的gather操作符被引入,通过深度卷积来应用空间滤波到独立通道上。这种方法被称为GE-θ,为gather操作符添加了可学习参数,进一步提高了性能。
性能和优势
-
ImageNet分类 :实验表明,将GE操作符集成到ResNet-50中,其性能优于更深的ResNet-101,展示了上下文利用的效率。
-
泛化能力 :GE框架在其他架构和任务中也表现出良好的泛化能力,如在MS COCO上的Faster R-CNN目标检测和CIFAR-10/100上的分类任务。
-
计算效率 :这些操作符计算成本低,不会显著增加网络的参数数量或计算复杂度,适合资源受限的环境。
核心代码
无
实验
脚本
import os
from ultralytics import YOLO
yaml = 'ultralytics/cfg/models/v8/yolov8_GatherExcite.yaml'
model = YOLO(yaml)
model.info()
if __name__ == "__main__":
results = model.train(data='coco128.yaml',
name='yolov8_GatherExcite',
epochs=10,
workers=8,
batch=1)