在深度学习目标检测领域,YOLOv5成为了备受关注的模型之一。本文给大家带来的是能用于移动端的高效坐标CA注意力机制。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。
专栏地址:YOLOv5改进+入门——持续更新各种有效涨点方法
1.原理
论文地址:Coordinate Attention for Efficient Mobile Network Design点击即可跳转
官方代码:CoordAttention官方代码仓库点击即可跳转
CA 机制是注意力机制的一种变体,常用于神经网络架构中,特别是在与计算机视觉和自然语言处理相关的任务中。CA 机制将卷积操作与注意力机制相结合,以有效捕捉空间依赖性。
在传统的注意力机制中,如 transformer 中的自注意力机制,序列中的每个标记都会关注到序列中的其他每个标记,导致计算复杂度为二次方。这对于长序列来说变得不切实际。另一方面,卷积操作在计算上是高效的,并且能有效捕捉局部模式。
CA 机制旨在融合卷积层和注意力机制的优点。它通常按以下方式操作:
1. 卷积操作:输入序列与可学习的滤波器进行卷积,捕捉局部信息并生成特征图。
2. 注意力机制:然后将特征图输入到注意力机制中,该机制计算每个特征图的注意力权重。这些权重表示每个局部特征图相对于其他特征图的重要性。
3. 加权聚合:最后,根据它们的注意力权重对特征图进行聚合,生成一个强调相关局部信息同时减少噪声和不相关细节的输入序列表示。
CA 机制已被证明在各种任务中有效,如图像分类、目标检测和自然语言理解。通过结合卷积操作和注意力机制,CA 模型能够高效地捕捉局部和全局依赖关系,从而在复杂任务中提高性能。
2.YOLOv5添加CA注意力机制
2.1 CA注意力机制代码
关键步骤一:将下面代码添加到 yolov5/models/common.py中任意位置
class h_sigmoid(nn.Module):def __init__(self, inplace=True):super(h_sigmoid, self).__init__()self.relu = nn.ReLU6(inplace=inplace)def forward(self, x):return self.relu(x + 3) / 6class h_swish(nn.Module):def __init__(self, inplace=True):super(h_swish, self).__init__()self.sigmoid = h_sigmoid(inplace=inplace)def forward(self, x):return x * self.sigmoid(x)class CoordAtt(nn.Module):def __init__(self, inp, oup, reduction=32):super(CoordAtt, self).__init__()self.pool_h = nn.AdaptiveAvgPool2d((None, 1))self.pool_w = nn.AdaptiveAvgPool2d((1, None))mip = max(8, inp // reduction)self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)self.bn1 = nn.BatchNorm2d(mip)self.act = h_swish()self.conv_h = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)def forward(self, x):identity = xn, c, h, w = x.size()# c*1*Wx_h = self.pool_h(x)# c*H*1# C*1*hx_w = self.pool_w(x).permute(0, 1, 3, 2)y = torch.cat([x_h, x_w], dim=2)# C*1*(h+w)y = self.conv1(y)y = self.bn1(y)y = self.act(y)x_h, x_w = torch.split(y, [h, w], dim=2)x_w = x_w.permute(0, 1, 3, 2)a_h = self.conv_h(x_h).sigmoid()a_w = self.conv_w(x_w).sigmoid()out = identity * a_w * a_hreturn out
CA注意力机制是一种结合了卷积操作和注意力机制的变体,通常用于处理序列数据,尤其在计算机视觉和自然语言处理任务中表现出色。首先,CA机制利用卷积操作来从输入序列中提取局部特征信息,这些卷积滤波器可以有效地捕获输入数据中的空间局部结构。然后,得到的特征图被送入注意力机制中,其中每个特征图都被赋予一个注意力权重,表示其相对于其他特征图的重要性。这种加权过程能够使得模型更加关注重要的局部特征,并且降低对无关信息的敏感度。最终,通过将注意力权重与特征图相乘并进行池化或者求和操作,可以得到一个整体的序列表示,其中包含了局部和全局的信息。总的来说,CA注意力机制能够在保持计算效率的同时,有效地捕获序列数据中的重要信息,从而提高了模型的性能和泛化能力。
CA注意力机制的流程如下:
1. 输入序列:首先,输入序列被表示为一个特征图集合或张量,例如,在自然语言处理中,可以是词嵌入序列;在计算机视觉中,可以是图像的特征图。
2. 卷积操作:输入序列经过一系列卷积操作,这些卷积操作可以捕获输入数据中的局部特征信息。这些卷积核或滤波器通常具有不同的大小和深度,以捕获不同尺度和层次的特征。
3. 特征图生成:每个卷积操作生成一个特征图,这些特征图捕获了输入序列中的局部信息,但可能忽略了全局关系。
4. 注意力机制:生成的特征图被输入到一个注意力机制中。在注意力机制中,每个特征图都被赋予一个权重,该权重表示该特征图相对于其他特征图的重要性。这些权重可以通过各种方式计算,如点乘、加性注意力等。
5. 加权汇聚:将特征图与其对应的注意力权重相乘,然后进行池化或求和操作,以将局部信息与全局信息结合起来。这样,得到的加权特征表示同时包含了局部和全局的重要信息。
6. 输出:最终,通过对加权特征表示进行后续处理(如全连接层),模型可以输出最终的预测结果或特征表示。
整个流程中,CA注意力机制通过结合卷积操作和注意力机制,能够高效地捕获序列数据中的局部和全局信息,从而提高了模型的性能和泛化能力。
2.2新增yaml文件
关键步骤二:在 /yolov5/models/ 下新建文件 yolov5_ca.yaml文件并将下面代码复制进去
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 80 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:- [10,13, 16,30, 33,23] # P3/8- [30,61, 62,45, 59,119] # P4/16- [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2[-1, 1, Conv, [128, 3, 2]], # 1-P2/4[-1, 3, C3, [128]],[-1, 1, Conv, [256, 3, 2]], # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]], # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, CoordAtt, [1024]],[-1, 1, SPPF, [1024, 5]], # 10]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]], # cat backbone P4[-1, 3, C3, [512, False]], # 14[-1, 1, Conv, [256, 1, 1]],[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 4], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 18 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 15], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 21 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 11], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 24 (P5/32-large)[[18, 21, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)]
温馨提示:因为本文只是对yolov5s基础上添加SE模块,如果要对yolov5n/l/m/x进行添加则只需要修改对应的depth_multiple 和 width_multiple。
2.3 注册模块
关键步骤三:在yolov5/models/yolo.py中注册,大概在250行左右添加 ‘CoordAtt’
2.4 执行程序
在train.py中,将cfg的参数路径设置为yolov5_ca.yaml的路径,如下图所示
建议大家写绝对路径,确保一定能找到
运行程序,如果出现下面的内容则说明添加成功🚀
我修改后的代码:链接: https://pan.baidu.com/s/1d2KfzR1iDF1Nlf2o7LqoKA?pwd=5re5 提取码: 5re5
3.总结
CA注意力机制是一种融合了卷积操作和注意力机制的变体,主要应用于处理序列数据,特别是在计算机视觉和自然语言处理任务中。其流程如下:
首先,输入序列被表示为特征图或张量,并经过一系列卷积操作,以提取输入序列的局部特征信息,生成相应的特征图。每个卷积操作都产生一个特征图,这些特征图捕获了输入序列的局部信息。
接下来,这些特征图被送入注意力机制中,注意力机制计算每个特征图的注意力权重,表示其相对于其他特征图的重要性。通过注意力权重,模型能够集中关注对当前任务最相关的特征图。
然后,将每个特征图与其对应的注意力权重相乘,并进行汇聚操作,以整合局部和全局信息。这一步骤使得模型能够有效地结合局部特征和全局关系,生成更丰富的特征表示。
最后,通过对加权特征表示进行后续处理(如全连接层),生成最终的预测结果或特征表示。这样的加权特征表示包含了输入序列中的局部和全局信息,使得模型能够更好地理解和处理序列数据,从而提高了模型的性能和泛化能力。