核心内容摘要
目标检测新选择!YOLOv9官方镜像全面评测
前言本文介绍了内容引导注意力融合模块CGAFusion在YOLO26中的结合应用。
CGAFusion由通道注意力、空间注意力和特征融合组成通过生成通道特定的空间重要性图有效处理特征非均匀性提升模型表现。
我们将CGAFusion集成到YOLO26的检测头中并进行相关注册和配置。
实验表明改进后的模型在显著减少参数与FLOPs的同时仍具备优异性能在资源受限场景下展现出高效与实用的优势。
文章目录 YOLO26改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLO26改进专栏文章目录前言介绍摘要文章链接基本原理CGA 的主要组成部分CGA 的原理图CGA 的流程如下所示CGA 的优势核心代码YOLO26引入代码注册卷积步骤1:步骤2配置yolo26-CGAFusion.yaml实验脚本结果介绍摘要摘要——单幅图像去雾是一个极具挑战性的病态问题其目标是从观测到的雾霾图像中估计出无雾图像。
部分现有的基于深度学习的方法试图通过增加卷积的深度或宽度来提升模型性能但卷积神经网络CNN结构的学习能力仍未得到充分发掘。
本文提出了一种细节增强注意力模块DEAB该模块由细节增强卷积DEConv和内容引导注意力CGA构成旨在强化特征学习进而改善去雾性能。
具体而言DEConv将先验信息融入常规卷积层以增强模型的表示能力和泛化能力随后利用重新参数化技术将DEConv等效转换为标准卷积且不产生额外的参数和计算开销。
CGA通过为每个通道分配独特的空间重要性图SIM能够更高效地聚焦于特征中编码的有用信息。
此外本文提出了一种基于CGA的混合融合方案可有效融合特征并辅助梯度流动。
综合上述组件我们提出了细节增强注意力网络DEA - Net用于恢复高质量的无雾图像。
大量实验结果证实了DEA - Net的有效性其将PSNR指标提升至41 dB以上且仅使用
653M的参数超越了当前最先进的SOTA方法。
我们的DEA - Net源代码将发布于https://github.com/cecret3350/DEA - Net。
文章链接论文地址论文地址代码地址代码地址基本原理内容引导注意力Content-Guided Attention, CGA是一种新颖的注意力机制旨在为每个通道生成特定的空间重要性图Spatial Importance Map, SIM以便在特征学习过程中更好地关注输入特征中的有用信息。
CGA 通过结合通道注意力和空间注意力能够有效地处理特征级别的非均匀性从而提升模型的表现。
CGA 的主要组成部分通道注意力Channel Attention通过对输入特征进行全局平均池化和全局最大池化生成通道级别的注意力权重。
这些权重用于调整不同通道的重要性使得模型能够更好地利用特征通道的信息。
空间注意力Spatial Attention通过对输入特征进行空间维度的处理生成空间级别的注意力权重。
这些权重帮助模型关注特征图中的重要区域增强对关键部分的响应。
特征融合CGA 通过将通道和空间注意力结合生成最终的空间重要性图SIM并将其应用于输入特征以增强特征的表示能力。
CGA 的原理图CGA 的流程如下所示Input Features (X) | ------------------- | | Channel Attention Spatial Attention | | ------------------- | Combined Attention Map (W) | ------------------- | | Weighted Features Input Features | | ------------------- | Output Features在这个图中输入特征首先通过通道注意力和空间注意力模块生成相应的注意力权重。
然后这些权重被结合成一个综合的注意力图W并应用于输入特征以生成最终的输出特征。
CGA 的优势通道特异性CGA 生成的注意力图是通道特定的能够更好地捕捉不同通道之间的关系。
空间关注通过空间注意力CGA 能够有效地识别输入特征图中的重要区域增强模型对关键特征的响应。
处理非均匀性CGA 同时考虑了图像级别和特征级别的非均匀性从而提升了去雾等任务的性能。
核心代码fromtorchimportnnfrom.cgaimportSpatialAttention,ChannelAttention,PixelAttentionclassCGAFusion(nn.Module):def__init__(self,dim,reduction
:super(CGAFusion,self).__init__()self.saSpatialAttention()self.caChannelAttention(dim,reduction)self.paPixelAttention(dim)self.convnn.Conv2d(dim,dim,1,biasTrue)self.sigmoidnn.Sigmoid()defforward(self,x,y):initialxy cattnself.ca(initial)sattnself.sa(initial)pattn1sattncattn pattn2self.sigmoid(self.pa(initial,pattn
)resultinitialpattn2*x(1-pattn
*y resultself.conv(result)returnresultYOLO26引入代码在根目录下的ultralytics/nn/目录新建一个attention目录然后新建一个以CGAFusion为文件名的py文件 把代码拷贝进去。
importtorchfromtorchimportnnfromeinopsimportrearrangeclassSpatialAttention(nn.Module):def__init__(self):super(SpatialAttention,self).__init__()self.sann.Conv2d(2,1,7,padding3,padding_modereflect,biasTrue)defforward(self,x):x_avgtorch.mean(x,dim1,keepdimTrue)x_max,_torch.max(x,dim1,keepdimTrue)x2torch.concat([x_avg,x_max],dim
sattnself.sa(x
returnsattnclassChannelAttention(nn.Module):def__init__(self,dim,reduction
:super(ChannelAttention,self).__init__()self.gapnn.AdaptiveAvgPool2d(
self.cann.Sequential(nn.Conv2d(dim,dim//reduction,1,padding0,biasTrue),nn.ReLU(inplaceTrue),nn.Conv2d(dim//reduction,dim,1,padding0,biasTrue),)defforward(self,x):x_gapself.gap(x)cattnself.ca(x_gap)returncattnclassPixelAttention(nn.Module):def__init__(self,dim):super(PixelAttention,self).__init__()self.pa2nn.Conv2d(2*dim,dim,7,padding3,padding_modereflect,groupsdim,biasTrue)self.sigmoidnn.Sigmoid()defforward(self,x,pattn
:B,C,H,Wx.shape xx.unsqueeze(dim
# B, C, 1, H, Wpattn1pattn
unsqueeze(dim
# B, C, 1, H, Wx2torch.cat([x,pattn1],dim
# B, C, 2, H, Wx2rearrange(x2,b c t h w - b (c t) h w)pattn2self.pa2(x
pattn2self.sigmoid(pattn
returnpattn2classCGAFusion(nn.Module):def__init__(self,dim,reduction
:super(CGAFusion,self).__init__()self.saSpatialAttention()self.caChannelAttention(dim,reduction)self.paPixelAttention(dim)self.convnn.Conv2d(dim,dim,1,biasTrue)self.sigmoidnn.Sigmoid()defforward(self,x):x_featx y_featx initialx_featy_feat cattnself.ca(initial)sattnself.sa(initial)pattn1sattncattn pattn2self.sigmoid(self.pa(initial,pattn
)resultinitialpattn2*x_feat(1-pattn
*y_feat resultself.conv(result)returnresult注册卷积在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.attention.CGAFusionimportCGAFusion步骤2修改def parse_model(d, ch, verboseTrue):elifmisCGAFusion:c2ch[f[1]]args[c2,*args]配置yolo26-CGAFusion.yamlultralytics/cfg/models/11/YOLO26-CGAFusion.yaml# Ultralytics AGPL-
0 License - https://ultralytics.com/license# Ultralytics YOLO26 object detection model with P3/8 - P5/32 outputs# Model docs: https://docs.ultralytics.com/models/yolo26# Task docs: https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesend2end:True# whether to use end-to-end modereg_max:1# DFL binsscales:# model compound scaling constants, i.e. modelyolo26n.yaml will call yolo
yaml with scale n# [depth, width, max_channels]n:[
50,
25,1024]# summary: 260 layers, 2,572,280 parameters, 2,572,280 gradients,
1 GFLOPss:[
50,
50,1024]# summary: 260 layers, 10,009,784 parameters, 10,009,784 gradients,
2
8 GFLOPsm:[
50,
00,512]# summary: 280 layers, 21,896,248 parameters, 21,896,248 gradients,
7
4 GFLOPsl:[
00,
00,512]# summary: 392 layers, 26,299,704 parameters, 26,299,704 gradients,
9
8 GFLOPsx:[
00,
50,512]# summary: 392 layers, 58,993,368 parameters, 58,993,368 gradients,
2