YOLOv8涨点技巧,添加SE注意力机制提升目标检测效果

目录

论文地址

摘要

SE结构图

代码实现

Squeeze 

 Excitation

SE-Inception and SE-ResNet

yaml文件编写

完整代码分享

总结 


论文地址

http://openaccess.thecvf.com/content_cvpr_2018/papers/Hu_Squeeze-and-Excitation_Networks_CVPR_2018_paper.pdf

摘要

卷积神经网络建立在卷积运算的基础上,它通过在局部感受野内将空间和通道信息融合在一起来提取信息特征。为了提高网络的表示能力,最近的几种方法已经显示了增强空间编码的好处。在这项工作中,我们专注于通道关系,并提出了一种新颖的架构单元,我们将其称为“挤压和激励”(SE)块,它通过显式建模通道之间的相互依赖性来自适应地重新校准通道方面的特征响应。我们证明,通过将这些块堆叠在一起,我们可以构建在具有挑战性的数据集上具有极好的泛化能力的 SENet 架构。至关重要的是,我们发现 SE 模块能够以最小的额外计算成本为现有最先进的深度架构带来显着的性能改进。 SENets 构成了我们 ILSVRC 2017 分类提交的基础,该分类提交赢得了第一名,并将 top-5 错误率显着降低至 2.251%,与 2016 年获胜条目相比相对提高了约 25%。

我们通过引入一个新的架构单元(我们将其称为“挤压和激励”(SE)块)来研究架构设计的另一个方面 - 通道关系。我们的目标是通过显式建模网络卷积特征通道之间的相互依赖性来提高网络的表示能力。为了实现这一目标,我们提出了一种允许网络执行特征重新校准的机制,通过该机制它可以学习使用全局信息来选择性地强调信息丰富的特征并抑制不太有用的特征。

SE结构图
模型结构

SE 构建块的基本结构如图所示。对于任何给定的变换 Ftr : X → U, X ∈ RH′×W ′×C′ , U ∈ RH×W ×C ,,我们可以构建相应的 SE 块来执行特征重新校准。特征 U 首先通过挤压操作,该操作聚合跨空间维度 H × W 的特征图以生成通道描述符。该描述符嵌入了通道特征响应的全局分布,使得来自网络的全局感受野的信息能够被其较低层利用。接下来是激励操作,其中通过基于通道依赖性的自门机制为每个通道学习特定于样本的激活,控制每个通道的激励。然后对特征图 U 进行重新加权以生成 SE 块的输出,然后可以将其直接馈送到后续层中。

代码实现
class SELayer(nn.Module):def __init__(self, channel, reduction=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)
class SEConv(nn.Module):# channel attentive convolutiondef __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True, reduction=16):  # ch_in, ch_out, kernel, stride, padding, groupssuper().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())self.se = SELayer(c2, reduction)def forward(self, x):residual = xout = self.bn(self.conv(x))out = self.se(out)out += residualreturn self.act(out)
class SEBottleneck(nn.Module):# Standard bottleneckdef __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = SEConv(c1, c_, 1, 1)self.cv2 = SEConv(c_, c2, 3, 1, g=g)self.add = shortcut and c1 == c2def forward(self, x):return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

以上代码添加在 ultralytics\nn\modules\block.py文件中

Squeeze 

为了解决利用通道依赖性的问题,我们首先考虑输出特征中每个通道的信号。每个学习过滤器都使用局部感受野进行操作,因此变换输出 U 的每个单元都无法利用该区域之外的上下文信息。在感受野尺寸较小的网络较低层中,这个问题变得更加严重。为了缓解这个问题,我们建议将全局空间信息压缩到通道描述符中。这是通过使用全局平均池化生成通道统计数据来实现的。 

 Excitation

为了利用挤压操作中聚合的信息,我们接下来进行第二个操作,旨在完全捕获通道方面的依赖关系。为了实现这一目标,该函数必须满足两个标准:首先,它必须是灵活的(特别是,它必须能够学习通道之间的非线性交互),其次,它必须学习非互斥关系,因为我们将就像确保允许强调多个通道而不是单热激活。

SE-Inception and SE-ResNet

将 SE 块应用于 AlexNet和 VGGNet非常简单。 SE 块的灵活性意味着它可以直接应用于标准卷积之外的变换。为了说明这一点,我们通过将 SE 块集成到具有复杂设计的现代架构中来开发 SENet。对于非残差网络,例如Inception网络,通过将变换Ftr作为整个Inception模块来构造SE块。通过对架构中的每个此类模块进行此更改,我们构建了一个 SE-Inception 网络。此外,SE 块足够灵活,可以在残差网络中使用。图 3 描述了 SEResNet 模块的架构。这里,SE块变换Ftr被视为残差模块的非恒等分支。挤压和激励都在与恒等分支求和之前起作用。可以通过遵循类似的方案来构建与 ResNeXt、Inception-ResNet、MobileNet和 ShuffleNet集成的更多变体。

原始 Inception 模块和 SE-Inception 模块的架构
原始 Residual 模块和 SE-ResNet 模块的架构

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: 80  # 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 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [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, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]]  # cat backbone P3- [-1, 3, C3SE, [256, False]]- [-1, 3, C2f, [256]]  # 15 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]]  # cat head P4- [-1, 3, C2f, [512]]  # 18 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]]  # cat head P5- [-1, 3, C2f, [1024]]  # 21 (P5/32-large)- [[16, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)
完整代码分享

https://download.csdn.net/download/m0_67647321/88894601

总结 

SE注意力机制,这是一种新颖的架构单元,旨在通过使其能够执行动态通道特征重新校准来提高网络的表示能力。大量的实验证明了 SENet 的有效性,它在多个数据集上实现了最先进的性能。此外,它们还提供了对先前架构在通道特征依赖性建模方面的局限性的一些见解,我们希望这对于需要强区分性特征的其他任务可能有用。最后,SE 块引起的特征重要性可能有助于相关领域,例如用于压缩的网络修剪。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/501535.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud 构建面向企业的大型分布式微服务快速开发框架+技术栈介绍

分布式架构图 Cloud架构清单 Commonservice(通用服务) 1)清单列表 2)代码结构 Component(通用组件) 1)清单列表 2)代码结构 快速开发管理平台——云架构【系统管理平台】 一…

SpringBoot IOC之@Autowried原理

文章目录 目录 文章目录 前言 一、AutowiredAnnotationBeanPostProcessor 二、MergedBeanDefinitionPostProcessor执行 2.1 postProcessMergedBeanDefinition方法执行 2.2 postProcessProperties方法执行 ​编辑 总结 前言 SpringBoot的两大特性,控制反转&#xff0…

StarRocks——中信建投基于StarRocks构建统一查询服务平台

目录 一、需求背景 1.1 数据加工链路复杂 1.2 大数据量下性能不足,查询响应慢 1.3 大量实时数据分散在各个业务系统,无法进行联合分析 1.4 缺少与预计算能力加速一些固定查询 二、构建统一查询服务平台 三、落地后的效果与价值 四、项目经验总结…

构建产业图谱,实现产业链精准招商!

​产业链招商是一种以产业链为基础的招商引资方式,它不仅仅关注单个企业的引入,而是侧重于整个产业链的布局和发展,通过吸引产业链上下游相关企业共同入驻,形成产业集群,从而提升地区或园区的产业竞争力和经济效益&…

C语言-----动态内存管理(1)

1.引入 我们之前已经学习了几种开辟内存空间的方式: (1)int a10;开辟4个字节大小的空间 (2)int arr[10]{0}定义数组开辟了一串连续的空间 2.malloc和free (1)malloc开辟内存空间可能会失败,因此需要检查…

Linux - 权限概念

Linux下有两种用户:超级用户(root)、普通用户。 超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情超级用户的命令提示符是“#”,普通用户的命令提示符是“$” 命…

Java进阶(锁)——锁分类总结,Java中常用的锁的介绍

目录 引出锁分类总结1、乐观锁2、悲观锁3、自旋锁4、可重入锁5、读写锁6、公平锁7、非公平锁8、共享锁9、独占锁10、重量级锁11、轻量级锁12、偏向锁13、分段锁14、互斥锁15、同步锁16、死锁17、锁粗化18、锁消除 Java中常用的锁synchronizedLock和synchronized的区别Reentrant…

PHP项目中composer和Git的组合使用

highlight: 在国内由于众所周知的原因,composer的package可能无法访问,解决办法是使用中国的全镜像: composer config -g repositories.packagist composer http://packagist.phpcomposer.com 在需要使用composer package的地方创建composer…

如何对比 MySQL 主备数据的一致性?

随着业务范围的扩大,很多企业为了保障核心业务的高可用性,选择了 MySQL 主从架构,这一套方案通常具备主备数据同步、数据备份与恢复、读写分离、高可用切换等特性,是一种相当成熟可靠的数据库架构方案。然而这套方案在特定情况下可…

tomcat安装步骤流程

安装tomcat是基于安装java的基础上的 JAVA 举例说明: 关闭防火墙 下载java [rootlocalhost ~]#yum install java -y rootlocalhost ~]#yum install epel-release.noarch -y [rootlocalhost ~]#yum provides */javac [rootlocalhost data]#yum install java-1.8.0-o…

1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)

文章目录 1028. 从先序遍历还原二叉树(三种方法:栈递归集合)一、栈 while迭代1.思路2.代码 二、递归法1.思路2.代码 三、集合存储1.思路2.代码 1028. 从先序遍历还原二叉树(三种方法:栈递归集合) 一、栈 wh…